From 23f3144dc4059585753196d17a1cb24cc10f5107 Mon Sep 17 00:00:00 2001 From: le king fu Date: Thu, 9 Apr 2026 09:01:29 -0400 Subject: [PATCH] fix: refresh Android widget after sync push and pull (#65) The sync client writes directly to the DB via drizzle, bypassing the repository functions that normally trigger syncWidgetData(). As a result, changes coming from the web (or any remote source) never refreshed the home screen widget. Call syncWidgetData() once at the end of pullChanges (after all remote changes are applied) and after a successful pushChanges (to reflect synced state). Single call per cycle avoids spamming widget updates. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/services/syncClient.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/services/syncClient.ts b/src/services/syncClient.ts index 040dcaa..711eb9f 100644 --- a/src/services/syncClient.ts +++ b/src/services/syncClient.ts @@ -4,6 +4,7 @@ import { syncOutbox, lists, tasks, tags, taskTags } from '@/src/db/schema'; import { useSettingsStore } from '@/src/stores/useSettingsStore'; import { getAccessToken } from '@/src/lib/authToken'; import { randomUUID } from '@/src/lib/uuid'; +import { syncWidgetData } from '@/src/services/widgetSync'; const SYNC_API_BASE = 'https://liste.lacompagniemaximus.com'; const INBOX_ID = '00000000-0000-0000-0000-000000000001'; @@ -97,6 +98,8 @@ export async function pushChanges(): Promise { .set({ syncedAt: now }) .where(eq(syncOutbox.id, entry.id)); } + // Refresh widget after a successful push to reflect the synced state + syncWidgetData().catch(() => {}); } } @@ -118,9 +121,11 @@ export async function pullChanges(since: string): Promise { const data: SyncPullResponse = await res.json(); + let appliedChanges = 0; for (const change of data.changes) { try { await applyChange(change); + appliedChanges++; } catch (err) { console.warn(`[sync] failed to apply change for ${change.entity_type}/${change.entity_id}:`, err); } @@ -130,6 +135,11 @@ export async function pullChanges(since: string): Promise { if (data.sync_token) { useSettingsStore.getState().setLastSyncAt(data.sync_token); } + + // Refresh widget once after applying all remote changes + if (appliedChanges > 0) { + syncWidgetData().catch(() => {}); + } } catch (err) { console.warn('[sync] pull error:', err); }