Skip to content

Commit

Permalink
[Network/#25] 회원 가입 연결
Browse files Browse the repository at this point in the history
  • Loading branch information
kim-seonwoo committed May 21, 2024
1 parent b26e265 commit a0e2649
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 41 deletions.
35 changes: 20 additions & 15 deletions HMH_iOS/HMH_iOS/Global/HMH_iOSApp.swift
Original file line number Diff line number Diff line change
@@ -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() {
Expand All @@ -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()
}
Expand All @@ -47,4 +53,3 @@ struct HMH_iOSApp: App {
}
}
}

3 changes: 2 additions & 1 deletion HMH_iOS/HMH_iOS/Network/Base/NetworkProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ class NetworkProvider<Provider : TargetType> : MoyaProvider<Provider> {
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{
Expand Down
42 changes: 18 additions & 24 deletions HMH_iOS/HMH_iOS/Presentation/#/ViewModels/#ViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -31,7 +31,7 @@ class LoginViewModel: NSObject, ObservableObject {
let idToken = oauthToken.accessToken
self.socialPlatform = "KAKAO"
self.socialToken = "Bearer " + idToken
self.getSocialLoginData()
self.postSocialLoginData()
}
}
} else {
Expand All @@ -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<SocialLogineResponseDTO>.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
}
}
}
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
post#LoginData()

default:
break
}
}

func addOnboardingState() {
onboardingState += 1
}
Expand All @@ -36,7 +87,10 @@ class OnboardingViewModel: ObservableObject {
}

func offIsCompleted() {
isCompleted = false
if onboardingState != 4 && onboardingState != 5 {
isCompleted = false
}
// 권한 허용 버튼 활성화를 위함
}

func getSurveyState() -> Int {
Expand All @@ -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 post#LoginData() {
let request = #RequestDTO(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: .#(data: request), instance: BaseResponse<#ResponseDTO>.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 {
Expand All @@ -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:
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct NextButtonView: View {
Button {
viewModel.addOnboardingState()
viewModel.offIsCompleted()
viewModel.saveOnboardingData()
} label: {
Text(viewModel.getNextButton())
.font(.text4_semibold_16)
Expand Down

0 comments on commit a0e2649

Please # to comment.