remindctl/Sources/RemindCore/Models.swift
Peter Steinberger 85a589366e
feat: add location reminder triggers
Co-authored-by: Octavio Froid <froid@bohm.com>
2026-05-04 05:58:14 +01:00

217 lines
5.2 KiB
Swift

import Foundation
public enum ReminderPriority: String, Codable, CaseIterable, Sendable {
case none
case low
case medium
case high
public init(eventKitValue: Int) {
switch eventKitValue {
case 1...4:
self = .high
case 5:
self = .medium
case 6...9:
self = .low
default:
self = .none
}
}
public var eventKitValue: Int {
switch self {
case .none:
return 0
case .high:
return 1
case .medium:
return 5
case .low:
return 9
}
}
}
public enum RecurrenceFrequency: String, Codable, CaseIterable, Sendable {
case daily
case weekly
case monthly
case yearly
}
public struct RecurrenceRule: Codable, Sendable, Equatable {
public let frequency: RecurrenceFrequency
public let interval: Int
public init(frequency: RecurrenceFrequency, interval: Int = 1) {
self.frequency = frequency
self.interval = interval
}
public var displayString: String {
if interval == 1 {
return frequency.rawValue
}
let unit =
switch frequency {
case .daily: "days"
case .weekly: "weeks"
case .monthly: "months"
case .yearly: "years"
}
return "every \(interval) \(unit)"
}
}
public struct ReminderList: Identifiable, Codable, Sendable, Equatable {
public let id: String
public let title: String
public init(id: String, title: String) {
self.id = id
self.title = title
}
}
public enum LocationProximity: String, Codable, CaseIterable, Sendable {
case arriving
case leaving
}
public struct LocationTrigger: Codable, Sendable, Equatable {
public let address: String
public let latitude: Double?
public let longitude: Double?
public let radius: Double
public let proximity: LocationProximity
public init(
address: String,
latitude: Double? = nil,
longitude: Double? = nil,
radius: Double = 100,
proximity: LocationProximity = .arriving
) {
self.address = address
self.latitude = latitude
self.longitude = longitude
self.radius = radius
self.proximity = proximity
}
}
public struct ReminderItem: Identifiable, Codable, Sendable, Equatable {
public let id: String
public let title: String
public let notes: String?
public let url: URL?
public let isCompleted: Bool
public let completionDate: Date?
public let creationDate: Date?
public let lastModifiedDate: Date?
public let priority: ReminderPriority
public let dueDate: Date?
public let dueDateIsAllDay: Bool
public let alarmDate: Date?
public let recurrenceRule: RecurrenceRule?
public let locationTrigger: LocationTrigger?
public let listID: String
public let listName: String
public init(
id: String,
title: String,
notes: String?,
url: URL? = nil,
isCompleted: Bool,
completionDate: Date?,
creationDate: Date? = nil,
lastModifiedDate: Date? = nil,
priority: ReminderPriority,
dueDate: Date?,
dueDateIsAllDay: Bool = false,
alarmDate: Date? = nil,
recurrenceRule: RecurrenceRule? = nil,
locationTrigger: LocationTrigger? = nil,
listID: String,
listName: String
) {
self.id = id
self.title = title
self.notes = notes
self.url = url
self.isCompleted = isCompleted
self.completionDate = completionDate
self.creationDate = creationDate
self.lastModifiedDate = lastModifiedDate
self.priority = priority
self.dueDate = dueDate
self.dueDateIsAllDay = dueDateIsAllDay
self.alarmDate = alarmDate
self.recurrenceRule = recurrenceRule
self.locationTrigger = locationTrigger
self.listID = listID
self.listName = listName
}
}
public struct ReminderDraft: Sendable {
public let title: String
public let notes: String?
public let dueDate: ParsedUserDate?
public let alarmDate: ParsedUserDate?
public let recurrenceRule: RecurrenceRule?
public let locationTrigger: LocationTrigger?
public let priority: ReminderPriority
public init(
title: String,
notes: String?,
dueDate: ParsedUserDate?,
alarmDate: ParsedUserDate? = nil,
recurrenceRule: RecurrenceRule? = nil,
locationTrigger: LocationTrigger? = nil,
priority: ReminderPriority
) {
self.title = title
self.notes = notes
self.dueDate = dueDate
self.alarmDate = alarmDate
self.recurrenceRule = recurrenceRule
self.locationTrigger = locationTrigger
self.priority = priority
}
}
public struct ReminderUpdate: Sendable {
public let title: String?
public let notes: String?
public let dueDate: ParsedUserDate??
public let alarmDate: ParsedUserDate??
public let recurrenceRule: RecurrenceRule??
public let priority: ReminderPriority?
public let listName: String?
public let isCompleted: Bool?
public init(
title: String? = nil,
notes: String? = nil,
dueDate: ParsedUserDate?? = nil,
alarmDate: ParsedUserDate?? = nil,
recurrenceRule: RecurrenceRule?? = nil,
priority: ReminderPriority? = nil,
listName: String? = nil,
isCompleted: Bool? = nil
) {
self.title = title
self.notes = notes
self.dueDate = dueDate
self.alarmDate = alarmDate
self.recurrenceRule = recurrenceRule
self.priority = priority
self.listName = listName
self.isCompleted = isCompleted
}
}