import Foundation public struct TeamCalendar: Decodable, Identifiable { public let id: Int64 public let name: String public let hue: Int public let writable: Bool } struct CalendarSession: Decodable { let week_start: Int let zone: String let calendars: [TeamCalendar] let default_calendar_id: Int64 } public struct CalendarEvent: Codable, Identifiable { public var id: Int64 = 0 public var calendar_id: Int64 = 0 public var status = "confirmed" public var title = "" public var location = "" public var notes = "" public var all_day = false public var start_local = "" public var end_local = "" public var tz = "" public var start: Int64 = 0 public var end: Int64 = 0 public var recurring = false public var writable = true public var calendar_name = "" public var occurrence = "" public var day_start = "" public var day_end = "" public func occurs(on day: Date, calendar: Calendar) -> Bool { if all_day { let f = DateFormatter(); f.locale = Locale(identifier: "en_US_POSIX") f.timeZone = calendar.timeZone; f.dateFormat = "yyyy-MM-dd" let date = f.string(from: day) return day_start <= date && day_end > date } let first = calendar.startOfDay(for: day) let last = calendar.date(byAdding: .day, value: 1, to: first)! return Double(start) < last.timeIntervalSince1970 && Double(end) > first.timeIntervalSince1970 } public var identity: String { "\(id)-\(occurrence)-\(start)" } public init() {} } struct CalendarEvents: Decodable { let events: [CalendarEvent] } struct SavedEvent: Decodable { let id: Int64; let warning: String? }