From 1d973f1be14214f06ae851ee74e006a66e25bfb5 Mon Sep 17 00:00:00 2001 From: seanr707 Date: Wed, 18 Dec 2024 17:19:20 -0500 Subject: [PATCH] initial commit --- background.js | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ content.js | 7 ++++ icons/48.png | Bin 0 -> 6491 bytes manifest.json | 40 +++++++++++++++++++++ options.html | 17 +++++++++ options.js | 16 +++++++++ 6 files changed, 174 insertions(+) create mode 100644 background.js create mode 100644 content.js create mode 100644 icons/48.png create mode 100644 manifest.json create mode 100644 options.html create mode 100644 options.js diff --git a/background.js b/background.js new file mode 100644 index 0000000..6f71ebe --- /dev/null +++ b/background.js @@ -0,0 +1,94 @@ +async function Clicked() { + const { token, url } = await browser.storage.local.get(['token', 'url']); + console.log(`Token: ${token}, URL: ${url}`); + /* + let site_url = document.URL.endsWith('/') ? + document.URL.slice(0, -1) : + document.URL; + */ + // let mealie = "http://localhost:8080"; + + // Pull current site's URL + let [tab] = await browser.tabs.query({active: true, currentWindow: true}); + let site_url = tab.url.endsWith('/') ? + tab.url.slice(0, -1) : + tab.url; + + let mealie = url; + // let group_slug = "" // Change this to your group slug. You can obtain this from your URL after logging-in to Mealie + // let use_keywords= "&use_keywords=0" // Optional - use keywords from recipe - update to "" if you don't want that + // let edity = "&edit=0" // Optional - keep in edit mode - update to "" if you don't want that + + if (mealie.slice(-1) === "/") { + mealie = mealie.slice(0, -1) + } + let dest = mealie + "/recipe/create/url?recipe_import_url=" + site_url; + + // Send a message to the content script + browser.tabs.query({active: true, currentWindow: true}, (tabs) => { + console.log("Sending message to content script"); + browser.tabs.sendMessage(tabs[0].id, `Token: ${token}, URL: ${url}`).then(() => { + console.log("Message sent to content script"); + }).catch((error) => { + console.error("Error sending message to content script:", error); + }); + }); + + /* + // Open a new tab with the destination URL + browser.tabs.create({ url: dest }).then(() => { + console.log(`New tab opened with URL: ${dest}`); + }).catch((error) => { + console.error("Error opening new tab:", error); + }); + */ + + // Submit POST request + const postUrl = `${mealie}/api/recipes/create/url`; + const requestBody = { + includeTags: true, + url: site_url + }; + + const response = await fetch(postUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${token}` + }, + body: JSON.stringify(requestBody) + }); + + if (response.ok) { + const responseData = await response.json(); + console.log("POST request successful:", responseData); + } else { + const errorText = await response.text(); + console.error("POST request failed:", response.statusTextm, errorText); + } +} + +// background.js + +// Create a context menu item +browser.contextMenus.create({ + id: "clickHere", + title: "Add to Mealie", + contexts: ["all"], +}); + +// Add a listener for the context menu item +browser.contextMenus.onClicked.addListener((info, tab) => { + console.log("click 1"); + if (info.menuItemId === "clickHere") { + console.log("click 2"); + Clicked(); + } +}); + +// Add a listener for the keyboard shortcut +browser.commands.onCommand.addListener((command) => { + if (command === "activateClick") { + Clicked(); + } +}); diff --git a/content.js b/content.js new file mode 100644 index 0000000..50362ec --- /dev/null +++ b/content.js @@ -0,0 +1,7 @@ +// content.js + +console.log("Content.js is loaded"); + +browser.runtime.onMessage.addListener((message) => { + console.log(`Received message: ${message}`); +}); diff --git a/icons/48.png b/icons/48.png new file mode 100644 index 0000000000000000000000000000000000000000..ac66efa0940dfcc23768a5ece983c6b981f7ef69 GIT binary patch literal 6491 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..8966999 --- /dev/null +++ b/manifest.json @@ -0,0 +1,40 @@ +{ + "manifest_version": 2, + "name": "Mealie", + "version": "1.0", + + "description": "Connects with a local Mealie instance.", + + "icons": { + "48": "icons/48.png" + }, + + "background": { + "scripts": ["background.js"] + }, + "permissions": [ + "webRequest", + "*://mealie.seans.pro/*", + "contextMenus", + "storage", + "activeTab" + ], + "commands": { + "activateClick": { + "suggested_key": { + "default": "Ctrl+Alt+M" + }, + "description": "Activates 'Clicked' function" + } + }, + "options_ui": { + "page": "options.html", + "open_in_tab": true + }, + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"] + } + ] +} \ No newline at end of file diff --git a/options.html b/options.html new file mode 100644 index 0000000..4f2a127 --- /dev/null +++ b/options.html @@ -0,0 +1,17 @@ + + + + + Mealie Extension Options + + +

Extension Options

+ +
+ +
+ + + + + diff --git a/options.js b/options.js new file mode 100644 index 0000000..534dac4 --- /dev/null +++ b/options.js @@ -0,0 +1,16 @@ +// options.js + +document.getElementById('save').addEventListener("click", async () => { + const token = document.getElementById('token').value; + const url = document.getElementById('url').value; + + await browser.storage.local.set({ token, url }); + alert('Options saved!'); +}); + +// Load saved settings if they exist +(async () => { + const { token, url } = await browser.storage.local.get(['token', 'url']); + if (token) document.getElementById('token').value = token; + if (url) document.getElementById('url').value = url; +})();