const $ = (id) => document.getElementById(id); const urlInput = $('server-url'); const tokenInput = $('api-token'); const jUrl = $('jira-url'); const jEmail = $('jira-email'); const jToken = $('jira-token'); const jBoards = $('jira-boards'); const feedback = $('feedback'); const stripUrl = (v) => (v || '').trim().replace(/\/+$/, ''); function originPattern(url) { try { return `${new URL(url).origin}/*`; } catch { return null; } } function show(state, text) { feedback.dataset.state = state; feedback.textContent = text; } function parseBoards(v) { return (v || '').split(',').map(s => s.trim()).filter(Boolean); } async function load() { const { serverUrl, token, jira } = await chrome.storage.local.get(['serverUrl', 'token', 'jira']); if (serverUrl) urlInput.value = serverUrl; if (token) tokenInput.value = token; if (jira) { if (jira.baseUrl) jUrl.value = jira.baseUrl; if (jira.email) jEmail.value = jira.email; if (jira.apiToken) jToken.value = jira.apiToken; if (Array.isArray(jira.boardIds)) jBoards.value = jira.boardIds.join(', '); } } async function ensurePermission(pattern) { try { return await chrome.permissions.request({ origins: [pattern] }); } catch { return false; } } async function save(e) { e.preventDefault(); const serverUrl = stripUrl(urlInput.value); const token = tokenInput.value.trim(); const pattern = originPattern(serverUrl); if (!pattern) return show('error', 'Enter a valid server URL, e.g. https://forge.mycloud.dp.ua'); if (!token) return show('error', 'Paste a sync token (starts with fg_).'); if (!(await ensurePermission(pattern))) return show('error', 'Permission for the FORGE origin was denied.'); // Jira is optional; only persist + request permission when a base URL is given. const jiraBase = stripUrl(jUrl.value); let jira = null; if (jiraBase) { const jPattern = originPattern(jiraBase); if (!jPattern) return show('error', 'Enter a valid Jira base URL, e.g. https://support.dataart.com'); if (!(await ensurePermission(jPattern))) return show('error', 'Permission for the Jira origin was denied.'); jira = { baseUrl: jiraBase, email: jEmail.value.trim(), apiToken: jToken.value.trim(), boardIds: parseBoards(jBoards.value), jql: '', }; } await chrome.storage.local.set({ serverUrl, token, jira }); show('ok', jira && jira.boardIds.length ? 'Saved. Sync from the popup — SNOW then Jira.' : 'Saved. You can sync from the toolbar popup now.'); } async function test() { const serverUrl = stripUrl(urlInput.value); const pattern = originPattern(serverUrl); if (!pattern) return show('error', 'Enter a valid server URL first.'); if (!(await ensurePermission(pattern))) return show('error', 'Permission for that origin was denied.'); try { const res = await fetch(`${serverUrl}/healthz`); if (res.ok) show('ok', 'FORGE server reachable ✓'); else show('error', `Server responded ${res.status}.`); } catch { show('error', 'Could not reach the server.'); } } $('form').addEventListener('submit', save); $('test').addEventListener('click', test); load();