EmailWriterViewModel.swift 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import AppKit
  2. import Combine
  3. import Foundation
  4. @MainActor
  5. final class EmailWriterViewModel: ObservableObject {
  6. static let maxCharacters = 5_000
  7. @Published var subject: String = ""
  8. @Published var prompt: String = ""
  9. @Published var generatedEmail: String = ""
  10. @Published var emailType: EmailType = .followUp
  11. @Published var tone: EmailTone = .professional
  12. @Published var isGenerating = false
  13. var characterCount: Int { prompt.count }
  14. var characterCountLabel: String {
  15. "\(characterCount)/\(Self.maxCharacters)"
  16. }
  17. var canGenerate: Bool {
  18. !prompt.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && !isGenerating
  19. }
  20. var canCopy: Bool {
  21. !generatedEmail.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
  22. }
  23. func pastePrompt() {
  24. guard let clipboard = NSPasteboard.general.string(forType: .string) else { return }
  25. prompt = String(clipboard.prefix(Self.maxCharacters))
  26. }
  27. func clearAll() {
  28. subject = ""
  29. prompt = ""
  30. generatedEmail = ""
  31. }
  32. func copyGeneratedEmail() {
  33. guard canCopy else { return }
  34. NSPasteboard.general.clearContents()
  35. NSPasteboard.general.setString(generatedEmail, forType: .string)
  36. }
  37. func generateEmail() {
  38. let trimmedPrompt = prompt.trimmingCharacters(in: .whitespacesAndNewlines)
  39. guard !trimmedPrompt.isEmpty else { return }
  40. isGenerating = true
  41. generatedEmail = ""
  42. // Email generation service integration point
  43. let subjectLine = subject.trimmingCharacters(in: .whitespacesAndNewlines)
  44. let greeting = tone == .formal ? "Dear Recipient," : "Hi there,"
  45. var email = "\(greeting)\n\n"
  46. email += "[\(emailType.title) · \(tone.title)]\n\n"
  47. email += trimmedPrompt
  48. email += "\n\nBest regards,\n[Your Name]"
  49. if !subjectLine.isEmpty {
  50. email = "Subject: \(subjectLine)\n\n" + email
  51. }
  52. generatedEmail = email
  53. isGenerating = false
  54. }
  55. }