Initial commit
Generated by create-expo-app 4.0.0.
This commit is contained in:
commit
f66034136d
19 changed files with 7409 additions and 0 deletions
1186
docs/superpowers/plans/2026-06-27-weegschaal-app-implementation.md
Normal file
1186
docs/superpowers/plans/2026-06-27-weegschaal-app-implementation.md
Normal file
File diff suppressed because it is too large
Load diff
88
docs/superpowers/specs/2026-06-27-weegschaal-app-design.md
Normal file
88
docs/superpowers/specs/2026-06-27-weegschaal-app-design.md
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
# 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
|
||||
Loading…
Reference in a new issue