forked from AcaMate/AcaMate_iOS
107 lines
3.0 KiB
Swift
107 lines
3.0 KiB
Swift
//
|
|
// 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 history: [PathName] = [.Intro]
|
|
|
|
var body: some View {
|
|
VStack(spacing: 0) {
|
|
|
|
ZStack {
|
|
switch appVM.naviState.path {
|
|
case .NONE:
|
|
EmptyView()
|
|
case .Intro:
|
|
IntroView()
|
|
case .Login :
|
|
LoginView()
|
|
case .Register(let type, let id):
|
|
RegisterView(type: type, snsID: id)
|
|
case .SelectAcademy:
|
|
SelectAcademyView()
|
|
case .Main:
|
|
MainView()
|
|
case .ChatRoom(let id):
|
|
ChattingRoomView(roomID: id)
|
|
}
|
|
}
|
|
}
|
|
.onChange(of: appVM.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)
|
|
}
|
|
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()
|
|
appVM.naviState.set(act: .NONE, path: history.last ?? .NONE)
|
|
// 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 {
|
|
appVM.naviState.set(act: .RESET, path: history.first ?? .Main)
|
|
// 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 {
|
|
appVM.naviState.set(act: .NONE, path: path)
|
|
// naviState.set(act: .NONE, path: path)
|
|
return
|
|
}
|
|
}
|
|
appVM.naviState.set(act: .RESET, path: path)
|
|
// naviState.set(act: .RESET, path: path)
|
|
}
|
|
|
|
private func showHistory() {
|
|
printLog(history)
|
|
}
|
|
|
|
}
|