ios widget showing what is available at chucks
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: add timezone awareness

+36 -19
.DS_Store

This is a binary file and will not be displayed.

+1
.gitignore
··· 1 + .DS_Store
wasup-chucks.xcodeproj/project.xcworkspace/xcuserdata/kierank.xcuserdatad/UserInterfaceState.xcuserstate

This is a binary file and will not be displayed.

+17 -9
wasup-chucks/ChucksModels.swift
··· 36 36 37 37 enum MealPhase: String, CaseIterable, Sendable { 38 38 case breakfast = "Breakfast" 39 - case brunch = "Brunch" 40 39 case lunch = "Lunch" 41 40 case dinner = "Dinner" 42 41 case closed = "Closed" ··· 44 43 var icon: String { 45 44 switch self { 46 45 case .breakfast: return "cup.and.saucer.fill" 47 - case .brunch: return "fork.knife" 48 - case .lunch: return "sun.max.fill" 49 - case .dinner: return "moon.stars.fill" 46 + case .lunch: return "takeoutbag.and.cup.and.straw.fill" 47 + case .dinner: return "fork.knife.circle.fill" 50 48 case .closed: return "moon.zzz.fill" 51 49 } 52 50 } ··· 54 52 var shortName: String { 55 53 switch self { 56 54 case .breakfast: return "Breakfast" 57 - case .brunch: return "Brunch" 58 55 case .lunch: return "Lunch" 59 56 case .dinner: return "Dinner" 60 57 case .closed: return "Closed" ··· 63 60 64 61 var apiSlot: String { 65 62 switch self { 66 - case .breakfast, .brunch: return "breakfast" 63 + case .breakfast: return "breakfast" 67 64 case .lunch: return "lunch" 68 65 case .dinner: return "dinner" 69 66 case .closed: return "" ··· 92 89 MealSchedule(phase: .dinner, startHour: 16, startMinute: 30, endHour: 19, endMinute: 30) 93 90 ] 94 91 95 - // Saturday: Continental 8-9, Brunch 11-1, Dinner 4:30-6:30 92 + // Saturday: Continental 8-9, Lunch 11-1, Dinner 4:30-6:30 96 93 static let saturdaySchedule: [MealSchedule] = [ 97 94 MealSchedule(phase: .breakfast, startHour: 8, startMinute: 0, endHour: 9, endMinute: 0), 98 - MealSchedule(phase: .brunch, startHour: 11, startMinute: 0, endHour: 13, endMinute: 0), 95 + MealSchedule(phase: .lunch, startHour: 11, startMinute: 0, endHour: 13, endMinute: 0), 99 96 MealSchedule(phase: .dinner, startHour: 16, startMinute: 30, endHour: 18, endMinute: 30) 100 97 ] 101 98 ··· 115 112 } 116 113 } 117 114 115 + // MARK: - Cedarville Timezone 116 + 117 + struct CedarvilleTime { 118 + static var calendar: Calendar { 119 + var calendar = Calendar(identifier: .gregorian) 120 + calendar.timeZone = TimeZone(identifier: "America/New_York")! 121 + return calendar 122 + } 123 + } 124 + 118 125 // MARK: - Chuck's Status 119 126 120 127 struct ChucksStatus { ··· 126 133 let currentMealEnd: Date? 127 134 128 135 static func calculate(for date: Date = Date()) -> ChucksStatus { 129 - let calendar = Calendar.current 136 + let calendar = CedarvilleTime.calendar 130 137 let weekday = calendar.component(.weekday, from: date) 131 138 let schedule = MealSchedule.schedule(for: weekday) 132 139 ··· 270 277 let menu = try await fetchMenu() 271 278 let dateFormatter = DateFormatter() 272 279 dateFormatter.dateFormat = "yyyy-MM-dd" 280 + dateFormatter.timeZone = TimeZone(identifier: "America/New_York") 273 281 let dateKey = dateFormatter.string(from: date) 274 282 275 283 guard let dayMenu = menu[dateKey] else {
+1
wasup-chucks/ContentView.swift
··· 66 66 let menu = try await ChucksService.shared.fetchMenu() 67 67 let dateFormatter = DateFormatter() 68 68 dateFormatter.dateFormat = "yyyy-MM-dd" 69 + dateFormatter.timeZone = TimeZone(identifier: "America/New_York") 69 70 let dateKey = dateFormatter.string(from: Date()) 70 71 todayMenu = menu[dateKey] ?? [] 71 72 } catch {
+17 -10
widget/widget.swift
··· 33 33 34 34 enum MealPhase: String, CaseIterable { 35 35 case breakfast = "Breakfast" 36 - case brunch = "Brunch" 37 36 case lunch = "Lunch" 38 37 case dinner = "Dinner" 39 38 case closed = "Closed" ··· 41 40 var icon: String { 42 41 switch self { 43 42 case .breakfast: return "cup.and.saucer.fill" 44 - case .brunch: return "fork.knife" 45 - case .lunch: return "sun.max.fill" 46 - case .dinner: return "moon.stars.fill" 43 + case .lunch: return "takeoutbag.and.cup.and.straw.fill" 44 + case .dinner: return "fork.knife.circle.fill" 47 45 case .closed: return "moon.zzz.fill" 48 46 } 49 47 } ··· 51 49 var shortName: String { 52 50 switch self { 53 51 case .breakfast: return "Breakfast" 54 - case .brunch: return "Brunch" 55 52 case .lunch: return "Lunch" 56 53 case .dinner: return "Dinner" 57 54 case .closed: return "Closed" ··· 60 57 61 58 var apiSlot: String { 62 59 switch self { 63 - case .breakfast, .brunch: return "breakfast" 60 + case .breakfast: return "breakfast" 64 61 case .lunch: return "lunch" 65 62 case .dinner: return "dinner" 66 63 case .closed: return "" ··· 86 83 MealSchedule(phase: .dinner, startHour: 16, startMinute: 30, endHour: 19, endMinute: 30) 87 84 ] 88 85 89 - // Saturday: Continental 8-9, Brunch 11-1, Dinner 4:30-6:30 86 + // Saturday: Continental 8-9, Lunch 11-1, Dinner 4:30-6:30 90 87 static let saturdaySchedule: [MealSchedule] = [ 91 88 MealSchedule(phase: .breakfast, startHour: 8, startMinute: 0, endHour: 9, endMinute: 0), 92 - MealSchedule(phase: .brunch, startHour: 11, startMinute: 0, endHour: 13, endMinute: 0), 89 + MealSchedule(phase: .lunch, startHour: 11, startMinute: 0, endHour: 13, endMinute: 0), 93 90 MealSchedule(phase: .dinner, startHour: 16, startMinute: 30, endHour: 18, endMinute: 30) 94 91 ] 95 92 ··· 109 106 } 110 107 } 111 108 109 + struct CedarvilleTime { 110 + static var calendar: Calendar { 111 + var calendar = Calendar(identifier: .gregorian) 112 + calendar.timeZone = TimeZone(identifier: "America/New_York")! 113 + return calendar 114 + } 115 + } 116 + 112 117 struct ChucksStatus { 113 118 let currentPhase: MealPhase 114 119 let timeRemaining: TimeInterval? ··· 118 123 let currentMealEnd: Date? 119 124 120 125 static func calculate(for date: Date = Date()) -> ChucksStatus { 121 - let calendar = Calendar.current 126 + let calendar = CedarvilleTime.calendar 122 127 let weekday = calendar.component(.weekday, from: date) 123 128 let schedule = MealSchedule.schedule(for: weekday) 124 129 ··· 263 268 let menu = try await fetchMenu() 264 269 let dateFormatter = DateFormatter() 265 270 dateFormatter.dateFormat = "yyyy-MM-dd" 271 + dateFormatter.timeZone = TimeZone(identifier: "America/New_York") 266 272 let dateKey = dateFormatter.string(from: date) 267 273 268 274 guard let dayMenu = menu[dateKey] else { ··· 312 318 var specials: [MenuItem] = [] 313 319 314 320 let phase = status.isOpen ? status.currentPhase : (status.nextPhase ?? .lunch) 321 + let menuDate = status.isOpen ? Date() : (status.nextPhaseStart ?? Date()) 315 322 if phase != .closed { 316 323 do { 317 - specials = try await ChucksService.shared.getSpecials(for: Date(), phase: phase) 324 + specials = try await ChucksService.shared.getSpecials(for: menuDate, phase: phase) 318 325 } catch { 319 326 print("Failed to fetch specials: \(error)") 320 327 }