2.8 KiB
2.8 KiB
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
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
- Dashboard — Toont de laatste meting en een lijn grafiek van het gewicht over de laatste 30 dagen.
- Nieuwe meting — Formulier met genummerde invoervelden voor alle meetwaarden. Datum/tijd wordt automatisch ingevuld maar is aanpasbaar.
- Historie — FlatList van alle metingen gesorteerd op
measuredAt(nieuwste eerst). - 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:
- Download measurements.json van WebDAV
- Merge met lokale SQLite: per meting de versie met laatste
updatedAtbehouden - Lokale database bijwerken
- Na een nieuwe meting:
- Opslaan in SQLite met
syncStatus: 'local' - Direct uploaden naar WebDAV
- Opslaan in SQLite met
- 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