feat: add reset synced data button to settings

This commit is contained in:
Davide Scaini
2026-04-24 15:45:51 +02:00
parent f054869b04
commit c1e4ab5af7
2 changed files with 45 additions and 1 deletions
+38 -1
View File
@@ -4,7 +4,7 @@ import {
ActivityIndicator, Platform, Pressable, ScrollView, StyleSheet, ActivityIndicator, Platform, Pressable, ScrollView, StyleSheet,
Text, TextInput, View, Text, TextInput, View,
} from 'react-native'; } from 'react-native';
import { getSetting, setSetting, useSetting } from '@/db/queries'; import { deleteRemoteActivities, getSetting, setSetting, useSetting } from '@/db/queries';
export default function SettingsScreen() { export default function SettingsScreen() {
const db = useSQLiteContext(); const db = useSQLiteContext();
@@ -23,6 +23,9 @@ export default function SettingsScreen() {
const [connecting, setConnecting] = useState(false); const [connecting, setConnecting] = useState(false);
const [connectMsg, setConnectMsg] = useState<{ ok: boolean; text: string } | null>(null); const [connectMsg, setConnectMsg] = useState<{ ok: boolean; text: string } | null>(null);
const [resetArmed, setResetArmed] = useState(false);
const [resetMsg, setResetMsg] = useState<string | null>(null);
async function save() { async function save() {
await setSetting(db, 'instance_url', instanceUrl.trim()); await setSetting(db, 'instance_url', instanceUrl.trim());
await setSetting(db, 'handle', handle.trim()); await setSetting(db, 'handle', handle.trim());
@@ -71,6 +74,17 @@ export default function SettingsScreen() {
setConnectMsg(null); 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; const isConnected = !!storedToken;
return ( return (
@@ -160,6 +174,22 @@ export default function SettingsScreen() {
</Section> </Section>
)} )}
<Section title="Data">
<Pressable
style={[styles.resetButton, resetArmed && styles.resetButtonArmed]}
onPress={resetSyncedData}
onBlur={() => setResetArmed(false)}
>
<Text style={[styles.resetText, resetArmed && styles.resetTextArmed]}>
{resetArmed ? 'Tap again to confirm' : 'Reset synced data'}
</Text>
</Pressable>
{resetMsg && <Text style={styles.msgOk}>{resetMsg}</Text>}
<Text style={styles.hint}>
Removes all activities synced from the instance. Locally imported files are kept.
</Text>
</Section>
<Section title="About"> <Section title="About">
<Row label="Version" value="0.1.0 (Phase 0.5)" /> <Row label="Version" value="0.1.0 (Phase 0.5)" />
<Row label="Schema" value="BAS 1.0" /> <Row label="Schema" value="BAS 1.0" />
@@ -252,4 +282,11 @@ const styles = StyleSheet.create({
disconnectText: { color: '#71717a', fontSize: 14 }, disconnectText: { color: '#71717a', fontSize: 14 },
msgOk: { color: '#86efac', fontSize: 13, paddingHorizontal: 12, paddingBottom: 10 }, msgOk: { color: '#86efac', fontSize: 13, paddingHorizontal: 12, paddingBottom: 10 },
msgErr: { color: '#fca5a5', 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' },
}); });
+7
View File
@@ -103,6 +103,13 @@ export async function upsertRemoteActivity(
return result.changes > 0; return result.changes > 0;
} }
export async function deleteRemoteActivities(
db: ReturnType<typeof useSQLiteContext>,
): Promise<number> {
const result = await db.runAsync(`DELETE FROM activities WHERE origin = 'remote'`);
return result.changes;
}
// ── Settings ─────────────────────────────────────────────────────────────── // ── Settings ───────────────────────────────────────────────────────────────
export async function getSetting( export async function getSetting(