diff --git a/src/database/db.ts b/src/database/db.ts index a6cfa21..f868e16 100644 --- a/src/database/db.ts +++ b/src/database/db.ts @@ -47,6 +47,15 @@ export async function getLatestMeasurement(): Promise { return rows.length > 0 ? (rows[0] as Measurement) : null } +export async function getMeasurementByDate(date: string): Promise { + const day = date.slice(0, 10) + const rows = await db!.getAllAsync( + "SELECT * FROM measurements WHERE measuredAt LIKE ? LIMIT 1", + [`${day}%`] + ) + return rows.length > 0 ? (rows[0] as Measurement) : null +} + export async function updateMeasurement(id: string, syncStatus: SyncStatus): Promise { await db!.runAsync( 'UPDATE measurements SET syncStatus = ?, updatedAt = ? WHERE id = ?', diff --git a/src/screens/NewMeasurementScreen.tsx b/src/screens/NewMeasurementScreen.tsx index b143cab..c1f433a 100644 --- a/src/screens/NewMeasurementScreen.tsx +++ b/src/screens/NewMeasurementScreen.tsx @@ -3,7 +3,7 @@ import { View, Text, Alert } from 'react-native' import { useFocusEffect } from '@react-navigation/native' import MeasurementForm from '../components/MeasurementForm' import { Measurement } from '../types' -import { initDatabase, insertMeasurement, getLatestMeasurement } from '../database/db' +import { initDatabase, insertMeasurement, getLatestMeasurement, getMeasurementByDate, upsertMeasurement } from '../database/db' type Props = { navigation: any @@ -29,7 +29,32 @@ export default function NewMeasurementScreen({ navigation }: Props) { const handleSubmit = async (m: Measurement) => { await initDatabase() - await insertMeasurement(m) + const existing = await getMeasurementByDate(m.measuredAt) + if (existing) { + Alert.alert( + 'Dubbele datum', + `Er bestaat al een meting van ${new Date(m.measuredAt).toLocaleDateString('nl-NL')}. Overschrijven?`, + [ + { text: 'Annuleren', style: 'cancel' }, + { + text: 'Overschrijven', + style: 'destructive', + onPress: () => doSave(m, existing.id), + }, + ] + ) + return + } + doSave(m) + } + + const doSave = async (m: Measurement, existingId?: string) => { + if (existingId) { + m.id = existingId + await upsertMeasurement(m) + } else { + await insertMeasurement(m) + } try { const { syncAll } = await import('../sync/syncService') await syncAll()