// // NavigationView.swift // AcaMate // // Created by Sean Kim on 12/12/24. // import SwiftUI import Combine /// 이거 위에 다른 뷰들이 위젯 느낌으로 계속 갈아 끼워지는거 struct NavigationView: View { @EnvironmentObject var appVM: AppViewModel @State private var naviState : NaviState = .init(act: .NONE, path: .Intro) @State private var history: [PathName] = [.Intro] var body: some View { ZStack { switch naviState.path { case .NONE: EmptyView() case .Intro: IntroView(naviState: $naviState) case .Login : LoginView(naviState: $naviState) case .Main: MainView(naviState: $naviState) } } .onChange(of: naviState) { old, new in switch new.act { case .NONE: break case .ADD: addHistory(path: new.path) case .POP: popHistory() case .RESET: resetHistory(path: new.path) case .MOVE: moveHistory(path: new.path) } // LOG printLog("\(old.path) => \(new.path)") showHistory() } .onTapGesture { endTextEditing() } .fullDrawView(.Normal.normal) .setAlert() .setNetwork() .loadingView(isLoading: $appVM.isLoading) } /// 경로에 한 단계 추가 private func addHistory(path: PathName) { history.append(path) } /// 가장 가까운 경로 삭제 private func popHistory() { history.removeLast() naviState.set(act: .NONE, path: history.last ?? .NONE) } /// 경로 기록 전체 삭제 private func resetHistory(path: PathName) { history.removeAll() addHistory(path: path) } /// 경로의 최상단 지우고, 새로 이동하는 경로로 설정 private func moveHistory(path: PathName) { if path == .NONE { naviState.set(act: .RESET, path: history.first ?? .Main) } if history.contains(path) { let remove = history.count - history.firstIndex(of: path)! - 1 history.removeLast(remove) if remove > 0 { naviState.set(act: .NONE, path: path) return } } naviState.set(act: .RESET, path: path) } private func showHistory() { printLog(history) } }