diff --git a/packages/extension/src/background/index.ts b/packages/extension/src/background/index.ts index 74f0772..b43ad29 100644 --- a/packages/extension/src/background/index.ts +++ b/packages/extension/src/background/index.ts @@ -201,6 +201,12 @@ browser.action.onClicked.addListener(async (tab) => { if (tab.id == null) return; try { + // first run: the toolbar click takes you to settings instead of the picker + const settings = await getSettings(); + if (!settings.token || !settings.defaultProjectId) { + await browser.runtime.openOptionsPage(); + return; + } await startPicker(tab.id); } catch (error) { console.error("[ltt] failed to start picker:", error); @@ -332,6 +338,11 @@ return { ok: true, data: { stepCount: buffer.events.length } }; } + case "open_options": { + await browser.runtime.openOptionsPage(); + return { ok: true }; + } + case "list_projects": { try { const client = await getHttpClient(); diff --git a/packages/extension/src/content/overlay/NoteComposer.vue b/packages/extension/src/content/overlay/NoteComposer.vue index ef87f32..f2cf10a 100644 --- a/packages/extension/src/content/overlay/NoteComposer.vue +++ b/packages/extension/src/content/overlay/NoteComposer.vue @@ -23,6 +23,8 @@ const submitting = ref(false); const error = ref(null); const titleInput = ref(); +/** null = checked and fine; string = what the user must fix in settings first */ +const settingsProblem = ref(null); onMounted(() => { titleInput.value?.focus(); @@ -31,6 +33,18 @@ }); onMounted(async () => { + const settings = (await browser.runtime.sendMessage({ type: "settings_get" })) as { + ok: boolean; + data?: { token: string | null; defaultProjectId: string | null }; + }; + if (!settings?.data?.token) { + settingsProblem.value = "Not signed in — open the extension settings to log in"; + } else if (!settings.data.defaultProjectId) { + settingsProblem.value = "No default project selected — open the extension settings"; + } +}); + +onMounted(async () => { const response = (await browser.runtime.sendMessage({ type: "capture" })) as { ok: boolean; data?: { dataUrl: string }; @@ -104,6 +118,10 @@ } } +async function openSettings() { + await browser.runtime.sendMessage({ type: "open_options" }).catch(() => {}); +} + function onKeyDown(event: KeyboardEvent) { if (event.key === "Escape") { event.preventDefault(); @@ -130,6 +148,14 @@ +
+ + {{ settingsProblem }} + +
+
@@ -254,6 +280,23 @@ color: var(--color-danger, #f7768e); font-size: 12px; } +.composer-warn { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 10px; + border: 2px solid var(--color-warning, #e0af68); + color: var(--color-warning, #e0af68); + font-size: 12px; + text-transform: none; + letter-spacing: normal; +} +.composer-btn-warn { + margin-left: auto; + background: transparent; + color: inherit; + border-color: var(--color-warning, #e0af68); +} .composer-actions { display: flex; justify-content: flex-end;