feat: add reset synced data button to settings
This commit is contained in:
@@ -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' },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user