Hey everyone,
I am building an app for my dad's business and I have implemented a feature where you can book a consultation with him. You can select a date, enter your name and your email and a note if you'd like. And when you press "Book", it sends an email to my dad with all of the info that you inputted.
That all works well, but when you select the "Book" button, the mail composer pops up with the appointment info that you inputted. But I would like for the email to automatically send to my dad when the user presses "Book", I don't want the user to have to send the email along with pressing the "Book" button.
Is this possible? And if not, what are some other ways that I can implement the appointment booking software?
Any help would be appreciated! Thanks in advance.
Here is the code for the booking page:
import UIKit
import MessageUI
struct AppointmentFormView: View {
@State private var name: String = ""
@State private var contact: String = ""
@State private var selectedDate = Date()
@State private var notes: String = ""
@State private var showAlert = false
var body: some View {
Form {
Section(header: Text("Personal Information")) {
TextField("First + Last Name", text: $name)
TextField("Your Email Address", text: $contact)
}
Section(header: Text("Appointment Details")) {
DatePicker("When would you like your appointment?", selection: $selectedDate, displayedComponents: [.date])
TextField("Anything you'd like us to know?", text: $notes)
}
Button(action: {
// Perform validation and backend tasks
bookAppointment()
}) {
Text("Book")
}
}
.alert(isPresented: $showAlert) {
Alert(title: Text("Appointment Booked"), message: Text("Your appointment has been successfully booked."), dismissButton: .default(Text("OK")))
}
}
private func bookAppointment() {
// Perform validation and backend tasks here
// Example implementation: show alert when appointment is booked
showAlert = true
// Compose and send the email notification
let mailView = MailView(recipientEmail: "inquiries@metricacarpentry.com",
subject: "New Appointment Booked",
messageBody: """
Name: \(name)
Contact: \(contact)
Date: \(selectedDate)
Notes: \(notes)
""")
UIApplication.shared.windows.first?.rootViewController?.present(UIHostingController(rootView: mailView), animated: true, completion: nil)
}
}
struct UIMailView: UIViewControllerRepresentable {
let recipientEmail: String
let subject: String
let messageBody: String
@Binding var showAlert: Bool // Add showAlert binding
func makeUIViewController(context: Context) -> MFMailComposeViewController {
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = context.coordinator
composeVC.setToRecipients([recipientEmail])
composeVC.setSubject(subject)
composeVC.setMessageBody(messageBody, isHTML: false)
return composeVC
}
func updateUIViewController(_ uiViewController: MFMailComposeViewController, context: Context) {
// No need to update the view controller
}
func makeCoordinator() -> Coordinator {
Coordinator(showAlert: $showAlert) // Pass showAlert binding to Coordinator
}
final class Coordinator: NSObject, MFMailComposeViewControllerDelegate {
@Binding var showAlert: Bool
init(showAlert: Binding<Bool>) {
_showAlert = showAlert
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
EmailHelper.getRootViewController()?.dismiss(animated: true, completion: nil)
if result == .sent {
let alert = UIAlertController(title: "Email Sent ✅", message: "Thanks for your inquiry! We'll get back to you within 24 hours.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
EmailHelper.getRootViewController()?.present(alert, animated: true, completion: nil)
}
}
}
}