import SwiftUI @MainActor enum AppRoute: Hashable { case login case avatarBox case feedbackView case feedbackDetail(type: FeedbackView.FeedbackType) case mediaUpload case blindBox(mediaType: BlindBoxMediaType, blindBoxId: String? = nil) case blindOutcome(media: MediaType, title: String? = nil, description: String? = nil, isMember: Bool, goToFeedback: Bool = false) case memories case subscribe case userInfo case account case about case permissionManagement case feedback @ViewBuilder var view: some View { switch self { case .login: LoginView() case .avatarBox: // AvatarBoxView has been removed; route to BlindBoxView as replacement BlindBoxView(mediaType: .all) case .feedbackView: FeedbackView() case .feedbackDetail(let type): FeedbackDetailView(feedbackType: type) case .mediaUpload: MediaUploadView() case .blindBox(let mediaType, let blindBoxId): BlindBoxView(mediaType: mediaType, blindBoxId: blindBoxId) case .blindOutcome(let media, let title, let description, let isMember, let goToFeedback): BlindOutcomeView( media: media, title: title, description: description, isMember: isMember, onContinue: { if goToFeedback { Router.shared.navigate(to: .feedbackView) } else { Router.shared.navigate(to: .blindBox(mediaType: .all)) } } ) case .memories: MemoriesView() case .subscribe: SubscribeView() case .userInfo: UserInfo() case .account: AccountView() case .about: AboutUsView() case .permissionManagement: PermissionManagementView() case .feedback: FeedbackView() } } } @MainActor class Router: ObservableObject { static let shared = Router() @Published var path = NavigationPath() private init() {} func navigate(to destination: AppRoute) { path.append(destination) } func pop() { path.removeLast() } func popToRoot() { path = NavigationPath() } }