From cbe900711023356c9adc3d7c1a03f86dd501ea85 Mon Sep 17 00:00:00 2001 From: youn9k Date: Sun, 28 Jul 2024 23:57:24 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=97=B4?= =?UTF-8?q?=EB=A7=A4=20=EA=B0=AF=EC=88=98=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Reactors/MyInfoReactor.swift | 19 ++++++++++++++++-- .../MyInfo/MyInfoViewController.swift | 10 ++++++++-- ...onView.swift => FruitDrawButtonView.swift} | 20 +++++++++++++++---- .../Sources/Views/MyInfoView.swift | 15 +++++++++----- 4 files changed, 51 insertions(+), 13 deletions(-) rename Projects/Features/MyInfoFeature/Sources/Views/{DrawButtonView.swift => FruitDrawButtonView.swift} (85%) diff --git a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift index 13bb957f0..a39aad001 100644 --- a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift +++ b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift @@ -17,6 +17,7 @@ final class MyInfoReactor: Reactor { case mailNavigationDidTap case teamNavigationDidTap case settingNavigationDidTap + case completedFruitDraw(Int) case changedUserInfo(UserInfo?) case changedReadNoticeIDs([Int]) case requiredLogin @@ -30,6 +31,7 @@ final class MyInfoReactor: Reactor { case updateProfileImage(String) case updateNickname(String) case updatePlatform(String) + case updateFruitCount(Int) case updateIsAllNoticesRead(Bool) } @@ -49,6 +51,7 @@ final class MyInfoReactor: Reactor { var profileImage: String var nickname: String var platform: String + var fruitCount: Int var isAllNoticesRead: Bool @Pulse var loginButtonDidTap: Bool? @Pulse var profileImageDidTap: Bool? @@ -67,7 +70,8 @@ final class MyInfoReactor: Reactor { isLoggedIn: false, profileImage: "", nickname: "", - platform: "", + platform: "", + fruitCount: 0, isAllNoticesRead: false ) observeUserInfoChanges() @@ -99,12 +103,15 @@ final class MyInfoReactor: Reactor { updateIsLoggedIn(userInfo), updateProfileImage(userInfo), updateNickname(userInfo), - updatePlatform(userInfo) + updatePlatform(userInfo), + updateFruitCount(userInfo) ) case let .changedReadNoticeIDs(readIDs): return updateIsAllNoticesRead(readIDs) case .requiredLogin: return navigateLogin() + case let .completedFruitDraw(count): + return .just(.updateFruitCount(count)) } } @@ -134,6 +141,9 @@ final class MyInfoReactor: Reactor { case let .updateIsAllNoticesRead(isAllNoticesRead): newState.isAllNoticesRead = isAllNoticesRead + + case let .updateFruitCount(count): + newState.fruitCount = count } return newState } @@ -187,6 +197,11 @@ private extension MyInfoReactor { guard let platform = userInfo?.platform else { return .empty() } return .just(.updatePlatform(platform)) } + + func updateFruitCount(_ userInfo: UserInfo?) -> Observable { + guard let count = userInfo?.itemCount else { return .empty() } + return .just(.updateFruitCount(count)) + } func loginButtonDidTap() -> Observable { return .just(.loginButtonDidTap) diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift index ddbdc8813..c53e4ead4 100644 --- a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift @@ -113,6 +113,13 @@ final class MyInfoViewController: BaseReactorViewController, Edit owner.myInfoView.profileView.updatePlatform(platform: platform) } .disposed(by: disposeBag) + + reactor.state.map(\.fruitCount) + .distinctUntilChanged() + .bind(with: self) { owner, count in + owner.myInfoView.updateFruitCount(count: count) + } + .disposed(by: disposeBag) reactor.pulse(\.$loginButtonDidTap) .compactMap { $0 } @@ -275,7 +282,6 @@ extension MyInfoViewController: EqualHandleTappedType { extension MyInfoViewController: FruitDrawViewControllerDelegate { func completedFruitDraw(itemCount: Int) { - #warning("획득한 열매 갯수입니다. 다음 처리 진행해주세요.") - LogManager.printDebug("itemCount: \(itemCount)") + reactor?.action.onNext(.completedFruitDraw(itemCount)) } } diff --git a/Projects/Features/MyInfoFeature/Sources/Views/DrawButtonView.swift b/Projects/Features/MyInfoFeature/Sources/Views/FruitDrawButtonView.swift similarity index 85% rename from Projects/Features/MyInfoFeature/Sources/Views/DrawButtonView.swift rename to Projects/Features/MyInfoFeature/Sources/Views/FruitDrawButtonView.swift index f1e67870b..0bed3945b 100644 --- a/Projects/Features/MyInfoFeature/Sources/Views/DrawButtonView.swift +++ b/Projects/Features/MyInfoFeature/Sources/Views/FruitDrawButtonView.swift @@ -5,11 +5,15 @@ import SnapKit import Then import UIKit -private protocol DrawActionProtocol { +private protocol FruitDrawStateProtocol { + func updateFruitCount(count: Int) +} + +private protocol FruitDrawActionProtocol { var drawButtonDidTap: Observable { get } } -final class DrawButtonView: UIView { +final class FruitDrawButtonView: UIView { let backgroundView = UIView().then { $0.backgroundColor = .white $0.layer.borderWidth = 1 @@ -56,7 +60,7 @@ final class DrawButtonView: UIView { } } -extension DrawButtonView { +extension FruitDrawButtonView { func addView() { self.addSubviews( backgroundView, @@ -89,6 +93,14 @@ extension DrawButtonView { } } -extension Reactive: DrawActionProtocol where Base: DrawButtonView { +extension FruitDrawButtonView: FruitDrawStateProtocol { + func updateFruitCount(count: Int) { + countLabel.text = String(count) + } + + +} + +extension Reactive: FruitDrawActionProtocol where Base: FruitDrawButtonView { var drawButtonDidTap: Observable { base.drawButton.rx.tap.asObservable() } } diff --git a/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift b/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift index a4c64ef89..ec7f326fc 100644 --- a/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift +++ b/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift @@ -10,6 +10,7 @@ import Utility private protocol MyInfoStateProtocol { func updateIsHiddenLoginWarningView(isLoggedIn: Bool) + func updateFruitCount(count: Int) } private protocol MyInfoActionProtocol { @@ -35,7 +36,7 @@ final class MyInfoView: UIView { $0.isHidden = true } - let drawButtonView = DrawButtonView() + let fruitDrawButtonView = FruitDrawButtonView() let vStackView = UIStackView().then { $0.axis = .vertical @@ -103,7 +104,7 @@ private extension MyInfoView { contentView.addSubviews( loginWarningView, profileView, - drawButtonView, + fruitDrawButtonView, vStackView, newNotiIndicator ) @@ -147,7 +148,7 @@ private extension MyInfoView { $0.height.equalTo(162) } - drawButtonView.snp.makeConstraints { + fruitDrawButtonView.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) $0.height.equalTo(52) $0.top.equalTo(loginWarningView.snp.bottom).offset(52) @@ -156,7 +157,7 @@ private extension MyInfoView { vStackView.snp.makeConstraints { $0.height.equalTo(200) $0.horizontalEdges.equalToSuperview().inset(20) - $0.top.equalTo(drawButtonView.snp.bottom).offset(16) + $0.top.equalTo(fruitDrawButtonView.snp.bottom).offset(16) $0.bottom.equalToSuperview() } @@ -186,6 +187,10 @@ extension MyInfoView: MyInfoStateProtocol { loginWarningView.isHidden = false } } + + func updateFruitCount(count: Int) { + fruitDrawButtonView.updateFruitCount(count: count) + } } extension Reactive: MyInfoActionProtocol where Base: MyInfoView { @@ -198,7 +203,7 @@ extension Reactive: MyInfoActionProtocol where Base: MyInfoView { var loginButtonDidTap: Observable { base.loginWarningView.rx.loginButtonDidTap } var profileImageDidTap: Observable { base.profileView.rx.profileImageDidTap } - var drawButtonDidTap: Observable { base.drawButtonView.rx.drawButtonDidTap } + var drawButtonDidTap: Observable { base.fruitDrawButtonView.rx.drawButtonDidTap } var fruitNavigationButtonDidTap: Observable { base.fruitNavigationButton.rx.tap.asObservable() } var qnaNavigationButtonDidTap: Observable { base.qnaNavigationButton.rx.tap.asObservable() } var notiNavigationButtonDidTap: Observable { base.notiNavigationButton.rx.tap.asObservable() } From a1b8772cb29b2825cd9b171884617e576c7de75d Mon Sep 17 00:00:00 2001 From: youn9k Date: Mon, 29 Jul 2024 00:26:53 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20[#848]=20?= =?UTF-8?q?=EB=8B=89=EB=84=A4=EC=9E=84=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Components/MyInfoComponent.swift | 5 +++- .../Sources/Reactors/MyInfoReactor.swift | 23 +++++++++++++++++-- .../MyInfo/MyInfoViewController.swift | 11 ++++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift index 8b36fba77..3e0ef63c8 100644 --- a/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift +++ b/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift @@ -5,6 +5,7 @@ import NeedleFoundation import NoticeDomainInterface import SignInFeatureInterface import TeamFeatureInterface +import UserDomainInterface import UIKit public protocol MyInfoDependency: Dependency { @@ -20,13 +21,15 @@ public protocol MyInfoDependency: Dependency { var fruitDrawFactory: any FruitDrawFactory { get } var fruitStorageFactory: any FruitStorageFactory { get } var fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase { get } + var setUserNameUseCase: any SetUserNameUseCase { get } } public final class MyInfoComponent: Component, MyInfoFactory { public func makeView() -> UIViewController { return MyInfoViewController.viewController( reactor: MyInfoReactor( - fetchNoticeIDListUseCase: dependency.fetchNoticeIDListUseCase + fetchNoticeIDListUseCase: dependency.fetchNoticeIDListUseCase, + setUserNameUseCase: dependency.setUserNameUseCase ), profilePopUpComponent: dependency.profilePopComponent, textPopUpFactory: dependency.textPopUpFactory, diff --git a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift index a39aad001..1961f1696 100644 --- a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift +++ b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift @@ -18,6 +18,7 @@ final class MyInfoReactor: Reactor { case teamNavigationDidTap case settingNavigationDidTap case completedFruitDraw(Int) + case changeNicknameButtonDidTap(String) case changedUserInfo(UserInfo?) case changedReadNoticeIDs([Int]) case requiredLogin @@ -33,6 +34,7 @@ final class MyInfoReactor: Reactor { case updatePlatform(String) case updateFruitCount(Int) case updateIsAllNoticesRead(Bool) + case showToast(String) } enum NavigateType { @@ -56,16 +58,20 @@ final class MyInfoReactor: Reactor { @Pulse var loginButtonDidTap: Bool? @Pulse var profileImageDidTap: Bool? @Pulse var navigateType: NavigateType? + @Pulse var showToast: String? } var initialState: State private let fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase + private let setUsernameUseCase: any SetUserNameUseCase private var disposeBag = DisposeBag() init( - fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase + fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase, + setUserNameUseCase: any SetUserNameUseCase ) { self.fetchNoticeIDListUseCase = fetchNoticeIDListUseCase + self.setUsernameUseCase = setUserNameUseCase self.initialState = .init( isLoggedIn: false, profileImage: "", @@ -112,6 +118,8 @@ final class MyInfoReactor: Reactor { return navigateLogin() case let .completedFruitDraw(count): return .just(.updateFruitCount(count)) + case let .changeNicknameButtonDidTap(newNickname): + return .empty() } } @@ -144,6 +152,8 @@ final class MyInfoReactor: Reactor { case let .updateFruitCount(count): newState.fruitCount = count + case let .showToast(message): + newState.showToast = message } return newState } @@ -187,7 +197,16 @@ private extension MyInfoReactor { guard let profile = userInfo?.profile else { return .empty() } return .just(.updateProfileImage(profile)) } - + + func updateRemoteNickname(_ newNickname: String) -> Observable { + setUsernameUseCase.execute(name: newNickname) + .andThen(.just(.updateNickname(newNickname))) + .catch { error in + let error = error.asWMError + return .just(.showToast(error.errorDescription ?? "알 수 없는 오류가 발생하였습니다.")) + } + } + func updateNickname(_ userInfo: UserInfo?) -> Observable { guard let userInfo = userInfo else { return .empty() } return .just(.updateNickname(userInfo.decryptedName)) diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift index c53e4ead4..62c64cf09 100644 --- a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift @@ -79,6 +79,13 @@ final class MyInfoViewController: BaseReactorViewController, Edit } override func bindState(reactor: MyInfoReactor) { + reactor.pulse(\.$showToast) + .compactMap { $0 } + .bind(with: self, onNext: { owner, message in + owner.showToast(text: message, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) + }) + .disposed(by: disposeBag) + reactor.state.map(\.isAllNoticesRead) .distinctUntilChanged() .bind(with: self) { owner, isAllNoticesRead in @@ -264,7 +271,9 @@ extension MyInfoViewController: EditSheetViewDelegate { showBottomSheet(content: vc, size: .fixed(352 + SAFEAREA_BOTTOM_HEIGHT())) case .nickname: guard let vc = multiPurposePopUpFactory - .makeView(type: .nickname, key: "", completion: nil) as? MultiPurposePopupViewController + .makeView(type: .nickname, key: "", completion: { [weak self] text in + self?.reactor?.action.onNext(.changeNicknameButtonDidTap(text)) + }) as? MultiPurposePopupViewController else { return } showBottomSheet(content: vc, size: .fixed(296)) } From eafa58ab3420c0479fd3e1ca370ebfb452057167 Mon Sep 17 00:00:00 2001 From: youn9k Date: Mon, 29 Jul 2024 01:09:58 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=97=B4?= =?UTF-8?q?=EB=A7=A4=20=EB=BD=91=EA=B8=B0=20=EC=8B=9C=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=A6=AC=ED=94=84=EB=A0=88=EC=89=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Components/MyInfoComponent.swift | 4 +- .../Sources/Reactors/MyInfoReactor.swift | 49 ++++++++++++++++--- .../MyInfo/MyInfoViewController.swift | 9 +++- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift index 3e0ef63c8..4e37d83dd 100644 --- a/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift +++ b/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift @@ -22,6 +22,7 @@ public protocol MyInfoDependency: Dependency { var fruitStorageFactory: any FruitStorageFactory { get } var fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase { get } var setUserNameUseCase: any SetUserNameUseCase { get } + var fetchUserInfoUseCase: any FetchUserInfoUseCase { get } } public final class MyInfoComponent: Component, MyInfoFactory { @@ -29,7 +30,8 @@ public final class MyInfoComponent: Component, MyInfoFactory { return MyInfoViewController.viewController( reactor: MyInfoReactor( fetchNoticeIDListUseCase: dependency.fetchNoticeIDListUseCase, - setUserNameUseCase: dependency.setUserNameUseCase + setUserNameUseCase: dependency.setUserNameUseCase, + fetchUserInfoUseCase: dependency.fetchUserInfoUseCase ), profilePopUpComponent: dependency.profilePopComponent, textPopUpFactory: dependency.textPopUpFactory, diff --git a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift index 1961f1696..03d15332c 100644 --- a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift +++ b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift @@ -17,7 +17,7 @@ final class MyInfoReactor: Reactor { case mailNavigationDidTap case teamNavigationDidTap case settingNavigationDidTap - case completedFruitDraw(Int) + case completedFruitDraw case changeNicknameButtonDidTap(String) case changedUserInfo(UserInfo?) case changedReadNoticeIDs([Int]) @@ -35,6 +35,7 @@ final class MyInfoReactor: Reactor { case updateFruitCount(Int) case updateIsAllNoticesRead(Bool) case showToast(String) + case dismissEditSheet } enum NavigateType { @@ -59,19 +60,23 @@ final class MyInfoReactor: Reactor { @Pulse var profileImageDidTap: Bool? @Pulse var navigateType: NavigateType? @Pulse var showToast: String? + @Pulse var dismissEditSheet: Bool? } var initialState: State private let fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase private let setUsernameUseCase: any SetUserNameUseCase + private let fetchUserInfoUseCase: any FetchUserInfoUseCase private var disposeBag = DisposeBag() init( fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase, - setUserNameUseCase: any SetUserNameUseCase + setUserNameUseCase: any SetUserNameUseCase, + fetchUserInfoUseCase: any FetchUserInfoUseCase ) { self.fetchNoticeIDListUseCase = fetchNoticeIDListUseCase self.setUsernameUseCase = setUserNameUseCase + self.fetchUserInfoUseCase = fetchUserInfoUseCase self.initialState = .init( isLoggedIn: false, profileImage: "", @@ -116,10 +121,10 @@ final class MyInfoReactor: Reactor { return updateIsAllNoticesRead(readIDs) case .requiredLogin: return navigateLogin() - case let .completedFruitDraw(count): - return .just(.updateFruitCount(count)) + case .completedFruitDraw: + return fetchUserInfo() case let .changeNicknameButtonDidTap(newNickname): - return .empty() + return updateRemoteNickname(newNickname) } } @@ -154,6 +159,8 @@ final class MyInfoReactor: Reactor { newState.fruitCount = count case let .showToast(message): newState.showToast = message + case .dismissEditSheet: + newState.dismissEditSheet = true } return newState } @@ -176,6 +183,26 @@ private extension MyInfoReactor { } .disposed(by: disposeBag) } + + func fetchUserInfo() -> Observable { + return fetchUserInfoUseCase.execute() + .asObservable() + .flatMap { entity -> Observable in + PreferenceManager.shared.setUserInfo( + ID: entity.id, + platform: entity.platform, + profile: entity.profile, + name: entity.name, + itemCount: entity.itemCount + ) + return .empty() + } + .catch { error in + let error = error.asWMError + return Observable.just(.showToast(error.errorDescription ?? "알 수 없는 오류가 발생하였습니다.")) + } + + } func updateIsAllNoticesRead(_ readIDs: [Int]) -> Observable { return fetchNoticeIDListUseCase.execute() @@ -200,10 +227,18 @@ private extension MyInfoReactor { func updateRemoteNickname(_ newNickname: String) -> Observable { setUsernameUseCase.execute(name: newNickname) - .andThen(.just(.updateNickname(newNickname))) + .andThen( + .concat( + .just(.updateNickname(newNickname)), + .just(.dismissEditSheet) + ) + ) .catch { error in let error = error.asWMError - return .just(.showToast(error.errorDescription ?? "알 수 없는 오류가 발생하였습니다.")) + return .concat( + .just(.showToast(error.errorDescription ?? "알 수 없는 오류가 발생하였습니다.")), + .just(.dismissEditSheet) + ) } } diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift index 62c64cf09..3ddcc0b19 100644 --- a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift @@ -145,6 +145,13 @@ final class MyInfoViewController: BaseReactorViewController, Edit }) .disposed(by: disposeBag) + reactor.pulse(\.$dismissEditSheet) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + owner.hideEditSheet() + }) + .disposed(by: disposeBag) + reactor.pulse(\.$navigateType) .compactMap { $0 } .bind(with: self) { owner, navigate in @@ -291,6 +298,6 @@ extension MyInfoViewController: EqualHandleTappedType { extension MyInfoViewController: FruitDrawViewControllerDelegate { func completedFruitDraw(itemCount: Int) { - reactor?.action.onNext(.completedFruitDraw(itemCount)) + reactor?.action.onNext(.completedFruitDraw) } } From facac716e2b5425b02080838c202aa3a85adeec1 Mon Sep 17 00:00:00 2001 From: youn9k Date: Thu, 1 Aug 2024 09:28:47 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9C=A8=20::=20[#848]=20=EB=8B=89?= =?UTF-8?q?=EB=84=A4=EC=9E=84=20=EB=B3=80=EA=B2=BD=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=EC=8B=9C=20=EC=9C=A0=EC=A0=80=EC=A0=95=EB=B3=B4=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Reactors/MyInfoReactor.swift | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift index 03d15332c..ba6294e95 100644 --- a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift +++ b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift @@ -228,10 +228,22 @@ private extension MyInfoReactor { func updateRemoteNickname(_ newNickname: String) -> Observable { setUsernameUseCase.execute(name: newNickname) .andThen( - .concat( - .just(.updateNickname(newNickname)), - .just(.dismissEditSheet) - ) + fetchUserInfoUseCase.execute() + .asObservable() + .flatMap { entity -> Observable in + PreferenceManager.shared.setUserInfo( + ID: entity.id, + platform: entity.platform, + profile: entity.profile, + name: entity.name, + itemCount: entity.itemCount + ) + return .concat( + .just(.showToast("닉네임이 변경되었습니다.")), + .just(.dismissEditSheet) + ) + + } ) .catch { error in let error = error.asWMError