diff --git a/waosSwift.xcodeproj/project.pbxproj b/waosSwift.xcodeproj/project.pbxproj index 1109c05..a23d940 100644 --- a/waosSwift.xcodeproj/project.pbxproj +++ b/waosSwift.xcodeproj/project.pbxproj @@ -56,9 +56,6 @@ BF78B5FA22942CBB0057157A /* CoreModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78B5F922942CBB0057157A /* CoreModel.swift */; }; BF78B5FC22942CCD0057157A /* CoreResponses.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78B5FB22942CCD0057157A /* CoreResponses.swift */; }; BF78B60822954B3F0057157A /* me.json in Resources */ = {isa = PBXBuildFile; fileRef = BF78B60622954B3F0057157A /* me.json */; }; - BF78B6142295713B0057157A /* SplashController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78B6132295713B0057157A /* SplashController.swift */; }; - BF78B616229571460057157A /* SplashFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78B615229571460057157A /* SplashFlow.swift */; }; - BF78B618229571550057157A /* SplashReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78B617229571550057157A /* SplashReactor.swift */; }; BF78B61A2295DBF70057157A /* RxAppState.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF78B6192295DBF70057157A /* RxAppState.framework */; }; BF78B61C229683A90057157A /* token.json in Resources */ = {isa = PBXBuildFile; fileRef = BF78B61B229683A90057157A /* token.json */; }; BF78B61E2296CE7B0057157A /* TokenState.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78B61D2296CE7B0057157A /* TokenState.swift */; }; @@ -188,9 +185,6 @@ BF78B5F922942CBB0057157A /* CoreModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreModel.swift; sourceTree = ""; }; BF78B5FB22942CCD0057157A /* CoreResponses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreResponses.swift; sourceTree = ""; }; BF78B60622954B3F0057157A /* me.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = me.json; sourceTree = ""; }; - BF78B6132295713B0057157A /* SplashController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashController.swift; sourceTree = ""; }; - BF78B615229571460057157A /* SplashFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashFlow.swift; sourceTree = ""; }; - BF78B617229571550057157A /* SplashReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashReactor.swift; sourceTree = ""; }; BF78B6192295DBF70057157A /* RxAppState.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxAppState.framework; path = Carthage/Build/iOS/RxAppState.framework; sourceTree = ""; }; BF78B61B229683A90057157A /* token.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = token.json; sourceTree = ""; }; BF78B61D2296CE7B0057157A /* TokenState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenState.swift; sourceTree = ""; }; @@ -488,7 +482,6 @@ BF4A2F88225C9AFF0001B4CE /* app */, BF4A2F4F225B7C200001B4CE /* core */, BF4A2F5C225B7C200001B4CE /* onBoarding */, - BF78B60E22956D940057157A /* splash */, BF058D712282BC5300E2A077 /* auth */, BF4A2F77225BB65E0001B4CE /* tasks */, BF4A2F78225BB6690001B4CE /* secondController */, @@ -611,40 +604,6 @@ path = Libs; sourceTree = ""; }; - BF78B60E22956D940057157A /* splash */ = { - isa = PBXGroup; - children = ( - BF78B60F22956EEE0057157A /* controllers */, - BF78B61022956EF30057157A /* flow */, - BF78B612229571100057157A /* reactors */, - ); - path = splash; - sourceTree = ""; - }; - BF78B60F22956EEE0057157A /* controllers */ = { - isa = PBXGroup; - children = ( - BF78B6132295713B0057157A /* SplashController.swift */, - ); - path = controllers; - sourceTree = ""; - }; - BF78B61022956EF30057157A /* flow */ = { - isa = PBXGroup; - children = ( - BF78B615229571460057157A /* SplashFlow.swift */, - ); - path = flow; - sourceTree = ""; - }; - BF78B612229571100057157A /* reactors */ = { - isa = PBXGroup; - children = ( - BF78B617229571550057157A /* SplashReactor.swift */, - ); - path = reactors; - sourceTree = ""; - }; BF794D432268722B000B19F3 /* controllers */ = { isa = PBXGroup; children = ( @@ -1048,7 +1007,6 @@ files = ( BFDE25FE227B052D008CBD30 /* NSViewController+Rx.swift in Sources */, BF4A2F7E225BB9270001B4CE /* TasksListReactor.swift in Sources */, - BF78B616229571460057157A /* SplashFlow.swift in Sources */, BF058D7B2282BCC500E2A077 /* AuthSigninReactor.swift in Sources */, BF9A3679228EB0A900EE2AB8 /* Networking.swift in Sources */, BF4A2F6B225B7C200001B4CE /* OnBoardingReactor.swift in Sources */, @@ -1076,7 +1034,6 @@ BF4A2F80225BB9360001B4CE /* SecondReactor.swift in Sources */, BFDE2602227B17D4008CBD30 /* AppServicesProvider.swift in Sources */, BF8C6731228022140012B5A8 /* UICollectionView+RxReusableKit.swift in Sources */, - BF78B6142295713B0057157A /* SplashController.swift in Sources */, BF0CD6AB22563C9800844F9A /* Strings.swift in Sources */, BF8C6723227C3E1E0012B5A8 /* TasksCellReactor.swift in Sources */, BF4A2F87225C8F160001B4CE /* UILocalizations.swift in Sources */, @@ -1099,7 +1056,6 @@ BF4A2F45225B751F0001B4CE /* AppFlow.swift in Sources */, BF4A2FAE2260F0040001B4CE /* Logger.swift in Sources */, BF78B61E2296CE7B0057157A /* TokenState.swift in Sources */, - BF78B618229571550057157A /* SplashReactor.swift in Sources */, BF4A2F74225BB4B90001B4CE /* AppSteps.swift in Sources */, BF9A3670228D5F2700EE2AB8 /* Stubbed.swift in Sources */, BF9A3663228C3F2500EE2AB8 /* TasksApi.swift in Sources */, diff --git a/waosSwift/lib/helpers/Errors.swift b/waosSwift/lib/helpers/Errors.swift index a322217..9705fc0 100644 --- a/waosSwift/lib/helpers/Errors.swift +++ b/waosSwift/lib/helpers/Errors.swift @@ -13,25 +13,25 @@ import Moya * @param {Error} error * @return {CustomError} */ -func getNetworkError(_ error: Error, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) -> CustomError! { +func getNetworkError(_ error: Error, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) -> NetworkError! { if let response = (error as? MoyaError)?.response { if let networkError = try? response.map(NetworkError.self) { - return CustomError.networkError(networkError) + return networkError } else if response.statusCode != 200, let jsonObject = try? response.mapJSON() { - let networkError = NetworkError(type: "MoyaError", message: "\(response.statusCode) : \(jsonObject)", error: "unknow") - return CustomError.networkError(networkError) + let networkError = NetworkError(type: "MoyaError", message: "\(jsonObject)", error: "unknow", code: response.statusCode) + return networkError } else if response.statusCode != 200, let jsonObject = try? response.mapString() { - let networkError = NetworkError(type: "MoyaError", message: "\(response.statusCode) : \(jsonObject)", error: "unknow") - return CustomError.networkError(networkError) + let networkError = NetworkError(type: "MoyaError", message: "\(jsonObject)", error: "unknow", code: response.statusCode) + return networkError } else { - let networkError = NetworkError(type: "MoyaError", message: error.localizedDescription, error: "unknow") + let networkError = NetworkError(type: "MoyaError", message: error.localizedDescription, error: "unknow", code: response.statusCode) log.warning("🌎 Error -> \(networkError.type) : \(networkError.message)", file: file, function: function, line: line) - return CustomError.networkError(networkError) + return networkError } } else { let networkError = NetworkError(type: "unknow", message: "unknow", error: "unknow") log.error("🌎 Error -> \(networkError.type) : \(networkError.message)", file: file, function: function, line: line) - return CustomError.networkError(networkError) + return networkError } } @@ -39,23 +39,29 @@ func getNetworkError(_ error: Error, file: StaticString = #file, function: Stati * Custom Errors */ -enum CustomError: Swift.Error { - case networkError(NetworkError) -} +//enum CustomError: Error { +// case networkError(NetworkError) +//} /** * Model Network Errors */ -struct NetworkError { - var error: String - var message: String - var type: String +struct NetworkError: Error { + let error: String + let message: String + let type: String + let code: Int? + + var localizedDescription: String { + return NSLocalizedString(message, comment: "") + } - init(type: String, message: String, error: String) { + init(type: String, message: String, error: String, code: Int? = 0) { self.type = type self.message = message self.error = error + self.code = code } } @@ -64,6 +70,7 @@ extension NetworkError: Decodable { case type case message case error + case code } init(from decoder: Decoder) throws { @@ -72,5 +79,6 @@ extension NetworkError: Decodable { type = try container.decode(String.self, forKey: .type) message = try container.decode(String.self, forKey: .message) error = try container.decode(String.self, forKey: .error) + code = try container.decode(Int.self, forKey: .code) } } diff --git a/waosSwift/lib/services/Preferences.swift b/waosSwift/lib/services/Preferences.swift index f6303d7..5e0337c 100644 --- a/waosSwift/lib/services/Preferences.swift +++ b/waosSwift/lib/services/Preferences.swift @@ -1,3 +1,17 @@ +/** + * Struct + */ + +struct Status { + var onBoarded: Bool + var isLogged: Bool + + init(onBoarded: Bool, isLogged: Bool) { + self.onBoarded = onBoarded + self.isLogged = isLogged + } +} + /** * protocol */ @@ -5,6 +19,8 @@ protocol PreferencesServiceType { var onBoarded: Bool { get set } var isLogged: Bool { get set } + // global + var status: Status { get } } /** @@ -28,6 +44,12 @@ class PreferencesService: PreferencesServiceType { UserDefaults.standard[#function] = newValue } } + // global + var status: Status { + get { + return Status(onBoarded: onBoarded, isLogged: isLogged) + } + } } /** @@ -48,4 +70,12 @@ extension Reactive where Base: PreferencesService { .observe(Bool.self, #function) .map { $0 ?? false } } + var status: Observable { + return Observable.combineLatest( + onBoarded, isLogged, + resultSelector: { onBoarded, isLogged in + return Status(onBoarded: onBoarded, isLogged: isLogged) + } + ) + } } diff --git a/waosSwift/modules/app/AppFlow.swift b/waosSwift/modules/app/AppFlow.swift index 535763e..1810d0c 100644 --- a/waosSwift/modules/app/AppFlow.swift +++ b/waosSwift/modules/app/AppFlow.swift @@ -24,9 +24,7 @@ final class AppFlow: Flow { switch step { case .onboardingIsRequired: return navigationToOnboardingScreen() - case .onboardingIsComplete, .splashIsRequired: - return navigationToSplashScreen() - case .splashIsComplete, .authIsRequired: + case .onboardingIsComplete, .authIsRequired: return navigationToAuthScreen() case .authIsComplete, .dashboardIsRequired: return navigationToDashboardScreen() @@ -46,16 +44,16 @@ final class AppFlow: Flow { return .one(flowContributor: .contribute(withNextPresentable: onboardingFlow, withNextStepper: OneStepper(withSingleStep: Steps.onboardingIsRequired))) } - private func navigationToSplashScreen() -> FlowContributors { - if let rootViewController = self.rootWindow.rootViewController { - rootViewController.dismiss(animated: false) - } - let splashFlow = SplashFlow(withServices: self.services) - Flows.whenReady(flow1: splashFlow) { [unowned self] (root) in - self.rootWindow.rootViewController = root - } - return .one(flowContributor: .contribute(withNextPresentable: splashFlow, withNextStepper: OneStepper(withSingleStep: Steps.splashIsRequired))) - } +// private func navigationToSplashScreen() -> FlowContributors { +// if let rootViewController = self.rootWindow.rootViewController { +// rootViewController.dismiss(animated: false) +// } +// let splashFlow = SplashFlow(withServices: self.services) +// Flows.whenReady(flow1: splashFlow) { [unowned self] (root) in +// self.rootWindow.rootViewController = root +// } +// return .one(flowContributor: .contribute(withNextPresentable: splashFlow, withNextStepper: OneStepper(withSingleStep: Steps.splashIsRequired))) +// } private func navigationToAuthScreen() -> FlowContributors { if let rootViewController = self.rootWindow.rootViewController { @@ -95,18 +93,18 @@ class AppStepper: Stepper { func readyToEmitSteps() { self.servicesProvider .preferencesService.rx - .onBoarded - .map { $0 ? Steps.onboardingIsComplete : Steps.onboardingIsRequired } + .status + .map { result in + if(result.onBoarded && result.isLogged) { + return Steps.authIsComplete + } else if ( result.onBoarded && !result.isLogged) { + return Steps.onboardingIsComplete + } else { + return Steps.onboardingIsRequired + } + } .bind(to: self.steps) .disposed(by: self.disposeBag) // .debug() - - self.servicesProvider - .preferencesService.rx - .isLogged - .map { $0 ? Steps.authIsComplete : Steps.authIsRequired } - .bind(to: self.steps) - .disposed(by: self.disposeBag) - // .debug() } } diff --git a/waosSwift/modules/app/AppSteps.swift b/waosSwift/modules/app/AppSteps.swift index 110da66..2358c6e 100644 --- a/waosSwift/modules/app/AppSteps.swift +++ b/waosSwift/modules/app/AppSteps.swift @@ -2,9 +2,6 @@ enum Steps: Step { case onboardingIsRequired case onboardingIsComplete - case splashIsRequired - case splashIsComplete(_ result: Bool) - case authIsRequired case authIsComplete diff --git a/waosSwift/modules/auth/reactors/AuthSigninReactor.swift b/waosSwift/modules/auth/reactors/AuthSigninReactor.swift index 97e6b9f..47820f4 100644 --- a/waosSwift/modules/auth/reactors/AuthSigninReactor.swift +++ b/waosSwift/modules/auth/reactors/AuthSigninReactor.swift @@ -26,7 +26,7 @@ final class AuthSigninReactor: Reactor { case updatePassword(String) case goSignUp case success(String) - case error(CustomError) + case error(NetworkError) } // the current view state @@ -102,8 +102,10 @@ final class AuthSigninReactor: Reactor { log.verbose("♻️ Mutation -> State : succes \(success)") // error case let .error(error): - log.verbose("♻️ Mutation -> State : error") - print("YESSSS \(error)") + log.verbose("♻️ Mutation -> State : error \(error)") + if let code = error.code, code == 401 { + self.provider.preferencesService.isLogged = false + } } return state } diff --git a/waosSwift/modules/auth/reactors/AuthSignupReactor.swift b/waosSwift/modules/auth/reactors/AuthSignupReactor.swift index 4aa64db..9efcb9f 100644 --- a/waosSwift/modules/auth/reactors/AuthSignupReactor.swift +++ b/waosSwift/modules/auth/reactors/AuthSignupReactor.swift @@ -30,7 +30,7 @@ final class AuthSignUpReactor: Reactor { case updatePassword(String) case goSignIn case dismiss - case error(CustomError) + case error(NetworkError) } // the current view state @@ -126,8 +126,10 @@ final class AuthSignUpReactor: Reactor { state.isDismissed = true // error case let .error(error): - log.verbose("♻️ Mutation -> State : error") - print("YESSSS \(error)") + log.verbose("♻️ Mutation -> State : error \(error)") + if let code = error.code, code == 401 { + self.provider.preferencesService.isLogged = false + } } return state } diff --git a/waosSwift/modules/auth/services/AuthService.swift b/waosSwift/modules/auth/services/AuthService.swift index 0d42513..17c4024 100644 --- a/waosSwift/modules/auth/services/AuthService.swift +++ b/waosSwift/modules/auth/services/AuthService.swift @@ -3,10 +3,10 @@ */ protocol AuthServiceType { - func signUp(firstName: String, lastName: String, email: String, password: String) -> Observable> - func signIn(email: String, password: String) -> Observable> - func me() -> Observable> - func token() -> Observable> + func signUp(firstName: String, lastName: String, email: String, password: String) -> Observable> + func signIn(email: String, password: String) -> Observable> + func me() -> Observable> + func token() -> Observable> } final class AuthService: CoreService, AuthServiceType { @@ -17,7 +17,7 @@ final class AuthService: CoreService, AuthServiceType { .startWith(nil) .share(replay: 1) - func signUp(firstName: String, lastName: String, email: String, password: String) -> Observable> { + func signUp(firstName: String, lastName: String, email: String, password: String) -> Observable> { log.verbose("🔌 service : signIn") return self.networking .request(.signUp(firstName: firstName, lastName: lastName, email: email, password: password)) @@ -31,7 +31,7 @@ final class AuthService: CoreService, AuthServiceType { .catchError { err in .just(.error(getNetworkError(err)))} } - func signIn(email: String, password: String) -> Observable> { + func signIn(email: String, password: String) -> Observable> { log.verbose("🔌 service : signIn") return self.networking .request(.signIn(email: email, password: password)) @@ -45,7 +45,7 @@ final class AuthService: CoreService, AuthServiceType { .catchError { err in .just(.error(getNetworkError(err)))} } - func me() -> Observable> { + func me() -> Observable> { log.verbose("🔌 service : me") return self.networking .request(.me) @@ -59,7 +59,7 @@ final class AuthService: CoreService, AuthServiceType { .catchError { err in .just(.error(getNetworkError(err)))} } - func token() -> Observable> { + func token() -> Observable> { log.verbose("🔌 service : me") return self.networking .request(.token) diff --git a/waosSwift/modules/splash/controllers/SplashController.swift b/waosSwift/modules/splash/controllers/SplashController.swift deleted file mode 100644 index 506658c..0000000 --- a/waosSwift/modules/splash/controllers/SplashController.swift +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Dependencies - */ - -import UIKit -import ReactorKit - -/** - * Controller - */ - -class SplashController: CoreController, View, Stepper { - - // MARK: UI - - let label = UILabel().then { - $0.text = "LOLILOL" - $0.textAlignment = .center - } - - // MARK: Properties - - let steps = PublishRelay() - - // MARK: Initializing - - init(reactor: SplashReactor) { - super.init() - self.reactor = reactor - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: View Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - self.view.backgroundColor = .white - self.view.addSubview(self.label) - } - - override func setupConstraints() { - label.snp.makeConstraints { (make) -> Void in - make.width.height.equalTo(250) - make.center.equalTo(self.view) - } - } - - // MARK: Binding - - func bind(reactor: SplashReactor) { - bindView(reactor) - bindAction(reactor) - bindState(reactor) - } -} - -/** - * Extensions - */ - -private extension SplashController { - - // MARK: views (View -> View) - - func bindView(_ reactor: SplashReactor) { - // Action - self.rx.viewDidAppear - .map { _ in Reactor.Action.checkUserToken } - .bind(to: reactor.action) - .disposed(by: self.disposeBag) - } - - // MARK: actions (View -> Reactor) - - func bindAction(_ reactor: SplashReactor) {} - - // MARK: states (Reactor -> View) - - func bindState(_ reactor: SplashReactor) {} -} diff --git a/waosSwift/modules/splash/flow/SplashFlow.swift b/waosSwift/modules/splash/flow/SplashFlow.swift deleted file mode 100644 index 380a013..0000000 --- a/waosSwift/modules/splash/flow/SplashFlow.swift +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Dependencies - */ - -import UIKit - -/** - * Flow - */ - -final class SplashFlow: Flow { - var root: Presentable { - return self.rootViewController - } - - private let rootViewController = UINavigationController() - private let services: AppServicesProvider - - init(withServices services: AppServicesProvider) { - self.services = services - } - - deinit { - log.info("🗑 \(type(of: self))") - } - - func navigate(to step: Step) -> FlowContributors { - guard let step = step as? Steps else { return .none } - switch step { - case .splashIsRequired: - return navigateToSplashScreen() - case .splashIsComplete(let result): - if (result) { - return .end(forwardToParentFlowWithStep: Steps.authIsComplete) - } else { - return .end(forwardToParentFlowWithStep: Steps.splashIsComplete(false)) - } - default: - return .none - } - } - - private func navigateToSplashScreen() -> FlowContributors { - let provider = AppServicesProvider() - let reactor = SplashReactor(provider: provider) - let viewController = SplashController(reactor: reactor) - viewController.title = "Splash" - self.rootViewController.pushViewController(viewController, animated: false) - return .one(flowContributor: .contribute(withNextPresentable: viewController, withNextStepper: viewController)) - } -} diff --git a/waosSwift/modules/splash/reactors/SplashReactor.swift b/waosSwift/modules/splash/reactors/SplashReactor.swift deleted file mode 100644 index 0011f0b..0000000 --- a/waosSwift/modules/splash/reactors/SplashReactor.swift +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Dependencies - */ - -import ReactorKit - -/** - * Reactor - */ - -final class SplashReactor: Reactor { - - // MARK: Constants - - // user actions - enum Action { - case checkUserToken - } - - // state changes - enum Mutation { - case success(String) - case error(CustomError) - } - - // the current view state - struct State { - init() { - } - } - - // MARK: Properties - - let provider: AppServicesProviderType - let initialState: State - - // MARK: Initialization - - init(provider: AppServicesProviderType) { - self.provider = provider - self.initialState = State() - } - - // MARK: Action -> Mutation (mutate() receives an Action and generates an Observable) - - func mutate(action: Action) -> Observable { - switch action { - case .checkUserToken: - log.verbose("♻️ Action -> Mutation : checkUserToken") - let status = getTokenStatus() - switch status { - case .isOk: - self.provider.preferencesService.isLogged = true - return .just(.success("token ok")) - case .toDefine: - self.provider.preferencesService.isLogged = false - return .just(.success("token to define")) - case .toRenew: - // if token expire time is more than X ms - return self.provider.authService - .token() - .asObservable() - .map { result in - switch result { - case let .success(response): - UserDefaults.standard.set(response.tokenExpiresIn, forKey: "CookieExpire") - return .success("token renewed") - case let .error(err): - self.provider.preferencesService.isLogged = false - return .error(err) - } - } - } - } - } - - // MARK: Mutation -> State (reduce() generates a new State from a previous State and a Mutation) - - func reduce(state: State, mutation: Mutation) -> State { - var state = state - switch mutation { - // success - case let .success(success): - log.verbose("♻️ Mutation -> State : succes \(success)") - // error - case let .error(error): - log.verbose("♻️ Mutation -> State : error") - print("YESSSS \(error)") - } - return state - } - -} diff --git a/waosSwift/modules/tasks/reactors/TasksListReactor.swift b/waosSwift/modules/tasks/reactors/TasksListReactor.swift index 5d5669a..5b0bc7b 100644 --- a/waosSwift/modules/tasks/reactors/TasksListReactor.swift +++ b/waosSwift/modules/tasks/reactors/TasksListReactor.swift @@ -33,7 +33,7 @@ final class TasksListReactor: Reactor { case setRefreshing(Bool) // default case success(String) - case error(CustomError) + case error(NetworkError) } // the current view state @@ -152,8 +152,10 @@ final class TasksListReactor: Reactor { log.verbose("♻️ Mutation -> State : succes \(success)") // error case let .error(error): - log.verbose("♻️ Mutation -> State : error") - print("YESSSS \(error)") + log.verbose("♻️ Mutation -> State : error \(error)") + if let code = error.code, code == 401 { + self.provider.preferencesService.isLogged = false + } } return state } diff --git a/waosSwift/modules/tasks/reactors/TasksViewReactor.swift b/waosSwift/modules/tasks/reactors/TasksViewReactor.swift index b42dd98..73f376d 100644 --- a/waosSwift/modules/tasks/reactors/TasksViewReactor.swift +++ b/waosSwift/modules/tasks/reactors/TasksViewReactor.swift @@ -28,7 +28,7 @@ final class TasksViewReactor: Reactor { enum Mutation { case updateTitle(String) case dismiss - case error(CustomError) + case error(NetworkError) } // the current view state @@ -105,17 +105,19 @@ final class TasksViewReactor: Reactor { func reduce(state: State, mutation: Mutation) -> State { var state = state switch mutation { + // update title case let .updateTitle(title): state.task.title = title - return state + // dissmiss case .dismiss: state.isDismissed = true - return state // error case let .error(error): - log.verbose("♻️ Mutation -> State : error") - print(error) - return state + log.verbose("♻️ Mutation -> State : error \(error)") + if let code = error.code, code == 401 { + self.provider.preferencesService.isLogged = false + } } + return state } } diff --git a/waosSwift/modules/tasks/services/TasksService.swift b/waosSwift/modules/tasks/services/TasksService.swift index 78dc8ca..176f72c 100644 --- a/waosSwift/modules/tasks/services/TasksService.swift +++ b/waosSwift/modules/tasks/services/TasksService.swift @@ -5,10 +5,10 @@ protocol TasksServiceType { var tasks: Observable<[Tasks]?> { get } - func list() -> Observable> - func create(_ task: Tasks) -> Observable> - func save(_ task: Tasks) -> Observable> - func delete(_ task: Tasks) -> Observable> + func list() -> Observable> + func create(_ task: Tasks) -> Observable> + func save(_ task: Tasks) -> Observable> + func delete(_ task: Tasks) -> Observable> } final class TasksService: CoreService, TasksServiceType { @@ -22,7 +22,7 @@ final class TasksService: CoreService, TasksServiceType { .startWith(nil) .share(replay: 1) - func list() -> Observable> { + func list() -> Observable> { log.verbose("🔌 service : get") return self.networking .request(.list) @@ -36,7 +36,7 @@ final class TasksService: CoreService, TasksServiceType { .catchError { err in .just(.error(getNetworkError(err)))} } - func create(_ task: Tasks) -> Observable> { + func create(_ task: Tasks) -> Observable> { log.verbose("🔌 service : create") return self.networking .request(.create(task)) @@ -51,7 +51,7 @@ final class TasksService: CoreService, TasksServiceType { .catchError { err in .just(.error(getNetworkError(err)))} } - func save(_ task: Tasks) -> Observable> { + func save(_ task: Tasks) -> Observable> { log.verbose("🔌 service : save") return self.networking .request(.update(task)) @@ -68,7 +68,7 @@ final class TasksService: CoreService, TasksServiceType { .catchError { err in .just(.error(getNetworkError(err)))} } - func delete(_ task: Tasks) -> Observable> { + func delete(_ task: Tasks) -> Observable> { log.verbose("🔌 service : delete") return self.networking .request(.delete(task))