// // SaveAndRefreshMenu.swift // Todos // // Created by Sam Jaffe on 3/9/26. // import SwiftUI import SwiftData internal import Combine struct RotateContentMenu: View { @Environment(\.modelContext) private var modelContext @AppStorage(UserDefaultsKeys.WeekStart) private var weekStart = Date() let inPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" @Query private var items: [Project] @Binding var rotate: RotateTracking var body: some View { Button("Save and Cleanup", systemImage: "arrow.3.trianglepath") { rotate.summary = RotateController().summarize(items) rotate.manuallyInvoked = true } .keyboardShortcut("R", modifiers: [.command, .shift]) // .disabled(!shouldAutosave) .onAppear(perform: tryAutosave) .help("Will save as \(ymd(weekStart)) after \(ymd(nextSunday(weekStart)))") } func tryAutosave() { if shouldAutosave && !inPreview { RotateController().saveAndRotate(items, &weekStart, &rotate) rotate.hasTriggeredAutosave = true } } func nextSunday(_ date: Date) -> Date { Calendar.current.nextDate(after: date, matching: DateComponents(weekday: 1), matchingPolicy: .nextTime)! } func ymd(_ date: Date) -> String { RotateController.ymd(date) } var shouldAutosave: Bool { ymd(Date()) > ymd(nextSunday(weekStart)) } } #Preview { @Previewable @State var rotate = RotateTracking() RotateContentMenu(rotate: $rotate) }