recipe-manager/browser-extension/background.js

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),
});
});
});