1 line
8.3 KiB
JavaScript
1 line
8.3 KiB
JavaScript
(()=>{"use strict";let e;const t="https://omnivore.app",s="https://omnivore.app/api/";function n(e){return new Promise((t=>{browserApi.storage.local.get(e,(s=>{const n=s&&s[e]||null;t(n)}))}))}function o(e){return new Promise((t=>{browserApi.storage.local.set(e,t)}))}function r(e){return new Promise((t=>{browserApi.storage.local.remove(e,t)}))}function a(t){t.setRequestHeader("Content-Type","application/json"),e&&t.setRequestHeader("Authorization",e)}function i(){n("postInstallClickComplete").then((e=>{e&&r("postInstallClickComplete")}))}function c(e,s){if(4===s.readyState)if(200===s.status){const{data:n}=JSON.parse(s.response);if("createArticle"in n)if("errorCodes"in n.createArticle){const s={text:descriptions[n.createArticle.errorCodes[0]]||"Unable to save page",type:"error"};"UNAUTHORIZED"===n.createArticle.errorCodes[0]&&(s.errorCode=401,s.url=t,i()),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:s})}else{const s=n.createArticle.createdArticle,o=n.createArticle.user,r=t+(s.hasContent?`/${o.profile.username}/`+s.slug:"/home");browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:r,linkText:"View",type:"success"}})}else if("errorCodes"in n.createArticleSavingRequest)browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:descriptions[n.createArticleSavingRequest.errorCodes[0]]||"Unable to save page",type:"error"}});else{const s=n.createArticleSavingRequest.articleSavingRequest,o=t+"/article/sr/"+s.id;browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:o,linkText:"View",type:"success"}})}}else 400===s.status&&browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}function l(e){browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Saving..."}});const n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&c(e,n)},browserApi.tabs.sendMessage(e.id,{action:ACTIONS.GetContent},(async o=>{if(!o||"object"!=typeof o)return;const{type:r,pageInfo:c,doc:l,uploadContentObjUrl:p}=o;let d=null;switch(r){case"pdf":if(d=await function(e,n,o,r){return new Promise((c=>{const l=new XMLHttpRequest;l.onreadystatechange=async function(){if(4===l.readyState){if(200===l.status){const{data:s}=JSON.parse(l.response);if("errorCodes"in s.uploadFileRequest&&"UNAUTHORIZED"===s.uploadFileRequest.errorCodes[0]&&(i(),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error",errorCode:401,url:t}})),s.uploadFileRequest&&s.uploadFileRequest.id&&!("errorCodes"in s.uploadFileRequest)){const e=await function({id:e,uploadSignedUrl:t},s,n){return fetch(n).then((e=>e.blob())).then((n=>new Promise((o=>{const r=new XMLHttpRequest;r.open("PUT",t,!0),r.setRequestHeader("Content-Type",s),r.onerror=()=>{o(null)},r.onload=()=>{o({id:e})},r.send(n)})))).catch((e=>{console.error("error uploading file",e)}))}(s.uploadFileRequest,o,r);return URL.revokeObjectURL(r),c(e)}browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}else 400===l.status&&browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}});c(!1)}};const p=JSON.stringify({query:"mutation UploadFileRequest($input: UploadFileRequestInput!) {\n uploadFileRequest(input:$input) {\n ... on UploadFileRequestError {\n errorCodes\n }\n ... on UploadFileRequestSuccess {\n id\n uploadSignedUrl\n }\n }\n }",variables:{input:{url:n,contentType:o}}});l.open("POST",s+"graphql",!0),a(l),l.send(p)}))}(e,encodeURI(e.url),c.contentType,p),!d||!d.id)return void browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}const u=l&&l.length||d,g=u?CREATE_ARTICLE_QUERY:CREATE_ARTICLE_SAVING_REQUEST_QUERY,b={url:encodeURI(e.url)};u&&(b.preparedDocument={document:l,pageInfo:c},b.uploadFileId=d&&d.id||null);const f=JSON.stringify({query:g,variables:{input:b}});n.open("POST",s+"graphql",!0),a(n),n.send(f)}))}async function p(e){const t=await n(e+"_saveInProgress");if(!t)return;clearInterval(t);const s=await n(e+"_saveInProgressTimeoutId_"+t);s&&clearTimeout(s)}function d(r){return n("postInstallClickComplete").then((async n=>{if(n)return!0;if("undefined"!=typeof browser&&browser.runtime&&browser.runtime.sendNativeMessage){const t=await browser.runtime.sendNativeMessage("omnivore",{message:ACTIONS.GetAuthToken});t.authToken&&(e=t.authToken)}return new Promise((e=>{const n=new XMLHttpRequest;n.onreadystatechange=function(){if(4===n.readyState&&200===n.status){const{data:s}=JSON.parse(n.response);s.me?(o({postInstallClickComplete:!0}),e(!0)):(browserApi.tabs.sendMessage(r,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Loading..."}}),browserApi.tabs.sendMessage(r,{action:ACTIONS.ShowMessage,payload:{text:"",type:"error",errorCode:401,url:t}}),e(null))}};const i=JSON.stringify({query:"{me{id}}"});n.open("POST",s+"graphql",!0),a(n),n.send(i)}))}))}function u(e){new Promise((e=>{browserApi.tabs.query({active:!0,currentWindow:!0},(function(t){e(t[0]||null)}))})).then((t=>{browserApi.tabs.sendMessage(t.id,{action:ACTIONS.Ping},(async function(s){if(s&&s.pong)await d(t.id)&&e(t);else{const s=browserApi.runtime.getManifest().content_scripts,n=[...s[0].js,...s[1].js];!function(s,n,o){function r(e,t,s){return function(){browserScriptingApi.executeScript(e,t,s)}}let a=async function(){await d(t.id)&&e(t)};for(let e=n.length-1;e>=0;--e)a=r(s,{file:n[e]},a);null!==a&&a()}(t.id,n)}}))}))}function g(e,t){let s="/images/toolbar/icon";if(ENV_IS_FIREFOX?s+="_firefox":ENV_IS_EDGE&&(s+="_edge"),e||(s+="_inactive"),("boolean"==typeof t?t:window.matchMedia("(prefers-color-scheme: dark)").matches)&&(s+="_dark"),ENV_IS_FIREFOX)return s+".svg";const n=["16","24","32","48"];ENV_IS_EDGE||n.push("19","38");const o={};for(let e=0;e<n.length;e++){const t=n[e];o[t]=s+"-"+t+".png"}return o}function b(e,t,s){browserActionApi.setIcon({path:g(t,s),tabId:e})}function f(e){const t=e&&e.id;t&&b(t,function(e){if("complete"!==e.status)return!1;const t=e.pendingUrl||e.url;return!(!t||!t.startsWith("https://")&&!t.startsWith("http://")||t.startsWith("https://omnivore.app/")&&t.startsWith("https://dev.omnivore.app/"))}(e))}browserApi.tabs.onActivated.addListener((({tabId:e})=>{!function t(){browserApi.tabs.get(e,(function(e){browserApi.runtime.lastError&&setTimeout(t,150),f(e)}))}()})),browserApi.tabs.onUpdated.addListener(((e,t,s)=>{t.status&&s&&s.active&&f(s)})),browserApi.tabs.onRemoved.addListener((e=>{!function(e){new Promise((e=>{browserApi.storage.local.get(null,(t=>{e(t||{})}))})).then((function(t){const s=[],n=Object.keys(t),o=e+"_saveInProgress";for(let e=0;e<n.length;e++){const t=n[e];t.startsWith(o)&&s.push(t)}0!==s.length&&r(s)}))}(e)})),browserActionApi.onClicked.addListener((function(){u((function(e){!function(e){function t(t,s){browserApi.tabs.get(e,(e=>{"complete"!==e.status?(browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Page loading..."}}),s&&"function"==typeof s&&s()):(t&&"function"==typeof t&&t(),l(e))}))}p(e),t(null,(()=>{!function(e,t,s,n=1e3,o=10500){const r=setInterval(e,n),a=setTimeout((()=>{clearInterval(r),t()}),o);s&&"function"==typeof s&&s(r,a)}((()=>{t((()=>{p(e)}))}),(()=>{p(e),browserApi.tabs.get(e,(e=>{l(e)}))}),((t,s)=>{const n={};n[e+"_saveInProgress"]=t,n[e+"_saveInProgressTimeoutId_"+t]=s,o(n)}))}))}(e.id)}))})),browserApi.runtime.onMessage.addListener(((e,t,s)=>{if(e.forwardToTab)return delete e.forwardToTab,void browserApi.tabs.sendRequest(t.tab.id,e);e.action===ACTIONS.RefreshDarkMode&&b(t.tab.id,e.payload.value)})),browserActionApi.setIcon({path:g(!0)}),browserApi.contextMenus.create({id:"log-selection",title:"Save to Omnivore",contexts:["link"],onclick:async function(e){u((async function(t){await async function(e,t){return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Saving..."}}),new Promise(((n,o)=>{const r=new XMLHttpRequest;r.open("POST",s+"graphql",!0),a(r),r.onerror=e=>{n(null)},r.onload=t=>{try{c(e,r)}catch(e){console.log("response error",e)}n({})};const i=JSON.stringify({query:CREATE_ARTICLE_SAVING_REQUEST_QUERY,variables:{input:{url:t}}});r.send(i)})).catch((e=>{console.error("error saving url",e)}))}(t,e.linkUrl)}))}})})(); |