| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import AppKit
- import Combine
- import Foundation
- @MainActor
- final class EmailWriterViewModel: ObservableObject {
- static let maxCharacters = 5_000
- @Published var subject: String = ""
- @Published var prompt: String = ""
- @Published var generatedEmail: String = ""
- @Published var emailType: EmailType = .followUp
- @Published var tone: EmailTone = .professional
- @Published var isGenerating = false
- var characterCount: Int { prompt.count }
- var characterCountLabel: String {
- "\(characterCount)/\(Self.maxCharacters)"
- }
- var canGenerate: Bool {
- !prompt.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && !isGenerating
- }
- var canCopy: Bool {
- !generatedEmail.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
- }
- func pastePrompt() {
- guard let clipboard = NSPasteboard.general.string(forType: .string) else { return }
- prompt = String(clipboard.prefix(Self.maxCharacters))
- }
- func clearAll() {
- subject = ""
- prompt = ""
- generatedEmail = ""
- }
- func copyGeneratedEmail() {
- guard canCopy else { return }
- NSPasteboard.general.clearContents()
- NSPasteboard.general.setString(generatedEmail, forType: .string)
- }
- func generateEmail() {
- let trimmedPrompt = prompt.trimmingCharacters(in: .whitespacesAndNewlines)
- guard !trimmedPrompt.isEmpty else { return }
- isGenerating = true
- generatedEmail = ""
- // Email generation service integration point
- let subjectLine = subject.trimmingCharacters(in: .whitespacesAndNewlines)
- let greeting = tone == .formal ? "Dear Recipient," : "Hi there,"
- var email = "\(greeting)\n\n"
- email += "[\(emailType.title) · \(tone.title)]\n\n"
- email += trimmedPrompt
- email += "\n\nBest regards,\n[Your Name]"
- if !subjectLine.isEmpty {
- email = "Subject: \(subjectLine)\n\n" + email
- }
- generatedEmail = email
- isGenerating = false
- }
- }
|