From b0667947006780283f2ff2da1692133d1228521b Mon Sep 17 00:00:00 2001 From: doyeonKim Date: Fri, 25 Oct 2024 16:37:14 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20Widget=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 8381a3ba12cff8cf27cf1554e8c43dccd65e998f Author: doyeonKim Date: Fri Oct 25 16:35:12 2024 +0900 feat: 앱종료시 딥링크 동작시키는 기능 구현 commit 0f845f2dab7bb2337764cd9065bb49c37d3210e4 Author: doyeonKim Date: Wed Oct 23 17:29:27 2024 +0900 feat: SecondWidget UI 구현 commit b697610ebd3cc7476d34e5d5bdfb61d19e9d7eea Author: siwonLee <111dltldnjs@gmail.com> Date: Wed Oct 23 17:12:47 2024 +0900 feat: Main Widget UI 구현 commit e91cad60cadcfa4f76c8780d98baaaaa67dfd11e Author: doyeonKim Date: Wed Oct 23 11:33:26 2024 +0900 feat: widget 기본 세팅 - Entry, provider 설정 commit af8b2546fdfc76efcb8080bb321b40330f19b39e Author: doyeonKim Date: Thu Oct 17 00:39:06 2024 +0900 feat: widget target 추가 --- Projects/App/Project.swift | 21 ++++- Projects/App/Resources/App.entitlements | 4 + Projects/App/Sources/AppDelegate.swift | 1 - Projects/App/Sources/SceneDelegate.swift | 9 +- .../Resources/WidgetExtension-Info.plist | 29 ++++++ .../Resources/WidgetExtension.entitlements} | 4 +- .../Sources/Model/AgencyEntry.swift | 50 +++++++++++ .../Sources/Model/OCREntry.swift | 21 +++++ .../Sources/Widgets/MainWidget.swift | 80 +++++++++++++++++ .../Sources/Widgets/OCRWidget.swift | 40 +++++++++ .../Sources/Widgets/SecondWidget.swift | 83 ++++++++++++++++++ .../Sources/Widgets/Widgets.swift | 12 +++ .../Core/Core/Sources/DeepLinkManager.swift | 18 ++++ .../Repository/LedgerRepository.swift | 13 ++- .../Sources/Coordinator/Coordinator.swift | 1 + .../Base/Sources/NSNotificationName+.swift | 1 + .../Sources/Scene/Ledger/LedgerVC.swift | 4 - .../Ledger/TabItems/Ledger/LedgerTabVC.swift | 8 ++ .../Main/Sources/MainDIContainer.swift | 3 +- .../Main/Sources/MainTabBarCoordinator.swift | 4 + .../Main/Sources/MainTapViewController.swift | 33 ++++++- .../mong.coin.imageset/Contents.json | 23 +++++ .../money mong coin_front view 1.png | Bin 0 -> 2215 bytes .../money mong coin_front view 1@2x.png | Bin 0 -> 6215 bytes .../money mong coin_front view 1@3x.png | Bin 0 -> 11384 bytes .../scan.circle.gray.imageset/Contents.json | 23 +++++ .../Group 360156.png | Bin 0 -> 3216 bytes .../Group 360156@2x.png | Bin 0 -> 7053 bytes .../Group 360156@3x.png | Bin 0 -> 11183 bytes .../DesignSystem/Sources/Utils/Images.swift | 4 + 30 files changed, 477 insertions(+), 12 deletions(-) create mode 100644 Projects/App/WidgetExtension/Resources/WidgetExtension-Info.plist rename Projects/App/{Moneymong.entitlements => WidgetExtension/Resources/WidgetExtension.entitlements} (70%) create mode 100644 Projects/App/WidgetExtension/Sources/Model/AgencyEntry.swift create mode 100644 Projects/App/WidgetExtension/Sources/Model/OCREntry.swift create mode 100644 Projects/App/WidgetExtension/Sources/Widgets/MainWidget.swift create mode 100644 Projects/App/WidgetExtension/Sources/Widgets/OCRWidget.swift create mode 100644 Projects/App/WidgetExtension/Sources/Widgets/SecondWidget.swift create mode 100644 Projects/App/WidgetExtension/Sources/Widgets/Widgets.swift create mode 100644 Projects/Core/Core/Sources/DeepLinkManager.swift create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1.png create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@2x.png create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@3x.png create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156.png create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@2x.png create mode 100644 Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@3x.png diff --git a/Projects/App/Project.swift b/Projects/App/Project.swift index 26dfc010..ef75512a 100644 --- a/Projects/App/Project.swift +++ b/Projects/App/Project.swift @@ -18,6 +18,24 @@ let project = Project( ] ), targets: [ + .init( + name: "WidgetExtension", + platform: .iOS, + product: .appExtension, + bundleId: "com.yapp.moneymong.WidgetExtension", + infoPlist: .extendingDefault(with: [ + "CFBundleDisplayName": "$(PRODUCT_NAME)", + "NSExtension": [ + "NSExtensionPointIdentifier": "com.apple.widgetkit-extension", + ], + ]), + sources: "WidgetExtension/Sources/**", + resources: "WidgetExtension/Resources/**", + entitlements: "WidgetExtension/Resources/WidgetExtension.entitlements", + dependencies: [ + .project(target: "DesignSystem", path: .relativeToRoot("Projects/Shared/DesignSystem")) + ] + ), Target( name: "Moneymong", platform: .iOS, @@ -63,7 +81,8 @@ let project = Project( entitlements: "Resources/App.entitlements", dependencies: [ .project(target: "SignFeature", path: .relativeToRoot("Projects/Feature/Sign")), - .project(target: "MainFeature", path: .relativeToRoot("Projects/Feature/Main")) + .project(target: "MainFeature", path: .relativeToRoot("Projects/Feature/Main")), + .target(name: "WidgetExtension") ], settings: .settings( base: .init() diff --git a/Projects/App/Resources/App.entitlements b/Projects/App/Resources/App.entitlements index a812db50..4ea3fcaa 100644 --- a/Projects/App/Resources/App.entitlements +++ b/Projects/App/Resources/App.entitlements @@ -6,5 +6,9 @@ Default + com.apple.security.application-groups + + group.moneymong + diff --git a/Projects/App/Sources/AppDelegate.swift b/Projects/App/Sources/AppDelegate.swift index b7f683cd..159cabf7 100644 --- a/Projects/App/Sources/AppDelegate.swift +++ b/Projects/App/Sources/AppDelegate.swift @@ -11,7 +11,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - //URLSessionProxyDelegate.enableAutomaticRegistration() FirebaseManager.shared.initSDK() KakaoAuthManager.shared.initSDK() return true diff --git a/Projects/App/Sources/SceneDelegate.swift b/Projects/App/Sources/SceneDelegate.swift index 385088eb..0f7927a0 100644 --- a/Projects/App/Sources/SceneDelegate.swift +++ b/Projects/App/Sources/SceneDelegate.swift @@ -19,11 +19,18 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { self.appCoordinator = AppCoordinator(navigationController: navigationController) appCoordinator?.start(animated: false) + + self.scene(scene, openURLContexts: connectionOptions.urlContexts) } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { guard let url = URLContexts.first?.url else { return } - KakaoAuthManager.shared.openURL(url) + + if url.absoluteString.contains("widget://") { + DeepLinkManager.setDestination(url.absoluteString) + } else { + KakaoAuthManager.shared.openURL(url) + } } func sceneDidDisconnect(_ scene: UIScene) {} diff --git a/Projects/App/WidgetExtension/Resources/WidgetExtension-Info.plist b/Projects/App/WidgetExtension/Resources/WidgetExtension-Info.plist new file mode 100644 index 00000000..3cc95de1 --- /dev/null +++ b/Projects/App/WidgetExtension/Resources/WidgetExtension-Info.plist @@ -0,0 +1,29 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + $(PRODUCT_NAME) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/Projects/App/Moneymong.entitlements b/Projects/App/WidgetExtension/Resources/WidgetExtension.entitlements similarity index 70% rename from Projects/App/Moneymong.entitlements rename to Projects/App/WidgetExtension/Resources/WidgetExtension.entitlements index a812db50..036c6e5e 100644 --- a/Projects/App/Moneymong.entitlements +++ b/Projects/App/WidgetExtension/Resources/WidgetExtension.entitlements @@ -2,9 +2,9 @@ - com.apple.developer.applesignin + com.apple.security.application-groups - Default + group.moneymong diff --git a/Projects/App/WidgetExtension/Sources/Model/AgencyEntry.swift b/Projects/App/WidgetExtension/Sources/Model/AgencyEntry.swift new file mode 100644 index 00000000..a971d344 --- /dev/null +++ b/Projects/App/WidgetExtension/Sources/Model/AgencyEntry.swift @@ -0,0 +1,50 @@ +import WidgetKit + +struct AgencyEntry: TimelineEntry { + let date: Date + let name: String + let amount: Int +} + +struct AgencyProvider: TimelineProvider { + func placeholder(in context: Context) -> AgencyEntry { + AgencyEntry( + date: Date(), + name: "머니몽 대학", + amount: 10000 + ) + } + + func getSnapshot(in context: Context, completion: @escaping (AgencyEntry) -> ()) { + let entry = AgencyEntry( + date: Date(), + name: "머니몽 대학", + amount: 10000 + ) + completion(entry) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + let entry: AgencyEntry + if let dic = UserDefaults(suiteName: "group.moneymong")?.dictionary(forKey: "test"), + let name = dic["name"] as? String, + let amount = dic["total"] as? Int { + + entry = AgencyEntry( + date: .now, + name: name, + amount: amount + ) + + } else { + entry = AgencyEntry( + date: .now, + name: "", + amount: 0 + ) + } + let nextUpdate = Calendar.current.date(byAdding: .hour, value: 1, to: .now) + let timeline = Timeline(entries: [entry], policy: .after(nextUpdate!)) + completion(timeline) + } +} diff --git a/Projects/App/WidgetExtension/Sources/Model/OCREntry.swift b/Projects/App/WidgetExtension/Sources/Model/OCREntry.swift new file mode 100644 index 00000000..c9db6881 --- /dev/null +++ b/Projects/App/WidgetExtension/Sources/Model/OCREntry.swift @@ -0,0 +1,21 @@ +import WidgetKit + +struct OCREntry: TimelineEntry { + let date: Date +} + +struct OCRProvider: TimelineProvider { + func placeholder(in context: Context) -> OCREntry { + OCREntry(date: Date()) + } + + func getSnapshot(in context: Context, completion: @escaping (OCREntry) -> ()) { + let entry = OCREntry(date: Date()) + completion(entry) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + let timeline = Timeline(entries: [OCREntry(date: .now)], policy: .never) + completion(timeline) + } +} diff --git a/Projects/App/WidgetExtension/Sources/Widgets/MainWidget.swift b/Projects/App/WidgetExtension/Sources/Widgets/MainWidget.swift new file mode 100644 index 00000000..3276bc40 --- /dev/null +++ b/Projects/App/WidgetExtension/Sources/Widgets/MainWidget.swift @@ -0,0 +1,80 @@ +import WidgetKit +import SwiftUI +import DesignSystem + +struct MainWidget: Widget { + private let kind: String = "MainWidget" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: AgencyProvider()) { entry in + MainWidgetEntryView(entry: entry) + } + .supportedFamilies([.systemMedium]) + .configurationDisplayName("My Widget") + .description("This is an example widget.") + } +} + +struct MainWidgetEntryView: View { + var entry: AgencyProvider.Entry + + + var body: some View { + VStack { + Link(destination: URL(string: "widget://CreateLedger")!) { + HStack(alignment: .center) { + Text("\(entry.name)에 오늘 사용한 금액 입력") + .bold() + .font(.system(size: 16)) + .foregroundStyle(Color(uiColor: Colors.Gray._6)) + .frame(height: 24) + .frame(maxWidth: .infinity) + .padding(.leading, 16) + .padding(.vertical, 18) + Image(uiImage: Images.mongCoin!) + .padding(.trailing, 16) + } + .background(Color.white) + .cornerRadius(12) + } + + Spacer() + HStack { + Link(destination: URL(string: "widget://OCR")!) { + HStack { + Spacer() + Text("영수증 스캔") + .bold() + .font(.system(size: 16)) + .foregroundStyle(Color(uiColor: Colors.Gray._5)) + Spacer() + } + } + + Divider() + .background(Color(uiColor: Colors.Gray._5)) + Link(destination: URL(string: "widget://LedgerDetail")!) { + HStack { + Spacer() + Text("회비 내역 확인") + .bold() + .font(.system(size: 16)) + .foregroundStyle(Color(uiColor: Colors.Gray._5)) + Spacer() + } + } + } + .frame(height: 24) + Spacer() + } + .containerBackground(for: .widget) { + Color(uiColor: Colors.Gray._1) + } + } +} + +#Preview(as: .systemMedium, widget: { + MainWidget() +}, timeline: { + AgencyEntry(date: .now, name: "머니몽", amount: 1000) +}) diff --git a/Projects/App/WidgetExtension/Sources/Widgets/OCRWidget.swift b/Projects/App/WidgetExtension/Sources/Widgets/OCRWidget.swift new file mode 100644 index 00000000..2ea31091 --- /dev/null +++ b/Projects/App/WidgetExtension/Sources/Widgets/OCRWidget.swift @@ -0,0 +1,40 @@ +import WidgetKit +import SwiftUI + +import DesignSystem + +struct OCRWidget: Widget { + private let kind: String = "OCRWidget" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: OCRProvider()) { entry in + OCRWidgetEntryView() + } + .supportedFamilies([.systemSmall]) + .configurationDisplayName("영수증 스캔") + .description("영수증을 스캔해서 바로 장부에 등록해보세요") + } +} + +struct OCRWidgetEntryView: View { + var body: some View { + VStack { + if let image = Images.scanCircle { + Image(uiImage: image) + .resizable() + .frame(width: 80, height: 80) + } + + Spacer() + + Text("영수증 스캔하기") + .foregroundColor(Color(uiColor: Colors.Gray._8)) + .font(.system(size: 16, weight: .bold)) + } + .padding(.vertical, 20) + .widgetURL(URL(string: "widget://OCR")) + .containerBackground(for: .widget) { + Color(uiColor: Colors.Gray._1) + } + } +} diff --git a/Projects/App/WidgetExtension/Sources/Widgets/SecondWidget.swift b/Projects/App/WidgetExtension/Sources/Widgets/SecondWidget.swift new file mode 100644 index 00000000..f76ef7cb --- /dev/null +++ b/Projects/App/WidgetExtension/Sources/Widgets/SecondWidget.swift @@ -0,0 +1,83 @@ +import WidgetKit +import SwiftUI + +import DesignSystem + +struct SecondWidget: Widget { + private let kind: String = "SecondWidget" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: AgencyProvider()) { entry in + SecondWidgetEntryView(entry: entry) + } + .supportedFamilies([.systemMedium]) + .configurationDisplayName("회비 확인") + .description("남은 회비를 확인해보세요") + } +} + +struct SecondWidgetEntryView: View { + var entry: AgencyProvider.Entry + + var body: some View { + VStack { + HStack(alignment: .top, spacing: 0) { + VStack(alignment: .leading, spacing: 4) { + Text("\(entry.name)에 이만큼 남았어요") + .font(.system(size: 12, weight: .semibold)) + .foregroundColor(Color(uiColor: Colors.Gray._6)) + .frame(height: 18) + + Text("\(entry.amount)원") + .font(.system(size: 28, weight: .bold)) + .foregroundColor(Color(uiColor: Colors.Gray._10)) + .frame(height: 26) + } + + Spacer() + + Image(uiImage: Images.mongLedger!) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 98) + .offset(y: -10) + } + + HStack(spacing: 10) { + Link(destination: URL(string: "widget://OCR")!) { + Text("영수증 스캔") + .font(.system(size: 12, weight: .bold)) + .foregroundColor(Color(uiColor: Colors.White._1)) + .frame(height: 18) + .frame(maxWidth: .infinity) + .padding(10) + .background(Color(uiColor: Colors.Blue._4)) + .cornerRadius(10) + } + + Link(destination: URL(string: "widget://LedgerDetail")!) { + Text("회비 내역 확인") + .font(.system(size: 12, weight: .bold)) + .foregroundColor(Color(uiColor: Colors.Blue._4)) + .frame(height: 18) + .frame(maxWidth: .infinity) + .padding(10) + .background(Color(uiColor: Colors.Blue._1)) + .cornerRadius(10) + } + } + } + .padding(.horizontal, 10) + .padding(.vertical, 20) + .containerBackground(for: .widget) { + Color(uiColor: Colors.Gray._1) + } + } +} + +#Preview(as: .systemMedium) { + SecondWidget() +} timeline: { + AgencyEntry(date: .now, name: "머니몽", amount: 100000) + AgencyEntry(date: .now, name: "머니몽2", amount: 120000) +} diff --git a/Projects/App/WidgetExtension/Sources/Widgets/Widgets.swift b/Projects/App/WidgetExtension/Sources/Widgets/Widgets.swift new file mode 100644 index 00000000..78c42b15 --- /dev/null +++ b/Projects/App/WidgetExtension/Sources/Widgets/Widgets.swift @@ -0,0 +1,12 @@ +import SwiftUI +import WidgetKit + +@main +struct Widgets: WidgetBundle { + @WidgetBundleBuilder + var body: some Widget { + MainWidget() + SecondWidget() + OCRWidget() + } +} diff --git a/Projects/Core/Core/Sources/DeepLinkManager.swift b/Projects/Core/Core/Sources/DeepLinkManager.swift new file mode 100644 index 00000000..500d9621 --- /dev/null +++ b/Projects/Core/Core/Sources/DeepLinkManager.swift @@ -0,0 +1,18 @@ +import Foundation + +public struct DeepLinkManager { + + public static var destination: String? + + // OCR, CreateLedger, LedgerDetail + public static func setDestination(_ urlString: String) { + let query = urlString.replacingOccurrences(of: "widget://", with: "") + destination = query + + NotificationCenter.default.post(name: .init("deeplink"), object: nil, userInfo: ["query": query]) + } + + public static func clear() { + destination = nil + } +} diff --git a/Projects/Core/Core/Sources/Network/APIs/LedgerAPI/Repository/LedgerRepository.swift b/Projects/Core/Core/Sources/Network/APIs/LedgerAPI/Repository/LedgerRepository.swift index e1e38b70..f2c42ed4 100644 --- a/Projects/Core/Core/Sources/Network/APIs/LedgerAPI/Repository/LedgerRepository.swift +++ b/Projects/Core/Core/Sources/Network/APIs/LedgerAPI/Repository/LedgerRepository.swift @@ -1,4 +1,5 @@ import Foundation +import WidgetKit public protocol LedgerRepositoryInterface { @@ -128,7 +129,17 @@ public final class LedgerRepository: LedgerRepositoryInterface { } else { targetType = LedgerAPI.ledgerFilterList(id: id, param: request) } - return try await networkManager.request(target: targetType, of: LedgerListResponseDTO.self).toEntity + + let result = try await networkManager.request(target: targetType, of: LedgerListResponseDTO.self) + + let dic:[String: Any] = [ + "name" : "머니몽 소속", + "total" : result.totalBalance + ] + + UserDefaults(suiteName: "group.moneymong")?.set(dic, forKey: "test") + WidgetCenter.shared.reloadAllTimelines() + return result.toEntity } public func fetchLedgerDetail(id: Int) async throws -> LedgerDetail { diff --git a/Projects/Feature/Base/Sources/Coordinator/Coordinator.swift b/Projects/Feature/Base/Sources/Coordinator/Coordinator.swift index 3431b030..de2dbe03 100644 --- a/Projects/Feature/Base/Sources/Coordinator/Coordinator.swift +++ b/Projects/Feature/Base/Sources/Coordinator/Coordinator.swift @@ -6,6 +6,7 @@ public enum Scene { case login // 로그인화면 case ledger // 장부화면 case createManualLedger(Int) // 운영비 등록화면 + case createOCRLedger(Int) // OCR 스캔화면 case agency // 소속화면 } diff --git a/Projects/Feature/Base/Sources/NSNotificationName+.swift b/Projects/Feature/Base/Sources/NSNotificationName+.swift index 273bcc6d..5ac57fbb 100644 --- a/Projects/Feature/Base/Sources/NSNotificationName+.swift +++ b/Projects/Feature/Base/Sources/NSNotificationName+.swift @@ -3,4 +3,5 @@ import Foundation public extension NSNotification.Name { static let tabBarHidden = NSNotification.Name("tabBarHidden") // toggle Tab static let presentManualCreater = NSNotification.Name("presentManualCreater") // 동아리 운영비 등록화면 present + static let presentOCRCreater = NSNotification.Name("presentOCRCreater") // 동아리 운영비 OCR 스캔화면 present } diff --git a/Projects/Feature/Ledger/Sources/Scene/Ledger/LedgerVC.swift b/Projects/Feature/Ledger/Sources/Scene/Ledger/LedgerVC.swift index af2b113e..ca9de933 100644 --- a/Projects/Feature/Ledger/Sources/Scene/Ledger/LedgerVC.swift +++ b/Projects/Feature/Ledger/Sources/Scene/Ledger/LedgerVC.swift @@ -52,10 +52,6 @@ public final class LedgerVC: BaseVC, View { ) } - public override func setupUI() { - super.setupUI() - } - public override func setupConstraints() { super.setupConstraints() view.addSubview(emptyView) diff --git a/Projects/Feature/Ledger/Sources/Scene/Ledger/TabItems/Ledger/LedgerTabVC.swift b/Projects/Feature/Ledger/Sources/Scene/Ledger/TabItems/Ledger/LedgerTabVC.swift index fbe2d141..b60bbf02 100644 --- a/Projects/Feature/Ledger/Sources/Scene/Ledger/TabItems/Ledger/LedgerTabVC.swift +++ b/Projects/Feature/Ledger/Sources/Scene/Ledger/TabItems/Ledger/LedgerTabVC.swift @@ -117,6 +117,14 @@ final class LedgerTabVC: BaseVC, View { } .disposed(by: disposeBag) + NotificationCenter.default.rx.notification(.presentOCRCreater) + .compactMap { $0.userInfo?["id"] as? Int } + .observe(on: MainScheduler.instance) + .bind(with: self) { owner, id in + owner.coordinator?.present(.createOCRLedger(id)) + } + .disposed(by: disposeBag) + dateRangeView.rx.tapGesture .map { _ in Reactor.Action.didTapDateRangeView } .bind(to: reactor.action) diff --git a/Projects/Feature/Main/Sources/MainDIContainer.swift b/Projects/Feature/Main/Sources/MainDIContainer.swift index 60d515de..1ffeb99d 100644 --- a/Projects/Feature/Main/Sources/MainDIContainer.swift +++ b/Projects/Feature/Main/Sources/MainDIContainer.swift @@ -39,7 +39,8 @@ public final class MainDIContainer { } func mainTab(with coordinator: Coordinator) -> MainTapViewController { - let tabVC = MainTapViewController() + let tabVC = MainTapViewController(agencyID: localStorage.selectedAgency) + tabVC.coordinator = coordinator tabVC.setViewControllers( [agencyTab(with: coordinator), ledgerTab(with: coordinator), diff --git a/Projects/Feature/Main/Sources/MainTabBarCoordinator.swift b/Projects/Feature/Main/Sources/MainTabBarCoordinator.swift index 90362007..a4796ecd 100644 --- a/Projects/Feature/Main/Sources/MainTabBarCoordinator.swift +++ b/Projects/Feature/Main/Sources/MainTabBarCoordinator.swift @@ -32,6 +32,10 @@ public final class MainTabBarCoordinator: Coordinator { case let .createManualLedger(agencyID): // 장부 이동 & tabBarController?.selectedIndex = 1 NotificationCenter.default.post(name: .presentManualCreater, object: nil, userInfo: ["id": agencyID]) + case let .createOCRLedger(agencyID): + tabBarController?.selectedIndex = 1 + NotificationCenter.default.post(name: .presentOCRCreater, object: nil, userInfo: ["id": agencyID]) + case .agency: // 소속으로 이동 tabBarController?.selectedIndex = 0 } diff --git a/Projects/Feature/Main/Sources/MainTapViewController.swift b/Projects/Feature/Main/Sources/MainTapViewController.swift index d5fea6f5..4275c479 100644 --- a/Projects/Feature/Main/Sources/MainTapViewController.swift +++ b/Projects/Feature/Main/Sources/MainTapViewController.swift @@ -1,14 +1,18 @@ import UIKit import BaseFeature +import Core import DesignSystem import RxSwift public final class MainTapViewController: UITabBarController { private let disposeBag = DisposeBag() + weak var coordinator: Coordinator? + private let agencyID: Int? - public init() { + public init(agencyID: Int?) { + self.agencyID = agencyID super.init(nibName: nil, bundle: nil) } @@ -26,6 +30,7 @@ public final class MainTapViewController: UITabBarController { setupTabBar() bind() + observeNotification() } private func setupTabBar() { @@ -58,4 +63,30 @@ public final class MainTapViewController: UITabBarController { }) .disposed(by: disposeBag) } + + private func observeNotification() { + NotificationCenter.default.rx + .notification(.init("deeplink")) + .compactMap { $0.userInfo?["query"] as? String } + .bind(with: self) { owner, query in + guard let agencyID = owner.agencyID else { return } + + switch query { + case "OCR": + owner.coordinator?.move(to: .createOCRLedger(agencyID)) + case "CreateLedger": + owner.coordinator?.move(to: .createManualLedger(agencyID)) + case "LedgerDetail": + owner.coordinator?.move(to: .ledger) + default: break + } + + DeepLinkManager.clear(); + } + .disposed(by: disposeBag) + + if let destination = DeepLinkManager.destination { + NotificationCenter.default.post(name: .init("deeplink"), object: nil, userInfo: ["query": destination]) + } + } } diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/Contents.json new file mode 100644 index 00000000..367283bb --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "money mong coin_front view 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "money mong coin_front view 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "money mong coin_front view 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1.png b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1.png new file mode 100644 index 0000000000000000000000000000000000000000..0546b8c948eef50b96c412db01d119deb47c9fa9 GIT binary patch literal 2215 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 literal 0 HcmV?d00001 diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@3x.png b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f4266c2b45f6f7f599faba9124e074117fe5fcfc GIT binary patch literal 11384 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 literal 0 HcmV?d00001 diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@3x.png b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..60eeed3802470a15cc5a13ecd21e99173a304d99 GIT binary patch literal 11183 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 N002ovPDHLkV1k0K`||(* literal 0 HcmV?d00001 diff --git a/Projects/Shared/DesignSystem/Sources/Utils/Images.swift b/Projects/Shared/DesignSystem/Sources/Utils/Images.swift index 2ad0991b..0909bef6 100644 --- a/Projects/Shared/DesignSystem/Sources/Utils/Images.swift +++ b/Projects/Shared/DesignSystem/Sources/Utils/Images.swift @@ -87,5 +87,9 @@ public enum Images { public static let timeLineBlue = UIImage(named: "time.line.blue", in: Bundle.module, with: nil) public static let feedback = UIImage(named: "feedback", in: Bundle.module, with: nil) + + // Widget + public static let scanCircle = UIImage(named: "scan.circle.gray", in: Bundle.module, with: nil) + public static let mongCoin = UIImage(named: "mong.coin", in: Bundle.module, with: nil) }