LocationTracker:
- isPaused, pausedAt, accumulatedPausedSeconds
- pause()/resume()/restore() Methoden
- effectiveElapsedSeconds rechnet Pausen raus
- restore() für nach App-Crash: Offline-Lücke wird als Pause gezählt
ActiveWalk @Model (SwiftData):
- startedAt, lastUpdate, pausedAt, accumulatedPausedSeconds, pointsData
- Container in BanYaroGoApp registriert
TrackingView:
- Persistenz alle 5s via Timer
- confirmationDialog beim Erscheinen wenn ActiveWalk vorhanden:
Fortsetzen / Jetzt speichern / Verwerfen
- Pause/Resume-Button + Stop-Button
- Floating Kamera-Button rechts unten
- Foto-Counter in der Stats-Karte
- Pause-Badge oben links bei Pause
CameraPicker: UIImagePickerController-Wrapper (Fallback auf Library im Simulator).
FinishWalkSheet: initialPhotos: [Data] für Kamera-Fotos während Tour.
RouteDetailView: PhotosPicker zum Hinzufügen von Fotos zu bestehender Tour,
sequentieller Upload mit Progress, Detail wird nach Upload refreshed.
NSCameraUsageDescription in BanYaroGo-Info.plist.
- APIClient.uploadFile: multipart POST mit Bearer-Token, generischer
field/filename/mime
- ImageResize: längste Kante max 2048px, JPEG q=0.8 — iPhone-Fotos sonst
5-10MB pro Stück
- FinishWalkSheet:
- PhotosPicker (iOS 16+, kein NSPhotoLibraryUsageDescription nötig)
- Thumbnail-Strip der gewählten Fotos
- Sequentieller Upload nach POST /api/routes, Toolbar zeigt "N/M"
- Bei < 50m: orangene Warnung "Sehr kurze Tour — du kannst trotzdem speichern"
- Save-Button blockt korrekt während Upload, Verwerfen auch