From bee0aaf6d1e9c1f46fedc2190b199690390e19bb Mon Sep 17 00:00:00 2001 From: SongSeoYoung <42825223+SongSeoYoung@users.noreply.github.com> Date: Tue, 8 Aug 2023 23:48:13 +0900 Subject: [PATCH] Feature/deeplink (#108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: home, detail deeplink * feat: 모잇 상세 딥링크 연결 * feat: 출석 결과 딥링크 * feat: 벌금 납부하기 딥링크 * feat: master인지 하위 RIB으로 내려주도록 설정 * feat: fcm 토픽 옵저빙 코드 추가 * feat: 빌드 오류 수정 --- App/Sources/AppDelegate.swift | 4 -- App/Sources/Workflow/FineWorkflow.swift | 3 -- .../Implement/FineList/FineListBuilder.swift | 5 +- .../FineList/FineListInteractor.swift | 17 ------- .../Implement/FineList/FineListRouter.swift | 42 +--------------- .../FineList/FineListBuildable.swift | 2 +- .../Implement/MOITAlarmViewController.swift | 12 ----- Features/MOITAlarm/MOITAlarm/Project.swift | 1 + .../Interface/MOITAlarmRepository.swift | 2 - .../MOITAlarm/MOITAlarmData/Project.swift | 2 + .../MOITAlarm/MOITAlarmDomain/Project.swift | 2 + .../Implement/MOITDetailInteractor.swift | 22 ++++++--- .../Implement/MOITDetailRouter.swift | 48 ++++++------------- .../Interface/MOITDetailActionableItem.swift | 2 +- .../Implement/MOITListRouter.swift | 27 ++--------- .../Implement/MOITWebViewController.swift | 13 +++++ Features/MOITWeb/Project.swift | 1 + 17 files changed, 59 insertions(+), 146 deletions(-) diff --git a/App/Sources/AppDelegate.swift b/App/Sources/AppDelegate.swift index 7e0e596a..941e4ca0 100644 --- a/App/Sources/AppDelegate.swift +++ b/App/Sources/AppDelegate.swift @@ -89,10 +89,6 @@ private extension AppDelegate { print("🤖 FCM registration token: \(token)") } } - - Messaging.messaging().subscribe(toTopic: "MOIT-80") { error in - print("🤖 error", error) - } } func configure(_ application: UIApplication) { diff --git a/App/Sources/Workflow/FineWorkflow.swift b/App/Sources/Workflow/FineWorkflow.swift index 0261614d..9237d0be 100644 --- a/App/Sources/Workflow/FineWorkflow.swift +++ b/App/Sources/Workflow/FineWorkflow.swift @@ -35,9 +35,6 @@ final class FineWorkflow: Workflow { guard let self else { return .empty() } return listActionableItem.routeToDetail(id: self.moitID) }) - .onStep { [weak self] detailActionableItem, _ -> Observable<(FineActionableItem, ())> in - return detailActionableItem.routeToFine() - } .onStep({ [weak self] fineActionableItem, _ -> Observable<(AuthorizePaymentActionableItem, ())> in guard let self else { return .empty() } return fineActionableItem.routeToAuthorizePayment( diff --git a/Features/Fine/FineUserInterface/Implement/FineList/FineListBuilder.swift b/Features/Fine/FineUserInterface/Implement/FineList/FineListBuilder.swift index 5f45084a..06c5bc83 100644 --- a/Features/Fine/FineUserInterface/Implement/FineList/FineListBuilder.swift +++ b/Features/Fine/FineUserInterface/Implement/FineList/FineListBuilder.swift @@ -47,7 +47,7 @@ public final class FineListBuilder: Builder, FineListBuildab public func build( withListener listener: FineListListener, moitID: Int - ) -> (router: ViewableRouting, actionableItem: FineActionableItem) { + ) -> ViewableRouting { let component = FineListComponent( dependency: dependency, moitID: moitID @@ -61,10 +61,9 @@ public final class FineListBuilder: Builder, FineListBuildab let authorizePaymentBuildable = AuthorizePaymentBuilder(dependency: component) let router = FineListRouter( - authorizePaymentBuildable: authorizePaymentBuildable, interactor: interactor, viewController: viewController ) - return (router, interactor) + return router } } diff --git a/Features/Fine/FineUserInterface/Implement/FineList/FineListInteractor.swift b/Features/Fine/FineUserInterface/Implement/FineList/FineListInteractor.swift index ecc2bb5e..096cde12 100644 --- a/Features/Fine/FineUserInterface/Implement/FineList/FineListInteractor.swift +++ b/Features/Fine/FineUserInterface/Implement/FineList/FineListInteractor.swift @@ -17,9 +17,6 @@ import ResourceKit import MOITFoundation protocol FineListRouting: ViewableRouting { - @discardableResult - func attachAuthorizePayment(moitID: Int, fineID: Int, isMaster: Bool) -> AuthorizePaymentActionableItem? - func detachAuthorizePayment(completion: (() -> Void)?) } protocol FineListPresentable: Presentable { @@ -274,17 +271,3 @@ extension FineListInteractor { } } } - -// MARK: - FineActionableItem - -extension FineListInteractor: FineActionableItem { - func routeToAuthorizePayment(moitID: String, fineID: String) -> Observable<(AuthorizePaymentActionableItem, ())> { - if let actionableItem = self.router?.attachAuthorizePayment( - moitID: Int(moitID) ?? 0, - fineID: Int(fineID) ?? 0, - isMaster: isMaster - ) { - return Observable.just((actionableItem, ())) - } else { fatalError() } - } -} diff --git a/Features/Fine/FineUserInterface/Implement/FineList/FineListRouter.swift b/Features/Fine/FineUserInterface/Implement/FineList/FineListRouter.swift index b69342e1..0e02fb97 100644 --- a/Features/Fine/FineUserInterface/Implement/FineList/FineListRouter.swift +++ b/Features/Fine/FineUserInterface/Implement/FineList/FineListRouter.swift @@ -19,51 +19,11 @@ protocol FineListViewControllable: ViewControllable { } final class FineListRouter: ViewableRouter, FineListRouting { - private let authorizePaymentBuildable: AuthorizePaymentBuildable - private var authorizePaymentRouters: [ViewableRouting] = [] - - init( - authorizePaymentBuildable: AuthorizePaymentBuildable, + override init( interactor: FineListInteractable, viewController: FineListViewControllable ) { - self.authorizePaymentBuildable = authorizePaymentBuildable super.init(interactor: interactor, viewController: viewController) interactor.router = self } - - @discardableResult - func attachAuthorizePayment( - moitID: Int, - fineID: Int, - isMaster: Bool - ) -> AuthorizePaymentActionableItem? { - let (router, interactor) = authorizePaymentBuildable.build( - withListener: interactor, - moitID: moitID, - fineID: fineID, - isMaster: isMaster - ) - let viewController = router.viewControllable.uiviewController - viewController.modalPresentationStyle = .fullScreen - viewControllable.uiviewController.present(viewController, animated: true) - - authorizePaymentRouters.append(router) - attachChild(router) - return interactor - } - - func detachAuthorizePayment(completion: (() -> Void)?) { - guard let router = authorizePaymentRouters.popLast() else { return } - - viewControllable.uiviewController.dismiss( - animated: true, - completion: { - if let completion { - completion() - } - } - ) - detachChild(router) - } } diff --git a/Features/Fine/FineUserInterface/Interface/FineList/FineListBuildable.swift b/Features/Fine/FineUserInterface/Interface/FineList/FineListBuildable.swift index 17ef371b..daec9b1f 100644 --- a/Features/Fine/FineUserInterface/Interface/FineList/FineListBuildable.swift +++ b/Features/Fine/FineUserInterface/Interface/FineList/FineListBuildable.swift @@ -12,5 +12,5 @@ public protocol FineListBuildable: Buildable { func build( withListener listener: FineListListener, moitID: Int - ) -> (router: ViewableRouting, actionableItem: FineActionableItem) + ) -> ViewableRouting } diff --git a/Features/MOITAlarm/MOITAlarm/Implement/MOITAlarmViewController.swift b/Features/MOITAlarm/MOITAlarm/Implement/MOITAlarmViewController.swift index 11fba0db..12eb1413 100644 --- a/Features/MOITAlarm/MOITAlarm/Implement/MOITAlarmViewController.swift +++ b/Features/MOITAlarm/MOITAlarm/Implement/MOITAlarmViewController.swift @@ -46,18 +46,6 @@ final class MOITAlarmViewController: UIViewController, private let disposeBag = DisposeBag() private var items: [MOITAlarmCollectionViewCellItem] = [ -// MOITAlarmCollectionViewCellItem(isRead: true, title: "일번알림", description: "일번알림미이이댜fealfijaelfieajhlfiajflieglaigjaleigaeligalghelighagleiglaihgeilhglei러미랴더ㅣ랴ㅓㅁ랴ㅣㄷㅁ너리먀ㅓ랴ㅣㄷ러미ㅑㄷ러미ㅑ럼디ㅑ럼디이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: false, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: true, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: false, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: true, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: false, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: true, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: false, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: true, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: false, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: true, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: ""), -// MOITAlarmCollectionViewCellItem(isRead: false, title: "일번알림", description: "일번알림미이이이이이이이이이", urlScheme: "") ] weak var listener: MOITAlarmPresentableListener? diff --git a/Features/MOITAlarm/MOITAlarm/Project.swift b/Features/MOITAlarm/MOITAlarm/Project.swift index 4cd6eda5..8f9c1941 100644 --- a/Features/MOITAlarm/MOITAlarm/Project.swift +++ b/Features/MOITAlarm/MOITAlarm/Project.swift @@ -24,6 +24,7 @@ let project = Project.invertedDualTargetProjectWithDemoApp( .ResourceKit, .DesignSystem, .Core.MOITFoundation, + .Core.Utils ], isUserInterface: true ) diff --git a/Features/MOITAlarm/MOITAlarmData/Interface/MOITAlarmRepository.swift b/Features/MOITAlarm/MOITAlarmData/Interface/MOITAlarmRepository.swift index 4f7d2248..8c38b97d 100644 --- a/Features/MOITAlarm/MOITAlarmData/Interface/MOITAlarmRepository.swift +++ b/Features/MOITAlarm/MOITAlarmData/Interface/MOITAlarmRepository.swift @@ -8,8 +8,6 @@ import Foundation -import MOITNetwork - import RxSwift public protocol MOITAlarmRepository { diff --git a/Features/MOITAlarm/MOITAlarmData/Project.swift b/Features/MOITAlarm/MOITAlarmData/Project.swift index fb4d6964..94fbb3b5 100644 --- a/Features/MOITAlarm/MOITAlarmData/Project.swift +++ b/Features/MOITAlarm/MOITAlarmData/Project.swift @@ -13,8 +13,10 @@ import UtilityPlugin let project = Project.invertedDualTargetProject( name: "MOITAlarmData", interfaceDependencies: [ + .ThirdParty.RxSwift ], implementDependencies: [ + .MOITNetwork.Interface ] ) diff --git a/Features/MOITAlarm/MOITAlarmDomain/Project.swift b/Features/MOITAlarm/MOITAlarmDomain/Project.swift index 8c22f5c3..ab316b8f 100644 --- a/Features/MOITAlarm/MOITAlarmDomain/Project.swift +++ b/Features/MOITAlarm/MOITAlarmDomain/Project.swift @@ -13,8 +13,10 @@ import UtilityPlugin let project = Project.invertedDualTargetProject( name: "MOITAlarmDomain", interfaceDependencies: [ + .ThirdParty.RxSwift, ], implementDependencies: [ + .ThirdParty.RxSwift, ] ) diff --git a/Features/MOITDetail/MOITDetail/Implement/MOITDetailInteractor.swift b/Features/MOITDetail/MOITDetail/Implement/MOITDetailInteractor.swift index 63e226d9..cb5be4ff 100644 --- a/Features/MOITDetail/MOITDetail/Implement/MOITDetailInteractor.swift +++ b/Features/MOITDetail/MOITDetail/Implement/MOITDetailInteractor.swift @@ -20,15 +20,18 @@ import FineDomain protocol MOITDetailRouting: ViewableRouting { func attachAttendance(moitID: String) + func attachMOITUsers(moitID: String) func detachMOITUsers(withPop: Bool) + func attachMOITShare(code: String) func detachMOITShare() - func attachFineList(moitID: Int) - func attachAuthorizePayment(moitID: Int, fineID: Int, isMaster: Bool) - func detachAuthorizePayment(completion: (() -> Void)?, withPop: Bool) + @discardableResult - func attachFineList(moitID: Int) -> FineActionableItem? + func attachAuthorizePayment(moitID: Int, fineID: Int, isMaster: Bool) -> AuthorizePaymentActionableItem? + func detachAuthorizePayment(completion: (() -> Void)?, withPop: Bool) + + func attachFineList(moitID: Int) } protocol MOITDetailPresentable: Presentable { @@ -81,6 +84,7 @@ final class MOITDetailInteractor: PresentableInteractor, private let isMasterUsecase: CompareUserIDUseCase private let moitID: String private let isMasterRelay: PublishRelay + private var isMaster: Bool = false private var scheduleDescription: String? private var longRuleDescription: String? @@ -123,7 +127,9 @@ final class MOITDetailInteractor: PresentableInteractor, self.shortRuleDescription = $0.ruleShortDescription self.periodDescription = $0.periodDescription self.invitationCode = $0.invitationCode + let isMaster = self.isMasterUsecase.execute(with: Int($0.masterID) ?? 0) + self.isMaster = isMaster self.isMasterRelay.accept(isMaster) }) .observe(on: MainScheduler.instance) @@ -323,8 +329,12 @@ extension MOITDetailInteractor { // MARK: - MOITDetailActionableItem extension MOITDetailInteractor: MOITDetailActionableItem { - func routeToFine() -> Observable<(FineActionableItem, ())> { - if let actionableItem = self.router?.attachFineList(moitID: Int(self.moitID) ?? 0) { + func routeToAuthorizePayment(moitID: String, fineID: String) -> Observable<(AuthorizePaymentActionableItem, ())> { + if let actionableItem = self.router?.attachAuthorizePayment( + moitID: Int(moitID) ?? 0, + fineID: Int(fineID) ?? 0, + isMaster: self.isMaster + ) { return Observable.just((actionableItem, ())) } else { fatalError() } } diff --git a/Features/MOITDetail/MOITDetail/Implement/MOITDetailRouter.swift b/Features/MOITDetail/MOITDetail/Implement/MOITDetailRouter.swift index 04115b6c..c8b666d4 100644 --- a/Features/MOITDetail/MOITDetail/Implement/MOITDetailRouter.swift +++ b/Features/MOITDetail/MOITDetail/Implement/MOITDetailRouter.swift @@ -109,68 +109,48 @@ final class MOITDetailRouter: ViewableRouter FineActionableItem? { - guard fineListRouter == nil else { return self.fineActionableItem } + guard fineListRouter == nil else { return } - let (router, interactor) = fineListBuilder.build( + let router = fineListBuilder.build( withListener: interactor, moitID: moitID ) - fineActionableItem = interactor fineListRouter = router attachChild(router) viewController.addChild(viewController: router.viewControllable) - return interactor } - + // MARK: - AuthorizePayment private let authorizePaymentBuilder: AuthorizePaymentBuildable - private var authorizePaymentRouter: ViewableRouting? - + private var authorizePaymentRouters: [ViewableRouting] = [] + + @discardableResult func attachAuthorizePayment( moitID: Int, fineID: Int, isMaster: Bool - ) { - if authorizePaymentRouter != nil { return } - - let router = authorizePaymentBuilder.build( + ) -> AuthorizePaymentActionableItem? { + let (router, interactor) = authorizePaymentBuilder.build( withListener: interactor, moitID: moitID, fineID: fineID, isMaster: isMaster ) - authorizePaymentRouter = router + authorizePaymentRouters.append(router) attachChild(router) self.viewController.uiviewController.navigationController?.pushViewController(router.viewControllable.uiviewController, animated: true) + return interactor } func detachAuthorizePayment(completion: (() -> Void)?, withPop: Bool) { - guard let router = authorizePaymentRouter else { return } + guard let router = authorizePaymentRouters.popLast() else { return } - authorizePaymentRouter = nil detachChild(router) if withPop { diff --git a/Features/MOITDetail/MOITDetail/Interface/MOITDetailActionableItem.swift b/Features/MOITDetail/MOITDetail/Interface/MOITDetailActionableItem.swift index 1059b980..170880fd 100644 --- a/Features/MOITDetail/MOITDetail/Interface/MOITDetailActionableItem.swift +++ b/Features/MOITDetail/MOITDetail/Interface/MOITDetailActionableItem.swift @@ -11,5 +11,5 @@ import FineUserInterface import RxSwift public protocol MOITDetailActionableItem: AnyObject { - func routeToFine() -> Observable<(FineActionableItem, ())> + func routeToAuthorizePayment(moitID: String, fineID: String) -> Observable<(AuthorizePaymentActionableItem, ())> } diff --git a/Features/MOITList/MOITListUserInterface/Implement/MOITListRouter.swift b/Features/MOITList/MOITListUserInterface/Implement/MOITListRouter.swift index 4500cb59..6603aee4 100644 --- a/Features/MOITList/MOITListUserInterface/Implement/MOITListRouter.swift +++ b/Features/MOITList/MOITListUserInterface/Implement/MOITListRouter.swift @@ -6,16 +6,16 @@ // Copyright © 2023 chansoo.MOIT. All rights reserved. // -import UIKit - import MOITListUserInterface +import Utils +import RIBs import MOITWeb import MOITDetail import MOITParticipateUserInterface import MOITSetting import MOITAlarm import Utils - +import Foundation import RIBs protocol MOITListInteractable: Interactable, @@ -75,6 +75,7 @@ final class MOITListRouter: ViewableRouter CGFloat { guard let height = UserDefaults.standard.object(forKey: "keyboardHeight") as? CGFloat else { return 301 @@ -176,17 +177,7 @@ final class MOITListRouter: ViewableRouter< -// guard moitWebRouter == nil else { return } -// let router = moitWebBuilder.build( -// withListener: interactor, -// domain: .frontend, -// path: .attendance(keyboardHeight: getKeyboardHeight()) -// ) -// self.moitWebRouter = router -// attachChild(router) -// viewController.uiviewController.navigationController?.pushViewController(router.viewControllable.uiviewController, animated: true) + } func detachSetting(withPop: Bool) { guard let settingRouter else { return } @@ -195,14 +186,6 @@ final class MOITListRouter: ViewableRouter< -// guard let moitWebRouter else { return } -// self.moitWebRouter = nil -// detachChild(moitWebRouter) -// if withPop { -// viewController.uiviewController.navigationController?.popViewController(animated: true) -// } } private let alarmBuilder: MOITAlarmBuildable diff --git a/Features/MOITWeb/Implement/MOITWebViewController.swift b/Features/MOITWeb/Implement/MOITWebViewController.swift index 3c233a00..e824ba93 100644 --- a/Features/MOITWeb/Implement/MOITWebViewController.swift +++ b/Features/MOITWeb/Implement/MOITWebViewController.swift @@ -15,6 +15,7 @@ import RxSwift import DesignSystem import Toast import TokenManagerImpl +import FirebaseMessaging protocol MOITWebPresentableListener: AnyObject { func didSwipeBack() @@ -116,6 +117,7 @@ enum Command: String { case close case alert case share + case didRegisterMOIT } extension MOITWebViewController: WKScriptMessageHandler { @@ -130,6 +132,7 @@ extension MOITWebViewController: WKScriptMessageHandler { print(cmd) print(command) + print(messages["value"]) switch command { case .close: didReceiveCloseCommand() @@ -142,6 +145,9 @@ extension MOITWebViewController: WKScriptMessageHandler { case .share: didReceiveShareCommand(messages: messages) + + case .didRegisterMOIT: + didRegisterMOITCommand(messages: messages) } } @@ -172,6 +178,13 @@ extension MOITWebViewController: WKScriptMessageHandler { if invitationCode.isEmpty { invitationCode = "전ㅈr군단" } self.listener?.didTapShare(with: invitationCode) } + + private func didRegisterMOITCommand(messages: [String: Any]) { + let moitID = messages["value"] as? Int ?? 0 + Messaging.messaging().subscribe(toTopic: "MOIT-\(moitID)") { error in + print("register topic subscribe error is 👉", error) + } + } } // MARK: - WKUIDelegate diff --git a/Features/MOITWeb/Project.swift b/Features/MOITWeb/Project.swift index 48bddcff..accd6920 100644 --- a/Features/MOITWeb/Project.swift +++ b/Features/MOITWeb/Project.swift @@ -23,6 +23,7 @@ let project = Project.invertedDualTargetProjectWithDemoApp( .Core.Utils, .Feature.MOITShare.Implement, .Feature.MOITShare.Interface, + .ThirdParty.FirebaseMessaging ], useTestTarget: true, isUserInterface: true