Files
swiftapp/swift/Sources/Core/Models/MailModels.swift
T

174 lines
4.2 KiB
Swift
Raw Normal View History

2026-04-17 20:46:27 +02:00
import Foundation
enum Mailbox: String, CaseIterable, Identifiable, Codable {
case inbox
case starred
2026-04-19 16:26:38 +02:00
case snoozed
case screener
2026-04-17 20:46:27 +02:00
case sent
case drafts
case archive
2026-04-19 16:26:38 +02:00
case trash
2026-04-17 20:46:27 +02:00
var id: String { rawValue }
var title: String {
switch self {
case .inbox: "Inbox"
case .starred: "Starred"
2026-04-19 16:26:38 +02:00
case .snoozed: "Snoozed"
case .screener: "The Screener"
2026-04-17 20:46:27 +02:00
case .sent: "Sent"
case .drafts: "Drafts"
case .archive: "Archive"
2026-04-19 16:26:38 +02:00
case .trash: "Trash"
2026-04-17 20:46:27 +02:00
}
}
var systemImage: String {
switch self {
case .inbox: "tray.full"
case .starred: "star"
2026-04-19 16:26:38 +02:00
case .snoozed: "clock.badge"
case .screener: "line.3.horizontal.decrease.circle"
2026-04-17 20:46:27 +02:00
case .sent: "paperplane"
case .drafts: "doc.text"
case .archive: "archivebox"
2026-04-19 16:26:38 +02:00
case .trash: "trash"
2026-04-17 20:46:27 +02:00
}
}
}
struct MailPerson: Identifiable, Hashable, Codable {
let id: UUID
let name: String
let email: String
init(id: UUID = UUID(), name: String, email: String) {
self.id = id
self.name = name
self.email = email
}
}
struct MailMessage: Identifiable, Hashable, Codable {
let id: UUID
let routeID: String
let sender: MailPerson
let recipients: [MailPerson]
let sentAt: Date
let body: String
let isDraft: Bool
2026-04-19 16:26:38 +02:00
let attachments: [MailAttachment]
2026-04-17 20:46:27 +02:00
init(
id: UUID = UUID(),
routeID: String = UUID().uuidString.lowercased(),
sender: MailPerson,
recipients: [MailPerson],
sentAt: Date,
body: String,
2026-04-19 16:26:38 +02:00
isDraft: Bool = false,
attachments: [MailAttachment] = []
2026-04-17 20:46:27 +02:00
) {
self.id = id
self.routeID = routeID
self.sender = sender
self.recipients = recipients
self.sentAt = sentAt
self.body = body
self.isDraft = isDraft
2026-04-19 16:26:38 +02:00
self.attachments = attachments
}
}
struct MailAttachment: Identifiable, Hashable, Codable {
let id: UUID
let name: String
let size: String
init(id: UUID = UUID(), name: String, size: String) {
self.id = id
self.name = name
self.size = size
2026-04-17 20:46:27 +02:00
}
}
struct MailThread: Identifiable, Hashable, Codable {
let id: UUID
let routeID: String
var mailbox: Mailbox
var subject: String
var participants: [MailPerson]
var messages: [MailMessage]
var isUnread: Bool
var isStarred: Bool
var tags: [String]
2026-04-19 16:26:38 +02:00
var lane: Lane
var summary: [String]?
var isScreeningCandidate: Bool
2026-04-17 20:46:27 +02:00
init(
id: UUID = UUID(),
routeID: String = UUID().uuidString.lowercased(),
mailbox: Mailbox,
subject: String,
participants: [MailPerson],
messages: [MailMessage],
isUnread: Bool,
isStarred: Bool,
2026-04-19 16:26:38 +02:00
tags: [String] = [],
lane: Lane = .people,
summary: [String]? = nil,
isScreeningCandidate: Bool = false
2026-04-17 20:46:27 +02:00
) {
self.id = id
self.routeID = routeID
self.mailbox = mailbox
self.subject = subject
self.participants = participants
self.messages = messages.sorted { $0.sentAt < $1.sentAt }
self.isUnread = isUnread
self.isStarred = isStarred
self.tags = tags
2026-04-19 16:26:38 +02:00
self.lane = lane
self.summary = summary
self.isScreeningCandidate = isScreeningCandidate
2026-04-17 20:46:27 +02:00
}
var latestMessage: MailMessage? {
messages.max(by: { $0.sentAt < $1.sentAt })
}
var previewText: String {
latestMessage?.body.replacingOccurrences(of: "\n", with: " ") ?? ""
}
var lastUpdated: Date {
latestMessage?.sentAt ?? .distantPast
}
2026-04-19 16:26:38 +02:00
var messageCount: Int {
messages.count
}
var hasAttachments: Bool {
messages.contains { !$0.attachments.isEmpty }
}
2026-04-17 20:46:27 +02:00
}
2026-04-19 16:26:38 +02:00
struct ComposeDraft: Equatable, Codable {
2026-04-17 20:46:27 +02:00
var to = ""
2026-04-19 16:26:38 +02:00
var cc = ""
var from = ""
2026-04-17 20:46:27 +02:00
var subject = ""
var body = ""
2026-04-19 16:26:38 +02:00
var isEmpty: Bool {
to.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty &&
cc.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty &&
subject.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty &&
body.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
}
2026-04-17 20:46:27 +02:00
}