88 lines
2.8 KiB
Markdown
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
|