mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-27 15:14:33 +00:00
Applied latest changes from boring.notch
This commit is contained in:
parent
bad481588b
commit
628d76b41c
18 changed files with 940 additions and 339 deletions
125
DynamicIsland/models/EventModel.swift
Normal file
125
DynamicIsland/models/EventModel.swift
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
//
|
||||
// EventModel.swift
|
||||
// Calendr
|
||||
//
|
||||
// Created by Paker on 24/12/20.
|
||||
// Original source: https://github.com/pakerwreah/Calendr
|
||||
// Modified by Alexander on 2025-05-18.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct EventModel: Equatable {
|
||||
let id: String
|
||||
let start: Date
|
||||
let end: Date
|
||||
let title: String
|
||||
let location: String?
|
||||
let notes: String?
|
||||
let url: URL?
|
||||
let isAllDay: Bool
|
||||
let type: EventType
|
||||
let calendar: CalendarModel
|
||||
let participants: [Participant]
|
||||
let timeZone: TimeZone?
|
||||
let hasRecurrenceRules: Bool
|
||||
let priority: Priority?
|
||||
}
|
||||
|
||||
enum AttendanceStatus: Comparable {
|
||||
case accepted
|
||||
case maybe
|
||||
case pending
|
||||
case declined
|
||||
case unknown
|
||||
|
||||
private var comparisonValue: Int {
|
||||
switch self {
|
||||
case .accepted: return 1
|
||||
case .maybe: return 2
|
||||
case .declined: return 3
|
||||
case .pending: return 4
|
||||
case .unknown: return 5
|
||||
}
|
||||
}
|
||||
|
||||
static func < (lhs: Self, rhs: Self) -> Bool {
|
||||
return lhs.comparisonValue < rhs.comparisonValue
|
||||
}
|
||||
}
|
||||
|
||||
enum EventType: Equatable {
|
||||
case event(AttendanceStatus)
|
||||
case birthday
|
||||
case reminder(completed: Bool)
|
||||
}
|
||||
|
||||
enum EventStatus: Equatable {
|
||||
case upcoming
|
||||
case inProgress
|
||||
case ended
|
||||
}
|
||||
|
||||
extension EventType {
|
||||
var isEvent: Bool { if case .event = self { return true } else { return false } }
|
||||
var isBirthday: Bool { self ~= .birthday }
|
||||
var isReminder: Bool { if case .reminder = self { return true } else { return false } }
|
||||
}
|
||||
|
||||
extension EventModel {
|
||||
|
||||
var eventStatus: EventStatus {
|
||||
if start > Date() {
|
||||
return .upcoming
|
||||
} else if end > Date() {
|
||||
return .inProgress
|
||||
} else {
|
||||
return .ended
|
||||
}
|
||||
}
|
||||
|
||||
var attendance: AttendanceStatus { if case .event(let attendance) = type { return attendance } else { return .unknown } }
|
||||
|
||||
var isMeeting: Bool { !participants.isEmpty }
|
||||
|
||||
func calendarAppURL() -> URL? {
|
||||
|
||||
guard let id = id.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard !type.isReminder else {
|
||||
return URL(string: "x-apple-reminderkit://remcdreminder/\(id)")
|
||||
}
|
||||
|
||||
let date: String
|
||||
if hasRecurrenceRules {
|
||||
let formatter = DateFormatter()
|
||||
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
|
||||
if !isAllDay {
|
||||
formatter.timeZone = .init(secondsFromGMT: 0)
|
||||
}
|
||||
if let formattedDate = formatter.string(for: start) {
|
||||
date = "/\(formattedDate)"
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
date = ""
|
||||
}
|
||||
return URL(string: "ical://ekevent\(date)/\(id)?method=show&options=more")
|
||||
}
|
||||
}
|
||||
|
||||
struct Participant: Hashable {
|
||||
let name: String
|
||||
let status: AttendanceStatus
|
||||
let isOrganizer: Bool
|
||||
let isCurrentUser: Bool
|
||||
}
|
||||
|
||||
enum Priority {
|
||||
case high
|
||||
case medium
|
||||
case low
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue