AcaMate_iOS/AcaMate/1. View/11. Intro & Login/IntroView.swift
2025-02-05 17:59:49 +09:00

128 lines
4.1 KiB
Swift

//
// IntroView.swift
// AcaMate
//
// Created by Sean Kim on 12/1/24.
//
import SwiftUI
import Combine
struct IntroView: View {
@EnvironmentObject var appVM: AppViewModel
@State var cancellables: Set<AnyCancellable> = []
@Binding var naviState : NaviState
var body: some View {
VStack(spacing: 0) {
Spacer()
.frame(height: 100)
Image(.Logo.appIcon)
.resizable()
.frame(width: 200, height: 200)
Spacer()
HStack(spacing: 4) {
Image(.Logo.teamIcon)
.resizable()
.frame(width: 24, height: 24)
Text("STEIN")
.font(.nps(font: .bold, size: 16))
.foregroundStyle(Color(.Text.detail))
}
.padding(.bottom,12)
Text("Copyright © Team.Stein")
.font(.nps(font: .regular, size: 14))
.foregroundStyle(Color(.Text.detail))
.padding(.bottom,50)
}
.onAppear {
printLog("IntroView_onAppear")
subscribeAlertAction()
loadVersion()
.sink { completion in
switch completion {
case .failure(let error):
printLog(error)
case .finished: break
}
} receiveValue: { version in
let compareForce = compareVersion(version.force_ver, currentVersion())
let compareChoice = compareVersion(version.final_ver, currentVersion())
if compareForce == .bigger {
appVM.alertData = SetAlertData().setForceUpdate(
action: appVM.alertAction
)
appVM.showAlert.toggle()
} else if compareChoice == .bigger && version.choice_update_yn {
appVM.alertData = SetAlertData().setSelectUpdate(
action: appVM.alertAction
)
appVM.showAlert.toggle()
} else {
naviState.set(act: .RESET, path: .Login)
}
}
.store(in: &cancellables)
}
}
private func subscribeAlertAction() {
appVM.alertAction
.compactMap { $0 }
.sink { action in
if action == "updateNow" {
exit(1)
//MARK: - TODO ( )
} else {
naviState.set(act: .RESET, path: .Login)
}
}.store(in: &cancellables)
}
private func loadVersion() -> Future<VersionData, Error> {
return Future { promise in
loadAPIData(url: "\(API_URL)",
path: "/api/v1/in/app/version",
parameters: ["type":"I"],
decodingType: APIResponse<VersionData>.self)
.sink { completion in
switch completion {
case .failure(let error):
printLog("\(error)")
promise(.failure(error))
case .finished: break
}
} receiveValue: { data in
guard let apiData = data as? APIResponse<VersionData> else {return}
printLog("\(apiData.data.toStringDict())")
promise(.success(apiData.data))
}
.store(in: &cancellables)
}
}
private func currentVersion() -> String {
guard let currentVer = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return "" }
return currentVer
}
private func versionChange(ver: String) -> [Int] {
return ver.components(separatedBy: ["."]).map {Int($0) ?? 0}
}
}
//#Preview {
// IntroView(path: $NavigationPath())
//}