Release 1.0.0 baseline

This commit is contained in:
alexandrev-tibco
2026-02-26 10:27:09 +01:00
parent e593453abd
commit c5c7e3d2e4
24 changed files with 600 additions and 168 deletions
+58 -3
View File
@@ -6,11 +6,33 @@ import EventKit
final class SettingsViewModel: ObservableObject {
@Published var availableCalendars: [EKCalendar] = []
@Published var showCalendarPermissionAlert: Bool = false
@Published var showToast: Bool = false
@Published var toastMessage: String = ""
func loadCalendars() {
availableCalendars = CalendarService.shared.availableCalendars()
}
@discardableResult
func ensureValidCalendarSelection(settings: AppSettings) -> Bool {
loadCalendars()
guard !availableCalendars.isEmpty else {
settings.calendarId = nil
settings.syncEnabled = false
showToastMessage(String(localized: "toast_calendar_unavailable"))
return false
}
if let selected = settings.calendarId,
availableCalendars.contains(where: { $0.calendarIdentifier == selected }) {
return true
}
settings.calendarId = availableCalendars.first?.calendarIdentifier
return true
}
func requestCalendarAccess() async -> Bool {
let granted = await CalendarService.shared.requestAccess()
if !granted {
@@ -42,10 +64,19 @@ final class SettingsViewModel: ObservableObject {
try deleteAll(of: WeekPlan.self, in: context)
try deleteAll(of: Dish.self, in: context)
try deleteAll(of: Tag.self, in: context)
try deleteAll(of: AppSettings.self, in: context)
DefaultDataService.createDefaultSettings(context: context)
DefaultDataService.createDefaultTags(context: context)
let settingsDescriptor = FetchDescriptor<AppSettings>()
if let existingSettings = try context.fetch(settingsDescriptor).first {
resetSettings(existingSettings)
} else {
DefaultDataService.createDefaultSettings(context: context)
if let createdSettings = try context.fetch(settingsDescriptor).first {
resetSettings(createdSettings)
}
}
try context.save()
} catch {
#if DEBUG
print("Failed to reset all data: \(error)")
@@ -61,4 +92,28 @@ final class SettingsViewModel: ObservableObject {
}
try context.save()
}
private func showToastMessage(_ message: String) {
toastMessage = message
withAnimation(.easeInOut(duration: 0.2)) {
showToast = true
}
}
private func resetSettings(_ settings: AppSettings) {
let defaults = AppSettings()
settings.mealWindows = defaults.mealWindows
settings.includeWeekends = defaults.includeWeekends
settings.language = defaults.language
settings.calendarId = defaults.calendarId
settings.syncEnabled = defaults.syncEnabled
settings.syncMode = defaults.syncMode
settings.lunchTime = defaults.lunchTime
settings.dinnerTime = defaults.dinnerTime
settings.eventDuration = defaults.eventDuration
settings.eventPrefix = defaults.eventPrefix
settings.reminderMinutesBefore = defaults.reminderMinutesBefore
settings.iCloudSyncEnabled = false
settings.onboardingCompleted = false
}
}