Skip to content

Commit 3754ee4

Browse files
committed
refactor: 받은 에러 코드를 보고 확인 후 해당 내용을 얼럿으로 띄우도록 개선
1 parent 9d02aab commit 3754ee4

4 files changed

Lines changed: 99 additions & 13 deletions

File tree

DevLog/Infra/Common/InfraLayerError.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ enum UIError: Error {
2727
enum EmailFetchError: Error, Equatable {
2828
case emailNotFound
2929
case emailMismatch
30+
31+
var code: String {
32+
switch self {
33+
case .emailMismatch:
34+
"email_mismatch"
35+
case .emailNotFound:
36+
"email_not_found"
37+
}
38+
}
3039
}
3140

3241
enum SocialLoginError: Error {

DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,19 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
214214
// Firebase Function 호출: Custom Token 발급
215215
func requestTokens(authorizationCode: String) async throws -> (String, String) {
216216
let requestTokenFunction = functions.httpsCallable(FunctionName.requestGithubTokens)
217-
let result = try await requestTokenFunction.call(["code": authorizationCode])
218-
219-
if let data = result.data as? [String: Any],
220-
let accessToken = data["accessToken"] as? String,
221-
let customToken = data["customToken"] as? String {
222-
return (accessToken, customToken)
217+
218+
do {
219+
let result = try await requestTokenFunction.call(["code": authorizationCode])
220+
221+
if let data = result.data as? [String: Any],
222+
let accessToken = data["accessToken"] as? String,
223+
let customToken = data["customToken"] as? String {
224+
return (accessToken, customToken)
225+
}
226+
throw URLError(.badServerResponse)
227+
} catch {
228+
throw mapRequestTokensError(error)
223229
}
224-
throw URLError(.badServerResponse)
225230
}
226231

227232
func revokeAccessToken(accessToken: String? = nil) async throws {
@@ -288,6 +293,18 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
288293

289294
return gitHubEmails.first(where: { $0.verified })?.email
290295
}
296+
297+
func mapRequestTokensError(_ error: Error) -> Error {
298+
let nsError = error as NSError
299+
guard nsError.domain == FunctionsErrorDomain,
300+
let details = nsError.userInfo[FunctionsErrorDetailsKey] as? [String: Any],
301+
let reason = details["reason"] as? String,
302+
reason == EmailFetchError.emailNotFound.code else {
303+
return error
304+
}
305+
306+
return EmailFetchError.emailNotFound
307+
}
291308
}
292309

293310
extension GithubAuthenticationService: ASWebAuthenticationPresentationContextProviding {

DevLog/Presentation/ViewModel/LoginViewModel.swift

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ final class LoginViewModel: Store {
1212
struct State: Equatable {
1313
var isLoading = false
1414
var showAlert: Bool = false
15+
var alertType: AlertType?
1516
var alertTitle: String = ""
1617
var alertMessage: String = ""
1718
}
1819

1920
enum Action {
20-
case setAlert(Bool)
21+
case setAlert(Bool, AlertType? = nil)
2122
case tapSignInButton(AuthProvider)
2223
case setLoading(Bool)
2324
}
@@ -26,6 +27,11 @@ final class LoginViewModel: Store {
2627
case signIn(AuthProvider)
2728
}
2829

30+
enum AlertType {
31+
case emailUnavailable
32+
case error
33+
}
34+
2935
private let signInUseCase: SignInUseCase
3036
private let loadingState = LoadingState()
3137

@@ -42,8 +48,8 @@ final class LoginViewModel: Store {
4248
var effects: [SideEffect] = []
4349

4450
switch action {
45-
case .setAlert(let isPresented):
46-
setAlert(&state, isPresented: isPresented)
51+
case .setAlert(let isPresented, let alertType):
52+
setAlert(&state, isPresented: isPresented, alertType: alertType)
4753
case .tapSignInButton(let authProvider):
4854
effects = [.signIn(authProvider)]
4955
case .setLoading(let value):
@@ -64,7 +70,7 @@ final class LoginViewModel: Store {
6470
try await self.signInUseCase.execute(authProvider)
6571
} catch {
6672
if error.isSocialLoginCancelled { return }
67-
send(.setAlert(true))
73+
send(.setAlert(true, alertType(for: error)))
6874
}
6975
}
7076
}
@@ -75,10 +81,30 @@ private extension LoginViewModel {
7581
func setAlert(
7682
_ state: inout State,
7783
isPresented: Bool,
84+
alertType: AlertType?,
7885
) {
79-
state.alertTitle = String(localized: "common_error_title")
80-
state.alertMessage = String(localized: "common_error_message")
86+
switch alertType {
87+
case .emailUnavailable:
88+
state.alertTitle = String(localized: "login_alert_email_unavailable_title")
89+
state.alertMessage = String(localized: "login_alert_email_unavailable_message")
90+
case .error:
91+
state.alertTitle = String(localized: "common_error_title")
92+
state.alertMessage = String(localized: "common_error_message")
93+
case .none:
94+
state.alertTitle = ""
95+
state.alertMessage = ""
96+
}
8197
state.showAlert = isPresented
98+
state.alertType = alertType
99+
}
100+
101+
func alertType(for error: Error) -> AlertType {
102+
if let emailFetchError = error as? EmailFetchError,
103+
emailFetchError == .emailNotFound {
104+
return .emailUnavailable
105+
}
106+
107+
return .error
82108
}
83109

84110
func beginLoading(_ mode: LoadingState.Mode) {

DevLog/Resource/Localizable.xcstrings

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,40 @@
537537
}
538538
}
539539
},
540+
"login_alert_email_unavailable_message" : {
541+
"extractionState" : "manual",
542+
"localizations" : {
543+
"en" : {
544+
"stringUnit" : {
545+
"state" : "translated",
546+
"value" : "The selected GitHub account's email could not be verified, so sign in could not be completed. Check the GitHub account settings and try again."
547+
}
548+
},
549+
"ko" : {
550+
"stringUnit" : {
551+
"state" : "translated",
552+
"value" : "선택한 GitHub 계정의 이메일 정보를 확인할 수 없어 로그인할 수 없어요. GitHub 계정 설정을 확인한 뒤 다시 시도해주세요."
553+
}
554+
}
555+
}
556+
},
557+
"login_alert_email_unavailable_title" : {
558+
"extractionState" : "manual",
559+
"localizations" : {
560+
"en" : {
561+
"stringUnit" : {
562+
"state" : "translated",
563+
"value" : "Unable to Verify Email"
564+
}
565+
},
566+
"ko" : {
567+
"stringUnit" : {
568+
"state" : "translated",
569+
"value" : "이메일 확인 불가"
570+
}
571+
}
572+
}
573+
},
540574
"login_google_sign_in" : {
541575
"extractionState" : "manual",
542576
"localizations" : {

0 commit comments

Comments
 (0)