weegschaal-app/docs/superpowers/specs/2026-06-27-weegschaal-app-design.md
Eddy de Vink f66034136d Initial commit
Generated by create-expo-app 4.0.0.
2026-06-27 22:39:13 +02:00

88 lines
2.8 KiB
Markdown

# 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