66 lines
1.7 KiB
JavaScript
66 lines
1.7 KiB
JavaScript
const DEFAULT_BASE_URL = 'http://localhost:3000';
|
|
|
|
function normalizeBaseUrl(rawBaseUrl) {
|
|
if (typeof rawBaseUrl !== 'string' || rawBaseUrl.trim().length === 0) {
|
|
return DEFAULT_BASE_URL;
|
|
}
|
|
|
|
return rawBaseUrl.trim().replace(/\/+$/, '');
|
|
}
|
|
|
|
async function getRecipeManagerBaseUrl() {
|
|
const { recipeManagerBaseUrl } = await chrome.storage.sync.get({
|
|
recipeManagerBaseUrl: DEFAULT_BASE_URL,
|
|
});
|
|
|
|
return normalizeBaseUrl(recipeManagerBaseUrl);
|
|
}
|
|
|
|
async function sendUrlToRecipeManager(pageUrl) {
|
|
const baseUrl = await getRecipeManagerBaseUrl();
|
|
const importUrl = `${baseUrl}/api/import/url`;
|
|
|
|
const response = await fetch(importUrl, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ url: pageUrl }),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const responseText = await response.text();
|
|
throw new Error(`Import request failed (${response.status}): ${responseText}`);
|
|
}
|
|
|
|
return response.json();
|
|
}
|
|
|
|
chrome.runtime.onInstalled.addListener(() => {
|
|
chrome.contextMenus.create({
|
|
id: 'send-to-recipe-manager',
|
|
title: 'Send to Recipe Manager',
|
|
contexts: ['page'],
|
|
});
|
|
});
|
|
|
|
chrome.contextMenus.onClicked.addListener((info, tab) => {
|
|
if (info.menuItemId !== 'send-to-recipe-manager' || !tab?.url) {
|
|
return;
|
|
}
|
|
|
|
sendUrlToRecipeManager(tab.url)
|
|
.then((payload) => {
|
|
console.info('[Recipe Manager Extension] Import request sent successfully', {
|
|
sourceUrl: tab.url,
|
|
success: payload?.success ?? true,
|
|
});
|
|
})
|
|
.catch((error) => {
|
|
console.error('[Recipe Manager Extension] Failed to import URL', {
|
|
sourceUrl: tab.url,
|
|
error: error instanceof Error ? error.message : String(error),
|
|
});
|
|
});
|
|
});
|