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

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

  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