diff --git a/mobile/app/(tabs)/settings.tsx b/mobile/app/(tabs)/settings.tsx index a23e204..b672dfc 100644 --- a/mobile/app/(tabs)/settings.tsx +++ b/mobile/app/(tabs)/settings.tsx @@ -4,7 +4,7 @@ import { ActivityIndicator, Platform, Pressable, ScrollView, StyleSheet, Text, TextInput, View, } from 'react-native'; -import { getSetting, setSetting, useSetting } from '@/db/queries'; +import { deleteRemoteActivities, getSetting, setSetting, useSetting } from '@/db/queries'; export default function SettingsScreen() { const db = useSQLiteContext(); @@ -23,6 +23,9 @@ export default function SettingsScreen() { const [connecting, setConnecting] = useState(false); const [connectMsg, setConnectMsg] = useState<{ ok: boolean; text: string } | null>(null); + const [resetArmed, setResetArmed] = useState(false); + const [resetMsg, setResetMsg] = useState(null); + async function save() { await setSetting(db, 'instance_url', instanceUrl.trim()); await setSetting(db, 'handle', handle.trim()); @@ -71,6 +74,17 @@ export default function SettingsScreen() { setConnectMsg(null); } + async function resetSyncedData() { + if (!resetArmed) { + setResetArmed(true); + return; + } + const n = await deleteRemoteActivities(db); + setResetArmed(false); + setResetMsg(`Removed ${n} synced ${n === 1 ? 'activity' : 'activities'}`); + setTimeout(() => setResetMsg(null), 3000); + } + const isConnected = !!storedToken; return ( @@ -160,6 +174,22 @@ export default function SettingsScreen() { )} +
+ setResetArmed(false)} + > + + {resetArmed ? 'Tap again to confirm' : 'Reset synced data'} + + + {resetMsg && {resetMsg}} + + Removes all activities synced from the instance. Locally imported files are kept. + +
+
@@ -252,4 +282,11 @@ const styles = StyleSheet.create({ disconnectText: { color: '#71717a', fontSize: 14 }, msgOk: { color: '#86efac', fontSize: 13, paddingHorizontal: 12, paddingBottom: 10 }, msgErr: { color: '#fca5a5', fontSize: 13, paddingHorizontal: 12, paddingBottom: 10 }, + resetButton: { + margin: 12, paddingVertical: 10, alignItems: 'center', + borderRadius: 8, borderWidth: 1, borderColor: '#3f3f46', + }, + resetButtonArmed: { borderColor: '#ef4444', backgroundColor: '#1c0a0a' }, + resetText: { color: '#71717a', fontSize: 14 }, + resetTextArmed: { color: '#ef4444', fontWeight: '600' }, }); diff --git a/mobile/db/queries.ts b/mobile/db/queries.ts index 87470ae..7c9443e 100644 --- a/mobile/db/queries.ts +++ b/mobile/db/queries.ts @@ -103,6 +103,13 @@ export async function upsertRemoteActivity( return result.changes > 0; } +export async function deleteRemoteActivities( + db: ReturnType, +): Promise { + const result = await db.runAsync(`DELETE FROM activities WHERE origin = 'remote'`); + return result.changes; +} + // ── Settings ─────────────────────────────────────────────────────────────── export async function getSetting(