AcaMate_iOS/AcaMate/1. View/11. Intro & Login/LoginView.swift

184 lines
6.3 KiB
Swift

//
// LoginView.swift
// AcaMate
//
// Created by Sean Kim on 12/1/24.
//
import SwiftUI
import Combine
struct LoginView: View {
@EnvironmentObject var appVM: AppViewModel
@StateObject private var loginVM = LoginViewModel()
@State var cancellables: Set<AnyCancellable> = []
@Binding var naviState : NaviState
@State var selectIdLogin: Bool = false
@State var userId: String = ""
@State var password: String = ""
@State var isSecure: Bool = true
@State var isSave: Bool = false
var body: some View {
VStack(spacing: 0) {
Image(.Icon.appIcon)
.resizable()
.frame(width: 200, height: 200)
.padding(.top, 80)
///
VStack(spacing: 16) {
Button {
// MARK: - TODO,
appVM.isLoading.toggle()
loginAction(type: .Kakao)
} label: {
makeButton(image: Image(.Icon.kakaoIcon),color: Color(.Other.yellow), "카카오 계정으로 시작하기")
}
Button {
// MARK: - TODO,
naviState.set(act: .MOVE, path: .Main)
} label: {
makeButton(image: Image(.Icon.appleIcon), color: Color(.Text.black), "애플 계정으로 시작하기")
}
}
/*
VStack(spacing: 16) {
Button {
// MARK: TO-DO
//
naviState.set(act: .MOVE, path: .Main)
} label: {
HStack(spacing: 24) {
Image("Kakao_Icon")
.resizable()
.frame(width: 32, height: 32)
Text(" ")
.font(.nps(font: .regular, size: 16))
.foregroundStyle(Color(.Text.black))
}
.frame(maxWidth: .infinity)
.padding(12)
.background {
RoundedRectangle(cornerRadius: 12)
.foregroundStyle(Color(.Other.yellow))
}
}
.frame(maxWidth: .infinity)
/// KAKAO
Button {
// MARK: TO-DO
//
} label: {
HStack(spacing: 24) {
Image(systemName: "apple.logo")
.resizable()
.accentColor(Color(.Text.white))
.frame(width: 32, height: 32)
Text(" ")
.font(.nps(font: .regular, size: 16))
.foregroundStyle(Color(.Text.white))
}
.frame(maxWidth: .infinity)
.padding(12)
.background {
RoundedRectangle(cornerRadius: 12)
.foregroundStyle(Color(.Text.black))
}
}
.frame(maxWidth: .infinity)
/// APPLE
}
*/
.padding([.leading,.trailing], 28)
}
.onAppear {
subscribeLoginAction()
}
.frame(maxWidth: .infinity,maxHeight: .infinity)
.fullDrawView(.Normal.normal)
}
func makeButton(image: Image, color: Color? = nil, _ body: String) -> some View {
return HStack {
image
.resizable()
.frame(width: 32, height: 32)
Spacer(minLength: 12)
Text("\(body)")
.font(.nps(font: .regular, size: 16))
.foregroundStyle(color == Color(.Text.black) ? Color(.Text.white) : Color(.Text.black))
Spacer(minLength: 12)
}
.padding(12)
.background {
if let color = color {
RoundedRectangle(cornerRadius: 12)
.foregroundStyle(color)
}
}
}
private func subscribeLoginAction() {
loginVM.loginAction
.sink { isTapped in
if isTapped {
if userId.isEmpty || password.isEmpty {
appVM.alertData = SetAlertData().setErrorLogin()
appVM.showAlert.toggle()
}
else {
}
printLog("로그인")
}
}
.store(in: &cancellables)
}
private func loginAction(type: SNSLoginType) {
LoginController().login(type)
.flatMap{ snsId in
loadAPIData(url: "\(API_URL)",
path: "/api/v1/in/user/login",
parameters: [
"sns_id": "\(snsId.snsId)",
"acctype": "\(type == .Apple ? "ST00": "ST01")"
],
decodingType: APIResponse<User_Academy>.self)
}
.sink { completion in
switch completion {
case .failure(let error):
printLog("\(error)")
appVM.isLoading.toggle()
case .finished:
appVM.isLoading.toggle()
}
} receiveValue: { response in
guard let ua = response as? APIResponse<User_Academy> else {return}
if let bids = ua.data.toStringDict()["bid"] {
printLog(bids)
if let bidArray: [String] = jsonToSwift(bids) {
printLog(bidArray[0])
} else {
printLog("JSON 변환 실패")
}
}
}
.store(in: &cancellables)
}
}
//#Preview {
// LoginView()
//}