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..3c6b9b60
--- /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("회비 내역 등록")
+ .description("등록할 회비 내역을 바로 입력할 수 있어요")
+ }
+}
+
+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..1f14d728
--- /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..a59bb96e
--- /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 00000000..0546b8c9
Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1.png differ
diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@2x.png b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@2x.png
new file mode 100644
index 00000000..fe00aba6
Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@2x.png differ
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 00000000..f4266c2b
Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/MoneyMong/mong.coin.imageset/money mong coin_front view 1@3x.png differ
diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Contents.json
new file mode 100644
index 00000000..22b0d085
--- /dev/null
+++ b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "Group 360156.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Group 360156@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Group 360156@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156.png b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156.png
new file mode 100644
index 00000000..9504583b
Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156.png differ
diff --git a/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@2x.png b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@2x.png
new file mode 100644
index 00000000..d7ef5787
Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@2x.png differ
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 00000000..60eeed38
Binary files /dev/null and b/Projects/Shared/DesignSystem/Resources/Image/Icon.xcassets/OCR/scan.circle.gray.imageset/Group 360156@3x.png differ
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)
}