Files
RIT-Dining/TigerDine/Views/FeedbackView.swift
NinjaCheetah 0c07c509f3 Add feedback submission sheet
Also fixed a bug where locations with overlapping close and open times would show "Closing Soon" for 30 minutes just to then switch to "Open" when it rolled over.
2026-02-17 00:01:55 -05:00

171 lines
7.7 KiB
Swift

//
// FeedbackView.swift
// TigerDine
//
// Created by Campbell on 2/16/26.
//
import SwiftUI
import MessageUI
struct FeedbackView: View {
@Environment(\.dismiss) var dismiss
@Environment(\.openURL) private var openURL
@State private var showingMailView = false
@State private var mailResult: Result<MFMailComposeResult, Error>? = nil
var body: some View {
NavigationView {
ScrollView {
VStack(alignment: .leading, spacing: 12) {
HStack {
Image(systemName: "paperplane")
.resizable()
.scaledToFit()
.frame(width: 50, height: 50)
.foregroundStyle(Color.accentColor)
Text("Submit Feedback")
.fontWeight(.bold)
.font(.title)
}
Text("Did I break something? Oops.")
Text("Or maybe you just have a suggestion to make TigerDine even cooler. Either way, I'd love to hear your feedback! (Or maybe the hours for a location are off, in which case that feedback is RIT's to handle.)")
.foregroundStyle(.secondary)
Text("Incorrect Location Hours")
.padding(.top, 12)
Button(action: {
openURL(URL(string: "https://www.rit.edu/dining/locations")!)
}) {
HStack(alignment: .center) {
Image(systemName: "clock.badge.questionmark")
.resizable()
.scaledToFit()
.frame(width: 50, height: 50)
.foregroundStyle(Color.accentColor)
VStack(alignment: .leading) {
Text("Confirm Against the RIT Website")
.fontWeight(.bold)
Text("Check that the hours displayed in TigerDine match RIT's website.")
.foregroundStyle(.secondary)
.multilineTextAlignment(.leading)
}
Spacer()
Image(systemName: "chevron.forward")
}
.padding(.all, 6)
.background (
RoundedRectangle(cornerRadius: 8)
.fill(Color.secondary.opacity(0.1))
)
}
.buttonStyle(.plain)
Button(action: {
openURL(URL(string: "https://www.rit.edu/its/support")!)
}) {
HStack(alignment: .center) {
Image(systemName: "clock.badge.exclamationmark")
.resizable()
.scaledToFit()
.frame(width: 50, height: 50)
.foregroundStyle(Color.accentColor)
VStack(alignment: .leading) {
Text("Submit an ITS Ticket")
.fontWeight(.bold)
Text("If hours are also incorrect on RIT's website, submit a ticket to ITS.")
.foregroundStyle(.secondary)
.multilineTextAlignment(.leading)
}
Spacer()
Image(systemName: "chevron.forward")
}
.padding(.all, 6)
.background (
RoundedRectangle(cornerRadius: 8)
.fill(Color.secondary.opacity(0.1))
)
}
.buttonStyle(.plain)
Text("If the hours do not match between TigerDine and RIT's website, please contact me instead and I'll look into it.")
.foregroundStyle(.secondary)
.font(.caption)
Text("TigerDine Issues and Feedback")
.padding(.top, 12)
Button(action: {
openURL(URL(string: "https://github.com/NinjaCheetah/TigerDine/issues")!)
}) {
HStack(alignment: .center) {
Image(systemName: "ant.circle")
.resizable()
.scaledToFit()
.frame(width: 50, height: 50)
.foregroundStyle(Color.accentColor)
VStack(alignment: .leading) {
Text("Submit a GitHub Issue")
.fontWeight(.bold)
Text("Report a bug or suggest a feature on TigerDine's GitHub repository.")
.foregroundStyle(.secondary)
.multilineTextAlignment(.leading)
}
Spacer()
Image(systemName: "chevron.forward")
}
.padding(.all, 6)
.background (
RoundedRectangle(cornerRadius: 8)
.fill(Color.secondary.opacity(0.1))
)
}
.buttonStyle(.plain)
Button(action: {
showingMailView = true
}) {
HStack(alignment: .center) {
Image(systemName: "envelope.circle")
.resizable()
.scaledToFit()
.frame(width: 50, height: 50)
.foregroundStyle(Color.accentColor)
VStack(alignment: .leading) {
Text("Send Me an Email")
.fontWeight(.bold)
Text("Not a GitHub user? Feel free to submit feedback via email.")
.foregroundStyle(.secondary)
.multilineTextAlignment(.leading)
}
Spacer()
Image(systemName: "chevron.forward")
}
.padding(.all, 6)
.background (
RoundedRectangle(cornerRadius: 8)
.fill(Color.secondary.opacity(0.1))
)
}
.buttonStyle(.plain)
.disabled(!MailView.canSendMail())
.sheet(isPresented: $showingMailView) {
MailView(result: $mailResult)
}
Text("Just don't spam my inbox, please and thank you.")
.foregroundStyle(.secondary)
.font(.caption)
}
.frame(maxWidth: .infinity)
.toolbar {
Button(action: {
dismiss()
}) {
Image(systemName: "xmark")
}
}
}
.padding(.horizontal, 16)
}
}
}
#Preview {
FeedbackView()
}