@@ -14,19 +14,18 @@ final class LoginViewModel: Store {
1414 struct State {
1515 var signIn : Bool ?
1616 var isLoading = false
17- var showToast : Bool = false
18- var toastMessage : String = " "
17+ var showAlert : Bool = false
18+ var alertTitle : String = " "
19+ var alertMessage : String = " "
1920 }
2021
2122 enum Action {
2223 case signOutAuto
23- case tapCloseToast
24+ case setAlert ( Bool )
2425 case tapSignInButton( AuthProvider )
2526 case tapSignOutButton
26- case didStartLoading
27- case didFinishLoading
28- case didLogined( result: Bool )
29- case didLoginFail( message: String )
27+ case setLoading( Bool )
28+ case setLogined( Bool )
3029 }
3130
3231 enum SideEffect {
@@ -54,65 +53,71 @@ final class LoginViewModel: Store {
5453 . removeDuplicates ( )
5554 . receive ( on: DispatchQueue . main)
5655 . sink { [ weak self] signIn in
57- self ? . send ( . didLogined ( result : signIn) )
56+ self ? . send ( . setLogined ( signIn) )
5857 }
5958 . store ( in: & cancellables)
6059 }
6160
6261 func reduce( with action: Action ) -> [ SideEffect ] {
62+ var state = self . state
63+
6364 switch action {
64- case . tapCloseToast :
65- state. showToast = false
65+ case . setAlert ( let isPresented ) :
66+ setAlert ( & state, isPresented : isPresented )
6667 case . tapSignInButton( let authProvider) :
68+ self . state = state
6769 return [ . signIn( authProvider) ]
6870 case . tapSignOutButton, . signOutAuto:
71+ self . state = state
6972 return [ . signOut]
70- case . didStartLoading:
71- state. isLoading = true
72- case . didFinishLoading:
73- state. isLoading = false
74- case . didLogined( let result) :
73+ case . setLoading( let value) :
74+ state. isLoading = value
75+ case . setLogined( let result) :
7576 state. signIn = result
76- case . didLoginFail( let message) :
77- state. toastMessage = message
78- state. showToast = true
7977 }
78+
79+ self . state = state
8080 return [ ]
8181 }
8282
8383 func run( _ effect: SideEffect ) {
84+ send ( . setLoading( true ) )
8485 switch effect {
8586 case . signIn( let authProvider) :
8687 Task {
87- send ( . didStartLoading)
8888 do {
89- defer { send ( . didFinishLoading) }
90-
91- _ = try await self . signInUseCase. execute ( authProvider)
92-
93- send ( . didFinishLoading)
94- send ( . didLogined( result: true ) )
89+ defer { send ( . setLoading( false ) ) }
90+ try await self . signInUseCase. execute ( authProvider)
91+ send ( . setLogined( true ) )
9592 sessionUseCase. execute ( true )
9693 } catch {
97- send ( . didFinishLoading)
98- send ( . didLogined( result: false ) )
94+ send ( . setLogined( false ) )
9995 sessionUseCase. execute ( false )
100- send ( . didLoginFail ( message : error . localizedDescription ) )
96+ send ( . setAlert ( true ) )
10197 }
10298 }
10399 case . signOut:
104100 Task {
105- send ( . didStartLoading)
106101 do {
107- defer { send ( . didFinishLoading ) }
102+ defer { send ( . setLoading ( false ) ) }
108103 try await self . signOutUseCase. execute ( )
109- send ( . didLogined ( result : false ) )
104+ send ( . setLogined ( false ) )
110105 sessionUseCase. execute ( false )
111106 } catch {
112- send ( . didFinishLoading)
113- send ( . didLoginFail( message: error. localizedDescription) )
107+ send ( . setAlert( true ) )
114108 }
115109 }
116110 }
117111 }
118112}
113+
114+ private extension LoginViewModel {
115+ func setAlert(
116+ _ state: inout State ,
117+ isPresented: Bool ,
118+ ) {
119+ state. alertTitle = " 오류 "
120+ state. alertMessage = " 문제가 발생했습니다. 잠시 후 다시 시도해주세요. "
121+ state. showAlert = isPresented
122+ }
123+ }
0 commit comments