Sechs Offline-Features: Erste Hilfe, Ausgaben, Wetter, Gassi-Zeiten, Giftköder, Verlorene
Pitch-Karte erweitert um die neuen Features (sowie Hundesitting, Züchter).
Neue DTOs in DTOs.swift:
- Expense + ExpenseCreateBody
- GassiZeit + GassiZeitCreateBody (mit wochentage [String], radius_m)
- PoisonAlert + PoisonCreateBody
- LostDog + LostDogCreateBody
- WeatherForecast + WeatherDay (mit asphalt_temp, zecken, pollen-Felder)
Neue Views:
- ErsteHilfeView + Detail: sechs Notfall-Topics (Vergiftung, Hitzschlag,
Wunden, Atemnot, Krampfanfall, Magendrehung) — komplett offline, kein API
- AusgabenView: Liste mit Total, AddExpenseSheet mit Kategorie/Betrag/
Datum/Hund-Picker
- WetterView: One-Shot Location + /api/weather/forecast, 7-Tage-Vorhersage
mit Hunde-Tipps (Hitze ab 25°/30°, Frost, Asphalt ≥50°, Zecken, Regen)
- GassiZeitenView: eigene Zeiten + Add-Sheet (Wochentag-Picker, Hund-
Auswahl), automatische lokale UNCalendarNotifications via Scheduler
- GiftkoederView: Map mit Pins + Liste in 5km Umkreis, Report-Sheet mit
Typ-Auswahl
- VerloreneHundeView: Liste mit Foto/Distanz, Detail mit Karte
Support:
- OneShotLocation: kleiner CLLocationManager-Wrapper für einmalige
Positionsabfrage (Wetter, Giftköder)
- GassiZeitenScheduler: UNCalendarNotificationTrigger pro Wochentag,
Identifier-Schema "gz-{id}-{weekday}"
Navigation: Section "Hund & Alltag" im Mehr-Tab mit NavigationLinks zu
allen sechs neuen Ansichten.
This commit is contained in:
parent
f1b3ff4035
commit
68b084be97
11 changed files with 1547 additions and 0 deletions
|
|
@ -89,6 +89,128 @@ struct RouteCreateBody: Encodable {
|
|||
let isPublic: Bool
|
||||
}
|
||||
|
||||
// MARK: - Expenses
|
||||
|
||||
struct Expense: Decodable, Identifiable {
|
||||
let id: Int
|
||||
let dogId: Int?
|
||||
let kategorie: String
|
||||
let betrag: Double
|
||||
let datum: String
|
||||
let notiz: String?
|
||||
let dogName: String?
|
||||
}
|
||||
|
||||
struct ExpenseCreateBody: Encodable {
|
||||
let dogId: Int?
|
||||
let kategorie: String
|
||||
let betrag: Double
|
||||
let datum: String
|
||||
let notiz: String?
|
||||
}
|
||||
|
||||
// MARK: - Gassi-Zeiten
|
||||
|
||||
struct GassiZeit: Decodable, Identifiable {
|
||||
let id: Int
|
||||
let dogId: Int?
|
||||
let wochentage: [String]
|
||||
let uhrzeit: String
|
||||
let ortName: String?
|
||||
let lat: Double?
|
||||
let lon: Double?
|
||||
let radiusM: Int?
|
||||
let notiz: String?
|
||||
let aktiv: Int?
|
||||
let distanceM: Int?
|
||||
let isMine: Bool?
|
||||
let userName: String?
|
||||
let dogName: String?
|
||||
let dogRasse: String?
|
||||
}
|
||||
|
||||
struct GassiZeitCreateBody: Encodable {
|
||||
let dogId: Int?
|
||||
let wochentage: [String]
|
||||
let uhrzeit: String
|
||||
let ortName: String?
|
||||
let lat: Double?
|
||||
let lon: Double?
|
||||
let radiusM: Int
|
||||
let notiz: String?
|
||||
}
|
||||
|
||||
// MARK: - Poison
|
||||
|
||||
struct PoisonAlert: Decodable, Identifiable {
|
||||
let id: Int
|
||||
let lat: Double
|
||||
let lon: Double
|
||||
let beschreibung: String?
|
||||
let typ: String?
|
||||
let distanzM: Int?
|
||||
let fotoUrl: String?
|
||||
let melderName: String?
|
||||
let createdAt: String?
|
||||
}
|
||||
|
||||
struct PoisonCreateBody: Encodable {
|
||||
let lat: Double
|
||||
let lon: Double
|
||||
let beschreibung: String?
|
||||
let typ: String
|
||||
}
|
||||
|
||||
// MARK: - Lost Dogs
|
||||
|
||||
struct LostDog: Decodable, Identifiable {
|
||||
let id: Int
|
||||
let name: String
|
||||
let rasse: String?
|
||||
let beschreibung: String
|
||||
let lat: Double
|
||||
let lon: Double
|
||||
let distanzM: Int?
|
||||
let fotoUrl: String?
|
||||
let melderName: String?
|
||||
let createdAt: String?
|
||||
}
|
||||
|
||||
struct LostDogCreateBody: Encodable {
|
||||
let name: String
|
||||
let rasse: String?
|
||||
let beschreibung: String
|
||||
let lat: Double
|
||||
let lon: Double
|
||||
let dogId: Int?
|
||||
}
|
||||
|
||||
// MARK: - Weather
|
||||
|
||||
struct WeatherForecast: Decodable {
|
||||
let days: [WeatherDay]
|
||||
}
|
||||
|
||||
struct WeatherDay: Decodable, Identifiable {
|
||||
let date: String
|
||||
let wday: String?
|
||||
let weathercode: Int?
|
||||
let desc: String?
|
||||
let icon: String?
|
||||
let tempMax: Double?
|
||||
let tempMin: Double?
|
||||
let precipProb: Int?
|
||||
let precipSum: Double?
|
||||
let windKmh: Double?
|
||||
let uvIndex: Double?
|
||||
let sunrise: String?
|
||||
let sunset: String?
|
||||
let asphaltTemp: Double?
|
||||
let zecken: String?
|
||||
|
||||
var id: String { date }
|
||||
}
|
||||
|
||||
/// Patch body for PATCH /api/routes/{id}. Only non-nil fields are encoded.
|
||||
struct RouteUpdateBody: Encodable {
|
||||
var name: String?
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue