forked from AcaMate/AcaMate_iOS
[✨] 회원 가입뷰 및 회원 정보 확인 로직 추가
This commit is contained in:
parent
71b2c3389f
commit
4b32aee2a4
Binary file not shown.
|
@ -25,6 +25,8 @@ struct NavigationView: View {
|
||||||
IntroView()
|
IntroView()
|
||||||
case .Login :
|
case .Login :
|
||||||
LoginView()
|
LoginView()
|
||||||
|
case .Register(let type, let id):
|
||||||
|
RegisterView(type: type, snsID: id)
|
||||||
case .SelectAcademy(let bids):
|
case .SelectAcademy(let bids):
|
||||||
SelectAcademyView(bids: bids)
|
SelectAcademyView(bids: bids)
|
||||||
case .Main:
|
case .Main:
|
||||||
|
|
|
@ -34,7 +34,9 @@ struct LoginView: View {
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
// MARK: - TODO, 애플 계정 로그인 구현
|
// MARK: - TODO, 애플 계정 로그인 구현
|
||||||
appVM.naviState.set(act: .ADD, path: .SelectAcademy(bids: ["AA0000", "AA0001"]))
|
// appVM.naviState.set(act: .ADD, path: .SelectAcademy(bids: ["AA0000", "AA0001"]))
|
||||||
|
loginVM.toggleLoading = true
|
||||||
|
loginVM.loginTest(type: .Apple, id: "12345678")
|
||||||
|
|
||||||
} label: {
|
} label: {
|
||||||
makeButton(image: Image(.Logo.appleIcon), color: Color(.Text.black), "애플 계정으로 시작하기")
|
makeButton(image: Image(.Logo.appleIcon), color: Color(.Text.black), "애플 계정으로 시작하기")
|
||||||
|
@ -47,9 +49,9 @@ struct LoginView: View {
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity,maxHeight: .infinity)
|
.frame(maxWidth: .infinity,maxHeight: .infinity)
|
||||||
.fullDrawView(.Normal.normal)
|
.fullDrawView(.Normal.normal)
|
||||||
.onChange(of: loginVM.navigateToAcademy, { _, _ in
|
.onChange(of: loginVM.pathName){ _, new in
|
||||||
appVM.naviState.set(act: .ADD, path: .SelectAcademy(bids: loginVM.bidArray))
|
appVM.naviState.set(act: .ADD, path: new)
|
||||||
})
|
}
|
||||||
|
|
||||||
.onChange(of: loginVM.toggleLoading) { _, new in
|
.onChange(of: loginVM.toggleLoading) { _, new in
|
||||||
appVM.isLoading = new
|
appVM.isLoading = new
|
||||||
|
|
59
AcaMate/1. View/11. Intro & Login/RegisterView.swift
Normal file
59
AcaMate/1. View/11. Intro & Login/RegisterView.swift
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
//
|
||||||
|
// RegisterView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/20/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct RegisterView: View {
|
||||||
|
@EnvironmentObject var appVM: AppViewModel
|
||||||
|
@StateObject private var topVM = TopViewModel()
|
||||||
|
|
||||||
|
@State private var scrollOffset: CGPoint = .zero
|
||||||
|
|
||||||
|
let type: SNSLoginType
|
||||||
|
let snsID: String
|
||||||
|
|
||||||
|
@State private var selectDate: Date = {
|
||||||
|
let calendar = Calendar.current
|
||||||
|
return calendar.date(byAdding: .year, value: -12, to: Date()) ?? Date()
|
||||||
|
}()
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
// MARK: TO-DO
|
||||||
|
// 회원가입 뷰 만들기
|
||||||
|
// 이름, 번호, 이메일, 주소, 생년월일
|
||||||
|
|
||||||
|
|
||||||
|
VStack(spacing: 0) {
|
||||||
|
TopView(topVM: topVM)
|
||||||
|
|
||||||
|
OffsetObservableScrollView(showsIndicators: false, scrollOffset: $scrollOffset) { proxy in
|
||||||
|
|
||||||
|
DatePicker("생년월일 입력", selection: $selectDate, displayedComponents: [.date])
|
||||||
|
.datePickerStyle(.compact)
|
||||||
|
.environment(\.locale, Locale(identifier: "ko_KR"))
|
||||||
|
.font(.nps(size: 16))
|
||||||
|
.padding()
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
|
}
|
||||||
|
.onAppear {
|
||||||
|
topVM.titleName = "회원가입"
|
||||||
|
topVM.setLeftBtn(Image(.Icon.left), size: CGPoint(x: 40, y: 40), action: leftAct)
|
||||||
|
topVM.setRightBtn(size: CGPoint(x: 40, y: 40), action: rightAct)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func leftAct() {
|
||||||
|
printLog("왼쪽 버튼 클릭")
|
||||||
|
appVM.naviState.set(act: .POP)
|
||||||
|
}
|
||||||
|
func rightAct() {
|
||||||
|
printLog("오른쪽 버튼 클릭")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ struct CalendarView: View {
|
||||||
topVM.setLeftBtn(size: CGPoint(x: 40, y: 40), action: leftAct)
|
topVM.setLeftBtn(size: CGPoint(x: 40, y: 40), action: leftAct)
|
||||||
topVM.setRightBtn(size: CGPoint(x: 40, y: 40), action: rightAct)
|
topVM.setRightBtn(size: CGPoint(x: 40, y: 40), action: rightAct)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,56 @@ class APIResponse<T: Codable>: Codable {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Status: Codable {
|
class Status: Codable {
|
||||||
let code: String
|
let code: APICode
|
||||||
let message: String
|
let message: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum APICode: Codable {
|
||||||
|
case success
|
||||||
|
case inputErr
|
||||||
|
case outputErr
|
||||||
|
case networkErr
|
||||||
|
case unknownErr
|
||||||
|
case anything(String)
|
||||||
|
|
||||||
|
init(from decoder: Decoder) throws {
|
||||||
|
let container = try decoder.singleValueContainer()
|
||||||
|
let rawValue = try container.decode(String.self)
|
||||||
|
switch rawValue {
|
||||||
|
case "000":
|
||||||
|
self = .success
|
||||||
|
case "001":
|
||||||
|
self = .inputErr
|
||||||
|
case "002":
|
||||||
|
self = .outputErr
|
||||||
|
case "003":
|
||||||
|
self = .networkErr
|
||||||
|
case "999":
|
||||||
|
self = .unknownErr
|
||||||
|
default:
|
||||||
|
self = .anything(rawValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func encode(to encoder: Encoder) throws {
|
||||||
|
var container = encoder.singleValueContainer()
|
||||||
|
switch self {
|
||||||
|
case .success:
|
||||||
|
try container.encode("000")
|
||||||
|
case .inputErr:
|
||||||
|
try container.encode("001")
|
||||||
|
case .outputErr:
|
||||||
|
try container.encode("002")
|
||||||
|
case .networkErr:
|
||||||
|
try container.encode("003")
|
||||||
|
case .unknownErr:
|
||||||
|
try container.encode("999")
|
||||||
|
case .anything(let value):
|
||||||
|
try container.encode(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// /api/v1/in/app/version ----------------
|
// /api/v1/in/app/version ----------------
|
||||||
|
|
||||||
class VersionData: Codable {
|
class VersionData: Codable {
|
||||||
|
|
|
@ -42,6 +42,7 @@ enum NaviAction: Hashable {
|
||||||
enum PathName: Hashable {
|
enum PathName: Hashable {
|
||||||
case Intro
|
case Intro
|
||||||
case Login
|
case Login
|
||||||
|
case Register(_ type: SNSLoginType, id: String)
|
||||||
case SelectAcademy(bids: [String])
|
case SelectAcademy(bids: [String])
|
||||||
case Main
|
case Main
|
||||||
case ChatRoom(id: String)
|
case ChatRoom(id: String)
|
||||||
|
|
|
@ -11,10 +11,54 @@ import Combine
|
||||||
|
|
||||||
class LoginViewModel: ObservableObject {
|
class LoginViewModel: ObservableObject {
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
@Published var toggleLoading: Bool = false
|
|
||||||
|
|
||||||
@Published var navigateToAcademy: Bool = false
|
@Published var toggleLoading: Bool = false
|
||||||
@Published var bidArray: [String] = []
|
@Published var pathName: PathName = .NONE
|
||||||
|
|
||||||
|
var bidArray: [String] = []
|
||||||
|
|
||||||
|
func loginTest(type: SNSLoginType, id: String) {
|
||||||
|
loadAPIData(url: "\(API_URL)",
|
||||||
|
path: "/api/v1/in/user/login",
|
||||||
|
parameters: [
|
||||||
|
"acctype": "\(type == .Apple ? "ST00": "ST01")",
|
||||||
|
"sns_id": "\(id)"
|
||||||
|
],
|
||||||
|
decodingType: APIResponse<User_Academy>.self)
|
||||||
|
.sink { [weak self] completion in
|
||||||
|
// API 자체적으로 내보내는 에러는 여기서 거를거고
|
||||||
|
switch completion {
|
||||||
|
case .failure(let error):
|
||||||
|
self?.toggleLoading = false
|
||||||
|
printLog("\(error)")
|
||||||
|
case .finished:
|
||||||
|
self?.toggleLoading = false
|
||||||
|
}
|
||||||
|
} receiveValue: { [weak self] response in
|
||||||
|
guard let self = self else { return }
|
||||||
|
guard let userAcademy = response as? APIResponse<User_Academy> else {return}
|
||||||
|
switch userAcademy.status.code {
|
||||||
|
case .success:
|
||||||
|
if let bids = userAcademy.data.toStringDict()["bid"] {
|
||||||
|
printLog(bids)
|
||||||
|
if let bidArray: [String] = jsonToSwift(bids) {
|
||||||
|
self.pathName = .SelectAcademy(bids: bidArray)
|
||||||
|
} else {
|
||||||
|
printLog("JSON 변환 실패")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case .anything(let apiCode):
|
||||||
|
// MARK: TO-DO
|
||||||
|
// 회원가입 로직
|
||||||
|
printLog("\(apiCode) : 로그인 정보 없음")
|
||||||
|
self.pathName = .Register(type, id: "\(id)")
|
||||||
|
default:
|
||||||
|
// 그외에 서버에서 처리를 하다가 문제가 생겨서 발생하는 에러는 여기로 보낼거임
|
||||||
|
printLog("ERROR")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
|
}
|
||||||
|
|
||||||
func loginAction(type: SNSLoginType) {
|
func loginAction(type: SNSLoginType) {
|
||||||
LoginController().login(type)
|
LoginController().login(type)
|
||||||
|
@ -38,14 +82,11 @@ class LoginViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
} receiveValue: { [weak self] response in
|
} receiveValue: { [weak self] response in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
guard let ua = response as? APIResponse<User_Academy> else {return}
|
guard let userAcademy = response as? APIResponse<User_Academy> else {return}
|
||||||
if let bids = ua.data.toStringDict()["bid"] {
|
if let bids = userAcademy.data.toStringDict()["bid"] {
|
||||||
printLog(bids)
|
printLog(bids)
|
||||||
if let bidArray: [String] = jsonToSwift(bids) {
|
if let bidArray: [String] = jsonToSwift(bids) {
|
||||||
// 정상 적으로 학원 ID를 불러 온거니까 이제 여기서 할 걸 정해야 함
|
self.pathName = .SelectAcademy(bids: bidArray)
|
||||||
printLog("GOOD")
|
|
||||||
self.navigateToAcademy = true
|
|
||||||
self.bidArray = bidArray
|
|
||||||
} else {
|
} else {
|
||||||
printLog("JSON 변환 실패")
|
printLog("JSON 변환 실패")
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ class SelectAcademyViewModel: ObservableObject {
|
||||||
|
|
||||||
func loadAcademy(bids: [String]) {
|
func loadAcademy(bids: [String]) {
|
||||||
loadAPIData(url: "\(API_URL)",
|
loadAPIData(url: "\(API_URL)",
|
||||||
path: "/api/v1/in/member/academy",
|
path: "/api/v1/in/user/academy",
|
||||||
method: .post,
|
method: .post,
|
||||||
parameters: ["bids": bids],
|
parameters: ["bids": bids],
|
||||||
decodingType: APIResponse<[AcademyName]>.self)
|
decodingType: APIResponse<[AcademyName]>.self)
|
||||||
|
|
|
@ -17,9 +17,7 @@ class WebSocketManager: ObservableObject ,WebSocketDelegate {
|
||||||
@Published var receivedMessage: [String] = []
|
@Published var receivedMessage: [String] = []
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
// guard let url = URL(string: "wss://devacamate.ipstein.myds.me/chatHub?transport=webSockets") else { return }
|
|
||||||
guard let url = URL(string: "\(WS_URL)/chatHub?transport=webSockets") else { return }
|
guard let url = URL(string: "\(WS_URL)/chatHub?transport=webSockets") else { return }
|
||||||
// guard let url = URL(string: "\(API_URL)/chatHub?transport=websockets3") else { return }
|
|
||||||
var request = URLRequest(url: url)
|
var request = URLRequest(url: url)
|
||||||
request.timeoutInterval = 5
|
request.timeoutInterval = 5
|
||||||
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user