Overview
Context: The sync engine is fully implemented in the Python backend (nexanote/sync/). The Flutter app can trigger a sync via AppState.triggerSync() → POST /sync/trigger, and read the last sync report via ApiClient.getSyncStatus() → GET /sync/status (returns notes_pulled, notes_pushed, conflicts_resolved, duration_seconds).
The gap: All sync feedback is buried inside SettingsScreen. The rest of the app has no idea whether sync succeeded, failed, or produced conflicts. The NotebookSidebar header has a sync button that calls triggerSync() but gives no feedback at all.
This issue brings sync results into the main UI.
What needs to be done
Goal
When the user taps the sync button, they see visual feedback: a spinner while it runs, then a snackbar saying how many notes were pushed/pulled, and a warning if any conflicts were resolved — all without needing to open Settings.
Where to look
app/lib/widgets/notebook_sidebar.dart — sync button is here
app/lib/services/app_state.dart — triggerSync() method, add _lastSyncReport and _isSyncing
app/lib/services/api_client.dart — triggerSync() and getSyncStatus() already exist
app/lib/screens/settings_screen.dart — reference for how sync results are currently displayed
Testing steps
Related to: #8, #25, #26, #28
Overview
Context: The sync engine is fully implemented in the Python backend (
nexanote/sync/). The Flutter app can trigger a sync viaAppState.triggerSync()→POST /sync/trigger, and read the last sync report viaApiClient.getSyncStatus()→GET /sync/status(returnsnotes_pulled,notes_pushed,conflicts_resolved,duration_seconds).The gap: All sync feedback is buried inside
SettingsScreen. The rest of the app has no idea whether sync succeeded, failed, or produced conflicts. TheNotebookSidebarheader has a sync button that callstriggerSync()but gives no feedback at all.This issue brings sync results into the main UI.
What needs to be done
triggerSync()completes (inAppStateor where the sync button is pressed), callgetSyncStatus()and store the result inAppState(e.g., add_lastSyncReportfield)NotebookSidebar(notebook_sidebar.dart), after the sync button is tapped and completes, show aSnackBarwith a summary: e.g., "Sync complete — 3 pushed, 1 pulled" or "Sync failed"conflicts_resolved > 0, show a different message: "Sync complete —SnackBarwith "Sync failed — check your WebDAV settings"_isSyncingbool inAppState)Goal
When the user taps the sync button, they see visual feedback: a spinner while it runs, then a snackbar saying how many notes were pushed/pulled, and a warning if any conflicts were resolved — all without needing to open Settings.
Where to look
app/lib/widgets/notebook_sidebar.dart— sync button is hereapp/lib/services/app_state.dart—triggerSync()method, add_lastSyncReportand_isSyncingapp/lib/services/api_client.dart—triggerSync()andgetSyncStatus()already existapp/lib/screens/settings_screen.dart— reference for how sync results are currently displayedTesting steps
Related to: #8, #25, #26, #28