desktop: reminders reach you when the window isn't in front
CI & Build / Python lint (push) Successful in 2s
CI & Build / Build now, or wait for Android? (push) Successful in 2s
Android / Build, or is the channel already serving this? (push) Successful in 3s
Desktop (Tauri) / Build, or is the channel already serving this? (push) Successful in 3s
CI & Build / Web typecheck and unit tests (push) Successful in 9s
CI & Build / Python tests (push) Successful in 11s
CI & Build / integration (push) Successful in 36s
CI & Build / Build & push image (push) Skipped
Desktop (Tauri) / Web tests, clippy, Rust tests and rustfmt (push) Successful in 2m30s
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 2m38s
Desktop (Tauri) / Tauri desktop (Linux) (push) Successful in 3m38s
Desktop (Tauri) / Update manifest (push) Successful in 5s
Android / Kotlin + Rust (APK) (push) Successful in 8m45s

A Rust worker reads due reminders from the local store every 15 s and
announces each occurrence once: always to the main window as a toast, and
as a system notification (tauri-plugin-notification) when that window
isn't focused. The page no longer polls on the desktop; its Notification
went nowhere in WebKitGTK and its timer stopped with the window. The
Reminders page says what each surface actually does.

Core gains store::due_reminders, compared by instant, not by string.

Refs #5171

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-07 12:46:02 -04:00
co-authored by Claude Opus 5.5
parent 5989ffc1c6
commit df85535ea2
9 changed files with 942 additions and 25 deletions
+8 -3
View File
@@ -7,9 +7,16 @@ import AsyncState from "../components/AsyncState.vue";
import EmptyState from "../components/EmptyState.vue";
import NoteEditor from "../components/NoteEditor.vue";
import NoteGrid from "../components/NoteGrid.vue";
import { isDesktop } from "../desktop/bridge";
const reminders = useReminderStore();
// What this surface actually does with a due reminder. The desktop's worker raises
// system notifications while it runs; a browser tab can only alert while it is open.
const deliveryNote = isDesktop()
? "Due reminders show as system notifications while Inkwell is running, even minimised."
: "Due reminders pop up while this tab is open. The desktop and Android apps alert you in the background.";
const { items, loading, error, load } = useNoteList(() => reminders.fetchReminders(), "Couldn't load reminders.");
const { editing, open: openEditor, close: closeEditor, navigate: onNavigate } = useNoteEditor({
@@ -37,9 +44,7 @@ onMounted(load);
</button>
<span v-else-if="reminders.osEnabled" class="text-xs text-neutral-400">Notifications on ✓</span>
</div>
<p class="mb-5 text-xs text-neutral-400">
Due reminders pop up while Inkwell is open. Background alerts arrive with the desktop &amp; mobile apps.
</p>
<p class="mb-5 text-xs text-neutral-400">{{ deliveryNote }}</p>
<AsyncState :loading="loading" :error="error || undefined" error-title="Couldn't load reminders" @retry="load">
<EmptyState