mirror of
https://github.com/Andre-Bzk/AnyClip.git
synced 2026-11-15 09:33:08 +01:00
- Space-Verlust behoben: refreshSpaces() speichert vor dem API-Call nur noch apiBase/apiKey, nicht die leere spaceId - Button "Auswahl sichern" → "Einstellungen sichern": speichert jetzt nur die Einstellungen, kein Web-Clip mehr - Kontextmenü-Fehler werden per Browser-Notification angezeigt (notifications-Permission ergänzt) - Verständliche Fehlermeldungen bei nicht erreichbarem Anytype (TypeError) und falschem API-Key (401)
135 lines
3.4 KiB
JavaScript
135 lines
3.4 KiB
JavaScript
const form = {
|
|
apiBase: document.getElementById("apiBase"),
|
|
apiKey: document.getElementById("apiKey"),
|
|
spaceId: document.getElementById("spaceId"),
|
|
objectType: document.getElementById("objectType")
|
|
};
|
|
|
|
const status = document.getElementById("status");
|
|
|
|
document.getElementById("refreshSpaces").addEventListener("click", refreshSpaces);
|
|
document.getElementById("savePage").addEventListener("click", () => saveClip("full"));
|
|
document.getElementById("saveSelection").addEventListener("click", saveSettingsOnly);
|
|
|
|
bootstrap().catch(showError);
|
|
|
|
async function bootstrap() {
|
|
const settings = await browser.runtime.sendMessage({ type: "load-settings" });
|
|
populateForm(settings);
|
|
await refreshSpaces(settings.spaceId);
|
|
}
|
|
|
|
function populateForm(settings) {
|
|
form.apiBase.value = settings.apiBase || "";
|
|
form.apiKey.value = settings.apiKey || "";
|
|
form.objectType.value = settings.objectType || "page";
|
|
}
|
|
|
|
async function saveSettingsOnly() {
|
|
await persistForm();
|
|
setStatus("Einstellungen gespeichert.");
|
|
}
|
|
|
|
async function refreshSpaces(selectedSpaceId = form.spaceId.value) {
|
|
setStatus("Lade Spaces ...");
|
|
await browser.runtime.sendMessage({
|
|
type: "save-settings",
|
|
payload: {
|
|
apiBase: form.apiBase.value.trim(),
|
|
apiKey: form.apiKey.value.trim()
|
|
}
|
|
});
|
|
|
|
try {
|
|
const response = await browser.runtime.sendMessage({ type: "list-spaces" });
|
|
const spaces = response?.spaces || [];
|
|
|
|
form.spaceId.innerHTML = "";
|
|
|
|
if (spaces.length === 0) {
|
|
const option = document.createElement("option");
|
|
option.value = "";
|
|
option.textContent = "Keine Spaces gefunden";
|
|
form.spaceId.appendChild(option);
|
|
setStatus("Keine Spaces verfügbar.");
|
|
return;
|
|
}
|
|
|
|
spaces.forEach((space) => {
|
|
const option = document.createElement("option");
|
|
option.value = space.id || space.space_id || "";
|
|
option.textContent = space.name || option.value;
|
|
option.selected = option.value === selectedSpaceId;
|
|
form.spaceId.appendChild(option);
|
|
});
|
|
|
|
if (!form.spaceId.value) {
|
|
form.spaceId.selectedIndex = 0;
|
|
}
|
|
|
|
await persistForm();
|
|
setStatus("Spaces geladen.");
|
|
} catch (error) {
|
|
showError(error);
|
|
}
|
|
}
|
|
|
|
async function saveClip(mode) {
|
|
setStatus("Sichere Webseite ...");
|
|
|
|
try {
|
|
const result = await browser.runtime.sendMessage({
|
|
type: "save-active-tab",
|
|
payload: {
|
|
mode,
|
|
settings: readForm()
|
|
}
|
|
});
|
|
|
|
const objectId = result?.created?.id || result?.created?.object?.id;
|
|
const suffix = objectId ? ` Objekt-ID: ${objectId}` : "";
|
|
setStatus(`In Anytype gespeichert.${suffix}`);
|
|
window.close();
|
|
} catch (error) {
|
|
showError(error);
|
|
}
|
|
}
|
|
|
|
async function persistForm() {
|
|
await browser.runtime.sendMessage({
|
|
type: "save-settings",
|
|
payload: readForm()
|
|
});
|
|
}
|
|
|
|
function readForm() {
|
|
return {
|
|
apiBase: form.apiBase.value.trim(),
|
|
apiKey: form.apiKey.value.trim(),
|
|
spaceId: form.spaceId.value,
|
|
objectType: form.objectType.value
|
|
};
|
|
}
|
|
|
|
function showError(error) {
|
|
setStatus(formatErrorMessage(error));
|
|
}
|
|
|
|
function formatErrorMessage(error) {
|
|
if (error instanceof TypeError) {
|
|
return "Anytype ist nicht erreichbar. Ist Anytype Desktop gestartet? Stimmt die API-URL?";
|
|
}
|
|
|
|
const msg = error?.message || "";
|
|
|
|
if (msg.includes("(401)")) {
|
|
return "Zugriff verweigert. Bitte den API-Key prüfen.";
|
|
}
|
|
|
|
return msg || String(error);
|
|
}
|
|
|
|
function setStatus(message) {
|
|
status.textContent = message;
|
|
}
|