From ba5df5f469940e888148181bf71dc990d5a67097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D0=B7=D0=BB=D1=8E=D0=B4=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=94=D0=BC=D0=B8=D1=82=D1=80?= =?UTF-8?q?=D0=B8=D0=B5=D0=B2=D0=B8=D1=87?= Date: Tue, 2 May 2023 11:57:09 +0300 Subject: [PATCH] feat: A simple proof of concept --- README.md | 5 +++-- assets/icon-128.png | Bin 0 -> 5978 bytes assets/icon-34.png | Bin 0 -> 1217 bytes background.js | 39 +++++++++++++++++++++++++++++++++++++++ contentScript.js | 19 +++++++++++++++++++ manifest.json | 24 ++++++++++++++++++++++++ popup.html | 13 +++++++++++++ popup.js | 15 +++++++++++++++ 8 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 assets/icon-128.png create mode 100644 assets/icon-34.png create mode 100644 background.js create mode 100644 contentScript.js create mode 100644 manifest.json create mode 100644 popup.html create mode 100644 popup.js diff --git a/README.md b/README.md index 2101d79..f012c73 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# articles-ive-read -A vanilla js chrome extension to save articles you've read to a github gist. +# Articles I've read + +A Vanilla JS chrome extension to save articles you've read to a github gist. diff --git a/assets/icon-128.png b/assets/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d7ef5066ad1e908774e177d6438988cf5d2eda GIT binary patch literal 5978 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 literal 0 HcmV?d00001 diff --git a/assets/icon-34.png b/assets/icon-34.png new file mode 100644 index 0000000000000000000000000000000000000000..973b2e7a3df190f0bd5519973eb977d06da03448 GIT binary patch literal 1217 zcmV;y1U~zTP)Px(dr3q=R9Hvt*I!IqRU8NK@BPz%l(sMm(hdqZA!7_3Fa{$G7$N8)Ta;vGTe8GN zO?=qH7Pbh8%My{HF43UjVaXEXgHe&FlWlHM1hz#+=_Fx;O~fU%9V>iJ>I!q$G!v)4Z8_}Lf z;?k@nJ*~SVf;@D{ z(L0)oaa%mBro^gufmuo#+`TR(kI@> z)uI!*W!7Tj1_x9MFK7{I_!|U6Qm?k*aN0${0B}5slWjYuNX&+W>C zA_c@NJt2_H{*Q1prxSPv;5ZUTPVUbB?1!^=Rt;IX{qh;XiOhC>57_OHk}e-1K(L$n z+@JbCSbZYVLgr1w&}`2IG68|(VL9<-_La`#t54*SM~ZouOq54L@pww(3fY=9gNPC= znH0P=YX-4ARAJl}C(5IeGsw>fJ-%xO5hYm9M3})r)F-?fi39DEZ@^PhvsfE-B0diT zZowH5go;&wijl7kBqBkWqNo#j0(pE@WD6F+%|BYJK;Smt$AYHBLX6LYXk%)(}#Lyl!402+1z+Oix-q?Bl+$tHlR+9eKBTl;>> zp+lKwiXvbz7{IbTydDnYw8#+`PWse)fnu%hAoMoatGe3QI3q9VuF+N-&u+BqQ=h!0fEZ~ zNkf~cRqB*VS)4!+4C`T8*2DP}Dj9fA0O#^hvRDNVQv82XnM|S}2!ggxS|7~JQDcE5 z1fRFp*m`(zrCr61`QSL3B50<^*fLaJSYPN9eB!%^eq{lYAcbCItFfZ6aT_miQqVMa zwZG-&VzaWMrc9n^NSPqzx=qdFr8^q31RuXH5Q3zHYXhf$uPkWV { + chrome.storage.local.get(["gistId", "token"], (result) => { + const gistId = result.gistId; + const token = result.token; + if (gistId && token) { + updateGist(message.title, message.url, gistId, token); + } + }); +}); + +async function updateGist(title, url, gistId, token) { + const headers = new Headers(); + headers.append("Authorization", `token ${token}`); + headers.append("Content-Type", "application/json"); + + const response = await fetch(`https://api.github.com/gists/${gistId}`, { + method: "GET", + headers: headers, + }); + + const gist = await response.json(); + const content = gist.files["articles-ive-read.md"].content; + + const updatedContent = `- [${title}](${url})\n` + content; + + const body = JSON.stringify({ + files: { + "articles-ive-read.md": { + content: updatedContent, + }, + }, + }); + + await fetch(`https://api.github.com/gists/${gistId}`, { + method: "PATCH", + headers: headers, + body: body, + }); +} diff --git a/contentScript.js b/contentScript.js new file mode 100644 index 0000000..d930e4f --- /dev/null +++ b/contentScript.js @@ -0,0 +1,19 @@ +const overlayButton = document.createElement("button"); +overlayButton.innerText = "Save Article"; +overlayButton.style.position = "fixed"; +overlayButton.style.bottom = "10px"; +overlayButton.style.right = "10px"; +overlayButton.style.zIndex = "9999"; +overlayButton.style.backgroundColor = "white"; +overlayButton.style.border = "1px solid black"; +overlayButton.style.padding = "5px"; +overlayButton.style.borderRadius = "5px"; + +document.body.appendChild(overlayButton); + +overlayButton.addEventListener("click", () => { + const title = document.title; + const url = window.location.href; + + chrome.runtime.sendMessage({ title, url }); +}); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..9ffed2a --- /dev/null +++ b/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 3, + "name": "Articles I've read", + "description": "Save article titles and URLs to a GitHub Gist", + "version": "0.69", + "action": { + "default_popup": "popup.html", + "default_icon": "assets/icon-34.png" + }, + "icons": { + "128": "assets/icon-128.png" + }, + "content_scripts": [ + { + "matches": [""], + "js": ["contentScript.js"], + "run_at": "document_end" + } + ], + "permissions": ["activeTab", "scripting", "storage"], + "background": { + "service_worker": "background.js" + } +} diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..f156c7a --- /dev/null +++ b/popup.html @@ -0,0 +1,13 @@ + + + +

Save Article to Gist

+ + +
+ + + + + + diff --git a/popup.js b/popup.js new file mode 100644 index 0000000..47bd55a --- /dev/null +++ b/popup.js @@ -0,0 +1,15 @@ +const gistIdInput = document.getElementById("gistId"); +const tokenInput = document.getElementById("token"); + +chrome.storage.local.get(["gistId", "token"], (result) => { + gistIdInput.value = result.gistId || ""; + tokenInput.value = result.token || ""; +}); + +gistIdInput.addEventListener("blur", () => { + chrome.storage.local.set({ gistId: gistIdInput.value }); +}); + +tokenInput.addEventListener("blur", () => { + chrome.storage.local.set({ token: tokenInput.value }); +});