| 1 | import Foundation |
| 2 | |
| 3 | public struct TeamCalendar: Decodable, Identifiable { |
| 4 | public let id: Int64 |
| 5 | public let name: String |
| 6 | public let hue: Int |
| 7 | public let writable: Bool |
| 8 | } |
| 9 | struct CalendarSession: Decodable { |
| 10 | let week_start: Int |
| 11 | let zone: String |
| 12 | let calendars: [TeamCalendar] |
| 13 | let default_calendar_id: Int64 |
| 14 | } |
| 15 | public struct CalendarEvent: Codable, Identifiable { |
| 16 | public var id: Int64 = 0 |
| 17 | public var calendar_id: Int64 = 0 |
| 18 | public var status = "confirmed" |
| 19 | public var title = "" |
| 20 | public var location = "" |
| 21 | public var notes = "" |
| 22 | public var all_day = false |
| 23 | public var start_local = "" |
| 24 | public var end_local = "" |
| 25 | public var tz = "" |
| 26 | public var start: Int64 = 0 |
| 27 | public var end: Int64 = 0 |
| 28 | public var recurring = false |
| 29 | public var writable = true |
| 30 | public var calendar_name = "" |
| 31 | public var occurrence = "" |
| 32 | public var day_start = "" |
| 33 | public var day_end = "" |
| 34 | public func occurs(on day: Date, calendar: Calendar) -> Bool { |
| 35 | if all_day { |
| 36 | let f = DateFormatter(); f.locale = Locale(identifier: "en_US_POSIX") |
| 37 | f.timeZone = calendar.timeZone; f.dateFormat = "yyyy-MM-dd" |
| 38 | let date = f.string(from: day) |
| 39 | return day_start <= date && day_end > date |
| 40 | } |
| 41 | let first = calendar.startOfDay(for: day) |
| 42 | let last = calendar.date(byAdding: .day, value: 1, to: first)! |
| 43 | return Double(start) < last.timeIntervalSince1970 && Double(end) > first.timeIntervalSince1970 |
| 44 | } |
| 45 | public var identity: String { "\(id)-\(occurrence)-\(start)" } |
| 46 | public init() {} |
| 47 | } |
| 48 | struct CalendarEvents: Decodable { let events: [CalendarEvent] } |
| 49 | struct SavedEvent: Decodable { let id: Int64; let warning: String? } |
| 50 | |