RotateContentMenu.swift 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //
  2. // SaveAndRefreshMenu.swift
  3. // Todos
  4. //
  5. // Created by Sam Jaffe on 3/9/26.
  6. //
  7. import SwiftUI
  8. import SwiftData
  9. internal import Combine
  10. struct RotateContentMenu: View {
  11. @Environment(\.modelContext) private var modelContext
  12. @AppStorage(UserDefaultsKeys.WeekStart) private var weekStart = Date()
  13. let inPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
  14. @Query private var items: [Project]
  15. @Binding var rotate: RotateTracking
  16. var body: some View {
  17. Button("Save and Cleanup", systemImage: "arrow.3.trianglepath") {
  18. rotate.summary = RotateController().summarize(items)
  19. rotate.manuallyInvoked = true
  20. }
  21. .keyboardShortcut("R", modifiers: [.command, .shift])
  22. // .disabled(!shouldAutosave)
  23. .onAppear(perform: tryAutosave)
  24. .help("Will save as \(ymd(weekStart)) after \(ymd(nextSunday(weekStart)))")
  25. }
  26. func tryAutosave() {
  27. if shouldAutosave && !inPreview {
  28. RotateController().saveAndRotate(items, &weekStart, &rotate)
  29. rotate.hasTriggeredAutosave = true
  30. }
  31. }
  32. func nextSunday(_ date: Date) -> Date {
  33. Calendar.current.nextDate(after: date,
  34. matching: DateComponents(weekday: 1),
  35. matchingPolicy: .nextTime)!
  36. }
  37. func ymd(_ date: Date) -> String { RotateController.ymd(date) }
  38. var shouldAutosave: Bool {
  39. ymd(Date()) > ymd(nextSunday(weekStart))
  40. }
  41. }
  42. #Preview {
  43. @Previewable @State var rotate = RotateTracking()
  44. RotateContentMenu(rotate: $rotate)
  45. }