# Weegschaal App — Design Doc ## Overzicht React Native app voor het handmatig invoeren en opslaan van metingen van een slimme weegschaal. Data wordt lokaal opgeslagen in SQLite en gesynchroniseerd met Nextcloud via WebDAV. ## Data Model ```typescript type Measurement = { id: string // UUID v4 weight: number // kg bmi: number bodyFatPercentage: number fatMass: number musclePercentage: number muscleMass: number visceralFat: number // index bmr: number // kcal (stofwisseling in rust) measuredAt: string // ISO 8601 datum/tijd createdAt: string updatedAt: string syncStatus: 'local' | 'synced' } ``` ## Technische Stack | Laag | Keuze | |---|---| | Framework | Expo (managed workflow) | | Lokale opslag | expo-sqlite | | Navigatie | @react-navigation/native-stack | | Grafiek | react-native-chart-kit | | Sync | Eigen laag via fetch() naar Nextcloud WebDAV | ## Schermen 1. **Dashboard** — Toont de laatste meting en een lijn grafiek van het gewicht over de laatste 30 dagen. 2. **Nieuwe meting** — Formulier met genummerde invoervelden voor alle meetwaarden. Datum/tijd wordt automatisch ingevuld maar is aanpasbaar. 3. **Historie** — FlatList van alle metingen gesorteerd op `measuredAt` (nieuwste eerst). 4. **Instellingen** — WebDAV URL, gebruikersnaam, wachtwoord (opgeslagen in SecureStore), handmatige sync-knop. ## Component Structuur ``` App ├── NavigationContainer │ ├── DashboardScreen │ │ ├── LatestMeasurementCard │ │ └── WeightChart │ ├── NewMeasurementScreen │ │ └── MeasurementForm │ ├── HistoryScreen │ │ └── MeasurementList → MeasurementRow │ └── SettingsScreen │ └── WebDAVConfigForm ├── database/ │ └── db.ts — SQLite initialisatie, CRUD operaties ├── sync/ │ └── syncService.ts — WebDAV upload/download/merge ├── types.ts — TypeScript types └── utils/ └── uuid.ts — UUID generatie ``` ## Sync Strategie - **Opslag op WebDAV:** Enkel JSON-bestand op `weegschaal/measurements.json` - **Bij app start:** 1. Download measurements.json van WebDAV 2. Merge met lokale SQLite: per meting de versie met laatste `updatedAt` behouden 3. Lokale database bijwerken - **Na een nieuwe meting:** 1. Opslaan in SQLite met `syncStatus: 'local'` 2. Direct uploaden naar WebDAV - **Handmatige sync:** Volledige merge + upload ## Foutafhandeling - Geen netwerk → meting wordt lokaal opgeslagen met `syncStatus: 'local'` - Conflict → last-write-wins op `updatedAt` - WebDAV credentials fout → melding in Settings tonen ## Testen - Jest voor unit tests (database, sync merge logica) - Geen E2E in eerste versie