diff --git a/HMH_iOS/HMH_iOS/Global/HMH_iOSApp.swift b/HMH_iOS/HMH_iOS/Global/HMH_iOSApp.swift index 08b56419..c0d97e58 100644 --- a/HMH_iOS/HMH_iOS/Global/HMH_iOSApp.swift +++ b/HMH_iOS/HMH_iOS/Global/HMH_iOSApp.swift @@ -1,20 +1,21 @@ -// -// HMH_iOSApp.swift -// HMH_iOS -// -// Created by 지희의 MAC on 2/15/24. -// - import SwiftUI - import KakaoSDKCommon import KakaoSDKAuth +enum AppState { + case onboardingComplete + case login + case home +} + @main struct HMH_iOSApp: App { @State private var isLoading: Bool = true - @AppStorage("isOnboarding") var isOnboarding : Bool = true - @AppStorage("isLogIn") var isLogIn : Bool = false + @StateObject var loginViewModel = LoginViewModel() + @AppStorage("isOnboarding") var isOnboarding = true + @AppStorage("isOnboardingComplete") var isOnboardingComplete = false + @AppStorage("isLogin") var isLogin = false + let kakaoAPIKey = Bundle.main.infoDictionary?["KAKAO_API_KEY"] as! String init() { @@ -25,19 +26,24 @@ struct HMH_iOSApp: App { WindowGroup { ZStack { Color(.blackground) + .ignoresSafeArea() if isLoading { SplashView(isLoading: $isLoading) } else { - if isLogIn { - TabBarView() - } else { - if isOnboarding { + if isOnboarding { + if isLogin { + TabBarView() + } else { LoginView() .onOpenURL { url in if (AuthApi.isKakaoTalkLoginUrl(url)) { _ = AuthController.handleOpenUrl(url: url) } } + } + } else { + if isOnboardingComplete { + OnboardingCompleteView() } else { OnboardingContentView() } @@ -47,4 +53,3 @@ struct HMH_iOSApp: App { } } } - diff --git a/HMH_iOS/HMH_iOS/Network/Base/NetworkProvider.swift b/HMH_iOS/HMH_iOS/Network/Base/NetworkProvider.swift index 248dc339..9da7da39 100644 --- a/HMH_iOS/HMH_iOS/Network/Base/NetworkProvider.swift +++ b/HMH_iOS/HMH_iOS/Network/Base/NetworkProvider.swift @@ -45,7 +45,8 @@ class NetworkProvider : MoyaProvider { switch result { /// 서버 통신 성공 case .success(let response): - if (200..<300).contains(response.statusCode) { + if (200..<300).contains(response.statusCode) || + response.statusCode == 403 { if let decodeData = try? JSONDecoder().decode(instance, from: response.data) { completion(decodeData) } else{ diff --git a/HMH_iOS/HMH_iOS/Presentation/Login/ViewModels/LoginViewModel.swift b/HMH_iOS/HMH_iOS/Presentation/Login/ViewModels/LoginViewModel.swift index 3dbd56bd..09e71a79 100644 --- a/HMH_iOS/HMH_iOS/Presentation/Login/ViewModels/LoginViewModel.swift +++ b/HMH_iOS/HMH_iOS/Presentation/Login/ViewModels/LoginViewModel.swift @@ -4,13 +4,13 @@ import KakaoSDKUser class LoginViewModel: NSObject, ObservableObject { @Published var socialLoginInfo = SocialLoginInfo() - @AppStorage("idToken") private var idToken = "" - @AppStorage("acessToken") private var acessToken = "" + @AppStorage("accessToken") private var accessToken = "" @AppStorage("refreshToken") private var refreshToken = "" @AppStorage("socialToken") private var socialToken = "" @AppStorage("socialPlatform") private var socialPlatform = "" - @AppStorage("isOnboarding") var isOnboarding : Bool? - @AppStorage("isLogIn") var isLoggedIn : Bool? + @AppStorage("userName") private var userName = "" + @AppStorage("isOnboarding") var isOnboarding: Bool? + @AppStorage("isLogin") var isLogin: Bool? func handleAppleLogin() { let request = ASAuthorizationAppleIDProvider().createRequest() @@ -31,7 +31,7 @@ class LoginViewModel: NSObject, ObservableObject { let idToken = oauthToken.accessToken self.socialPlatform = "KAKAO" self.socialToken = "Bearer " + idToken - self.getSocialLoginData() + self.postSocialLoginData() } } } else { @@ -43,31 +43,25 @@ class LoginViewModel: NSObject, ObservableObject { print("kakao success") self.socialPlatform = "KAKAO" let idToken = oauthToken.refreshToken - self.socialToken = "Bearer" + idToken - self.getSocialLoginData() + self.socialToken = "Bearer " + idToken + self.postSocialLoginData() } } } } - func getSocialLoginData() { + func postSocialLoginData() { let provider = Providers.AuthProvider let request = SocialLoginRequestDTO(socialPlatform: socialPlatform) provider.request(target: .socialLogin(data: request), instance: BaseResponse.self) { data in - DispatchQueue.main.async { - if data.status == 403 { - self.isOnboarding = true - self.isLoggedIn = false - } else if data.status == 200 { - guard let data = data.data else { return } - self.isOnboarding = true - self.isLoggedIn = true - self.idToken = data.token.accessToken - self.refreshToken = data.token.refreshToken - // UserManager.shared.updateToken(data.token.accessToken, data.token.refreshToken) - // UserManager.shared.updateUserId(data.userId) - } + if data.status == 403 { + self.isOnboarding = false + } else if data.status == 200 { + guard let data = data.data else { return } + self.isLogin = true + self.refreshToken = data.token.refreshToken + self.accessToken = data.token.accessToken } } } @@ -95,23 +89,23 @@ extension LoginViewModel: ASAuthorizationControllerDelegate { } self.socialPlatform = "APPLE" - self.getSocialLoginData() + self.postSocialLoginData() default: break } - } func handleAppleIDCredential(_ credential: ASAuthorizationAppleIDCredential) { let userIdentifier = credential.user let fullName = credential.fullName let name = (fullName?.familyName ?? "") + (fullName?.givenName ?? "") + self.userName = name guard let idToken = String(data: credential.identityToken ?? Data(), encoding: .utf8) else { return print("no idToken!!") } self.socialToken = idToken self.socialPlatform = "APPLE" //성공 시 수행할 api 로직 - self.getSocialLoginData() + self.postSocialLoginData() } func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { diff --git a/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewModels/OnboardingViewModel.swift b/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewModels/OnboardingViewModel.swift index cebf9a1b..02a92fc6 100644 --- a/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewModels/OnboardingViewModel.swift +++ b/HMH_iOS/HMH_iOS/Presentation/Onboarding/ViewModels/OnboardingViewModel.swift @@ -9,9 +9,13 @@ import SwiftUI class OnboardingViewModel: ObservableObject { + @AppStorage("isOnboardingComplete") var isOnboardingComplete = false + @Published var surveyButtonItems: [[SurveyButtonInfo]] + var problems: [String] + @Published var onboardingState: Int @@ -27,6 +31,53 @@ class OnboardingViewModel: ObservableObject { @Published var selectedAppMinute: String + var averageUseTime: String + + var period: Int + + var goalTime: Int + + var appGoalTime: Int + + + @AppStorage("socialPlatform") private var socialPlatform = "" + @AppStorage("userName") private var userName = "" + + func saveOnboardingData() { + print(onboardingState) + switch onboardingState { + case 1: + for index in 0..<4{ + if surveyButtonItems[onboardingState - 1][index].isSelected { + self.averageUseTime = surveyButtonItems[onboardingState - 1][index].buttonTitle + } + } + case 2: + for index in 0..<4{ + if surveyButtonItems[onboardingState - 1][index].isSelected { + self.problems.append(surveyButtonItems[onboardingState - 1][index].buttonTitle) + } + } + case 3: + for index in 0..<4{ + if surveyButtonItems[onboardingState - 1][index].isSelected { + self.period = removeLastCharacterAndConvertToInt(from: surveyButtonItems[onboardingState - 1][index].buttonTitle) ?? 0 + + print(surveyButtonItems[onboardingState - 1][index].buttonTitle) + + } + } + case 4: + self.goalTime = convertToTotalMilliseconds(hour: selectedGoalTime, minute: "0") + case 7: + self.appGoalTime = convertToTotalMilliseconds(hour: selectedAppHour, minute: selectedAppMinute) + postSignUpLoginData() + + default: + break + } + } + func addOnboardingState() { onboardingState += 1 } @@ -36,7 +87,10 @@ class OnboardingViewModel: ObservableObject { } func offIsCompleted() { - isCompleted = false + if onboardingState != 4 && onboardingState != 5 { + isCompleted = false + } + // 권한 허용 버튼 활성화를 위함 } func getSurveyState() -> Int { @@ -49,6 +103,35 @@ class OnboardingViewModel: ObservableObject { // } } + func removeLastCharacterAndConvertToInt(from string: String) -> Int? { + guard !string.isEmpty else { + return nil + } + + let modifiedString = String(string.dropLast()) + + return Int(modifiedString) + } + + + func postSignUpLoginData() { + let request = SignUpRequestDTO(socialPlatform: socialPlatform, name: userName, onboarding: Onboarding(averageUseTime: self.averageUseTime, problem: self.problems), challenge: Challenge(period: self.period, goalTime: self.goalTime, apps: [Apps(appCode: "#23324", goalTime: appGoalTime)])) + + let provider = Providers.AuthProvider + provider.request(target: .signUp(data: request), instance: BaseResponse.self) { data in + if data.status == 201 { + self.isOnboardingComplete = true +// self.setRootViewController(SignInCompleteViewController()) +// guard let data = data.data else { return } +// UserManager.shared.updateToken(data.token.accessToken, data.token.refreshToken) +// UserManager.shared.updateUserId(data.userId) + } else { + self.onboardingState = 6 +// self.setRootViewController(LoginViewController()) + } + } + } + func changeSurveyButtonStatus(num: Int) { for index in 0..<4{ if index == num { @@ -59,6 +142,16 @@ class OnboardingViewModel: ObservableObject { } } + func convertToTotalMilliseconds(hour: String?, minute: String?) -> Int { + let hourInt = Int(hour ?? "") ?? 0 + let minuteInt = Int(minute ?? "") ?? 0 + + let totalMinutes = hourInt * 60 + minuteInt + let totalMilliseconds = totalMinutes * 60 * 1000 + return totalMilliseconds + } + + func getOnboardigMain() -> String { switch onboardingState { case 0: @@ -142,5 +235,10 @@ class OnboardingViewModel: ObservableObject { self.selectedGoalTime = "" self.selectedAppHour = "" self.selectedAppMinute = "" + self.problems = [] + self.averageUseTime = "" + self.period = 0 + self.goalTime = 0 + self.appGoalTime = 0 } } diff --git a/HMH_iOS/HMH_iOS/Presentation/Onboarding/Views/NextButtonView.swift b/HMH_iOS/HMH_iOS/Presentation/Onboarding/Views/NextButtonView.swift index f61be4fe..d4b2e926 100644 --- a/HMH_iOS/HMH_iOS/Presentation/Onboarding/Views/NextButtonView.swift +++ b/HMH_iOS/HMH_iOS/Presentation/Onboarding/Views/NextButtonView.swift @@ -16,6 +16,7 @@ struct NextButtonView: View { Button { viewModel.addOnboardingState() viewModel.offIsCompleted() + viewModel.saveOnboardingData() } label: { Text(viewModel.getNextButton()) .font(.text4_semibold_16)