wake-ios/wake/View/Feedback.swift

271 lines
11 KiB
Swift

import SwiftUI
struct FeedbackView: View {
// Use Router for navigation instead of dismiss
@EnvironmentObject private var router: Router
@State private var selectedFeedback: FeedbackType? = FeedbackType.allCases.first
@State private var showNextScreen = false
enum FeedbackType: String, CaseIterable, Identifiable {
case excellent = "Excellent"
case good = "Good"
case okay = "Okay"
case bad = "Bad"
var id: String { self.rawValue }
var icon: String {
switch self {
case .excellent: return "😘"
case .good: return "😊"
case .okay: return "😐"
case .bad: return "😞"
}
}
}
var body: some View {
VStack(spacing: 0) {
// Custom Navigation Bar
HStack {
// Back Button
Button(action: { router.pop() }) {
Image(systemName: "chevron.left")
.font(.system(size: 17, weight: .semibold))
.foregroundColor(.primary)
.frame(width: 44, height: 44)
}
// Title
Text("Feedback")
.font(Typography.font(for: .title2, family: .quicksandBold))
.frame(maxWidth: .infinity)
// Spacer to balance the HStack
Spacer()
.frame(width: 44, height: 44)
}
.frame(height: 44)
.background(Color.themeTextWhiteSecondary)
// Main Content
GeometryReader { geometry in
ScrollView {
VStack(spacing: 24) {
// Top spacing for vertical centering
Spacer(minLength: 0)
VStack(spacing: 24) {
Text("How are you feeling?")
.font(Typography.font(for: .title2, family: .quicksandBold))
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity)
.padding(.bottom, 50)
// Feedback Type Selection
VStack(spacing: 12) {
ForEach(FeedbackType.allCases) { type in
Button(action: {
selectedFeedback = type
}) {
let isSelected = selectedFeedback == type
HStack {
Text(type.icon)
.font(.body)
.foregroundColor(isSelected ? .white : .primary)
Text(type.rawValue)
.font(.body)
.foregroundColor(Color.themeTextMessageMain)
Spacer()
}
.padding()
.background(
RoundedRectangle(cornerRadius: 12)
.fill(isSelected ? Color.themePrimary : Color.themePrimaryLight)
)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(isSelected ? Color.themePrimary : Color.themePrimaryLight, lineWidth: 1)
)
}
.buttonStyle(PlainButtonStyle())
}
}
.padding(.bottom, 24)
}
.padding(.horizontal, 20)
.padding(.vertical, 24)
.background(Color.white)
.cornerRadius(16)
.padding(.horizontal, 16)
.frame(minHeight: geometry.size.height - 120) // Subtract navigation bar and bottom button height
// Bottom spacing for vertical centering
Spacer(minLength: 0)
}
.frame(maxWidth: .infinity, minHeight: geometry.size.height - 44) // Subtract navigation bar height
}
}
.background(Color.themeTextWhiteSecondary) // Add background color to the GeometryReader
// Continue Button
Button(action: {
router.navigate(to: .mediaUpload) // or your custom navigation method
}) {
Text("Continue")
.font(.headline)
.foregroundColor(selectedFeedback != nil ? .themeTextMessageMain : .gray)
.frame(maxWidth: .infinity)
.frame(height: 56)
.background(
RoundedRectangle(cornerRadius: 32)
.fill(selectedFeedback != nil ?
Color.themePrimary : Color.themeTextWhiteSecondary)
)
}
.disabled(selectedFeedback == nil)
.padding()
.background(Color.themeTextWhiteSecondary) // Add background color to the button area
}
.background(Color.themeTextWhiteSecondary) // Set the background for the entire view
.navigationBarHidden(true)
}
}
// Feedback Detail View
struct FeedbackDetailView: View {
let feedbackType: FeedbackView.FeedbackType
@State private var feedbackText = ""
@State private var contactInfo = ""
var body: some View {
VStack(spacing: 0) {
// Navigation Bar
HStack {
// Back Button
Button(action: { Router.shared.pop() }) {
Image(systemName: "chevron.left")
.font(.system(size: 17, weight: .semibold))
.foregroundColor(.primary)
.frame(width: 44, height: 44)
}
// Title
Text(feedbackType.rawValue)
.font(.headline)
.frame(maxWidth: .infinity)
// Spacer to balance the HStack
Spacer()
.frame(width: 44, height: 44)
}
.frame(height: 44)
.background(Color.themeTextWhiteSecondary)
// Form
ScrollView {
VStack(spacing: 24) {
// Feedback Type
HStack {
Image(systemName: feedbackType.icon)
.foregroundColor(.blue)
Text(feedbackType.rawValue)
.font(.headline)
Spacer()
}
.padding()
.background(Color.blue.opacity(0.1))
.cornerRadius(12)
// Feedback Text
VStack(alignment: .leading, spacing: 8) {
Text("Describe your \(feedbackType.rawValue.lowercased())")
.font(.subheadline)
.foregroundColor(.secondary)
TextEditor(text: $feedbackText)
.frame(minHeight: 150)
.padding()
.background(Color(.systemGray6))
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(Color(.systemGray4), lineWidth: 1)
)
}
// Contact Info
VStack(alignment: .leading, spacing: 8) {
Text("Contact Information (Optional)")
.font(.subheadline)
.foregroundColor(.secondary)
TextField("Email or phone number", text: $contactInfo)
.padding()
.background(Color(.systemGray6))
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(Color(.systemGray4), lineWidth: 1)
)
}
Spacer()
}
.padding(.horizontal, 20)
}
// Submit Button
Button(action: {
submitFeedback()
}) {
Text("Submit Feedback")
.font(.headline)
.foregroundColor(.white)
.frame(maxWidth: .infinity)
.frame(height: 56)
.background(
RoundedRectangle(cornerRadius: 25)
.fill(Color.themePrimary)
)
.padding(.horizontal, 24)
.padding(.bottom, 24)
}
}
.navigationBarHidden(true)
}
private func submitFeedback() {
// TODO: Implement feedback submission logic
print("Feedback submitted:")
print("Type: \(feedbackType.rawValue)")
print("Message: \(feedbackText)")
if !contactInfo.isEmpty {
print("Contact: \(contactInfo)")
}
// Navigate back to feedback type selection
Router.shared.pop()
}
}
// Preview
struct FeedbackView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
FeedbackView()
.environmentObject(Router.shared)
}
}
}
struct FeedbackDetailView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
FeedbackDetailView(feedbackType: .excellent)
}
}
}