Files
omnivore/apple/OmnivoreKit/Sources/App/Views/Profile/NewsletterEmailsView.swift
Satindar Dhillon c486167969 use more LocalText
2023-01-25 10:59:38 -08:00

101 lines
2.7 KiB
Swift

import Models
import Services
import SwiftUI
import Views
@MainActor final class NewsletterEmailsViewModel: ObservableObject {
@Published var isLoading = false
@Published var emails = [NewsletterEmail]()
func loadEmails(dataService: DataService) async {
isLoading = true
if let objectIDs = try? await dataService.newsletterEmails() {
await dataService.viewContext.perform { [weak self] in
self?.emails = objectIDs.compactMap { dataService.viewContext.object(with: $0) as? NewsletterEmail }
}
}
isLoading = false
}
func createEmail(dataService: DataService) async {
isLoading = true
if let objectID = try? await dataService.createNewsletter() {
await dataService.viewContext.perform { [weak self] in
if let item = dataService.viewContext.object(with: objectID) as? NewsletterEmail {
self?.emails.insert(item, at: 0)
}
}
}
isLoading = false
}
}
struct NewsletterEmailsView: View {
@EnvironmentObject var dataService: DataService
@StateObject var viewModel = NewsletterEmailsViewModel()
var body: some View {
Group {
#if os(iOS)
Form {
innerBody
}
#elseif os(macOS)
List {
innerBody
}
.listStyle(InsetListStyle())
#endif
}
.task { await viewModel.loadEmails(dataService: dataService) }
}
private var innerBody: some View {
Group {
Section(footer: Text(LocalText.newslettersDescription)) {
Button(
action: {
Task { await viewModel.createEmail(dataService: dataService) }
},
label: {
HStack {
Image(systemName: "plus.circle.fill").foregroundColor(.green)
Text(LocalText.createNewEmailMessage)
Spacer()
}
}
)
.disabled(viewModel.isLoading)
}
if !viewModel.emails.isEmpty {
Section(header: Text(LocalText.newsletterEmailsExisting)) {
ForEach(viewModel.emails) { newsletterEmail in
Button(
action: {
#if os(iOS)
UIPasteboard.general.string = newsletterEmail.email
#endif
#if os(macOS)
let pasteBoard = NSPasteboard.general
pasteBoard.clearContents()
pasteBoard.writeObjects([newsletterEmail.unwrappedEmail as NSString])
#endif
Snackbar.show(message: "Email copied")
},
label: { Text(newsletterEmail.unwrappedEmail) }
)
}
}
}
}
.navigationTitle(LocalText.emailsGeneric)
}
}