User can manually trigger sync
Why it matters
When sync is fully automatic with no manual escape hatch, users who suspect stale data — a merchant checking a just-placed order, a field technician pulling the latest work ticket — have no way to force a refresh and must kill the app or wait for an opaque background timer. This produces 'the app is broken' perception even when the sync engine is healthy, and it blocks power users from recovering from transient failures. The user-experience taxon depends on giving users visible control over system state.
Severity rationale
Low because automatic sync still works; the gap is user confidence and recovery, not data loss or security.
Remediation
Add a sync control to the primary screen — either a pull-to-refresh gesture on the main list or an explicit 'Sync Now' button in the header — that calls your sync function, shows a spinner while running, and surfaces the last-sync timestamp. Wire it in src/components/SyncButton.tsx and keep it disabled while a sync is in flight to prevent concurrent runs.
<TouchableOpacity onPress={handleSync} disabled={isSyncing}>
{isSyncing ? <ActivityIndicator /> : <Text>Sync Now</Text>}
</TouchableOpacity>
{lastSyncTime && <Text>Last synced: {lastSyncTime}</Text>}
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Mobile Offline & Storage Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
Taxons
History
- 2026-04-18·v1.0.0·Initial import from mobile-offline-storage·automated