From 7894ede944ed8a9e8d967c6b110a62f7f92b310e Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Wed, 23 Jul 2025 15:24:19 +0700 Subject: [PATCH 01/14] feat: transit main menu to SwiftUI --- DashWallet.xcodeproj/project.pbxproj | 36 +- .../image.coinjoin.menu.png | Bin 645 -> 0 bytes .../image.coinjoin.menu@2x.png | Bin 1226 -> 0 bytes .../image.coinjoin.menu@3x.png | Bin 1587 -> 0 bytes .../image.about.imageset}/Contents.json | 6 +- .../image.about.imageset/dash.logo.circle.png | Bin 0 -> 723 bytes .../dash.logo.circle@2x.png | Bin 0 -> 1246 bytes .../dash.logo.circle@3x.png | Bin 0 -> 1730 bytes .../Contents.json | 9 +- .../buy.sell.dash.2.png | Bin 0 -> 684 bytes .../buy.sell.dash.2@2x.png | Bin 0 -> 1239 bytes .../buy.sell.dash.2@3x.png | Bin 0 -> 1806 bytes .../Contents.json | 23 ++ .../image.coinjoin.menu.imageset/Layer_1.png | Bin 0 -> 692 bytes .../Layer_1@2x.png | Bin 0 -> 1361 bytes .../Layer_1@3x.png | Bin 0 -> 1956 bytes .../image.csv.export.imageset/Contents.json | 23 ++ .../image.csv.export.imageset/csv.export.png | Bin 0 -> 417 bytes .../csv.export@2x.png | Bin 0 -> 687 bytes .../csv.export@3x.png | Bin 0 -> 945 bytes .../image.currency.imageset/Contents.json | 23 ++ .../Menu/image.currency.imageset/cash.png | Bin 0 -> 495 bytes .../Menu/image.currency.imageset/cash@2x.png | Bin 0 -> 882 bytes .../Menu/image.currency.imageset/cash@3x.png | Bin 0 -> 1268 bytes .../Menu/image.explore.imageset/Contents.json | 23 ++ .../image.explore.imageset/Explore-Blue.png | Bin 0 -> 578 bytes .../Explore-Blue@2x.png | Bin 0 -> 1070 bytes .../Explore-Blue@3x.png | Bin 0 -> 1510 bytes .../Contents.json | 23 ++ .../public.key.png | Bin 0 -> 478 bytes .../public.key@2x.png | Bin 0 -> 812 bytes .../public.key@3x.png | Bin 0 -> 1222 bytes .../Contents.json | 23 ++ .../import.private.key.png | Bin 0 -> 571 bytes .../import.private.key@2x.png | Bin 0 -> 983 bytes .../import.private.key@3x.png | Bin 0 -> 1504 bytes .../Contents.json | 23 ++ .../Layer_1.png | Bin 0 -> 310 bytes .../Layer_1@2x.png | Bin 0 -> 571 bytes .../Layer_1@3x.png | Bin 0 -> 785 bytes .../Contents.json | 23 ++ .../Layer_1.png | Bin 0 -> 322 bytes .../Layer_1@2x.png | Bin 0 -> 572 bytes .../Layer_1@3x.png | Bin 0 -> 827 bytes .../Contents.json | 23 ++ .../image.notifications.imageset/Layer 1.png | Bin 0 -> 426 bytes .../Layer 1@2x.png | Bin 0 -> 721 bytes .../Layer 1@3x.png | Bin 0 -> 987 bytes .../Menu/image.rescan.imageset/Contents.json | 23 ++ .../rescan.blockchain.png | Bin 0 -> 577 bytes .../rescan.blockchain@2x.png | Bin 0 -> 1028 bytes .../rescan.blockchain@3x.png | Bin 0 -> 1505 bytes .../image.security.imageset/Contents.json | 23 ++ .../Menu/image.security.imageset/Vector.png | Bin 0 -> 459 bytes .../image.security.imageset/Vector@2x.png | Bin 0 -> 789 bytes .../image.security.imageset/Vector@3x.png | Bin 0 -> 1182 bytes .../image.settings.imageset/Contents.json | 23 ++ .../Iconly_x2F_Bold_x2F_Setting.png | Bin 0 -> 567 bytes .../Iconly_x2F_Bold_x2F_Setting@2x.png | Bin 0 -> 1035 bytes .../Iconly_x2F_Bold_x2F_Setting@3x.png | Bin 0 -> 1478 bytes .../Menu/image.support.imageset/Contents.json | 23 ++ .../Menu/image.support.imageset/Group.png | Bin 0 -> 600 bytes .../Menu/image.support.imageset/Group@2x.png | Bin 0 -> 1106 bytes .../Menu/image.support.imageset/Group@3x.png | Bin 0 -> 1641 bytes .../Menu/image.tools.imageset/Contents.json | 23 ++ .../Menu/image.tools.imageset/Group.png | Bin 0 -> 369 bytes .../Menu/image.tools.imageset/Group@2x.png | Bin 0 -> 563 bytes .../Menu/image.tools.imageset/Group@3x.png | Bin 0 -> 898 bytes .../filters.png | Bin 351 -> 0 bytes .../filters@2x.png | Bin 562 -> 0 bytes .../filters@3x.png | Bin 779 -> 0 bytes .../GroupedTransactionsScreen.swift | 1 + .../DashPay/Voting/UsernameVoting.storyboard | 6 +- .../Sources/UI/Home/Views/HomeView.swift | 1 + .../UI/Main/MainTabbarController.swift | 20 +- .../UI/Menu/Main/DWMainMenuViewController.h | 48 --- .../UI/Menu/Main/DWMainMenuViewController.m | 287 --------------- .../Sources/UI/Menu/Main/MainMenuView.swift | 212 +++++++++++ .../UI/Menu/Main/MainMenuViewController.swift | 348 ++++++++++++++++++ ...h => MainMenuViewControllerDelegate.swift} | 21 +- .../UI/Menu/Main/MainMenuViewModel.swift | 289 +++++++++++++++ .../Sources/UI/Menu/MenuItemModel.swift | 10 +- .../Settings/SettingsMenuViewController.swift | 65 ++-- .../UI/Menu/Settings/SettingsViewModel.swift | 9 +- .../Menu/Tools/ToolsMenuViewController.swift | 85 +++-- .../UI/SwiftUI Components/MenuItem.swift | 2 +- DashWallet/ar.lproj/Localizable.strings | 12 + DashWallet/bg.lproj/Localizable.strings | 12 + DashWallet/ca.lproj/Localizable.strings | 12 + DashWallet/cs.lproj/Localizable.strings | 12 + DashWallet/da.lproj/Localizable.strings | 12 + DashWallet/dashwallet-Bridging-Header.h | 3 +- DashWallet/de.lproj/Localizable.strings | 12 + DashWallet/el.lproj/Localizable.strings | 12 + DashWallet/en.lproj/Localizable.strings | 12 + DashWallet/eo.lproj/Localizable.strings | 12 + DashWallet/es.lproj/Localizable.strings | 12 + DashWallet/et.lproj/Localizable.strings | 12 + DashWallet/fa.lproj/Localizable.strings | 12 + DashWallet/fi.lproj/Localizable.strings | 12 + DashWallet/fil.lproj/Localizable.strings | 12 + DashWallet/fr.lproj/Localizable.strings | 12 + DashWallet/hr.lproj/Localizable.strings | 12 + DashWallet/hu.lproj/Localizable.strings | 12 + DashWallet/id.lproj/Localizable.strings | 12 + DashWallet/it.lproj/Localizable.strings | 12 + DashWallet/ja.lproj/Localizable.strings | 12 + DashWallet/ko.lproj/Localizable.strings | 12 + DashWallet/mk.lproj/Localizable.strings | 12 + DashWallet/ms.lproj/Localizable.strings | 12 + DashWallet/nb.lproj/Localizable.strings | 12 + DashWallet/nl.lproj/Localizable.strings | 12 + DashWallet/pl.lproj/Localizable.strings | 12 + DashWallet/pt.lproj/Localizable.strings | 12 + DashWallet/ro.lproj/Localizable.strings | 12 + DashWallet/ru.lproj/Localizable.strings | 12 + DashWallet/sk.lproj/Localizable.strings | 12 + DashWallet/sl.lproj/Localizable.strings | 12 + DashWallet/sl_SI.lproj/Localizable.strings | 12 + DashWallet/sq.lproj/Localizable.strings | 12 + DashWallet/sr.lproj/Localizable.strings | 12 + DashWallet/sv.lproj/Localizable.strings | 12 + DashWallet/th.lproj/Localizable.strings | 12 + DashWallet/tr.lproj/Localizable.strings | 12 + DashWallet/uk.lproj/Localizable.strings | 12 + DashWallet/vi.lproj/Localizable.strings | 12 + DashWallet/zh-Hans.lproj/Localizable.strings | 12 + .../zh-Hant-TW.lproj/Localizable.strings | 12 + DashWallet/zh.lproj/Localizable.strings | 12 + DashWallet/zh_TW.lproj/Localizable.strings | 12 + 130 files changed, 1841 insertions(+), 455 deletions(-) delete mode 100644 DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu.png delete mode 100644 DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu@2x.png delete mode 100644 DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu@3x.png rename DashWallet/Resources/AppAssets.xcassets/{CoinJoin/image.coinjoin.menu.imageset => Menu/image.about.imageset}/Contents.json (65%) create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle@3x.png rename DashWallet/Resources/AppAssets.xcassets/{icon_filter_horizontal.imageset => Menu/image.buy.and.sell.imageset}/Contents.json (60%) create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/buy.sell.dash.2.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/buy.sell.dash.2@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/buy.sell.dash.2@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.coinjoin.menu.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.coinjoin.menu.imageset/Layer_1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.coinjoin.menu.imageset/Layer_1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.coinjoin.menu.imageset/Layer_1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/public.key.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/public.key@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/public.key@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.support.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.support.imageset/Group.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.support.imageset/Group@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.support.imageset/Group@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Group.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Group@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Group@3x.png delete mode 100644 DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters.png delete mode 100644 DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters@2x.png delete mode 100644 DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters@3x.png delete mode 100644 DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h delete mode 100644 DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m create mode 100644 DashWallet/Sources/UI/Menu/Main/MainMenuView.swift create mode 100644 DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift rename DashWallet/Sources/UI/Menu/Main/{DWMainMenuViewControllerDelegate.h => MainMenuViewControllerDelegate.swift} (55%) create mode 100644 DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 20db4c830..42a010c43 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -180,7 +180,6 @@ 2A74EFFB2305464C00C475EB /* DWRecoverTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A74EFFA2305464C00C475EB /* DWRecoverTextView.m */; }; 2A74EFFE2305763F00C475EB /* DWRecoverModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A74EFFD2305763F00C475EB /* DWRecoverModel.m */; }; 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */; }; - 2A7A7BB22347927700451078 /* DWMainMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BB12347927700451078 /* DWMainMenuViewController.m */; }; 2A7A7BBE2347950700451078 /* DWMainMenuTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBC2347950700451078 /* DWMainMenuTableViewCell.m */; }; 2A7A7BBF2347950700451078 /* DWMainMenuTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */; }; 2A7A7BC3234797FC00451078 /* DWMainMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC2234797FC00451078 /* DWMainMenuModel.m */; }; @@ -537,6 +536,14 @@ 7527720F2AA9F58E0066557E /* TopperViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7527720E2AA9F58E0066557E /* TopperViewModel.swift */; }; 752772122AAA1CE30066557E /* Coinbase-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 752772112AAA1CE30066557E /* Coinbase-Info.plist */; }; 752C3ED22B1AF19C00F46CD3 /* BuySellPortal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9FAABB42AB793CE00878224 /* BuySellPortal.storyboard */; }; + 752D03A92E2F758B00B88784 /* MainMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */; }; + 752D03AB2E2F758B00B88784 /* MainMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A62E2F758B00B88784 /* MainMenuView.swift */; }; + 752D03AC2E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; + 752D03AD2E2F758B00B88784 /* MainMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */; }; + 752D03AF2E2F758B00B88784 /* MainMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A62E2F758B00B88784 /* MainMenuView.swift */; }; + 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; + 752D03B22E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; + 752D03B32E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; 75303FE52AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 75303FE62AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 7531308D2B47EC910069C9B7 /* UpholdClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7531308C2B47EC910069C9B7 /* UpholdClient.swift */; }; @@ -1320,7 +1327,6 @@ C9D2C8052A320AA000D15901 /* IntegrationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47838B86290670630003E8AB /* IntegrationViewController.swift */; }; C9D2C8062A320AA000D15901 /* NSString+DWTextSize.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD1CE7F22DC92BF00C99324 /* NSString+DWTextSize.m */; }; C9D2C8072A320AA000D15901 /* PointOfUseListFiltersCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8C0428C1F74A00490F5E /* PointOfUseListFiltersCell.swift */; }; - C9D2C80A2A320AA000D15901 /* DWMainMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BB12347927700451078 /* DWMainMenuViewController.m */; }; C9D2C80C2A320AA000D15901 /* AllMerchantLocationsDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8C1928C6A21A00490F5E /* AllMerchantLocationsDataProvider.swift */; }; C9D2C80D2A320AA000D15901 /* MainTabbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F451E42A0B986E00825057 /* MainTabbarController.swift */; }; C9D2C80E2A320AA000D15901 /* NumberFormatter+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B30D77290BFCA60080C326 /* NumberFormatter+DashWallet.swift */; }; @@ -1954,8 +1960,6 @@ 2A74F0082305F1C100C475EB /* DWRecoverAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWRecoverAction.h; sourceTree = ""; }; 2A7A7BAC234770C900451078 /* DWCaptureSessionManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWCaptureSessionManager.h; sourceTree = ""; }; 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWCaptureSessionManager.m; sourceTree = ""; }; - 2A7A7BB02347927700451078 /* DWMainMenuViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuViewController.h; sourceTree = ""; }; - 2A7A7BB12347927700451078 /* DWMainMenuViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWMainMenuViewController.m; sourceTree = ""; }; 2A7A7BBB2347950700451078 /* DWMainMenuTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuTableViewCell.h; sourceTree = ""; }; 2A7A7BBC2347950700451078 /* DWMainMenuTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWMainMenuTableViewCell.m; sourceTree = ""; }; 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWMainMenuTableViewCell.xib; sourceTree = ""; }; @@ -2464,6 +2468,10 @@ 7527720C2AA9B2630066557E /* SupportedTopperAssets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedTopperAssets.swift; sourceTree = ""; }; 7527720E2AA9F58E0066557E /* TopperViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopperViewModel.swift; sourceTree = ""; }; 752772112AAA1CE30066557E /* Coinbase-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Coinbase-Info.plist"; sourceTree = ""; }; + 752D03A62E2F758B00B88784 /* MainMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuView.swift; sourceTree = ""; }; + 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewController.swift; sourceTree = ""; }; + 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewModel.swift; sourceTree = ""; }; + 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewControllerDelegate.swift; sourceTree = ""; }; 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CrowdNode.storyboard; sourceTree = ""; }; 7531308C2B47EC910069C9B7 /* UpholdClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdClient.swift; sourceTree = ""; }; 753130902B47EE920069C9B7 /* UpholdCapability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdCapability.swift; sourceTree = ""; }; @@ -3049,7 +3057,6 @@ C943B5882A40ED4500AF23C5 /* DWUsernameValidationRule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWUsernameValidationRule.m; sourceTree = ""; }; C943B59A2A40EE4800AF23C5 /* DWNetworkErrorViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWNetworkErrorViewController.m; sourceTree = ""; }; C943B59B2A40EE4800AF23C5 /* DWNetworkErrorViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWNetworkErrorViewController.h; sourceTree = ""; }; - C94946DF2A25EE24008A678D /* DWMainMenuViewControllerDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuViewControllerDelegate.h; sourceTree = ""; }; C94D98202A4CC78F00F3BEE1 /* DashInputField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashInputField.swift; sourceTree = ""; }; C94D98222A4CC85400F3BEE1 /* UIView+Dash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Dash.swift"; sourceTree = ""; }; C94D98242A4CC8FD00F3BEE1 /* UIControl+Dash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIControl+Dash.swift"; sourceTree = ""; }; @@ -4230,9 +4237,10 @@ isa = PBXGroup; children = ( 2A7A7BB32347928B00451078 /* Views */, - 2A7A7BB02347927700451078 /* DWMainMenuViewController.h */, - 2A7A7BB12347927700451078 /* DWMainMenuViewController.m */, - C94946DF2A25EE24008A678D /* DWMainMenuViewControllerDelegate.h */, + 752D03A62E2F758B00B88784 /* MainMenuView.swift */, + 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */, + 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */, + 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */, ); path = Main; sourceTree = ""; @@ -4255,9 +4263,9 @@ children = ( 2A7A7C13234B761700451078 /* LocalCurrency */, 2A8F420A21BEE69E00858B91 /* About */, - 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */, 2A7A7BD72348CB7300451078 /* DWSettingsMenuModel.h */, 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */, + 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */, 750CED5F2C94BFD7000FB837 /* SettingsViewModel.swift */, ); path = Settings; @@ -8620,6 +8628,7 @@ C3DAD2CF247585C10001624F /* NSPredicate+DWFullTextSearch.m in Sources */, 47F2C6842860513900C2B774 /* TxReclassifyTransactionsWhereToChangeViewController.swift in Sources */, 2A7A7C16234B763600451078 /* DWLocalCurrencyViewController.m in Sources */, + 752D03B22E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */, C9F451FD2A0CC4A300825057 /* BadgeView.swift in Sources */, 756557B52CE84FFA0060348D /* FeeInfo.swift in Sources */, C9F451F52A0CAC9400825057 /* HomeHeaderView.swift in Sources */, @@ -8871,7 +8880,6 @@ 758A8F172C4D35A80012FA41 /* NSLayoutConstraint+DashWallet.swift in Sources */, 2AD1CE8022DC92BF00C99324 /* NSString+DWTextSize.m in Sources */, 47AE8C0528C1F74A00490F5E /* PointOfUseListFiltersCell.swift in Sources */, - 2A7A7BB22347927700451078 /* DWMainMenuViewController.m in Sources */, 47AE8C1A28C6A21A00490F5E /* AllMerchantLocationsDataProvider.swift in Sources */, 754565CC2DAA52A000DA4E8E /* CTXSpendAPI.swift in Sources */, 754565CE2DAA52A000DA4E8E /* CTXSpendService.swift in Sources */, @@ -8900,6 +8908,9 @@ 753FD7E22CA44BDD00B7751F /* CoinJoinProgress.swift in Sources */, 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */, 753E46E82DE1E24300A3FF2A /* CTXSpendModels.swift in Sources */, + 752D03AD2E2F758B00B88784 /* MainMenuViewModel.swift in Sources */, + 752D03AF2E2F758B00B88784 /* MainMenuView.swift in Sources */, + 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */, 478A2C7228DC909C00AD1420 /* BaseNavigationController.swift in Sources */, 47CDEECC294A2BAD008AE06D /* UIViewController+Coinbase.swift in Sources */, 472D13E1299E1F2F006903F1 /* CSVBuilder.swift in Sources */, @@ -9287,6 +9298,9 @@ C9D2C6F22A320AA000D15901 /* DWSetupViewController.m in Sources */, C9D2C6F32A320AA000D15901 /* ExploreDatabaseConnection.swift in Sources */, C9D2C6F42A320AA000D15901 /* WithdrawalLimitsController.swift in Sources */, + 752D03A92E2F758B00B88784 /* MainMenuViewModel.swift in Sources */, + 752D03AB2E2F758B00B88784 /* MainMenuView.swift in Sources */, + 752D03AC2E2F758B00B88784 /* MainMenuViewController.swift in Sources */, C943B31B2A408CED00AF23C5 /* DWUpdatingUserProfileView.m in Sources */, C9D2C6F52A320AA000D15901 /* CoinbaseTransactionResponse.swift in Sources */, C943B52F2A40A54600AF23C5 /* DWNotificationsData.m in Sources */, @@ -9670,7 +9684,6 @@ C9D2C8052A320AA000D15901 /* IntegrationViewController.swift in Sources */, C9D2C8062A320AA000D15901 /* NSString+DWTextSize.m in Sources */, C9D2C8072A320AA000D15901 /* PointOfUseListFiltersCell.swift in Sources */, - C9D2C80A2A320AA000D15901 /* DWMainMenuViewController.m in Sources */, 7545ED5E2DA91F590075F45C /* CTXSpendTermsScreen.swift in Sources */, 75AA33D02BF9D44A00F12465 /* ButtonsGroup.swift in Sources */, C9D2C80C2A320AA000D15901 /* AllMerchantLocationsDataProvider.swift in Sources */, @@ -9924,6 +9937,7 @@ C9D2C8CF2A320AA000D15901 /* TwoFactorAuthViewController.swift in Sources */, C9D2C8D02A320AA000D15901 /* Taxes.swift in Sources */, C9D2C8D12A320AA000D15901 /* DWSeedWordModel+DWLayoutSupport.m in Sources */, + 752D03B32E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */, C9D2C8D22A320AA000D15901 /* CoinbaseAPIClient.swift in Sources */, C943B4ED2A40A54600AF23C5 /* DWPendingContactInfoView.m in Sources */, C9D2C8D32A320AA000D15901 /* SendAmountViewController.swift in Sources */, diff --git a/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu.png b/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu.png deleted file mode 100644 index f65f5980d1a2907d1968c626d70ad3d370f55be6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmV;00($+4P)o=gETM0A(?(s6 z2+6!9*UneZDW6RgkfTbv3dc9R1lfzW6($@7_c9n&mqQB`rYuEu%9OiN4BJV&KJ%H* zT|ERBRPmF2$6!;`gL6|&QOOV1^Nl;}$L>(!OuRLH`wYc)onEbe)x@qx)js-Lbw<_z z=83I;whRw6&k? zUDz7ZBIE(1n3_!RH`zvdmm{%t)V2?MJZ}}#9h#(}Sh-S-ch3;Q>%-Xx_uKEBxZlyA z++9wLo<>qloGU`yNvk$$$FC)pGCv2r(oLMX8p}G~J z#S!hL)gd;4_4uc)K`pe6O-Ng0F`( fzPZa>II4wz-p%8j*TjJH00000NkvXXu0mjforxj_ diff --git a/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu@2x.png b/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu@2x.png deleted file mode 100644 index d13f537c3ab82bfca430f67e4e04b9b77634b77e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1226 zcmV;*1U37KP) z(dheYy28w zMI`(gnc@8Fn+w|A?;%~m~bSIeFc7kyCs*y zOLBdPCFHv&C+Pczdo_Y@r+vu02!Ud)1MVR6lUNJ=brQH_$aS(Ah7NGH)XZfBI$7$HgdEob8P`ito{k2&O$;B`DD|7$O9Q{0|XAZb)aAun$BN1VIh* zC^~}1gbl5rt!6c)Nk(#;wncREC}u-U`v`@Bzpjh|aT)Ot73NT>tv{K(PydU(d%gsE!-eC5u$M-BSpO7kh{E5iK@ky z=##y+m0uT^+F46*OQi0_RLC0J3e~?g2*J9>k)*n}gm}Ybp`KSaS4Z|@=6!Fm)6S^6 zJ!U#{CDpKtcS-j|JIRb3QO;JMD|Yv?b}YJ*SY>i1y+Iv#_*n-Z+0xS?>XATpWT0=E zEFJpm$b3|PaL2thU35=$G9z`w|21tTILWpXYP;vf70b&V?}&nyt!{$b_;gWl@o>ok?Up<7i(<)&2-Ce)u&30SK80r)!N2it%}0xVTJ6iV za%m$`4~5g$+uY5BH`LbVuR{#1jV_m0YG=!@hdz)Kc}Gys<&DFln3|}j(@y=~V;&(C zazuihptbLTQB?Y0@BR2*GCM+@b{c(z5XcWBw|&W>B?uBTM9isIWC^pte-3tZPKpcv2FgNkBjLf zGo`zOY)MbM{qpVV!=qi2tRN?-wp-F5^fcfpkY`ko6Eq)S%6ZLJ>u3WcTg6eI)t_Al z9s%<@n$Cxdwf1SmW_AnEW?3s9pHx=g1eRzz3fz%BiP*B)wy>JX7E38{)}nFIVwrO$ oShlElY`NI~@w$4p-M=Az0=3r6s?3S6S^xk507*qoM6N<$f+9#yU;qFB diff --git a/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu@3x.png b/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/image.coinjoin.menu@3x.png deleted file mode 100644 index 1949a1f54701c09b56c6859f0b2f78eafb497962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmV-32F&@1P)Ro60s z&H$n)Qv3lx$UkpkStK6Grx^e<0}x?T7=G&lM17FrC4K7x!jAq_(95+$i0N+(3TFWF z4-hZ`xShhu^BHUa2qB?GJ~;xV`XsCmZGa?P!DkTB1Wta6ArQg{9)2f*c-C5EHO3&+ zXE=E_ftF||c=JN@V5?(v*v8_1g0<^*&OpL3+z-g&(YcRscfo8`iC=&Rp!-D(QXRsn zo0|)l#xVRrR>f<$f3b`n2znNNCI{GA*o?kI`b7uuFfoQ-w-0R^HVbC4N#}Yok3L)= zOabS6P4joX;Kw31g@x$)J}jS%9*tOrqGy$zVO^7I!Fn)I2k`hXs2j-2UHZdc2Y})W zJZ4C>S2ks>3m*Q{1DWvD(*qwM%pg&}(SH-T-HKuBwnxVfXbRb1OB{+Eg_n>-Gb>Ir zVi5D)Vt-y2eDPyMt~>xAaOQ*2UTFlxKcu1`vMgJ2<=EpBO;;!R+ZAshlW*V)5k0RB z_ssRbLK?WRWii@y;<%#V+WA3CB_r_1xG}cX=e4^p?gy7v9HdOi7ZK(LuuQPdd|G5Z zN?zHuQ`6=D(o%?26YvFVdQaLG$OKFA8rnctEG!U-7+euqUb~vVw6YP*{RCRZ$pU+J z4OP|`QQ7s&MEUjK{%cKu&fnet$tDc0B9S5U*XbagH@P`p>`>=H=^p#Q! zZ+7yYM3G!0htCJd(h&B|2b)@U{)I5$zIH-$-+1jzb>Uz}gVL+gL_Tz}LCl}x;-c3O z6cjOm`knlT#OM<3e)A0A!*PU?ueRvoeeeZpi>A{|FN=tD(s4l7UVIJ8*`afO7DwFK zB0ImxU)_etu`is%>Gr4G@r#=QojWTH1(~DB-QN`4y`B@(2)$mnVh%YxIJ-Ljg7ER? z+R1gA!ojlmw=P~zImPhNhtvG*Qy!&z-~zT%T{y_+*eZF>c_T+jcMeb+7f@F~at{}O zp3w;W)T-sh4Uha?FAiJx&GvIAjwRg6vHD%5E3P+ULD6Q2#g?LdMI?Ent$C8kg|G#nvZkdTLi*hCFkwW zm!%vZutw5q=3(PXEupUT1J;3s@y?tKRNCF1HgZB3WN}|3Sj@-J8hB~fPG;?_OS|A- zmrlXkpCA<+!mXu>t=dJM%%ZlXU153cYAhECvd}V7ZmCug)@9n;tleFeX;%vVnc%j4 z1(jV)n=8|z9j8s1mNiwbEw!<-!q>H-Aj1^=``H0Jvg8cF7rc>e1$n`G6kS>Da)SvU zs|1vWJ{Jj%)@zK%G8&XWQJp z)WJ!)5W^PpbQn}Ev^BuB5O0!lp3p<2Y`)-V5a+wDVj14WEDf_#IJ(o9JQD4~6YxYk z!6`U0LmX^uPzxY5yHrS+V85@0hj~%!N>^h7zNHpc@GA6f`lxSmUh!g)?Dr~O#pB%p lG}o&?b=f#dCYyQ{?|&@P(`L^TwqXDO002ovPDHLkV1j1m@{j-k diff --git a/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/Contents.json similarity index 65% rename from DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/Contents.json rename to DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/Contents.json index f381203f8..aed16563f 100644 --- a/DashWallet/Resources/AppAssets.xcassets/CoinJoin/image.coinjoin.menu.imageset/Contents.json +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "image.coinjoin.menu.png", + "filename" : "dash.logo.circle.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "image.coinjoin.menu@2x.png", + "filename" : "dash.logo.circle@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "image.coinjoin.menu@3x.png", + "filename" : "dash.logo.circle@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc64879f056c257ce4efa51c75a13aa96e47da9 GIT binary patch literal 723 zcmV;^0xbQBP)Gb6ysOl8L_&S@4Dk%D5O>z#4doCT55}{Xv^VOTwoJS&t-E?@z^RsSwzVL-075 z)=?PxD%a4=ii+;I)S;=;oO3G=d_e=cL-v`A+Jc`&@fVV1?U9?H5n=!U002ovPDHLk FV1m}GRdxUX literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5328a2436d8baee2eda58088117cc89b5be77d GIT binary patch literal 1246 zcmV<41R?v0P)!dwaU~cHfWPw*tdp<6!|9TY`&u zK-dtn1PN+W9}j^ReYdE6o31;sa!pibT1bgNQk2l+*CAz@geoHmf|QZCokkgR1$@C> zc>}#8oSqsfvSzA?nF1UCt)7A4{aB)k%EdL^?s^JrJhI_9cd2&?qoGB!v8Xc})}Rhp zf3ytO*&3nnjIG}J%fCy5I>sx&CL^61&eCL}DL`0vl?*XNn~-PkRb+t}zX(@=r;fGH z5+ZjMD>Ivc=0HbwShm0SV>WTL$*~vSb?l%IxK0Dv6P_uMKL)I#UjffyY-ANlk?`hT zwYTZiggn!Ei0nhA)R{wNuFXI4C(W+AiWF>pdjX~CF|EGsBNwe_4tkNC6Dbz*_*NI~gBIt6@KiE?p5ud@)B)nypYyY$&PeEsi z`5#(Xolo*<&4;P~{aSr=VUxM~<%gjr!^#yV1Ub4K{73HClBKqPBZi%}djA>fyWvXP zlX;n}59wZRe<_g@nzj+Ax5pw>&$c{gUm24z>?F5%=C89b!JuTIhCX z+iiR^t**MnIb@WnaH7+spgC6_s}$x;glD!7qer=LF8uYJp*1m6fKA5)4vBHmq+A>i zw6XA75vU6*(AMe5Hg7WeYzCFa)7UWj$$crRc!`UDk) zy$#L!ej`bRS*~2fFyKtR@Y{jWGpe$^Qe5zcPs)2RB<&`~hojEookJMIWqJ4;8teEL zH1mOvJ*Bx~j6mgy=2Kkx4U; zq~;g6ddezvaN&;e&Mb>Xt$wWBoUg!X2vKzwc^g^Bm3^l;!P@Bh{+6nMWf49oTq(}= zHU)#Y$X$Vv*pX9s8vVXlQ?`~BSe73?t%u!;KjizF zD#4aWRWnTu3;*M6HR|@@Q%di&hSy4?4XmFR_KbjP;C|p*R?WBoMph<$? zOCtE`Ukn3Z8A)|kOO-0^K7SD^F}Bt2Ptq1v(3Lk*35D+EE%&^!kGNwE&j0`b07*qo IM6N<$f(hGFMF0Q* literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.about.imageset/dash.logo.circle@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9b32000d4a54b1c37f293a72ba76597cde7845 GIT binary patch literal 1730 zcmV;z20i(SP)6DJxA|!k1mwO$RI8P1$wP5SVINm z-Ymf&W&~;%#eqrA#rkx769&*Lkmo|f3vlHkbXZC_O0dKxU~TENDm?;StuPl+LgntP zLId#y${#pz#bf%-#`U5E>E`g+Tib|1bb(YxTBeM&i0jQdtm-OqlNCfDnn3yADOJ~Z zas8~O8{~FFGf`rbg|K)oRey%$h{M?4Xa4+``v^%mfgb%vfmpERTy-FhLI%Qmg0*s} zkPuv;{IAOt^wyDl^4_%sBv=e$%NY!DTFFsy>3dE70v0ZP0RJP)P zoWz(DgbHQ1>0a5bdkpf%Q}v_<v4rDe4AM%oP*Pz|m#qtz)+yRX{ z-RKgJI$Mxy<#E%nXgt}$)h-L9Y6KfM4|28Cr6RK3#SD+J=H7h?_UI7eP&%ojbX-T} z%ti623e8Yft4_8KY*X#`yR$H8Jqz!>jO-g}=z>Kml+Up9(58I65t-6YRQ=KYA5;XACh>{qzP+fdpn@ z5PK|zey~Vx99txwY-pea;^1s}_Q4q+M!#T@?!SEtkzp+wDPIZX)*TpT>b6-IyGY)N zIYMfuqg;~Uu7J)J&0#EL}<_Q#+y`%r23%?i@1nbhut_Uns+SMTrQ#=fQQCXkj^EkeR z+2N<2J23Z-e@zmUFom688t0NAF0ln-%gNl*qI2k~*KhbzIEYw9w-EcvvKq%&Ti=IE z+kS4X$AZ*q(#U+MDfVz>y!m5rf&9eL)RHa5Zqn@0hu{wr=lR9MYH0WJ8;d>F;9g`r zl@z2XQblAVB3$zK8*ijO(c6NysZXte3b~lOkAyKBV0L8t=YJ6&xkq)7C?P>`KZx5M zz2Hi`a;Bk!L)usrrVB_2vs7>Ge)78S<5qRKy(^0pq^l+Bd+-#;wOz%*8Eg52R{~Y* zY&|;Cy9dqHr@Z-}N9CgKrhSk=+KVZ2C3{S@O*13G$~7K)X|o=oJWHi{i5>dxKqFad zR`EPlKbilkqR)DG{|C-1X{)*k&Gd7chv7mqa)Z7Typss$0yt9%xkU3 zSc}H8yry$2H`9haYJMh_W6sQ%e_)+vFSOEdFQzGwaHSRK(UhvR{U26J^ zL%nXr@Yu9v?^*NT%x<=JutARqyvVv6CKf834?fjWmlt{p!A{iWR_mYbeqhzsY07m0 zF>50AAC4arI3ra~r6-Jz_NgyyJ*m`Y`%M>FJ6O?SMTx|ft5h7WwBB@CAYRoV)6aDD zsuKlU&x7&Fi#J~`Q8^aXa5Te#W~o9vA)Y&ikNVZ!g5S6ejsq=jS!ZVt$Gil|#wwwY)&Kwi07*qoM6N<$f)pl9X#fBK literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/Contents.json similarity index 60% rename from DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/Contents.json rename to DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/Contents.json index bd44fe04b..966e26ccc 100644 --- a/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/Contents.json +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "filters.png", + "filename" : "buy.sell.dash.2.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "filters@2x.png", + "filename" : "buy.sell.dash.2@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "filters@3x.png", + "filename" : "buy.sell.dash.2@3x.png", "idiom" : "universal", "scale" : "3x" } @@ -19,8 +19,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" } } diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/buy.sell.dash.2.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.buy.and.sell.imageset/buy.sell.dash.2.png new file mode 100644 index 0000000000000000000000000000000000000000..48cfe3d6e38776e8b6a70cdec0707ad7fa93c176 GIT binary patch literal 684 zcmV;d0#p5oP)XKT`avu-EMRFBshZpXmR3v&H_#JkP5_7t;)Y?PY$(DBLQWu_K&-^Lgc}5_uw2Rp zVg=^4{bquUQ!q7C$tvGs>P^4ye*NEs0P5%0MG!ZLbsnUeAD=%t!6tOBGQguUn2TT( zT^eB|=Pqiw-ij^hmwA6VFKew`g-j$L&TLlx%Yt^k2!r(>ospOCDcX|;RHB6H(=q+C z{QI>9M_+l2+)br-ZM#6zjSsXZhR;Gc#!!pG+5^WqH9m?J&DLSs-YV9fyosP3E{{%D zlJ<}@H}jdLnTm$0)J{KCj39AGG!VT|e`fQcC?Bq9nis?R`OMxb4)gKL_bb zaUb^tm0B)s@n!6LwfW&7J=!Wk7$7R7Y?WQgPLZIJq<19oIcpv6+Mz6vDfmp_hE9eB`29{1BQLa=;-WWEPHV*a)L{1Rp1hQi(S&AEo zg_CTl$XJ%p^z(b&1D+WTFf+^`7W!2QG0@Y@NB8S~?;8*zviJU~f;rkGO;tWDp~BY( zkH4wGG&C<(02X(Es3Ls=@t>s&2yH(8161x9YTtLpb%QYJ;{U!XfkQ_C=7R!f)Ar$d zu?2By{>K;W9Pvd~BA(G=F^y4T)VMRvw}0!LhYDa2u?une_1_)P+-GzF!j?Jb)rZ}% zH%E%t|EpI8)F*_v652r1ZwHSH#}J3+KQDmvYksx@@sV?yrjG!j(@Ca~jKEz1_?D+Z zW4Tyt*UK?SK}Ns|NP`+YTOIZlDq{b%cTNCn-q#SQcJNa%*+obU$aF|H0%3GHM#_U2 zxig*i|NOt2ssKT2nF47E0MnN&3@&$LBA0*aJ4R?tB|t_2XbaLt76!9Khln6D`@j$d z3vXZ=v{Qww(0Q|3<>kTb1q}B4YvgIe0n^pW>B{?uKR)U}5)d|lAR7>WmVf#E(@#xu zv{6JV=W9bU_Z)p8&-YGyo#p;bxxVpTyj6+(@s%p>4zCDkH{vO!o5ey2;*(}T2Pw&e z;CoX5_~^~E;KA!_;dwk{Vqz8Sxt!wpCRLI<+LOl@W6IA0*TFN9x+ZX^zD$WVl2 zy5KIc_5!I9+K`};C{rDtPwyZrBvl8`K4CVrJMn>?!zYD0OoO^jD_;ufJ7*G5-)49C zAUdJ34lk@371A4)VN2%L@0v0}n*zYhZhQ(Rl7$Sg+!vzTv&01v9{ku&cxg zz|hc5iw-Ag8zfkO*_1HmY zOFy(bYRYYg!SVg39V2k3(Zz&jY+k4hDXnLhipRmk!9?7EpJhD}k>_V0WqOyQwYC92 zcOqV{7u!(`JtVF#$X1KUOKetlub*eDiQaW3N;$?FlW@yY2~_i^@39jf2zW_-A4Jrc~gW>n|e>e zHGaqO{Oo2;gR^=4v9}v?>zR{C9BKFDt>KFm$P%e7Mqt1BPbZrCCjDUnffn|*!Z=r6 z8N(Mdwck7Ailghx%S!N;v*+ZA0t96ZUoKp-5F&j_-(#SV--pyIg&_>vA!%R5+A=Aj3i6e_3^#uo_jt-NJ#x9PyTmsa0_H^!rCem zO@goiW7Znqj<%6C&3`Je-Fex%Ciks^F)7=V-n;v9tPQ3%z)xXHTUh$CjhGOIWck@) z6~wD@^QzBBw;DIbYRHP;_T-1bq6noL=Q6owSFU-Cds7?HFNulUa}HM-d^hyul9^7u zH#PsR!qU2IRgjFf{H;Y1RxBYc|8ZDB*KQ+X1IwMGtM%H|eWXG2wG5#vtFQ?FapLg^ zrn82nY2S867SjElH#2Op?dY5c5Yg6y>thQ@1Jyg-?xwVM2HDUSeO2?*R|XN#9u!qT z#Mmdo)@Ng*w~+>}V&2YBK#F@0z1ILjds37krh;ME$FkXK%zfTMTIdk7S6(8y{)vVv zb?Vgmhu%o&h1SXp7SKrM$Dd7%*Xy&Cj_x_ZmEe1)4NGrj=blTwhXZ@k^3I!EVq>iP zor)3M3?QyqB(>q%Kw_j`xK{u-UBq?Nby5=0Ek{ z2V>G1HthI>LLu-{W|0s!>6sIWp_aa$u((w}slgb09X1}^n0SP&(6CQY@Y-@hNUEQ> zWETAOQ$~8I7xgm}TF4vqQhGk`Q)@Rr{iH71?DS9{jQq_Cjm>%ZdL~`pcDF8@-^f|7 zr0YHUBoWzT9`3!)&HC0^?T4x9<6U1Lwdo1B6d!66i3~d!9O6bR18m1P-&-Pbwf99K|hmPf{F{KpO8Y5i-FE zN+t|*=Z+(&&TJ++NZkK)8Z^{2xIFhy4O8j)dOD?(Ol1nZ*e+)JO++68J zFT=iq?C!3K=escWcPxEf9Jg&BCxzrLCf8$U*{4HbnsA{EaAbs`eizgM|m*jSm#) z`Jdf-aA&L20#ca#b2TrNkYKHU4PQWl+JzC4(~H;tL@p z$Eft{MOyk1k_#ICT!1sq%Ja8P=75LK7!z79JK{cHs8BU#E(y~B_0dJL{%SG;TtQlu z9wDQ6#I5Bp6%-AQFQofBM>EVvRfZ8qqOArSfYfTtjnxr>5p-!oG*kLsz@&uCIK3RZ zLo9bHuJ?3Q1#J8WhZ1P>z5QD~elw_bx)4Wq7d_PvgYhVQOPO z+DRHU)u3ROslY+#kS7gF#*5xMm7l(KdeqX|yz=+Sw<+5eFDr4-~>27$*gSeyhvhm0-PI|6WGc}*>VGq1X7kk z3ChQ2x~S^G_INxD!}x97JzZU|yQ*K6330T}imv9zqNndm`%U_}_zv6$9ez zp&@9@J7Bwup|^$Cn~4vCZE!T*^5LA3334hk+>a(U4H_zUn@j|j8xrff8{bnWgpcQg ziD8=aoH~(b$|ottor!bR$=%Ks6|mU411Uj(?yaVJWrzGa36=c*tPP?A#83ZbV}DVd zgi7|V>Ml_;r?6q@7Su^dpb631!hAGcG`{=2k51xX+M&6R8j>KWea{QYtC3FRlBwWZfWrgmMy5yee%4oDZ?nI8{Ch-#_=_Czmt9#&T z5um*@YFSObIt_2#d? z?NeWm`aaO-Ly&_GY^?Sn1{%khzdXO#2f!kL=mLu7&XeWtq;X=>1JL?h0Ly$vpDGT4 zb^lNZSM{~&L&ZFgC*f<&Xh0=KIv_-<7P^$*%mELCbkPG7p2G8$4^a>ObM$o$$(0Z&&O8u?th{)%yyxn3J&~R8BlIXPN;+|| z_4Z2xgseOJNZ7s*So-(z-LVqfE|jhCpyuW^G-6`s$vxTtR-JuhmAr*wzj1Ij9)Gie z)~7mTEBpu?Uv-@acOKtudpE)3FLSrX@nE}HETBg+EK%AF%?nM_DHp7_4bT>y@*QHt{?E zm*kISm=E%C)+Q_Lx_hw5!AveB)?pS9K=}>60<@mO75Tp$+=stb+PcHp3M6#b*>{;+ zTFX(C7uX(|K#<>>By^6n7c;pFnQxC|EnYWzob2VOV-3=V5*(Vaxv~o>f{)d$_ZM9l zn8l@gw>$PyFHcj}Kjky>s+x+%HIRceVZjD${t~S9jQ9jw;0)rY%HCP}FeKrh2Lxrt zd_utgr^kuoz=Wz#cw6K36jJhCvPd(`B6N&eA0Y`WZ2E zbER}M=7iJYGnhU4bO5coNjmOwmowdc$y{Dm#9+XyOsglz)RQ`eahp9sc! zaAl4yAqEcv1KW^2SDX37yg*4|cx{y54}U+XspzC)>&iF5^0z3gTVP0WtORCE|gvPqF?x+Rb zmtPj3wOv8X6)!GTKrAHW6G=c6R3dsZQGxN&f@FLmDGtd3=(!caB9$%*po?kwL>i#A zCDq}(-ij9$qh4!IGA*A-jyA7t#{i-`J!UH$UFf?~Tt1NouGyg4K%f=SYHYv1_ycqh zmro=GuXW7^9elv33Xd7ASA(Q*o*K;x$;ooKdHeX@2(uehrT{t3XX+jn|XrQD1WpWqu73BLl@cSb+(5bE@ss=WRKuDw7Q T-mpq>00000NkvXXu0mjfH@bV} literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.coinjoin.menu.imageset/Layer_1@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.coinjoin.menu.imageset/Layer_1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..31cddc43202d60c4fd0eb9f9e61df9957994acfd GIT binary patch literal 1956 zcmV;V2V3}wP)32YS$+XkC1CpmQBHt!0*hdhM~f3k z38Z*LRe=~|?{vCnEL*a6_J5__uL{f74!f&Q-90`1^{jv-u-z>KlvY5(O#oqoz(qiy z_tZZP0X_QJqxU;t$rm)f1NG}YNEqvX9@*gFF929k*Aut}R-xVe?n)0LKtNO|QfBS} z(v2WgAPNMLg|N#XAStre4?cG3#lG}55oNWS%U8A_B*GIkAV%VS7`Bl3Xc19cafn)f z`EP}Y*!LLHgMw8JV@(!>!S+9!AWK~$rvb^5!>ECDy6PGcVOgT@GlbkvcGq7W1-?cw z3)+51Cw89G=tYuW{ZMq+Ck5)AV482Gnna4z7AOa~kv! zJxL}4IE z?k-0}^s!(qT}}bUT}(QhM`Vp0Mj6nFW!23)Stq}SADgz(IC_&oSZOAH+T;%DS z2E@P@&dGfa%!Uh8)?a<74Zm~YV%oL3kbRJ=oh(3o!7nK^;w&Z|qPwS1aKE}R_~XKY zq>P-wP8j5B#RkNHjx%UV9qjd&N0q@Jnjp3wz#8NQNP$+Z38Ul5t+^fJ^e^z-STsS> zsX)F^23fohaUrC^im)=sur)yf?m^xl#P<*r&E>fkPw#HWj!UyOezlZ);Y8P2$$)E6 zDm27A4H~EYANaKh&dDNW&5&6L^$m9@e|b$-(*cKmcM5&jNU9o%dvp;O57HHZB4w6b z5zH2t6i(<6_TbSsZAcN#+t=C~2Os<6Q@#%1Mf&9?WCa4+l+A9XP0D4Uz&ian&!Pp= zvZE;0^esJm+of;HhG}9-#0*1~M^0r;2<*>Zz1nIl>FT6_r*Eg{V9J%`8vOX}9%K|# zjLu>Y1T7gdOb(+6(}09JJi4(Hc>EM~H+Hf2FsbqeyOe{gfnrTYbhpU`Y5s-DQTL;nxTTUQyvZuR|1-;oJlG0s^NvwLhRfcu9^essG%Aed(iHtj5s zGXURXS$oVAf*uCE+hqqR>vmfOn19ji&>|f`bU;h z&cX4_G;8Hhce@}cDJw#7*Uyz}Whm|#K{?@&Vluj#e@IiZfarM<&s-1ZTdv3Qq`M6% zCgbG}QCNkju7-wmA#b|dkQI#+q@#EpqQKA?kZ0Y^yz2Jsu6iBC)qVe%WXi@_cgrheX~n-L&F;n-rY>okf#_~Qth?nERN4(z zwCBM6V1B{V<zFK zE+YSe+yY-)=Dk(20*PEB#}-8QZkg6lBB>R4y1HAsunKL9GT@fmF?O?!KR)^@kG@Dt zcS{>wouJ&#I%~^syNy8!+mHm((B0Aox6Qy=JxEAtD%RVHO!-MECX)pB6u}umPwsrR zXWq7mo2tPv4wBa0(no8sbUI(n3wi2Vht?a-r0?!vU*yS(hI$Il3DQ<%+)ix=*+T7! zyjT&}yoMIuBa2m^jb^@Er~~2I+r!M(sJUv&g~1_=6wG`!n&~anrJ2K6F)5DjmL^o2 zV4-^X?XilY+GvK-%N0UD|6&Ajbhk8dO84Ya(=yhBytYsep~uhXiBul>=?#@{MKnxru0<{4L00(Y_U;U`H&AJh^%U8qRu`9t=5~juQeb^T-M#9KyTE05rvqGQ{({yvJe+3(6N+lkHjl2 q4D?m?5~;+?n}4}b7vu321N;wh249KqyX#8;0000i$@NU^?(|{K)?Y;c+1JSpHp0`$pS52{Y_D=v&wuCWN1du^>rGh{%vad0 z=W-U!wD0B3Ut%zRE)82+MAkA%`;I18fr6@c^u@Pz`Z^+-u?G zH&`iF;`U@BZ8EmF;J|eLJXv}yC~Uz%}^oiN?Fo9Tc)-XO6*+1WmXTTyohi6=~Y?Z00000 LNkvXXu0mjf(L}J} literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1c6807edf6ffdcccf7b60f5dafedb33295cead GIT binary patch literal 687 zcmV;g0#N;lP)Q9O_Q}%{Ze`BVPhfbFw@~ z1YBVWsjjsDb;K2d=Ob9+CigF~6%K;-awcLcECuc6Tv<#Ys+8HxG-UUlwhr%gT&9Ts z*YehKIY~uq8(d~nFq?}%5*W~fDZz0k0H99k{%YtDX0m_3A^Xy&*xNpJ? z50gyq3VEIGF@k3i9H{5@wI>=arythIms3b_LaCR?U*_Amp{u+_@ILp-pf1fn^_{wD zf#7Jd`A2aoublS;7O4Ko}2~%FwU2-59K%_77p~qdL^)r0C~8C#Cbjuy%UN&*g+V zLDNv;ESFPgo*d1;b`!Rxm9wRlv!#`@o&T?CB%Y?ClD;#ow`UrICsFYsN z`D_SB>XX|8?SinSm9wRlv!#`@C literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.csv.export.imageset/csv.export@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..55ab489a9f39ece5dba3258415d4abc222872c5a GIT binary patch literal 945 zcmV;i15W&jP)k#TV0qh37LAw*IHy{#~_S*M0_CDLm zO4YcO#EvS@KdAxYB+V~&Y=6dPXp+HW3wYau5T_8J-!ViqPmpwHa129JNXhKYh`#X? zR_|Z}7M~#5PvMYeL`{-QQbh5QOW6pn8T{$IASvm9XCrm2Bi!bwym2WYMYh9P&bkwQ zy<~wCSvR89B@3*}+83=aSzuMxZe_GdlF^OJPZ_d_Sw~*$H@;6dRbpFXPjo;xWR{#! zTX{sCgih(XvKYY3|M_u%TDy}=G zdLYS*b|o4N(^MP#SenMgQU1W3;XZoV5rU|1{5PW8RYofEpHr_SYN0w*BUA6D3|SfN zu?{LDQc{^AX-`Z?m_-LqhY;+F+Ai7csw1e0NQSdfX_^#`3~8@}0s}Ti#P5)-*5d1; zGWSGwPlAWANfdYKx}&uSMuu)*+FjgE1?=)b-`OvMiPd+sh$n4J7A$bG5|hgCjq?O< zIDJ0gwkm38WWda~_C&{}T!v)S>zQ{|WaAE9I*Gl1yKbkaa4A`!i&BcFkfoE{mO0AM zgRd}r)}pEcf|aqEorH2V&(S>a^%yP6nZLQ2ljo?Y-yzs>LZ{w0f~aoYcj5~( zEvi=JvN8N+xU7sa!^#97h~oZIR8C*x9?D9mWItV>-FfqLjfgoPer$wiYj4Wu>&gLT zhAZQuxm`!jAeFO5pG~OTJOlgY>5z^%rX2nVHB)j2#hGd?^oNUIbdSTbr6qp>Wjr+d TDaPZF00000NkvXXu0mjfe?zt= literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/Contents.json new file mode 100644 index 000000000..d6ea849c9 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "cash.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "cash@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "cash@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash.png new file mode 100644 index 0000000000000000000000000000000000000000..72540cf43b0324c64e70e5688428097b9bf25507 GIT binary patch literal 495 zcmVCv@pDUpH`h$j$kfF}@+Fe+co%fP7Ax1E*!ciLz72f4=CMqDjJB;GHHBBAA}P($!vf?bHC()yne zW_}019N~R7Orpym3C?}5vRKr&oI}@fHeg*6kQ{(AbhKlQ4h{giU7ecuIas(AI8+^U z%@uWU0O7XBGfKE7uf`T%e4yn3cXNC;BG0p|fnpDJ;Zae}_qcg_3E=~>c$*&r14D#^E l+i=YICe?Gy!?7C=$0c@8i|-nzB8>n5002ovPDHLkV1gWK%}f9Q literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7acbaa3c2a2b88a65f05db247de01fec9e2b9a6b GIT binary patch literal 882 zcmV-&1C9KNP)M8Zxq#sWEhnIyAmIdXg9aMJBY8wb_A;|h z(s*qrPIr-=ev%{GJ63jf=jWSQLKcGS2BP{gKug{|VKbyujz{0>RJ0`perLkby`Iu^)KPJJFY$Sb?|G zV~BS91Qk8U$>Xb~0@pxEj(T^@;LY3KV)cDg1qvT|Vh`CwNMBy9t>2}gBPBaAJwugH zs}0d_&sNXj-YTOoIoD2-nblA<4+3 z#OEyM(Fhi>+yUn4smTi|B(d=>maI0uPccbtaZ)%j>1+O-S1?&{)HYYR^uAb?WQ=b++{z(`h4=sDSCT5*DKkO2}BMJz`gn*eM`RYlg+s)(}G6mZn1N z7jhq|!^PMwvgiWa zZthA3RZ$Q71_jNz;wZ#@cDAPv*cYsk!sHp*`OT2K1QoM$1G3O3tyQ-=eaI(;Ibl%R z$z&dc)kbXUVl9c+dC&(R%+;m+URDQN994&Tj+EZ~GK=y41B@Ugr0#0l=>Px#07*qo IM6N<$f?IWr)Bpeg literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.currency.imageset/cash@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..069368f629903d7e7fd55cfd4669296a9cc58fa5 GIT binary patch literal 1268 zcmVf5wKPf5qwfFI!TkcI)Kv@Cl3g`}MRzSm_XVPaVDJ#HT0qlTw1%wq4AiyKxIgP}O z9NLgbw%b^8?c{e(TSr!$`0HpiGm-`J(EGRvG&t5I3|%g^NouF^}fEQAr)aYiAkgfvkmf()5daERvae65os{Pr3D=gBl`Us zYnTpM(lH+-0`@xM)ije-VnIj4kEo+SN*|(m ze$19|(Z;cz+KBili2a`dH3_VEm<*U-C?qRBSuNOK&g zo|osx$fAKg@qP&xk1QxD7v!Kd>Pv?lZM@*5lLWk*=K^&X zXla@#8v*|Ba-C*CHvP%8X^KOn@r^s?xJ1emNZ=F`ic_B6K27cS{7V}`MASdqXLum| z5X&pfJe&?`N{4jVfHtf^$_UfNGCZdMPi6#o1tJlOBE(_%8houlgb}DHaefm}B>zK9 z(CqYRYdf`%iA^^4=%!odwbXrj-A^l~8(t3CC$-@b|Ff8A>^jex%=*?$6?0m@Q~YRWOsj zW*AzS`1M6T1sXYH9i@1hZXrKxZT13J@);v|!k<9A%xl98musz@L{2MmeO3W@v>^S# z+B_Lwzr3Porn8^;1W))ANIT44h$ZSz(=cG6Sq$KbaFKLH@hFh^-_bt6b`+&XFj8XLyT!S>NadeoTKFtiTiM0m-Q&=wbJNUAkMU1R>U{VH=aJ+Vuh)A-zW!=7cmmebnMJ$muqYU*i#UuDtlj_@vL;=ONCCxR%2-+DDSJ1woH`Fr=bC0k&n4D*%3OM;aw-+nIvML@B?S8B-eOW?*n)l_%Z!WI z?^jJmGFLuS#D2djLcWoPm_EZA2l|7g1oYpk&wt+mv+U(YV-Aav3P{^HEyA!m7g> z%sjuk_(lOv!Tq0000tZ1m5WT36A@S(Mga+A?(CoL>Ao>K?miq zAV*W1BPX?W_BnuzUMr9@F15|=dYJEE{xOD$ z|3kfh6Sw5--G{PwJES-C$f!$3`B3T(?q-5fD@?D6Zl;|O=N^%_Q3TiXF*;3?&)03p z?Q~lLLz9b~UtCU0mK4asVQe}mg2Dr`o%c`xhc*TIJKUx9zt*e5^oD$bAaj`&)0Q5s zve5uVAbTn@^)f`qzJu40M9eMCT_;NlA+@y7(a3}Ej4dR?BGC6iHFY&`+?JV;+4^}e zf_yAU@cO2Ugxd!TR9z5S?56x`9GF5*Q5Pa?Z?|L)SihzEzZ2%TZfx(Bv`U$4ueyA5 zS~&6@a`W2;ZpkQ`l$q3+WvT0EnHiC5xZC@nsa5f*%=8EPKJYfaRb^xR0oGTr_c_Fz QrvLx|07*qoM6N<$f|_XnZ~y=R literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed46301da676cda86465d707f0c2afd0f021695 GIT binary patch literal 1070 zcmV+}1kwA6P)7!q4%DZN!=ge@w zgiI1b`ujd0gj~*Wwc6CV0re9y1HE2|FlSD^Xl z9Lj59ohGxK9E5YDW$%5O*$B2&f5*7e-(xdY9DWt-oG z+4#|?g}pnwu;)5-y+Wle@+yWK8D~>4!||rHERw z&tJwfAmus!4=9y!kB48(3~Xxj#~ErFc8q4h%z*UDND6@t#g_|s*u_b{NUuGemD(|y z1$S^!^7~jHEVRN88nxEYcBfDwyq*vr%%#_1K7yuLi4IA|Lf!%|-7+{x)r$7lh;BX_M+coKD1`7n+I-50PL~$3u+2lJ;jWr3aRpDo3JCcN zVbSIjrX?65cuk=m+(QUpGz_PHQ2y7l^6p%DdrpOM&L}DF?)D^5zm5m6`sr$hD zjZ+Edm0O9?f?87WgOK6oXlLkINEmJiOvIk~QmoOtiy=!~4+}isd^RdFACX2=;+##; zQ=1v)6)@9NL)wt?a8cT_xE?sox3sOL1(xO0`-L@!e>>s}b%GtS*`6s2f3{s;_Vem~ z%4M%g?@c8A%z$nFl}!0FS%dFkLC^(=*G?>Gah}7@BtWWe*U?(HN%5$A6pMUJX8sgg zcs4w*9#>5}kirP=QZ`^&Uq|?}hi(d&2c7M3fsZRXk22v9f{!l|2Sa5PWu}g9RTie! oi)kG6b@ivHgcbC;s%ssPe+=1buHp#5f&c&j07*qoM6N<$g5o>v{r~^~ literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.explore.imageset/Explore-Blue@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c63b1f17121186aab825acd1fb6a694fed4b5a7 GIT binary patch literal 1510 zcmVGU*C(uagr{4jUK$%_pJAk!>$80s z)ad&YB2z=<#RCGO;G61q5+pmIGwsujvKU*K7lj8p)(xW411i7N;SoOqv8CwpQCpN0 zKIw?{e)}38kQKKce{B&|wDpv4L^h!d*v>p29NU!dyO6k2_v zcL|n@Iz6yAIGHb~7Z=E7q*KaBZ?W85A!?qZvh$1r6cfm0rh6=()r^DOuC!MqHbuzG z-~SzuIA5?j;xLK5X1?~EQ_5V{CeTCJhYVT!6 zW{W|5KyA*jUQ}psIrV{07l{4Vxz+li&EB+Oz+{13w&H-iiZN#vo+-P%nv~tf#~?eO zvZ;Js#bMk%+A-Z|CIsm+2eJg~4|z#>Y|tL+To!*JyExr2;)x4d# zOsb5bMoR0QW*FO54MjWBK3C>3PnLzQXIypefUBnji5||U{IQtq}t$zo4^;O z4Gk34ON2u4+PNUwb7O=73lykg$bq@CU4tY%xb=#98BQQW8A}o#+`4`vuS7$gUB1vZ ztqUG6OW~g+|I%|2*u74KTj#vHmm`coe%vcX00If5?;uGS_p(IoZc@LLvImIbad6mA zJ%9z7yQ0lYBeB&!6Q=q=6KTp~N_K2Ae3n~Cl9f_~g9K9g2|nRoW=T{jlzS28U$&q+ ze8FW>@kZ}J?qyGKyX`%G+g(|eb~Da6yrG1HETY%6JWTN z_D<)=?p(~ymqeQYR+Fs1u-89Xjas~5FE_DVHQ0LM_`3I>`UTo_D`M*z7`u(gG!%5P^9Gy7n0p>wFyjKd*&tWrdmXc=FutN#YMlis$1WPaN50pw zzn;XpZ)V}%Bvo`X3&VeC^!mmlP4_mX;xN5v|L1R9)2U$H&~#7k-X=2Jss``Od>lsSwaN$C^ zSo0Avm2L!j0^|f@I5xFfM+*^3SeWi%ec@d1FwjSIP2ccR`0&1Q^SM+^tUSAb1n@7= zARlOzBT~DRT@w1vJ=$CLHTq)$VcTPasU7T M07*qoM6N<$f?=@FYybcN literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/Contents.json new file mode 100644 index 000000000..0d62cd039 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "public.key.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "public.key@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "public.key@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/public.key.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.extend.public.key.imageset/public.key.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5fb89d8ab30198fa29e1745c18c480f3b7c5a6 GIT binary patch literal 478 zcmV<40U`d0P)Z_LC05}L@C1?*Se^j9f$_5j*2?DwgcEoKa|5}7ScYPoJ;jV~Cc+|!mNB#7 zRZWuasp{9$zlmUj(MJnLx-e)`s-Y+ZF>Oq7SC2B$8DDgvO%G*4Ne|&kUoc2I6esWj zZ34wJwBZXC=_dPtM#~2D`t3^_vGuQiwDd@4lsqFh zX1+^uu{rc`8q>LXUcF0Thn@94Jf1_DfSQmY3fxmzCNEC5A+)mfK0}%}w;Q5N zJInGwk`0E-Hq1KO8d8;W7;_1u$CSr(q7Qxa%J0VS1R3UBF^}|Kewk)yaCO{7HzMc{K~#7F?V4S3 z5OUKE_9@z>pJ|oIp5%a01B*2xa0c_-c%cCjd_nyg@vH+#qOB%O~>=?ASeg z#9cmWAY_-Z_E)vV&dw|~Ju}_Y-Lr&6_}6;~9#sH(0n&%i$Rh~|U1;h7`ZHc<+l!k- zdH=lxQZ2sQ!*0>z>uppJ6>8%5eeV1vcCYh7p05`CAN7A9-pzni1iAq?X!1V4!wzzoqkz z2PT7-t&?fHgu0T$Sjh!GRc+#(0=%>K^xH#5-X*= z4z`8f?hKSnwr+}y&D$LAHhtP}Nun8^lWKpfUd!QN>sLR&^^_M~U~~;nKJYtMIvg-o%d4 z^vdL3r|qCiR&^^_&lkF*4JB4$*fsiK^drL?8`aIm79*Pqurs6qP12+SBuy$n()nWBz z&Q=KY?307=w-V}&&6l1d>Y4#V|i2f-fxQ?;_0000>EYQpm#Kx(Ngwgz702x-e+d-X`kB4W0WXo%^U%S`C=9RIe4 zu12>&gXsVv_OV%-D8;Vwj+I8B6sbyAT9olLJG0xe^$ zNaNM}9f&wCnwSM0P0?f*f|~|*s1H(4AS9sv)--tQKyX8Ya`s{meXLc4riPG;2;@No z@*o0v5P>|1KpsRO4KME%c z3?&OHEK>1KIiTD9E`;T6(I>)h9cHWTEefEP3F zgrlCFSrL+$n@W1CB=W~WMm?qPRWHV4vB77GjvYgYw5U6+fGafHPOCeezPlGYabI)L z+D3^K>4VyMNr9jX4hRogTNEMxLrSt2=|kWCks5VZbaY=Vl5W@_aGcnFXp6P|1>0;r z6^x>pVqT0dDlIzB0tc2H8>OK#d%e=VV;Q6Q&a>`QUB1rx7uMnw_>eGUd)3C= z&PMv76}ao6q=SxT{>(Xq`z#Wik(=jis94b*Y&}6RkMn9etV@x1>2R407hT0z9cu6an`lXV%}e4i?y=aRtv%e^h$x%a zl7#3luG!I?24^y7vmP31w{H0?FD%TQtR^52p0a#GAuBeWtGdwkRTjKzr(Q24h*lj< kC_28Nb066NIm5b=uhH>@G|1#`;Q#;t07*qoM6N<$g2zQFBLDyZ literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/Contents.json new file mode 100644 index 000000000..96215738b --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "import.private.key.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "import.private.key@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "import.private.key@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key.png new file mode 100644 index 0000000000000000000000000000000000000000..88225c71937438463b89a475795a86d7be8513f1 GIT binary patch literal 571 zcmV-B0>u4^P)tgXo$zvZbI$t3W{1{`JmAm3aP=;!{M46 zv94uEi=o#%Ew*R6UbaE)^~_quu6}U`3Rhv2pI4K-m&}U**)a*mb5=UhGx0^}Jj9R2 zb|`J8NszHjQteAJ_OJ;$UhUs5`6u}}F;BD_C2WUMcxu-pzA1>ilN2oBr;4m$rXtEq zueWX0HkjM<*@_adi^Mvje}#P_#br37BQxZSirjJ7go2i@`i!R@9ecYK#Yas&6<>xu zJ&bRxHg+qTN?39+WTzsn`dU0UKq{gE{zjrzUlcku*i59jD+-I<5vqQ%^C>qoH9(FB zRwh#H3`-)eo+x?FF_#?4)oTl^ys3?e9qtjua;614C6)_Oj&SATut_S&NHRYPk-jQe zxh6JwK>s%cfhW|Lzy3MVhk;@lecKjaza$U0j6X(h<@~_c<~NWHswSsoVWTL(ZIRLyW(6vRgcA@>P&ffdZN;+OfT*Np z*+^~0g4(a|*|B0f4kS(#4}za$X~v$h{mq{@W`JUi{YM;LJnED z9@Myp%E1#IF`La2M0NOT3pQJZD150M5Rn$tXfmiS%fyRMNlhj&l*{A^In2@sg% zipQtQ%%J?J0TZa6Y93%)^U8vyk>QmsDl!{k9*%>y>)zub98C`MW_>z?D1{6Z((fIDuT zL2%#69rgie)=zn2WE}~jv5i64`nl+~nD?^%QgZ8THkU964$t2Z>Zzad#6%aw^3*Z< zMJymWH6%0TQm5L>)W*_nh;n{HV;I~X8G$L6du*M}V@Q&VajlDEVN{S^8+Z;yNG`^4 zWN3_Xm%w{LyZ_-9LozXL3sMQAr{tOTWZXd#JhQD}7{eI=!?+b=D)Dnhwk3nD=HtWL z-^CK&Go}g=2-CeT-Od?PxfNq7=8F+OghQ)*%Ay zH&c1Zn%y&3IaK7DlxbtKnEw0_filT<&Ep{Ahj@Q)3O=b#Fi&i;0 z=Y5#X;Yn4Duci*~Kb)Ae3MvrOj3O~kg_SY?mC;~9v1?7`^KXldK)8W<6s^CU49%O% zo!@TYmgAk{``tuZxE%KfM&;|D5=gHoqAY1D%dm=;`40@tOJ~K?=!O6Q002ovPDHLk FV1m10&20bx literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.import.private.key.imageset/import.private.key@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..76eb0b37389f111d16839123d36ee29ced6a0f35 GIT binary patch literal 1504 zcmV<61t0o}P)98<@+s>0q9q$rIFm0&p^PoZKL88m1XAJOS<#K%c-cBFp;{s8Q-v z;x@;XIK5!CRsjSY(3S(~p$Q&5f?wv(bQ#ow1!6U5D-Y@8f<#-xR~#&)Yj zfA=-1WSZBD{RJfVAxU^e(1|6W5{p=DB0wf0@F#k71^@c}W`a~}am^*kJS=exm2VEg zG*9Thwp;A4Yl_r7h};_ecY8mn%TDW*epo?qP@PU%29pG(d6l+G5Uq0ICw(|cycC(8 zRzn$Ya$x&-ex>)732xwAc_Is_w$R5Vk?>2@9rBZ~1|Lt|sBkZ+HDh5znPy#o)ip~i z*wc2D8QCO^iA6t1+&MKQ7E|(lF5jpL)~RU}xPVbSyV%_f1QS?LW|ZrKozf^GTZUpj^D$sJeo1GFSb$;aIOBdga6uS^79158b&F{rfCVbGxf;jO@R!CfD z628vP+n*t3;uFm8=@2eV6Y1^x*Nu_*1Pg-TX}3r7es@%i#3NV`Jv;Cz;8-fSek{aQ z!VJ|~H$=iJ#DsalYJObgz^8X-VS-6?{Hb@Q zt2TzGM5U{Q1#`ZZlwu9TQxG^W4vx*HM=&l~iV1R|a9%zJdIP-aF-f#Ztoi5@0Rw^S z-LEMrVe$`CvwTug!caRAulnk01BDmND6*~k^Y8CfAcS<3FiSnD=IP7J8c%1Ch7LnxElKm@I43bR2c*Tm< zc46K8ik0LE=C4>;s6$L7%ZJ6aVx^CcV3>r(R&`jPk9W253A2s`doTq8A7*<; zAZFM)LsqOjd-Y#INUKJrqKMQvh$zdy{xCPu`h)7pRS{9tD3~pDj}27v`+dw-zf(oC zVx{`$l_UM7*s|znqZ=0zPr1PjV|e!ZaurZC_?YgoQeq?5chO^dR7IFg)a$c7?;$s; zM-r&P{q*%EH?~!WLG|UkeIZ8MncQsZ*`d{Dhnb9(wiCcT6CueZT|!SVzh_ZS#c`Sk zzg6v(wta{O3js>F81(d9%5+QMZZ}2M&aLn6Hpx*B^vT~GY@#JslJgn{LBeQ8gV^~~ zyON#112+Hx&!mly_yLT@65RLAFS?jDe`f374!}3M_2AwjIj-m~huWo|eQ|e%&%s~y z3lM&56(~wOn6WoFRcHh|G}^D8{ObZ*6D{pQkd@~T=5`17g~8_Od2|7YeI24P&@RE_ z`@e@}=>)R}dJ`p|C%y94k6#{*q`)Nbx*dClUWa9&3ze@o!?Ni7TED+i9T#m)(BKQ# z9L;MRZV5EBX1yle@7srqa#-~%yavpLJXua>FqYxhGXuY8& zqH~+Tk~o}4co9FMN%O}Tzkl+`uxaaUe)_pb9g3*N-nx^@fV7XH`d>-uv!XkO*!CDZht^0@wKT)Uw42lwJK%Pj(% zlXTdYRyY<1u2($g{=LOq`@R1D2&UGb;S0UvXB03_y<}$<^?UIIptl%2UHx3vIVCg! E0A-7H!vFvP literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a806c426de77cc34908b87aca0a8626d93fd46fd GIT binary patch literal 571 zcmV-B0>u4^P)m9&<&0^TJu9@IlJG7kWIcT zV72u4I++zJr$T~$z~Zj4dT|<`uO@=W`q!7ABd9+pYQPRIcqFU(W-Rc$Uxrq16QmAM z+iFh)c7covVR;6S!=m>-dS%#09^^f9k%&E53++mt=X_X;*p@sAmtZfxgylGarZ|D7 zIDw`(fu>k5a4mKu;R@ccf@*Q_V_fj$V>D{;O7jpYAb7b&u_C2cM0LFvD|Wo;dO-># zNb&0+er!IqJxzRpDi?(5i$aecR2?Z1KgGX^Cxu#+aPwGFsWkpBRJoeumwdQme{mcclywP6shgVmO>9yZL>0Y{B9;{-$bCE znZvmV!F8bcSJT;?dcBCy;9(C%+Z0(j0lE;vX^v+SU958!!*7e?nDgv0IeY*B002ov JPDHLkV1nHX@jd_m literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.masternode.keys.imageset/Layer_1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..85d3376b9cf38211e438b4bf9ddbb476c032ec04 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^HbCsb!3HE(`A=I4q&N#aB8wRq6fHoQ(RG?(0#J~# zILO_JVcj{Imp~3nx}&cn1H;CC?mvmF3=B-mJY5_^Dj46+aV)xJAktQ^nYTOj_DmCJ zzks}eybE_2p0ji=FNwX;?&L2}%$#?jh`FlCKsR^W8|I*Un`d$|PD*ewuz5Y(^TP>) zACDtHRU0`a%HA?pRakLg#rc30hZgy)Ref@LMqjGKaia#aS{L=brEyE<-JRXBZ*RlK z=_lepsJ30uVk;59`1@h7e^u0v-~YKIE+6>Ut!K1kzuG>T@v`E} zjE#knJN~|(<@Zp)sKfJD%|1u_TXS8)dUS*rx%w5`xa=_HdimcpMJRBI^`41b+w)Hw zT%Nxrw9V((h4SSce#bWl-@2j@K27r=%SnYfZaYkOHRdF$b#6L#b-wY5>8V~bSVVnq zdWyO}A~jM$_+XtAl$D*Y4-F>dC($n76#7K>V<%ZQ<_&oA$|awaxyJ zV|JhO_qsOON7veem1bS+H<#LSDPP=VgY!1Unt&g62>a&#IdynV&dNDw_S>B4O17L? zUpYhcc+n;PsF^q1z)Yk4pA594wbW}XH6V_h>%_JH-Phv%64|?i_ya{m*hCU&{l_&Z~F-rpt5FE6?Ouc2hww$uDCQ#Ey0J$0M8SenH!f7zkT z%T=$(}KP0np!+I zA8yjwY&Csd{ezvWJ~y8^B*MGTrgo0inj3#*_M9m*;w)T}wK=}*MtnqxS77bKWetaR zsdO8KidseP3SY>taGy0!YiAFiX7#Jf8^26q$?EMqQeEbAPwGdiR30z|GkCiCxvXg literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Contents.json new file mode 100644 index 000000000..596ac5b1b --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Layer_1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Layer_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Layer_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..19e194cca7800d1bf350ffb884049614d6d9a73c GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#>z*!-Ar*{or(NVcWFXM?f47xGyesS71A?zq zb~y>ozs;v0>v(sGatSl5sC;RoSzOc?NA9M#nyq#Gjoyc1i^SjYKXk15lAzIWFhocE zzLUq1<9w$dZZqM2{+wYa=S3AC#XpWN5%a~8@)kJerRkKO41sO>YBf?XV~A>{#DQLHm+sYWsy?lm`>xyu*zdvC4T7T*c< OB7>)^pUXO@geCwMx_mMK literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.network.monitor.imageset/Layer_1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb96a696840c1594b161e60f09f113cf20a5acc4 GIT binary patch literal 572 zcmV-C0>k}@P)=p@7dIEX_xB+ki$_-l4eajk9-~=rvpd5i4^ad?ZgjmrfQdJLQLx6;o zx@;Uv{-j9x895nyW@7nSponBtg<5X_Vi$tyAjEKizz`(H0NvtbvtMkI=ltOSLiYHq zigGdL<23Jx%$OvTgg^cU<@h%&a7}Q)HNk;EAmElT7jjK- zz%{`E*8~S#6V`>ox=ADdMn4%6?{R_*Or6qUWv2EE~K!o!A{T}-QH@Zm%lfAXx&(# z<7|h@A_V8D;!xMolDWMIBY?AptYuhNN~TU!Q|7r+>S9wcF?#emKUsw#yAF%0~FHq;m%G{kQ|KUrouQZd{`J@{R|J7AD<`lHe z-}v{~reh0w-Z`^&tnxThEfI6*Va&C#4e`q^eVe$YmSr~2MGNUEm6LDoFy(#rlvk*{ z`!BbPahs`O!tabda^ibeSS&cdKmWlbF+Tknp~*ipA0N(~v)#~s!Mi2hEZZ&gY&lnM z+*M?|;NALa%O$TY{5H0f?A>$7?)IE-a~AU+U%gmaQm68j<6O_!y8F$0+P*BA7k`53 z)jvyjqyJjo&lU2yepfUeJ6clMp=xR{CskA>uxjF|s(|!Q3~XDp-nxpF+pjxN@F~Qg zdsWz~limUQgkw%xp4h`GYVdvy&%IR(YK%0#hi`P2&u(4e!ZCG+*`mnv*LnV5|GAst zWcRLku3P>cxwj@9KB0OqF}gEkj{N2>QXF_%8VZCp{i*ls7TIMzz@oJuYymfL(+3Ibfb>^18IXA{iUwfmp zp!rzwgeFE!32cObpy0)Wk7Qk0Un{UO2N_@|<_Cs+kaT68A9&>+->r`G8d^Vk7B!WN zi2f6}eb&5e#fPf)Qv!RyF+r@Y(J%lA{^6rt~Dy(;aQ&O5*UvvPT**@l~` zS8Ew<&C6^5t80sFE}FCVh5Y^MMH=6_BOM|Oud$`hN!d6f_(kT5htF3P*j%~9GwqpB z)O@+;c|xaeE%RTL}_r(6QmqpyajD0_k^{-pszvz@%QQ;@^ zH=EAS*<2}XpL;GR?0Dx&-L!qyGIld|evx`=w%#%FrHaNgA+x!s7HKuUz23s2rki{$ lNS1%;+vY6}dWG3f^(#I|OxfY$#tlsC44$rjF6*2Ung9|JXJG&U literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Contents.json new file mode 100644 index 000000000..dfd25a450 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Layer 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Layer 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Layer 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1.png new file mode 100644 index 0000000000000000000000000000000000000000..923a09d50c1be8488a9c929620483206ee7cde7b GIT binary patch literal 426 zcmV;b0agBqP)Fva6|*Dj2HJ@9O6$V`*z{tn@7T6VDJIG=ZrA)m|LRlTDrK~#7F?U_$* z)G!prKRYvQnJrQ)JSU*sAl!f(l%9a8Myxw*K_%q`^akYy^ayi<2DQMFSu+!x=Lu~| zVkgd@iBqXRDN^LT}NlQwnSGGAP6D30MsOHWGisB1V%BApT%eaLld^5p1g%p zArwNCdsvdqXYk;%iP-uAKm8B`C4#R$jQK{48DHpB9g;}ZpCQ?^~N_B!)k%ikCTqYr6~I5=}lB+R^G+B zYh`kUT_V*hyxYIDJuZ)+O1@y%1ni{jv0Y$v9k%~t9nd~Lk}nH(fs!AhFG`|l9)o($ zljGm$4_X@6Q`59#j$lG-YrjlvKFtC-GaBy{i%-iKWG~P=W}mj7M4)e!*(a}Kykmr^ zu_$nx>v=-2TsaI8919ExgFxjkf}4%VHx&g+Cg2NR^lgfufIkYoR}{$LuZvkRI7NYq zKZh?Adzx=DM9||;V#wT06SaUZl*<@Y9t9eLlNIQ56}i)pT}^Tk9Cg2Yt4p%ZXvhle zGtIY=%M0&Q{&b6}H`4-s$)x}H5tLGITm<~1_d|D^s8panv4VPo;V`39hnc=%y__C2 zg$Gj(wV7e4kT&jh?X7|q4Gt#1W2i91Bye##D=cHbzxINJAw1P zGb$+B1?XqmrUmWB;4L3+4iKo<|9y5v^^av){lk^ND_yf(1f@%800000NkvXXu0mjf D8@M>3 literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.notifications.imageset/Layer 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..694c71127e1307a643d8ed91126f62e848ce5d3b GIT binary patch literal 987 zcmV<110?*3P)Wojqt0NRnAf7;OKs|xnfXqDpFneK4dd$NLLd+{Iw0ik8r<)*zJ`*hw{Rzc;N8`?w=82tl@p{yv&=*U$l69 z1~=%Ug>NWHIpOpw>BAj-99-^|d4qYAPMfmr+fNln@UE5-E{{wOHcyyy*V4`Cg12`} z4>n6!m5sdf18xc{j8isCn0GeduB<`@vT1UlnJ~j^xDLa**?0s20i-j4o&5(WLZAmKKpbjNgj-Cn&gXFjOG zp$(}ZVc~-u`g7I`vqncBXG6g`>xG5)0@M)fv2J%k!h&MLzHWEXeVCrGs3R<#{)UuC zjXq2<;mX3v)Fx3h=dMZk+6P(U+?4Z$V}e)c3{AC_FU&k2bg7Uq2q&yLcTK_+>*x%Y zTOn!^CRkQxXsRvUeVA^O7FC34R#_P(`*5;Ag>b^^+*5};7yEK&gn5BslsJuL(@oR(G+ZG$H++-pc7zYJd&FSj7GSKq|1Mt1r;P)71Q{00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP0o*`OpozG~8#oJ$TQ=xMx~!hz zGfiN|8Nr1wfo__bdR^5$RgW->#(M^8m+42*&NcHQ(_|@GzQd5KxJ9`zU+N4PF;F{PU+6b5rK`Z76aIhDOwnC69P3Agd0C*4O0$&L zB1)wpUFjnt?3qA9W)-=RGjkhp32WKSiqz63ad@Pz4XbJ`yI}{~O=h=pTXmPWAk8vn z5WUbCrLF;C5HJH zYAuq$!-&+6sHzR4aD)uU{*9ZLMr#o*co=Or@6!jvLB`yX>)P}pGqdy!E9tHsJY}0G P00000NkvXXu0mjfQ5o=_ literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d236d7edabff987ed51ecd6fc7156a3d2d9a0de7 GIT binary patch literal 1028 zcmV+f1pE7mP)VObTaaDvhk04IPDwPIJZi&}-0696ZGo`6(p)g|c(h}0mK zWKn2Tu%~Yv5b?~|9&BP_l-~jo``I(!{P%m0!IawZ1l*^~0DA+*XTVXAESg|B8|zbh zNW#|X61ek){+sY!XY_u~8UX(aD_2Kps%i2%W@3ce$w#<+O(|5RjdFexNvO7t>2D#z zstJqjqBOl3VHY8=c3Obr?32|DOc1TSo-ZN^)z%rJ8}bGcnp+6#O)KzGAfhkOHR@~JgLbAJ&zwxrB|h6atCS>0oL zf!#T0OQr{~{;i-?Y~vyEMwVNn#b(iegKwhz!j{dM{sq+SzTP8o<>_}AB&sL-lE^l! z%c9%?>Kt^PdGv}C^TD!87&OFa5~6Oo-o_*|^-1>D_mlHI(>*6uyq==y0MqCi8=?XE$;hW&WG-m_7R`xTy$2cr{{Go7zZk_!5QDKynenLX&g~s z3klfx`M1zHzc>PS?fViZpc>OrknL=IKR*^_AOVR4!f~b5_TDLoGVH@M)02&YPT=jz z6mp{2`0-~M{S|jZq4Q*9E#!V^eRTr6N2Q3P7vpRdX~F0VCYaFrnte@Zp!va(B9*!E zSanS{2Q$D>VAdH5%sP)=;E*9h9u^kpNzOi=r=1yklCw%%Y!i>I=WbzLfp_sFXNT+0 zr`SH3f%#nOr%xse3qrUVMnp{F3*`J8QbPDh5tG;gN3X8vaKM`AJFIEs01hCw zKzm`bO|iO#{)(h`du7BY(IQiMHP)=mJu8wAaV5z-QDJrRmT!)ZkIjlQkN|aW*`lLc zZv@rCEJ`Uyb4{sH)YrvP&y^qKe6U`8nS4Z+-iyWCj z!%IA%c)brb)TauxE_b0sPDgeyXn1jYITD?#%Vw%TedKh}i;0J%Yovx4O=^6eB3=4O zbg;jFt3`1?B}b;4VIf+wLb=ssA)=ijzA!$>XgK9Yo@#oc6Fy;l=|WXw)7 y;zgpRfE8~k*7a(?bJe_S-Znt@FN-GP1pfhDz*^4_DfV#y0000|J-N* literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.rescan.imageset/rescan.blockchain@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d6576fe4806a94958ba4321e41673dcf8af62f16 GIT binary patch literal 1505 zcmV<71s?i|P)g~h1K=G%Y6C%o z_cjz~j(OXM_2wE}1^w4gAf^YJws3P{n6!!D5CRy$T5|{`K`6uSXoc@^pBvNxD`*SW z7dF8q{ZSuccwl)|#2dG*xeo;?CTQ9t_xP_C6l2Vdz6mbb9lZfv&&(#`p524T3j?qu z09%q@9*>~7nA1QD0)9rBGAywZwEudqz%aTD(E&JzUO-u5+T@inf}WL zoX)jb@HV%7l|^r5T=6`Qcakk=YJiRmcZgWXLKAqcNIjM(Mqy*>W<6*29GY5lHORdY zPnM=$OhH^F47+E(shR*Y=TmbJm0t~DPjlrE9yXU?7I`*0GWga#lb@Q^L)C7B408qHDx)2sjKk+D`Ei9RS;`xxVUnx~gP)YiUCxz%B zHA>Z`pIlEaqzgIuSZt==de-SDH+^_M+??Hyjb{7s&1w3L$8pqb**rlR&VGf&sMPF zWHtHXKaJWDvb&L1BWq|aW}PbBVqzf2X%L9x7P8c?pls(mg)03lU&sln00000NkvXX Hu0mjfbosZt literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Contents.json new file mode 100644 index 000000000..df240cf11 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Vector.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector.png new file mode 100644 index 0000000000000000000000000000000000000000..af7266bf9c7375be617a9870e145fe0179cbc128 GIT binary patch literal 459 zcmV;+0W|)JP)ea5b3_CwbdVCDgHQqK03rm}*!P5#5K{q41)&6YfI&uFeUIYh%@WB9*w~SM z$S3)C-#*Q*XU2jm=5Ic5d<$!buo$>^f*3FnM3xwzCS}v4+$YQ?5I#uphRU+&B)HH7uI*LT!mCE1-*YS^A4ZKfYX z`cL>~fc;2#gv^4dFr0r*m=XcnU?jl!EEInJ5g!-m0_Le?b@&~~1Ohi`b)NHt3rKQ&Ol-D;Te@N0CVCT5D+cHnMchd0>R5M9As zHF!AJ|3-UL^3}a|MPIP;L-TkZ=NWgBmpg@kAaGQ9R7p zB(c}7*Z-2ZYJQU2#@*e1o!On88HF-9w;e#Afr!7O1>z@Q4uvUyoG zjMRVybTW-sm_X4G{o@I8l24#>^8{!P;Ndlj@d0m+`gtZ~7bxPE%`wk7MH$5PYH^N! zd!A*uMpo_;C+-7!_}gf+b(H@s@xp%xHHwWVUW0fo-y3$aSH~H2QtC8UWkIrrXpxwoCTBG9JT;c>7D|2LSn1-=- z0_hfXW~c1hZ;^MJ_gep%iy~aHH?-jmixtx?NYpi6d?_qW5Fx>#3M=TOO|iIGofw}- zC=2n;5?NB6r46@O(Ad-(g|Dp58jXqZH(IH~kxn#LmAF$kYs9ulD{Xl8K)ojp0?U#d z2PN`*&93}}-O%G}?>gxhae?oDyaIWbFb~M~arqgVLZbqcl7ih6Ng_4^>mhE%T4W&b z-K@)BKcQau`*J1l29|)i2jO6Xsq+1nZ9(*%T})q5ThvH% zigXPrQ0j(kJ+A7spLvkiL){?mGGKLzFP@Ls-ycyIJX*IvqOFgs+e>b8R~BRoA%?m* zUUxX+%_FIk6$U#mrWBt8kGGn5GxGW_{DPiqW<{-7uev%>ZV=`;lE`6A$i)8vGUDZ6 TRyV;~00000NkvXXu0mjfMEP4- literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.security.imageset/Vector@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e07b49473b8bcd5aadf1cba9550a9b0ab9f47df9 GIT binary patch literal 1182 zcmV;P1Y!G$P)sgvZ^?QeX)q^Y~dKe*;iO#dck}nT5X|fl5oLlHP{ACJIS4s5==a8*e zWrnSCeORdgSz<-&O=+>rr}^Eu4zA109CWmU5)>C4H)Z|ScQ6IPaO`4B1V;?#Sa zz|QipE;ObN1T;&q1!jU>=fMf~a$Us(yOJ;2YfM5D_|1WpcvE@A^W0Zvp0yozt(K5J zeVX-UE@ILJb0ku$9`3);aYFj6$3X-GX2HQAfWiuz%@&FF#|tL~2WLCfgu8HqT@t-~ zz2K&ojxFnqSf)!3HMm}IW#K$w*XH7rrQ_vgA~*@VR<%`fAE2=A#S30yj+(UMz+4;d zLh}eOcEX8;HwUM1TQCz_Sz_ZC2f^BKpLicjQrx#t5UkNqgp&m4j}|l^@mi)vB3*%clukCYrC7??1FnR61#{3|T)e^RC=Dq%?E#Mt>+~b_Hfe$7 z8#z~e9BCglQm&j=(O52{=0-9 zQ5fZJT}?bV2SPj8v{}=&oUO^UrH#SvtN5Lw*UYD07*qoM6N<$g4~BC-v9sr literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Contents.json new file mode 100644 index 000000000..35aa54dae --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Iconly_x2F_Bold_x2F_Setting.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Iconly_x2F_Bold_x2F_Setting@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Iconly_x2F_Bold_x2F_Setting@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting.png new file mode 100644 index 0000000000000000000000000000000000000000..355bbe4fb1be034a3891ff3ede65d759a392480a GIT binary patch literal 567 zcmV-70?7S|P)LUt^8s25@G;N6!Pg_PvQJObamlav+!U)H$inaD6<aA1Jh0mNy>WY%27jxEkJWSgvjMkn<94$0!GY0wx^m{XEEfeP0WUyR`%^)?Rf ze4cnjkyzDdouV5Q4NHUp3-mu45Y{vP1GI}hC=ujnRt_bA!kCOQgsPJ5m^rE(Ne}!t zB2={t6`oL9wBc5Qc&zV_$mxY%oDO5hu0%EH*tJkZxA4ktCd3)+kUJ)wG=^Bz*s^{R z(!zg99cG6@r3YnM?mD2YgLY6xVfc=Bw&g&k=TixNo|QOH9hduY+ebz2Q;|hRk@>WC z?NVL*;|vhwuo(gc5Y5PdbciB4PR**)}3^dBGxoREGQx=#QA002ovPDHLk FV1l^8@}mF% literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..50e98d27a98db2d21b24e12eb9560b4e3ba286af GIT binary patch literal 1035 zcmV+m1oZofP)Yg;?!ITb?;8X{qVuN&ne5SBjjrOJFYs^C2phqWA@jZbEA)p33n4LKESTn~9VaP*#gf(2|Od=3@ zC)k`+Cj7~>zAKbr3xyIocU~_LVCQ8WZo627e6t4+WP6*=eHBvF>C-CMGbr4o{IlLQ z5-#Cuct^DM@#NZC{wI=O%axx=zVk?g)PANIL5nESg;2$zs(9<|*xFaLCaq2D=BZ&M z_R(5xkEV>{@S#C}Pq4_4Y7<}AuK0FZ=e>0BMG%RTCqo~RXLSL2fW-$z^MbZBqc-;8 zecqt-qQ7o-UM5*t;3A{QyFXMLv4Q17d7kNkAB1>UFn98no@xjM`WA|&s-U~x@LZ95pO-onKanZ&U9giQ>&6rk5$L8 zfjQaDaXD#k!z!fEh7F{$FQz3KwGEgPa~ngptBm3+*q~78!WOo3qW(qdU)dx7x*P5b zB8PmzuB;mjO0b6IoI#pXHhC%Ra{5SDTy~IA-D-R+QtA4XtK>ZSZHEl70Xx_=k&LUn zgmnros9hMf(yp@eP^Kt*?LeGCWnpqYb2lKNu}-xEr5F6t-ygIJjpy?YJCQ<{PGB?l z1XvCe7Y?nGl$?IWkpFRiM1}P>!r_#zUx-xKJc^R;20&F2tZq>4VOHtidYeK+Uvk`} z6oNvCjpfbf@occ_7Rv_e@fh+6F0gE%4w@m)Ik>XS^5zSj#g2479_+)X7jC+Ek>m4Ck-}HesVDzGn9`6pu#{WLv1)%=+Zj#C0ykU* zwx0=dH$Y07_+ez&Ix5SKcSnHN7IAYTDjWHAl3#ruqi}}Z_otIneR24B?*0OlXzi|U z!4dvJinF|V%tZ+Dx@dQ3W$>JZ_#W2H#d^EtK;&K03;&cP40%yFg6&S4IbH}u-stY^ z#+RTO;+G%cQeyVO-11}hCo)b!H%B>M&=+FgCjIrR#6OMjOju0b$wdGF002ovPDHLk FV1k=B?ezcv literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.settings.imageset/Iconly_x2F_Bold_x2F_Setting@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2f87971a8dee8bb9ed3ad028d1049177fa6ffc12 GIT binary patch literal 1478 zcmV;%1v&bOP)g%|XyYT2qw+g#H&@A2Du z3jq-bP4i0)GW|f$YPcH-Qf%Y*^=kwmtT4^a3rMgiRm?}1#A$>OC!8?zTgq(`L^m(7 zztM$9A_PP3pu8y1`;e8_@Ju*iq}qiu#4C6vj4;iQJg3y)j;bD-9tmVIKg>JXE{s6J zq#lGxy^0-17^$5&*ZZu)BcUeWw{VZw3E00d&Ce`K4eqH?SkZ(hiXA*&QRLb#J$p`D z^N{F5339H~Wp4bUSE9AIWb%G}jz}D0|K}s*o=04VjDDf>uj%(@IRAWMPQFl(m!87z z!YA}NBfD#3zwf3S4|fa3)N2SsLXRUlkLx?0hxy(Vf$YNY5RmE+%fJ+?n=TBe1b}la z6H+zs=4pHI(l+_}SVitPkvQ*r=;r0b2L4u&`%We}%?>3qVO?SVe91$nizud)#*-v# zF;cR%EUPFCxhAQeMn)E6tmPwC=!tk_F~(X}FcDsl4JEaO6@A2}8A`_O{|_sM1kCw9 zEJl;>afdBtaVwGlXZ;76|0)&P7P&fhE5oNkUP47X2#Me#ntG33rG-D9B$?0tq#9IA z(YzopTm^SHFGd#g*QYwU#UBs?p$lh6c(Z;w)ApvE8&04UFGq6>2T)QS!8dFrg1pOF zMPWECAmWDpu5VZas&r09*Y7@^LU^j%7*QJRa$_FY2~||h^kq3po#EiAj+Z7^CG)|a zmtRNG@R?T>hQFJtJ-CLimD3J=QOsL5-2XZ)8WL_U>ZHTxRfh{KR&4iUc*7pH;R;Es zk1JA#bD?Eu=R0`ZZoy4E<>`)R$4X=N<)Yi6WgFVXp083Zl!d#ZoFm#OOO6#63sb2i zD2wtik&EA9N|;3Gxu!VKvwWU2PAaf0cdukm`% zoq3l7ZdLo{!bj3xQ0-mBd*eRMq{W>4`$`|!wJ7>%TNTB;#;`T($Vj7RO$jo=V4C_2-&KXaJD=e1oSPrPVfIM%8eqBl5{BVU8LsoSq z3w>d360FEzgyCCU*vVO8p#0HjD7nehJq{GkvLV4q=c<2?;_|{Pecwo_JUbSa*ej9m zIxT&}_%gsN^1=G<_*-_*mp9}hci~QH8%{udi#POxpYwr2bS4boVPHFtB6J}?D~j1= z5hf3END^)i13Oa$zeHR)wHE1pWdU!)#XJ#j=bnc-|K~$jWN`ip7q*OIu`p$ES%ANd z7Uibl4`Cpl>Wh~h9ML1#D z^pz~%waNJskIVFcu#+$6I+Wa=D~=lW;yw$KFY+G}Ov99e>;1obt6R4-ccffXO5h(< gXefG~a97O0cOEGZ;q7ELrT_o{07*qoM6N<$g0jIzD43r38_CjFB=Erw zGZdQWgsKAfUp{a)$6qcqLjsu?!tGgDT;!E)tyYY(2{Z-eQ0@Wt0uP^oYz>vkoB<}p zU<=wyIh0Er#I*|%XfaDafXd{BjUrtY4%Uu5!yIZacY3s@D#)@sP(4>0%9TXe+X+4c zxNbA~q|ig*HyNvvcO(}LiPTqt^}&0^yGm?OCf|c^PdEkwP0C+_9Yi{>kQ1`j6~`Jb z3~3=)3y7t5ov}X0UV7RfhZnF#W_TGK5C)GMp$*buHi3bM!#{%?FBDmZEv6gK5J{+l z81&LU*dk*i?K<8QJY?~%4>HqqY4%DxuLA9y1OIu}DAO$-g0+CbyYO3~Cgo|f+Ihd; zTS7Uu<8~zXOzC`hAFB`Ki|D;;hLd<%HaoIhy|>gMt{5bF5mRQjpLMcW=O}7Ot`|wS z9^9NSR6`EYoV+ShK=q=LdUJAmRX5LtdI2hpJ6-Ab_T-`LdES+rC0yasucHNKer81f(Y*p>)BDu<8QRzzGN^C_O>L2?!^^E$Qnv>k?a? zkz(>;lgv1_U;BG6gcnQp{3VSv8d*UWbbnU>f*ORd4GMPfmkJpC%%Z@@zdrsx!0$WI zr9QM?`miPn($c*z1H9M=V`^wr4bq@cjDd@F#K;9uYlp!;{@1`y8M32?LQbSY_yVF9 z4^0!YHGCee+R%D+!Y$4dK&>7GUnk?c2z=~~x18S4z`+EU1sYGd24lb!U~Zsrc+cef zz}c{erT3r+3|ztCW`k3d*8>FIFf?rEN{zsHBHjaTn!E*?);?~wV%JX}+Bj1jLmoV5 zeD~KSHeM~svEw}u2H(L=lTGLhFJsp~ZMAdhiRH%A?-gsCozAD|g~G?S;FLxoB32t8 zfg-%-Y?0{@azp1HlA+=BA@=Lya8fYB2VS8?eR$j$z|o|;KjXcG1D{N*`VAazH3h~yl(~QdSI-Gp-ukdo zM3$^F-hsXFScO(~t$yhEv7`qFmz7-5`~ zM_eS`Q&4%FQng_C%vQdDtO-N;v>a~KHF~tP^?mkiBjND%HIQ?PY%x3N18Q4T3CuUh z4I}GWTu;b}E0Q`8z%}GW2z?NtwskCfunKQHfV}WLA7qsI;dBHp9*`IE%tQ(S{}?1d z)}l6vl@kl0G6!uVNC{(%Ds#h=E|5Mtv64BZPML+{U@+X4ph$oUe~2o9lEh6i4DJE3)hY~17o=Tc>xrQn2p<~5W5)TBUX!`-QdAyb@uXnG)i4QhWEB$ zvBne0*$(RyxKpE;O<{6(0ofs6e#XxtN}dT0`3f;Uf-Qo#p^+w?)`y)u;|U1unQ*Zv zUf9kPKaRYGzlM@)90OZ)N$_m&fAqpq3e1hN;Ku!>R0_2#Kw=7d2 zP3OJt8T2`lru&ViiGNipgiwt}KVE;melrT|qJguIcATXmgFucUM>=3RTnnoFE2p=1aYLK z8wZ(`HmXEXbQzqJtg9+y$qKSf=&M7d<_HpzQjR`7u1M6Wq$n9d^@^EAs}tb<9G&eu z1QIT&`>9Qx?pu16ATIj!IK_`!Jp|w{$VSb^F;W~MZh9fj&R@{k?G56Knj-qp54%21 zPQwRoR!>I`lVH$n!2>@*81Td`xC2}piq5s!?85^;K^&?>?BS_M8lbcOK8X4GwuJ^R z5yQ}4#1Jp=#(yLWALe706ex#TEGS<`EnD-%C~27-JAb2PkZ$%CeYeGeMnk#lbKY!S z7rr+pNz3H?_W3!?F#r3)DL`>2-M#H%G?Z`JFV7N+V0kfg+~wpj)JkZ=TfqDXa?6Ly zIe&>elFG{&k(xccp3ODQk07_Unn%2m6e5Sw^quYUY3k*fH+KKwa7$2(j3l1C8FNn0 zUeJ4Yao^acg{86&{qT)_&7?or_qfbrF`;rC)YO_sv!^+Z8?`R6+A_kgxp6jdXin#a z^FsJonij?i&nI4&k&|;r|D5gd4tpwsQvUD+tFd|{aRjg!Zs#wz_DajikM(NnfTkSV zltFw)rZ4RAll|MA0aM&TbFjw?bbYN$bX64&(Ca86!c{ zZM*D2W04dl$HAKok53ubIo}|hdYjv?f7AAo{sR(lUq?$27eVQ;4H-C+WKPfrt&brE zuR)PFv9RVfg{rf&mYbYr&CCgs+}zW;gSt?S7m$K?foW!~v;49Yy{fl@7h*q~=0`H{ zu1%t|LIN35^A2^Brst4?@X7(s-GKBD1YsrgXixwAS4fl?DO1kXiI z(Ek)UL38rCwIO&eT5QgMuOr%7-AEuqUoL{=G6LZY(*zRG#)1}`GjP3gENIn+3?xXU zA0dHJ&kze@=VCr^1oa_9f?q^41AcUE+Bbm&>EpaUu59My8+{D0scJT=8 z3Np%$sy!0?D0ixWs^px=uXw3PaeIzV$^CmpXsIT(9&c`ZO0NnG`&8oT5F#MvUw zRih}hvddjcNl}&lN$tBoAvzcX08^VV2h?E$g@o=1}t!X1qJ;Do`hhQ%+8Zq+Zdb zo5dN$#^7Wk9UHftobr;~uwGb^vcknIg9GX)uNLmR$028&<$V(8jZ(88b}`E;#3v_5 zq#Q6zP`q+-f+hJ2ieFAnkR(4r#a9Exink=ceX+FS82Y!OM=NH?NT?2L~ zr*rne^RjSGur>DFMJ17AFQ?0EhSxX>$8vQ>LU7dZk}0rmGF%YD6UqTiD0RtP zQWbE@Vn|Wb9Q+=~?QzCoQA0|OX?y3X_3my6iy0lZ3fu->n~r{%-M6ed9`9#HDdP&N z+^P{Y&g4zr+6YD2y!o}2a!*?`KRv~pycNO8IKEAdRxKJ`68gzC+T0YAnI`E(+_~}` n!_Pn1I)dilI;wieFP;AY1Qz2UGpt?_00000NkvXXu0mjfoLmQo literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Contents.json new file mode 100644 index 000000000..c599cc6a9 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Group.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.tools.imageset/Group.png new file mode 100644 index 0000000000000000000000000000000000000000..66f02d2befdf8b955b1c7a292084fa740700f66c GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIW|uh$B+uft5Xd5nj8dN|L48g@`0gBXm58F zlVL`ZdYPEi7nWDCUsSUE7cTAD%`M@`u~|iAPYN^7{P~G#l_}n^yVCWTLZOLvvrC7emtb&&(!}|hVts0^ z+|y>vdiLknr%#LCH!tXP@#T2)?nuxs+lk_SMt6B`ul#QHnBi%G$q9+e3qxE>+Ej(| z?gz`ug#`ZFd}-r^Ycsyjbz;A&v02Lhis$XfgBQ9p!WQgkV+&2c%bk4c^6m3n%l4gG zlkhUz`qEjGZF5C+YFi@@UUp|sslM&pC8%+^&{q52sSLsQ4_Vs&F{j29p0zlau>lxD N44$rjF6*2UngHc6lFcf!-fF{Fa=?F@S_W=D}@`z4zd%raX=KC*3V zO4!qA9^fzFEcG^NX|KvXhyDkgJ`NkcvgIk>$Wu1EDSMwMa zT0Ui|jefqx^j)t$P5-oqWzDHMvsfio-1zq^@^EI6W1{DWGry+9eW5@d)alk|RVAiETEh zi^?A6ITN*jTX5=`d5ia3R8HG?p1+Kr-^}|$Xkz$%fQq(27{H>BWgv{*d&e;L5XJ2g zghRi*8vf|RmhasK4A3nTm@G$eYk~mmemU(^Sw7}tn`OuQ_g5!q$+-~2=>{sCxTAH1 zVTKYpUiQZ5kljzG144OZiR!rB1vK zV|g61uh5dY5LFpkgazyMt=A#$!Z#XzJ3vbe-hAVGtB+W4{(0?^u`moMdxY2+_e2tg z6T)sFJ_88DxT%^#h(3g2pwy@k9u>lK145}QMlP1HTn^j){L^0bcUOUqT?JY!Do~L# zqFy_2*^F?BoX_oqKH{qWXx~ScyWEbb#2{>H~yfu;ZF9gb`xFx8jRC#}LLmSyHx*2$h@@Vdlol z(J6NH_b}~my}1zFf#T*%NHJ;=(0RAZ5Q>ZCIG4??D&0m)np%D*OZPi3ABAtf0!1%K zlDydRTUlE>*xRJmA82zK%DoQCw(1@3<(t40_udgI*96{?-vm|^MNyRhr}^>Og@=mm zLZC5Bd5GegC3S>&{wS!XTsI8Gc&H-ABiBO}Ii9%?wTG(witzTKnfoL*|2Z=f#3R!~ zl^`CPuPe+EVp7@s()CB8c;tDg62&9WLzO5Vc^;}n@n~Peqe6I82#*TkQ6W4kghz$& zs1P0%!lOcXR0xj>;ZY$x@;p?D;t}YfN)wMf4^^Ug=DXPMrY8Y<2hH%*f7ZKu<^Lpz zN2Z4=K|C@&R0-lae|&PshnpQCvUcsE;zmjf4^`xNnw!A<-EE?$PNsWHZ>DzXp^6aC YFS%P+6D4)3r~m)}07*qoM6N<$g8TNBvj6}9 literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters.png b/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters.png deleted file mode 100644 index d4b1b789252cdb9ad2d29b3a25a4fe2d81fd1539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!3HF~3v%Lt6lZ})WHC@o7=#%aX3dcR3NjW4 zxjQkeJ16rJ$YDu$^mSxl*x1kgCy^D%|KjQ57*fGFHSl2Wp#YxRe-H1)X$NY~UGSD= zsq_}*5+<+J^O(Oo9bq}Z(&OOP!1<%eL*^vINpt<59x6c=2`4Az-mE)+zA0PmeRaVy z{tPzZ9)pSvsgVNmP73_9?^d0EraGrD;f!(1P6M~&T*p>!Q{oW%Q*wWG>$)5BR!6e4 ztv|7IVV;|lMv~s|w&Hx5Z5m&=wPwcbeOUk9(W;j3)-PW3+pGtRdm}Vo>U_98cRT-) zm)+s6X=j9gwaHy%H^`d(Hg2i1a{U(0d0Oixm$*)e<92xVf5K<}Mwg{rA-TSP+XKEw tJ}u2&5yB^SR6wbGN>SJT<4af>)#Lr+FWxLN{{i$rgQu&X%Q~loCIG*whZ6t* diff --git a/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters@2x.png b/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters@2x.png deleted file mode 100644 index d54b9ef576e728dd5dd39d78a708c58b0f0929a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmV-20?qx2P)By`cFaNq)ul)C4QkK31WNL3Nti6LfLIWm>{4RXqd`KE@bUAF|8!2^2zEj3!IQ zyJ!8yYKs1ehkuEDiIfaMxx+Qj2_#iDR-WJJ6Wo9F*jq+O_eiea=n+iZ4v$YiZ&l)K zei~dgii{I#oa&rpPovQ#LhGP8#8)@0j*Z_e!qQZJBjrn>=%O^u_oA#bPTVUVP3VEW zC@;+<^*w4QMkJBnOicD->oqPSOOEaVmJUTFQg)riEnkI#774=mQc+1Ky(EjBnT_uK zFtCD5++Kv1ZZG`OXe^7rVyOf-oODoH+lTngH(|Q4m4&-8e*gdg07*qoM6N<$f-n>A A%K!iX diff --git a/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters@3x.png b/DashWallet/Resources/AppAssets.xcassets/icon_filter_horizontal.imageset/filters@3x.png deleted file mode 100644 index bc3036f4fecf9594729db0ae6d5b84b061e90d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)j%;b<45}_DtW5 z3AQO7J7lt`luxn}kH<3~^S<}qXTnoq^rH^E;Oox{=f|t6uMu3rkT^PpQavaHnOzoq zKgPSpq-+Uyghsyu$oQK73yLSv4BlPec48i!kl~XlC8MD_P_?OTh8sfiXp|$PLj?38 zRh$2w^L?0d!U=}UUeQvtjk{C<4o8Qt`ewxtv~K0Xl7#bSI|qi~d}oany!C)EyuD)D zJ-C9BUA%ui`)7Rk>yp`ivc5~0drrw{h}vTBxKaz0fy3!(R&a?Z3ighZ7oZHRJs%`k zeDNjA`wb3-LKFA;5GE}1-19_3r(n z`7G2KSWqP05Ym~dYB#y+Tm)SbE*h<($8PG7PH__LT)inGL!xV&;)akR^(r)^6uxgX zk|na@Iyd0@)Hd@haNAt7_`Gbgj_Qb5M<4AZp7CGfVHz5-E}%9IGFm*u3A!Vcx`8vK z-TEFAcw$hNIqnEma)DfXVs!DLQQkZ&z+Q(cxj=p{Fg4_#lu+X8g6+Movf2UOiQ~ix z(kw?x#&)k$5wz{ZWIA?=YzN=x0uAZgsqx9_YI7V4-R)VAK2)qtcasNflgGH&lTlKR z;ZY|u?*xy5iUV(R5+xI5xOd$5L%2j`$4FE_y1*SC44NexilZ~$^kx1TAAjm^_=`Za za`nc1i`Dd(M38xFf1^S}TA002ov JPDHLkV1jTHVjKVf diff --git a/DashWallet/Sources/UI/CrowdNode/Tx Details/GroupedTransactionsScreen.swift b/DashWallet/Sources/UI/CrowdNode/Tx Details/GroupedTransactionsScreen.swift index d800b8070..3932a8425 100644 --- a/DashWallet/Sources/UI/CrowdNode/Tx Details/GroupedTransactionsScreen.swift +++ b/DashWallet/Sources/UI/CrowdNode/Tx Details/GroupedTransactionsScreen.swift @@ -105,6 +105,7 @@ struct GroupedTransactionsScreen: View { self.currentTag = txItem.txHashHexString onShowBackButton(true) } + .frame(minHeight: 66) } } } diff --git a/DashWallet/Sources/UI/DashPay/Voting/UsernameVoting.storyboard b/DashWallet/Sources/UI/DashPay/Voting/UsernameVoting.storyboard index 8bd5ca9c6..eb63badad 100644 --- a/DashWallet/Sources/UI/DashPay/Voting/UsernameVoting.storyboard +++ b/DashWallet/Sources/UI/DashPay/Voting/UsernameVoting.storyboard @@ -37,7 +37,7 @@ - + @@ -620,7 +620,7 @@ - + @@ -646,7 +646,7 @@ - + diff --git a/DashWallet/Sources/UI/Home/Views/HomeView.swift b/DashWallet/Sources/UI/Home/Views/HomeView.swift index 33abe1fb2..e01ca6833 100644 --- a/DashWallet/Sources/UI/Home/Views/HomeView.swift +++ b/DashWallet/Sources/UI/Home/Views/HomeView.swift @@ -440,6 +440,7 @@ struct HomeViewContent: View { self.selectedTxDataItem = txDataItem } } + .frame(minHeight: 66) } } diff --git a/DashWallet/Sources/UI/Main/MainTabbarController.swift b/DashWallet/Sources/UI/Main/MainTabbarController.swift index 8020bdc48..85a5ad5d9 100644 --- a/DashWallet/Sources/UI/Main/MainTabbarController.swift +++ b/DashWallet/Sources/UI/Main/MainTabbarController.swift @@ -83,7 +83,7 @@ class MainTabbarController: UITabBarController { private var ratesVolatileWarningShown = false weak var homeController: HomeViewController? - weak var menuNavigationController: DWMainMenuViewController? + weak var menuNavigationController: MainMenuViewController? #if DASHPAY weak var contactsNavigationController: DWRootContactsViewController? @@ -239,11 +239,11 @@ extension MainTabbarController { item = UITabBarItem(title: nil, image: MainTabbarTabs.more.icon, selectedImage: MainTabbarTabs.more.selectedIcon) item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0) - let menuVC: DWMainMenuViewController + let menuVC: MainMenuViewController #if DASHPAY - menuVC = DWMainMenuViewController(dashPayModel: homeModel.dashPayModel, receiveModel: homeModel.receiveModel, dashPayReady: homeModel, userProfileModel: homeModel.dashPayModel.userProfile) + menuVC = MainMenuViewController(dashPayModel: homeModel.dashPayModel, receiveModel: homeModel.receiveModel, dashPayReady: homeModel, userProfileModel: homeModel.dashPayModel.userProfile) #else - menuVC = DWMainMenuViewController() + menuVC = MainMenuViewController() #endif menuVC.delegate = self @@ -334,18 +334,18 @@ extension MainTabbarController { #endif } -// MARK: DWMainMenuViewControllerDelegate +// MARK: MainMenuViewControllerDelegate -extension MainTabbarController: DWMainMenuViewControllerDelegate { - func mainMenuViewControllerImportPrivateKey(_ controller: DWMainMenuViewController) { +extension MainTabbarController: MainMenuViewControllerDelegate { + func mainMenuViewControllerImportPrivateKey(_ controller: UIViewController) { performScanQRCodeAction() } - - func mainMenuViewControllerOpenHomeScreen(_ controller: DWMainMenuViewController) { + + func mainMenuViewControllerOpenHomeScreen(_ controller: UIViewController) { selectedIndex = MainTabbarTabs.home.rawValue } - func showGiftCard(_ txId: Data!) { + func showGiftCard(_ txId: Data) { selectedIndex = MainTabbarTabs.home.rawValue homeController?.showGiftCardDetails(txId: txId) } diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h deleted file mode 100644 index 33ad6476d..000000000 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWWipeDelegate.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DWMainMenuViewController; -@protocol DWMainMenuViewControllerDelegate; -@protocol DWReceiveModelProtocol; -@class DWCurrentUserProfileModel; -@protocol DWDashPayReadyProtocol; -@protocol DWDashPayProtocol; - -@interface DWMainMenuViewController : UIViewController - -@property (nullable, nonatomic, weak) id delegate; - -#if DASHPAY -- (instancetype)initWithDashPayModel:(id)dashPayModel - receiveModel:(id)receiveModel - dashPayReady:(id)dashPayReady - userProfileModel:(DWCurrentUserProfileModel *)userProfileModel; -#endif - -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; -- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m deleted file mode 100644 index a3f707f4a..000000000 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.m +++ /dev/null @@ -1,287 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWMainMenuViewController.h" - -#import -#import - -#import "DWAboutModel.h" -#import "DWGlobalOptions.h" -#import "DWMainMenuModel.h" -#import "DWSecurityMenuViewController.h" -#import "SFSafariViewController+DashWallet.h" -#import "dashwallet-Swift.h" - -#ifdef DASHPAY -#import "DWInvitationHistoryViewController.h" -#import "DWUserProfileModalQRViewController.h" -#endif - -NS_ASSUME_NONNULL_BEGIN - -@interface DWMainMenuViewController () - -@property (nonatomic, strong) DWMainMenuContentView *view; -@property (nonatomic, strong) id receiveModel; -#if DASHPAY -@property (nonatomic, strong) id dashPayReady; -@property (nonatomic, strong) id dashPayModel; -@property (nonatomic, strong) DWCurrentUserProfileModel *userProfileModel; -#endif - -@end - -@implementation DWMainMenuViewController - -@dynamic view; - -- (instancetype)init { - self = [super initWithNibName:nil bundle:nil]; - if (self) { - self.title = NSLocalizedString(@"More", nil); - } - return self; -} - -#if DASHPAY -- (instancetype)initWithDashPayModel:(id)dashPayModel - receiveModel:(id)receiveModel - dashPayReady:(id)dashPayReady - userProfileModel:(DWCurrentUserProfileModel *)userProfileModel { - self = [super initWithNibName:nil bundle:nil]; - if (self) { - _receiveModel = receiveModel; - _dashPayReady = dashPayReady; - _dashPayModel = dashPayModel; - _userProfileModel = userProfileModel; - - self.title = NSLocalizedString(@"More", nil); - } - return self; -} -#endif - -- (void)loadView { - const CGRect frame = [UIScreen mainScreen].bounds; - self.view = [[DWMainMenuContentView alloc] initWithFrame:frame]; - self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.view.delegate = self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - -#if DASHPAY - self.view.userModel = self.userProfileModel; -#endif -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; - -#ifdef DASHPAY - BOOL invitationsEnabled = ([DWGlobalOptions sharedInstance].dpInvitationFlowEnabled && (self.userProfileModel.blockchainIdentity != nil)); - - NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; - BOOL isVotingEnabled = [VotingPrefsWrapper getIsEnabled]; - self.view.model = [[DWMainMenuModel alloc] initWithInvitesEnabled:invitationsEnabled votingEnabled:isVotingEnabled]; - [self.view updateUserHeader]; -#else - self.view.model = [[DWMainMenuModel alloc] initWithInvitesEnabled:NO votingEnabled:NO]; -#endif -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -#pragma mark - DWMainMenuContentViewDelegate - -- (void)mainMenuContentView:(DWMainMenuContentView *)view didSelectMenuItem:(id)item { - switch (item.type) { - case DWMainMenuItemType_BuySellDash: { - [[DSAuthenticationManager sharedInstance] - authenticateWithPrompt:nil - usingBiometricAuthentication:[DWGlobalOptions sharedInstance].biometricAuthEnabled - alertIfLockout:YES - completion:^(BOOL authenticated, BOOL usedBiometrics, BOOL cancelled) { - if (authenticated) { - BuySellPortalViewController *controller = [BuySellPortalViewController controller]; - controller.hidesBottomBarWhenPushed = true; - [self.navigationController pushViewController:controller animated:YES]; - } - }]; - - break; - } - case DWMainMenuItemType_Explore: { - DWExploreViewController *controller = [[DWExploreViewController alloc] init]; - controller.delegate = self; - DWNavigationController *nvc = [[DWNavigationController alloc] initWithRootViewController:controller]; - [self presentViewController:nvc animated:YES completion:nil]; - - break; - } - case DWMainMenuItemType_Security: { - DWSecurityMenuViewController *controller = [[DWSecurityMenuViewController alloc] init]; - controller.delegate = self.delegate; - [self.navigationController pushViewController:controller animated:YES]; - - break; - } - case DWMainMenuItemType_Settings: { - DWSettingsMenuViewController *controller = [[DWSettingsMenuViewController alloc] init]; - controller.delegate = self; - [self.navigationController pushViewController:controller animated:YES]; - - break; - } - case DWMainMenuItemType_Tools: { - DWToolsMenuViewController *controller = [[DWToolsMenuViewController alloc] init]; - controller.delegate = self; - [self.navigationController pushViewController:controller animated:YES]; - - break; - } - case DWMainMenuItemType_Support: { - [self presentSupportEmailController]; - break; - } -#if DASHPAY - case DWMainMenuItemType_Invite: { - DWInvitationHistoryViewController *controller = [[DWInvitationHistoryViewController alloc] init]; - controller.hidesBottomBarWhenPushed = YES; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case DWMainMenuItemType_Voting: { - UsernameVotingViewController *controller = [UsernameVotingViewController controller]; - controller.hidesBottomBarWhenPushed = YES; - [self.navigationController pushViewController:controller animated:YES]; - break; - } -#endif - } -} - - -#if DASHPAY -- (void)mainMenuContentViewWithShowQRAction:(DWMainMenuContentView *_Nonnull)view { - DWUserProfileModalQRViewController *controller = [[DWUserProfileModalQRViewController alloc] initWithModel:self.receiveModel]; - [self presentViewController:controller animated:YES completion:nil]; -} - -- (void)mainMenuContentViewWithEditProfileAction:(DWMainMenuContentView *_Nonnull)view { - DWRootEditProfileViewController *controller = [[DWRootEditProfileViewController alloc] init]; - controller.delegate = self; - DWNavigationController *navigation = [[DWNavigationController alloc] initWithRootViewController:controller]; - navigation.modalPresentationStyle = UIModalPresentationFullScreen; - [self presentViewController:navigation animated:YES completion:nil]; -} - -- (void)mainMenuContentViewWithJoinDashPayAction:(DWMainMenuContentView *_Nonnull)view { - CreateUsernameViewController *controller = - [[CreateUsernameViewController alloc] - initWithDashPayModel:self.dashPayModel - invitationURL:nil - definedUsername:nil]; - controller.hidesBottomBarWhenPushed = YES; - controller.completionHandler = ^(BOOL result) { - if (result) { - [self.view dw_showInfoHUDWithText:NSLocalizedString(@"Username was successfully requested", @"Usernames") offsetForNavBar:YES]; - } - else { - [self.view dw_showInfoHUDWithText:NSLocalizedString(@"Your request was cancelled", @"Usernames") offsetForNavBar:YES]; - } - }; - [self.navigationController pushViewController:controller animated:YES]; -} - -- (void)mainMenuContentViewWithShowCoinJoin:(DWMainMenuContentView *_Nonnull)view { - CoinJoinLevelsViewController *controller = [CoinJoinLevelsViewController controllerWithIsFullScreen:NO]; - controller.hidesBottomBarWhenPushed = YES; - [self.navigationController pushViewController:controller animated:YES]; -} - -- (void)mainMenuContentViewWithShowRequestDetails:(DWMainMenuContentView *)view { - RequestDetailsViewController *controller = [RequestDetailsViewController controller]; - controller.hidesBottomBarWhenPushed = YES; - [self.navigationController pushViewController:controller animated:YES]; -} - -#endif - -#pragma mark - DWToolsMenuViewControllerDelegate - -- (void)toolsMenuViewControllerImportPrivateKey:(DWToolsMenuViewController *)controller { - [self.navigationController popToRootViewControllerAnimated:NO]; - [self.delegate mainMenuViewControllerImportPrivateKey:self]; -} - -#pragma mark - DWSettingsMenuViewControllerDelegate - -- (void)settingsMenuViewControllerDidRescanBlockchain:(DWSettingsMenuViewController *)controller { - [self.navigationController popToRootViewControllerAnimated:NO]; - [self.delegate mainMenuViewControllerOpenHomeScreen:self]; -} - -#pragma mark - DWExploreTestnetViewControllerDelegate -- (void)exploreViewControllerShowSendPayment:(DWExploreViewController *)controller { - [self.delegate showPaymentsControllerWithActivePage:DWPaymentsViewControllerIndex_Pay]; -} - -- (void)exploreViewControllerShowReceivePayment:(DWExploreViewController *)controller { - [self.delegate showPaymentsControllerWithActivePage:DWPaymentsViewControllerIndex_Receive]; -} - -- (void)exploreViewControllerShowGiftCard:(DWExploreViewController *)controller txId:(NSData *)txId { - [self.delegate showGiftCard:txId]; -} - -#pragma mark - DWRootEditProfileViewControllerDelegate - -#if DASHPAY -- (void)editProfileViewController:(DWRootEditProfileViewController *)controller - updateDisplayName:(NSString *)rawDisplayName - aboutMe:(NSString *)rawAboutMe - avatarURLString:(nullable NSString *)avatarURLString { - [self.view.userModel.updateModel updateWithDisplayName:rawDisplayName aboutMe:rawAboutMe avatarURLString:avatarURLString]; - [controller dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)editProfileViewControllerDidCancel:(DWRootEditProfileViewController *)controller { - [controller dismissViewControllerAnimated:YES completion:nil]; -} -#endif - -#pragma mark - MFMailComposeViewControllerDelegate - -- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error { - [controller dismissViewControllerAnimated:YES completion:nil]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift new file mode 100644 index 000000000..e128edb97 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift @@ -0,0 +1,212 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2025 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI + +struct MainMenuView: View { + @StateObject private var viewModel: MainMenuViewModel + + #if DASHPAY + let joinDPViewModel = JoinDashPayViewModel(initialState: .none) + #endif + + init(viewModel: MainMenuViewModel) { + self._viewModel = StateObject(wrappedValue: viewModel) + } + + var body: some View { + ScrollView { + LazyVStack(alignment: .leading, spacing: 20) { + // Header + HStack { + Text(NSLocalizedString("More", comment: "")) + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primaryText) + Spacer() + } + .padding(.horizontal, 20) + .padding(.top, 10) + + #if DASHPAY + // Join DashPay section (if needed) + if viewModel.userProfileModel?.showJoinDashpay == true { + JoinDashPayView( + viewModel: joinDPViewModel, + onTap: { state in + handleJoinDashPayTap(state: state) + }, + onActionButton: { state in + handleJoinDashPayAction(state: state) + }, + onDismissButton: { state in + joinDPViewModel.markAsDismissed() + }, + onSizeChange: { size in + // Handle size changes if needed + } + ) + .padding(.horizontal, 18) + .padding(.bottom, 20) + } + #endif + + // Menu sections + ForEach(Array(viewModel.menuSections.enumerated()), id: \.offset) { index, section in + MenuSectionView(section: section) { menuItem in + viewModel.handleMenuAction(menuItem) + } + } + + Spacer(minLength: 60) // Bottom padding for tab bar + } + } + .background(Color.primaryBackground) + .onAppear { + viewModel.updateModel() + } + } + + #if DASHPAY + private func handleJoinDashPayTap(state: JoinDashPayViewState) { + switch state { + case .registered: + NotificationCenter.default.post(name: .editProfile, object: nil) + case .voting: + NotificationCenter.default.post(name: .showRequestDetails, object: nil) + case .none: + handleJoinButtonAction() + default: + break + } + } + + private func handleJoinDashPayAction(state: JoinDashPayViewState) { + switch state { + case .blocked, .failed, .contested: + handleJoinButtonAction() + default: + NotificationCenter.default.post(name: .editProfile, object: nil) + joinDPViewModel.markAsDismissed() + } + } + + private func handleJoinButtonAction() { + let shouldShowMixDashDialog = CoinJoinService.shared.mode == .none || !UsernamePrefs.shared.mixDashShown + let shouldShowDashPayInfo = !UsernamePrefs.shared.joinDashPayInfoShown + + if shouldShowMixDashDialog { + NotificationCenter.default.post(name: .showMixDashDialog, object: nil) + } else if shouldShowDashPayInfo { + NotificationCenter.default.post(name: .showDashPayInfo, object: nil) + } else { + NotificationCenter.default.post(name: .joinDashPay, object: nil) + } + } + #endif +} + +struct MenuSectionView: View { + let section: MenuSection + let onMenuItemTap: (MenuItemType) -> Void + + var body: some View { + VStack(spacing: 0) { + ForEach(section.items, id: \.self) { item in + MenuItemView(item: item) { + onMenuItemTap(item) + } + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + .padding(.horizontal, 20) + } +} + +struct MenuItemView: View { + let item: MenuItemType + let action: () -> Void + + var body: some View { + MenuItem( + title: item.title, + subtitle: item.subtitle, + icon: item.iconName, + showChevron: false, + action: action + ) + } +} + +// MARK: - Additional Notification Names + +extension Notification.Name { + #if DASHPAY + static let editProfile = Notification.Name("editProfile") + static let showRequestDetails = Notification.Name("showRequestDetails") + static let showMixDashDialog = Notification.Name("showMixDashDialog") + static let showDashPayInfo = Notification.Name("showDashPayInfo") + static let joinDashPay = Notification.Name("joinDashPay") + #endif +} + +// MARK: - MenuItemType Hashable + +extension MenuItemType: Hashable { + func hash(into hasher: inout Hasher) { + switch self { + case .joinDashPay: + hasher.combine("joinDashPay") + case .buySellDash: + hasher.combine("buySellDash") + case .explore: + hasher.combine("explore") + case .security: + hasher.combine("security") + case .settings: + hasher.combine("settings") + case .tools: + hasher.combine("tools") + case .support: + hasher.combine("support") + #if DASHPAY + case .invite: + hasher.combine("invite") + case .voting: + hasher.combine("voting") + #endif + } + } +} + +#Preview { + #if DASHPAY + let viewModel = MainMenuViewModel( + dashPayModel: nil, + receiveModel: nil, + dashPayReady: nil, + userProfileModel: nil + ) + #else + let viewModel = MainMenuViewModel() + #endif + + return MainMenuView(viewModel: viewModel) +} diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift new file mode 100644 index 000000000..3f1e94e7e --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -0,0 +1,348 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import SwiftUI +import MessageUI + +@objc(DWMainMenuViewController) +class MainMenuViewController: UIViewController { + + // MARK: - Properties + + @objc weak var delegate: DWWipeDelegate? + + private var viewModel: MainMenuViewModel! + private var hostingController: UIHostingController! + + #if DASHPAY + private let receiveModel: DWReceiveModelProtocol? + private let dashPayReady: DWDashPayReadyProtocol? + private let dashPayModel: DWDashPayProtocol? + private let userProfileModel: CurrentUserProfileModel? + #endif + + // MARK: - Initialization + + @objc override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { + #if DASHPAY + self.receiveModel = nil + self.dashPayReady = nil + self.dashPayModel = nil + self.userProfileModel = nil + #endif + + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + setupViewController() + } + + #if DASHPAY + @objc init(dashPayModel: DWDashPayProtocol, + receiveModel: DWReceiveModelProtocol, + dashPayReady: DWDashPayReadyProtocol, + userProfileModel: CurrentUserProfileModel) { + self.receiveModel = receiveModel + self.dashPayReady = dashPayReady + self.dashPayModel = dashPayModel + self.userProfileModel = userProfileModel + + super.init(nibName: nil, bundle: nil) + setupViewController() + } + #endif + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setup + + private func setupViewController() { +// title = NSLocalizedString("More", comment: "") todo + } + + // MARK: - View Lifecycle + + override func loadView() { + super.loadView() + setupSwiftUIView() + } + + override func viewDidLoad() { + super.viewDidLoad() + setupNotificationObservers() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + navigationItem.largeTitleDisplayMode = .never + viewModel.updateModel() + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + // MARK: - SwiftUI Setup + + private func setupSwiftUIView() { + #if DASHPAY + viewModel = MainMenuViewModel( + dashPayModel: dashPayModel, + receiveModel: receiveModel, + dashPayReady: dashPayReady, + userProfileModel: userProfileModel + ) + #else + viewModel = MainMenuViewModel() + #endif + + let swiftUIView = MainMenuView(viewModel: viewModel) + hostingController = UIHostingController(rootView: swiftUIView) + + addChild(hostingController) + view.addSubview(hostingController.view) + hostingController.didMove(toParent: self) + + hostingController.view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + hostingController.view.topAnchor.constraint(equalTo: view.topAnchor), + hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), + hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + } + + // MARK: - Notification Observers + + private func setupNotificationObservers() { + NotificationCenter.default.addObserver(self, selector: #selector(showBuySellPortal), name: .showBuySellPortal, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showExplore), name: .showExplore, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showSecurity), name: .showSecurity, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showSettings), name: .showSettings, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showTools), name: .showTools, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showSupport), name: .showSupport, object: nil) + + #if DASHPAY + NotificationCenter.default.addObserver(self, selector: #selector(showInvite), name: .showInvite, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showVoting), name: .showVoting, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(editProfile), name: .editProfile, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showRequestDetails), name: .showRequestDetails, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showMixDashDialog), name: .showMixDashDialog, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(showDashPayInfo), name: .showDashPayInfo, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(joinDashPay), name: .joinDashPay, object: nil) + #endif + } + + // MARK: - Navigation Handlers + + @objc private func showBuySellPortal() { + DSAuthenticationManager.sharedInstance().authenticate( + withPrompt: nil, + usingBiometricAuthentication: DWGlobalOptions.sharedInstance().biometricAuthEnabled, + alertIfLockout: true + ) { [weak self] authenticated, usedBiometrics, cancelled in + if authenticated { + let controller = BuySellPortalViewController.controller() + controller.hidesBottomBarWhenPushed = true + self?.navigationController?.pushViewController(controller, animated: true) + } + } + } + + @objc private func showExplore() { + let controller = ExploreViewController() + controller.delegate = self + let navigationController = BaseNavigationController(rootViewController: controller) + present(navigationController, animated: true) + } + + @objc private func showSecurity() { + let controller = DWSecurityMenuViewController() + controller.delegate = delegate + navigationController?.pushViewController(controller, animated: true) + } + + @objc private func showSettings() { + let controller = SettingsMenuViewController() + controller.delegate = self + navigationController?.pushViewController(controller, animated: true) + } + + @objc private func showTools() { + let controller = ToolsMenuViewController() + controller.delegate = self + navigationController?.pushViewController(controller, animated: true) + } + + @objc private func showSupport() { + presentSupportEmailController() + } + + #if DASHPAY + @objc private func showInvite() { + let controller = DWInvitationHistoryViewController() + controller.hidesBottomBarWhenPushed = true + navigationController?.pushViewController(controller, animated: true) + } + + @objc private func showVoting() { + let controller = UsernameVotingViewController.controller() + controller.hidesBottomBarWhenPushed = true + navigationController?.pushViewController(controller, animated: true) + } + + @objc private func editProfile() { + let controller = DWRootEditProfileViewController() + controller.delegate = self + let navigation = DWNavigationController(rootViewController: controller) + navigation.modalPresentationStyle = .fullScreen + present(navigation, animated: true) + } + + @objc private func showRequestDetails() { + let controller = RequestDetailsViewController.controller() + controller.hidesBottomBarWhenPushed = true + navigationController?.pushViewController(controller, animated: true) + } + + @objc private func showMixDashDialog() { + let swiftUIView = MixDashDialog( + positiveAction: { [weak self] in + let controller = CoinJoinLevelsViewController.controller(isFullScreen: false) + controller.hidesBottomBarWhenPushed = true + self?.navigationController?.pushViewController(controller, animated: true) + }, + negativeAction: { [weak self] in + if UsernamePrefs.shared.joinDashPayInfoShown { + self?.joinDashPay() + } else { + UsernamePrefs.shared.joinDashPayInfoShown = true + self?.showDashPayInfo() + } + } + ) + + let hostingController = UIHostingController(rootView: swiftUIView) + hostingController.setDetent(260) + present(hostingController, animated: true) + } + + @objc private func showDashPayInfo() { + let swiftUIView = JoinDashPayInfoDialog { [weak self] in + self?.joinDashPay() + } + + let hostingController = UIHostingController(rootView: swiftUIView) + hostingController.setDetent(600) + present(hostingController, animated: true) + } + + @objc private func joinDashPay() { + guard let dashPayModel = dashPayModel else { return } + + let controller = CreateUsernameViewController( + dashPayModel: dashPayModel, + invitationURL: nil, + definedUsername: nil + ) + controller.hidesBottomBarWhenPushed = true + controller.completionHandler = { [weak self] result in + if result { + self?.view.dw_showInfoHUD(withText: NSLocalizedString("Username was successfully requested", comment: "Usernames"), offsetForNavBar: true) + } else { + self?.view.dw_showInfoHUD(withText: NSLocalizedString("Your request was cancelled", comment: "Usernames"), offsetForNavBar: true) + } + } + navigationController?.pushViewController(controller, animated: true) + } + #endif +} + +// MARK: - DWToolsMenuViewControllerDelegate + +extension MainMenuViewController: ToolsMenuViewControllerDelegate { + func toolsMenuViewControllerImportPrivateKey(_ controller: ToolsMenuViewController) { + navigationController?.popToRootViewController(animated: false) + if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.mainMenuViewControllerImportPrivateKey(self) + } + } +} + +// MARK: - DWSettingsMenuViewControllerDelegate + +extension MainMenuViewController: SettingsMenuViewControllerDelegate { + func settingsMenuViewControllerDidRescanBlockchain(_ controller: SettingsMenuViewController) { + navigationController?.popToRootViewController(animated: false) + if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.mainMenuViewControllerOpenHomeScreen(self) + } + } +} + +// MARK: - DWExploreViewControllerDelegate + +extension MainMenuViewController: ExploreViewControllerDelegate { + func exploreViewControllerShowSendPayment(_ controller: ExploreViewController) { + if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.showPaymentsController(withActivePage: PaymentsViewControllerState.pay.rawValue) + } + } + + func exploreViewControllerShowReceivePayment(_ controller: ExploreViewController) { + if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.showPaymentsController(withActivePage: PaymentsViewControllerState.receive.rawValue) + } + } + + func exploreViewControllerShowGiftCard(_ controller: ExploreViewController, txId: Data) { + if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.showGiftCard(txId) + } + } +} + +// MARK: - DWRootEditProfileViewControllerDelegate + +#if DASHPAY +extension MainMenuViewController: DWRootEditProfileViewControllerDelegate { + func editProfileViewController(_ controller: DWRootEditProfileViewController, + updateDisplayName rawDisplayName: String, + aboutMe rawAboutMe: String, + avatarURLString: String?) { + userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + controller.dismiss(animated: true) + } + + func editProfileViewControllerDidCancel(_ controller: DWRootEditProfileViewController) { + controller.dismiss(animated: true) + } +} +#endif + +// MARK: - MFMailComposeViewControllerDelegate + +extension MainMenuViewController: MFMailComposeViewControllerDelegate { + func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { + controller.dismiss(animated: true) + } +} diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewControllerDelegate.h b/DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift similarity index 55% rename from DashWallet/Sources/UI/Menu/Main/DWMainMenuViewControllerDelegate.h rename to DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift index bb11c35ae..37c1bf7a0 100644 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewControllerDelegate.h +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift @@ -15,18 +15,11 @@ // limitations under the License. // -#import +import Foundation -#ifndef DWMainMenuViewControllerDelegate_h -#define DWMainMenuViewControllerDelegate_h - -@protocol DWMainMenuViewControllerDelegate - -- (void)mainMenuViewControllerImportPrivateKey:(DWMainMenuViewController *)controller; -- (void)mainMenuViewControllerOpenHomeScreen:(DWMainMenuViewController *)controller; -- (void)showPaymentsControllerWithActivePage:(NSInteger)pageIndex; -- (void)showGiftCard:(NSData *)txId; - -@end - -#endif /* DWMainMenuViewControllerDelegate_h */ +protocol MainMenuViewControllerDelegate: AnyObject { + func mainMenuViewControllerImportPrivateKey(_ controller: UIViewController) + func mainMenuViewControllerOpenHomeScreen(_ controller: UIViewController) + func showPaymentsController(withActivePage pageIndex: Int) + func showGiftCard(_ txId: Data) +} diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift new file mode 100644 index 000000000..6a6007255 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift @@ -0,0 +1,289 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2025 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI +import Combine + +protocol MainMenuViewModelDelegate: AnyObject { + func mainMenuViewModelImportPrivateKey() + func mainMenuViewModelOpenHomeScreen() + func showPaymentsController(with pageIndex: Int) + func showGiftCard(_ txId: Data) +} + +@MainActor +class MainMenuViewModel: ObservableObject { + + // MARK: - Published Properties + + @Published var menuSections: [MenuSection] = [] + + // MARK: - Dependencies + + #if DASHPAY + let receiveModel: DWReceiveModelProtocol? + let dashPayReady: DWDashPayReadyProtocol? + let dashPayModel: DWDashPayProtocol? + let userProfileModel: CurrentUserProfileModel? + #endif + + weak var delegate: MainMenuViewModelDelegate? + + // MARK: - Initialization + + #if DASHPAY + init(dashPayModel: DWDashPayProtocol? = nil, + receiveModel: DWReceiveModelProtocol? = nil, + dashPayReady: DWDashPayReadyProtocol? = nil, + userProfileModel: CurrentUserProfileModel? = nil) { + self.dashPayModel = dashPayModel + self.receiveModel = receiveModel + self.dashPayReady = dashPayReady + self.userProfileModel = userProfileModel + buildMenuSections() + } + #else + init() { + buildMenuSections() + } + #endif + + // MARK: - Menu Building + + private func buildMenuSections() { + var sections: [MenuSection] = [] + + // DashPay section (if enabled and not registered) + #if DASHPAY + if userProfileModel?.showJoinDashpay == true { + sections.append(MenuSection(items: [ + .joinDashPay + ])) + } + #endif + + // Main services section + sections.append(MenuSection(items: [ + .buySellDash, + .explore + ])) + + // Settings section + sections.append(MenuSection(items: [ + .security, + .settings, + .tools, + .support + ])) + + self.menuSections = sections + } + + // MARK: - Actions + + func handleMenuAction(_ item: MenuItemType) { + switch item { + case .joinDashPay: + handleJoinDashPay() + case .buySellDash: + handleBuySellDash() + case .explore: + handleExplore() + case .security: + handleSecurity() + case .settings: + handleSettings() + case .tools: + handleTools() + case .support: + handleSupport() + #if DASHPAY + case .invite: + handleInvite() + case .voting: + handleVoting() + #endif + } + } + + private func handleJoinDashPay() { + #if DASHPAY + // This will be handled by the JoinDashPayView integration + #endif + } + + private func handleBuySellDash() { + DSAuthenticationManager.sharedInstance().authenticate( + withPrompt: nil, + usingBiometricAuthentication: DWGlobalOptions.sharedInstance().biometricAuthEnabled, + alertIfLockout: true + ) { [weak self] authenticated, usedBiometrics, cancelled in + if authenticated { + NotificationCenter.default.post(name: .showBuySellPortal, object: nil) + } + } + } + + private func handleExplore() { + NotificationCenter.default.post(name: .showExplore, object: nil) + } + + private func handleSecurity() { + NotificationCenter.default.post(name: .showSecurity, object: nil) + } + + private func handleSettings() { + NotificationCenter.default.post(name: .showSettings, object: nil) + } + + private func handleTools() { + NotificationCenter.default.post(name: .showTools, object: nil) + } + + private func handleSupport() { + NotificationCenter.default.post(name: .showSupport, object: nil) + } + + #if DASHPAY + private func handleInvite() { + NotificationCenter.default.post(name: .showInvite, object: nil) + } + + private func handleVoting() { + NotificationCenter.default.post(name: .showVoting, object: nil) + } + #endif + + func updateModel() { + #if DASHPAY + let invitationsEnabled = DWGlobalOptions.sharedInstance().dpInvitationFlowEnabled && (userProfileModel?.blockchainIdentity != nil) + let isVotingEnabled = VotingPrefsWrapper.getIsEnabled() + #endif + + buildMenuSections() + } +} + +// MARK: - Data Models + +struct MenuSection { + let items: [MenuItemType] +} + +enum MenuItemType: CaseIterable { + case joinDashPay + case buySellDash + case explore + case security + case settings + case tools + case support + #if DASHPAY + case invite + case voting + #endif + + var title: String { + switch self { + case .joinDashPay: + return NSLocalizedString("Join DashPay", comment: "") + case .buySellDash: + return NSLocalizedString("Buy & sell Dash", comment: "") + case .explore: + return NSLocalizedString("Explore", comment: "") + case .security: + return NSLocalizedString("Security", comment: "") + case .settings: + return NSLocalizedString("Settings", comment: "") + case .tools: + return NSLocalizedString("Tools", comment: "") + case .support: + return NSLocalizedString("Support", comment: "") + #if DASHPAY + case .invite: + return NSLocalizedString("Invite", comment: "") + case .voting: + return NSLocalizedString("Voting", comment: "") + #endif + } + } + + var subtitle: String? { + switch self { + case .joinDashPay: + return NSLocalizedString("Create a username and say goodbye to numerical addresses", comment: "") + case .buySellDash: + return nil + case .explore: + return nil + case .security: + return nil + case .settings: + return nil + case .tools: + return nil + case .support: + return nil + #if DASHPAY + case .invite: + return nil + case .voting: + return nil + #endif + } + } + + var iconName: IconName { + switch self { + case .joinDashPay: + return .custom("account", maxHeight: 22) + case .buySellDash: + return .custom("image.buy.and.sell", maxHeight: 22) + case .explore: + return .custom("image.explore", maxHeight: 22) + case .security: + return .custom("image.security", maxHeight: 22) + case .settings: + return .custom("image.settings", maxHeight: 22) + case .tools: + return .custom("image.tools", maxHeight: 22) + case .support: + return .custom("image.support", maxHeight: 22) + #if DASHPAY + case .invite: + return .custom("invite", maxHeight: 22) + case .voting: + return .custom("voting", maxHeight: 22) + #endif + } + } +} + +// MARK: - Notification Names + +extension Notification.Name { + static let showBuySellPortal = Notification.Name("showBuySellPortal") + static let showExplore = Notification.Name("showExplore") + static let showSecurity = Notification.Name("showSecurity") + static let showSettings = Notification.Name("showSettings") + static let showTools = Notification.Name("showTools") + static let showSupport = Notification.Name("showSupport") + #if DASHPAY + static let showInvite = Notification.Name("showInvite") + static let showVoting = Notification.Name("showVoting") + #endif +} diff --git a/DashWallet/Sources/UI/Menu/MenuItemModel.swift b/DashWallet/Sources/UI/Menu/MenuItemModel.swift index 18e226cab..aa47c6f08 100644 --- a/DashWallet/Sources/UI/Menu/MenuItemModel.swift +++ b/DashWallet/Sources/UI/Menu/MenuItemModel.swift @@ -17,7 +17,7 @@ import SwiftUI -class MenuItemModel: Identifiable, Equatable { +class MenuItemModel: Identifiable, Equatable, Hashable { let id = UUID() var title: String @@ -25,18 +25,16 @@ class MenuItemModel: Identifiable, Equatable { var details: String? = nil var icon: IconName? = nil var showInfo: Bool = false - var showChevron: Bool = false var showToggle: Bool = false @State var isToggled: Bool = false var action: (() -> Void)? = nil - init(title: String, subtitle: String? = nil, details: String? = nil, icon: IconName? = nil, showInfo: Bool = false, showChevron: Bool = false, showToggle: Bool = false, isToggled: Bool = false, action: (() -> Void)? = nil) { + init(title: String, subtitle: String? = nil, details: String? = nil, icon: IconName? = nil, showInfo: Bool = false, showToggle: Bool = false, isToggled: Bool = false, action: (() -> Void)? = nil) { self.title = title self.subtitle = subtitle self.details = details self.icon = icon self.showInfo = showInfo - self.showChevron = showChevron self.showToggle = showToggle self._isToggled = State.init(initialValue: isToggled) self.action = action @@ -45,6 +43,10 @@ class MenuItemModel: Identifiable, Equatable { static func == (lhs: MenuItemModel, rhs: MenuItemModel) -> Bool { lhs.id == rhs.id } + + func hash(into hasher: inout Hasher) { + hasher.combine(id) + } } class CoinJoinMenuItemModel: MenuItemModel { diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift index e59407471..e93671e66 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift @@ -19,15 +19,13 @@ import UIKit import SwiftUI import Combine -@objc(DWSettingsMenuViewControllerDelegate) protocol SettingsMenuViewControllerDelegate: AnyObject { func settingsMenuViewControllerDidRescanBlockchain(_ controller: SettingsMenuViewController) } -@objc(DWSettingsMenuViewController) class SettingsMenuViewController: UIViewController, DWLocalCurrencyViewControllerDelegate { - @objc weak var delegate: SettingsMenuViewControllerDelegate? + weak var delegate: SettingsMenuViewControllerDelegate? private lazy var model: DWSettingsMenuModel = DWSettingsMenuModel() private lazy var viewModel: SettingsViewModel = SettingsViewModel(model: model) @@ -222,38 +220,43 @@ struct SettingsMenuContent: View { @StateObject var viewModel: SettingsViewModel var body: some View { - List(viewModel.items) { item in - Group { - if let cjItem = item as? CoinJoinMenuItemModel { - MenuItem( - title: cjItem.title, - subtitleView: AnyView(CoinJoinSubtitle(cjItem)), - icon: .custom("image.coinjoin.menu"), - badgeText: nil, - action: cjItem.action - ) - } else { - MenuItem( - title: item.title, - subtitle: item.subtitle, - details: item.details, - icon: item.icon, - showInfo: item.showInfo, - showChevron: item.showChevron, - showToggle: item.showToggle, - isToggled: item.isToggled, - action: item.action - ) + VStack(alignment: .leading, spacing: 0) { + VStack(spacing: 0) { + ForEach(viewModel.items) { item in + if let cjItem = item as? CoinJoinMenuItemModel { + MenuItem( + title: cjItem.title, + subtitleView: AnyView(CoinJoinSubtitle(cjItem)), + icon: .custom("image.coinjoin.menu", maxHeight: 22), + badgeText: nil, + action: cjItem.action + ) + .frame(minHeight: 60) + } else { + MenuItem( + title: item.title, + subtitle: item.subtitle, + details: item.details, + icon: item.icon, + showInfo: item.showInfo, + showChevron: false, + showToggle: item.showToggle, + isToggled: item.isToggled, + action: item.action + ) + .frame(minHeight: 60) + } } } + .padding(.vertical, 5) .background(Color.secondaryBackground) - .cornerRadius(8) - .shadow(color: .shadow, radius: 10, x: 0, y: 5) - .listRowSeparator(.hidden) - .listRowBackground(Color.clear) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + + Spacer() } - .listStyle(.plain) - .background(Color.clear) + .padding(.horizontal, 20) + .padding(.top, 16) } @ViewBuilder diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift index 978078026..fd33ff6b5 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift @@ -74,13 +74,14 @@ class SettingsViewModel: ObservableObject { MenuItemModel( title: NSLocalizedString("Local Currency", comment: ""), subtitle: model.localCurrencyCode, - showChevron: true, + icon: .custom("image.currency", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .currencySelector } ), MenuItemModel( title: NSLocalizedString("Enable Receive Notifications", comment: ""), + icon: .custom("image.notifications", maxHeight: 22), showToggle: true, isToggled: model.notificationsEnabled, action: { [weak self] in @@ -90,21 +91,21 @@ class SettingsViewModel: ObservableObject { MenuItemModel( title: NSLocalizedString("Network", comment: ""), subtitle: model.networkName, - showChevron: true, + icon: .custom("image.rescan", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .network } ), MenuItemModel( title: NSLocalizedString("Rescan Blockchain", comment: ""), - showChevron: true, + icon: .custom("image.rescan", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .rescan } ), MenuItemModel( title: NSLocalizedString("About", comment: ""), - showChevron: true, + icon: .custom("image.about", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .about } diff --git a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift index 92b14f481..92f112981 100644 --- a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift @@ -18,14 +18,12 @@ import UIKit import SwiftUI -@objc(DWToolsMenuViewControllerDelegate) protocol ToolsMenuViewControllerDelegate: AnyObject { func toolsMenuViewControllerImportPrivateKey(_ controller: ToolsMenuViewController) } -@objc(DWToolsMenuViewController) class ToolsMenuViewController: UIViewController, DWImportWalletInfoViewControllerDelegate { - @objc weak var delegate: ToolsMenuViewControllerDelegate? + weak var delegate: ToolsMenuViewControllerDelegate? override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) @@ -45,28 +43,28 @@ class ToolsMenuViewController: UIViewController, DWImportWalletInfoViewControlle let items = [ MenuItemModel( title: NSLocalizedString("Import Private Key", comment: ""), - showChevron: true, + icon: .custom("image.import.private.key", maxHeight: 22), action: { [weak self] in self?.showImportPrivateKey() } ), MenuItemModel( title: NSLocalizedString("Extended Public Keys", comment: ""), - showChevron: true, + icon: .custom("image.extend.public.key", maxHeight: 22), action: { [weak self] in self?.showExtendedPublicKeys() } ), MenuItemModel( title: NSLocalizedString("Show Masternode Keys", comment: ""), - showChevron: true, + icon: .custom("image.masternode.keys", maxHeight: 22), action: { [weak self] in self?.showMasternodeKeys() } ), MenuItemModel( title: NSLocalizedString("CSV Export", comment: ""), - showChevron: true, + icon: .custom("image.csv.export", maxHeight: 22), action: { [weak self] in self?.askToExportTransactionsInCSV() } @@ -74,8 +72,7 @@ class ToolsMenuViewController: UIViewController, DWImportWalletInfoViewControlle MenuItemModel( title: NSLocalizedString("ZenLedger", comment: ""), subtitle: NSLocalizedString("Simplify your crypto taxes", comment: ""), - icon: .custom("zenledger"), - showChevron: true + icon: .custom("zenledger") ) ] @@ -175,31 +172,57 @@ struct ToolsMenuContent: View { var onOpenSafari: (String) -> Void var body: some View { - List(items) { item in - MenuItem( - title: item.title, - subtitle: item.subtitle, - details: item.details, - icon: item.icon, - showInfo: item.showInfo, - showChevron: item.showChevron, - isToggled: item.isToggled, - action: { - if item == items.last { - showZenLedgerSheet = true - } else { - item.action?() - } + VStack(alignment: .leading, spacing: 16) { + // First group - all items except ZenLedger + VStack(spacing: 0) { + ForEach(items.dropLast(), id: \.self) { item in + MenuItem( + title: item.title, + subtitle: item.subtitle, + details: item.details, + icon: item.icon, + showInfo: item.showInfo, + showChevron: false, + isToggled: item.isToggled, + action: { + item.action?() + } + ) + .frame(minHeight: 60) } - ) + } + .padding(.vertical, 5) .background(Color.secondaryBackground) - .cornerRadius(8) - .shadow(color: .shadow, radius: 10, x: 0, y: 5) - .listRowSeparator(.hidden) - .listRowBackground(Color.clear) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + + // Second group - ZenLedger + if let zenLedgerItem = items.last { + VStack(spacing: 0) { + MenuItem( + title: zenLedgerItem.title, + subtitle: zenLedgerItem.subtitle, + details: zenLedgerItem.details, + icon: zenLedgerItem.icon, + showInfo: zenLedgerItem.showInfo, + showChevron: false, + isToggled: zenLedgerItem.isToggled, + action: { + showZenLedgerSheet = true + } + ) + .frame(minHeight: 60) + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + } + + Spacer() } - .listStyle(.plain) - .background(Color.clear) + .padding(.horizontal, 20) + .padding(.top, 16) .sheet(isPresented: $showZenLedgerSheet, onDismiss: { if let link = safariLink { safariLink = nil diff --git a/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift b/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift index dd7299d17..b7b64bb90 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift @@ -219,7 +219,7 @@ struct MenuItem: View { } .contentShape(Rectangle()) .padding(10) - .frame(maxWidth: .infinity, minHeight: 66) + .frame(maxWidth: .infinity) .onTapGesture { if showToggle { isToggled.toggle() diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 25e967a58..f76a766ec 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "شراء بطاقة هدية"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "إنشاء حساب"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 004c74d57..573a86b21 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Купи & Продай Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Изчистен!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Адрес за гласуване"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index dd7555bc4..1f33bb759 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index c70716062..e6b26d70a 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Nákup a prodej Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Nákup dárkového poukazu"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Vytvořit účet"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Přeneseno!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Adresa pro hlasování"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index a86334747..e1abcff7c 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index d2960e9bd..e8191c780 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -143,10 +143,8 @@ static const bool _SNAPSHOT = 0; #import "DSChain+DashWallet.h" //MARK: Tabbar -#import "DWMainMenuViewController.h" #import "DWWipeDelegate.h" #import "DWPayModel.h" -#import "DWMainMenuViewControllerDelegate.h" //MARK: Home #import "DWHomeModel.h" @@ -167,6 +165,7 @@ static const bool _SNAPSHOT = 0; #import "DWSharedUIConstants.h" #import "DWUserProfileContainerView.h" #import "DWDashPayReadyProtocol.h" +#import "DWSecurityMenuViewController.h" //MARK: Onboarding #import "DWTransactionStub.h" diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index d14c68a16..40481a9fe 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Kaufe & Verkaufe Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Gutscheinkarte kaufen"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Nutzernamen erstellen."; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Konto erstellen"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Einreichen"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Geleert!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Stimmen: Aufsteigend"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Abstimmungs-Adresse"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 13d37dfb6..e76607c44 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Αγορά και Πώληση Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Αγοράστε μια δωροκάρτα"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Δημιουργία όνομα χρήστη"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Δημιουργία λογαριασμού"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Υποβολή"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Σαρώθηκε"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Ψήφοι: Χαμηλές προς υψηλές"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Διεύθυνση Ψήφου"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 0cba67f80..0f51672f5 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index a3562dcdf..ca511a99d 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index b8b97f3ed..f957b7c4c 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Comprar y Vender Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Comprar una Tarjeta de regalo"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Crear nombre de usuario"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Crear una cuenta"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Entregar"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "¡Barrido!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votos: Bajo a alto"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Dirección de voto"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index 591c8c9c1..e209b9ab3 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 83514c3c8..ec915823b 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "خرید کارت هدیه"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "ایجاد یک حساب کاربری"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "ایجاد حساب"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "ثبت"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 992c0e41b..5f6ef2ec6 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 3a54e1490..c16bc0fb2 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Bumili at magbenta ng Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Bumili ng Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Gumawa ng username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Lumikha ng Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Isumite"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Tangayin!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Mga Boto: Mababa hanggang mataas"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Address ng pagboto"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index d17c956c4..9f473f9f8 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Acheter & vendre des dashs"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Acheter une carte-cadeau"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Créer un nom d'utilisateur"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Créer un compte"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Valider"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Récupéré !"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes : de bas à haut"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Adresse de vote"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 53142f916..d40fda7ef 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 26005937f..61c91ca37 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 0ed4efe36..2584391e3 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Beli & Jual Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Beli Kartu Hadiah"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Buat Nama Pengguna"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Buat Akun"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Kirim"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "bersihkan!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Rendah ke tinggi"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Alamat pemungutan suara"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 276d23c82..f16e890f6 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Compra & Vendi Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Acquista una carta regalo "; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Crea un nome utente"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Crea un Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Invia"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Pulito!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Voti: da basso a alto"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Indirizzo di voto"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index f7e16f722..74b7c5daf 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Dashを売買する"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "ギフトカードを購入する"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "ユーザー名を作成する"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "アカウントの作成"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "提出する"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "スイープしました!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "投票数:低から高"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = " 投票のアドレス"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 19f74b648..8df3e9f96 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "대시 매수 & 매도"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "기프트 카드 구매"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "사용자이름 생성하기"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "계정 생성하기"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "제출"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "잔액이 지갑으로 보내졌습니다!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "투표: 낮음부터 높음"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "투표 주소"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 6727f3fc4..2e8feb8fa 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 438aaa438..b1442888b 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 014c412fb..8f501fee9 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index 60f13515d..5969220b2 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Koop & verkoop Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Koop een geschenkbon"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Maak een gebruikersnaam"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Maak account aan"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Indienen"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Geveegd!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Stemmen: van laag naar hoog"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Stem adres"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 1995bba7e..85a670033 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Kupuj i Sprzedawaj Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Kup Kartę Podarunkową"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Stwórz nazwę użytkownika"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Stwórz Konto"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Wyślij"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Wymieciony!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Głosy: od najmniej do najwięcej"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Adres Głosowania"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index e80c6f75b..a686f0158 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Comprar & Vender Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Comprar um Cartão Presente"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Criar um nome de usuário"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Criar Conta"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Enviar"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Varrido!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votos: Do mais baixo para o mais alto"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Endereço de Votação"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index 553348fe3..3b1b6d74b 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 9044d48fb..984ba62b7 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Купить и продать"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Купить подарочную карту"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Создать имя пользователя"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Создать аккаунт"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Отправить"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Переведено!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Голоса: По возрастанию"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Адрес голосования"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 389e9798a..3e0d847ac 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Kúpiť a predať Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Kúpiť darčekovú kartu"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Vytvoriť používateľské meno"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Vytvoriť účet"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Odoslať"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Načítať!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Hlasy: od najmenších"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Adresa pre hlasovanie"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index b4f934338..4e1b8408a 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index e2f2ab284..ea201b6da 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 2d8911e80..640385287 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 13dc02c71..252151ab6 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index cb2099258..5bba538e0 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Köp & Sälj Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index ece2a8b9e..0af1f178d 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "ซื้อ & ขาย Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "ซื้อบัตรของขวัญ"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "กำหนดชื่อผู้ใช้"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "สร้างบัญชี"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "ลบล้าง"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "โหวต: ต่ำไปสูง"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "ที่อยู่ซึ่งใช้ในการออกเสียงลงคะแนน"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index b741c96cf..5a50394a1 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Dash Al & Sat"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Hediye Kartı Satın Alın"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Kullanıcı adı oluştur"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Hesab Oluştur"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Tarandı!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Oylar: Düşükten yükseğe"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Oy Verme Adresi"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index e509a33a0..539ed8209 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Купити & Продати Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Купити подарункову карту"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Створити ім'я користувача"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Створити обліковий запис"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Надіслати"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Переведено!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Голоси: від низького до високого"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Адреса голосування"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index c675d5153..77521779c 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Mua & Bán Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Đã quét!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Địa chỉ bỏ phiếu"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index 970e844bf..24e3b7d97 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index cef7f7872..58eba26aa 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "Create a username"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "Create Account"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "Swept!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "Votes: Low to high"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "Voting Address"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 98768d536..d910a702f 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "买 & 卖 Dash"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "购买礼品卡"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "创建一个用户名"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "创建账户"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "提交"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "已清除!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "投票: 从低到高"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "投票者地址"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index fe40ae8a6..2d0fba993 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -359,6 +359,9 @@ /* No comment provided by engineer. */ "Buy & Sell Dash" = "買賣達世幣"; +/* No comment provided by engineer. */ +"Buy & sell Dash" = "Buy & sell Dash"; + /* Buy a Gift Card */ "Buy a Gift Card" = "購買禮品卡"; @@ -598,6 +601,9 @@ /* Usernames */ "Create a username" = "創建一個用戶名稱"; +/* No comment provided by engineer. */ +"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; + /* CrowdNode */ "Create Account" = "創建帳號"; @@ -2380,6 +2386,9 @@ /* Voting */ "Submit" = "提交"; +/* No comment provided by engineer. */ +"Support" = "Support"; + /* No comment provided by engineer. */ "Swept!" = "掃一掃!"; @@ -2823,6 +2832,9 @@ /* Voting */ "Votes: Low to high" = "得票數:從低到高"; +/* No comment provided by engineer. */ +"Voting" = "Voting"; + /* No comment provided by engineer. */ "Voting Address" = "投票位址"; From 88a3d954bcdcb8a45e518ac964aed375c5596ffc Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Wed, 23 Jul 2025 18:22:42 +0700 Subject: [PATCH 02/14] feat: moving security screen to SwiftUI --- DashWallet.xcodeproj/project.pbxproj | 20 +- .../Menu/Image.face.id.imageset/Contents.json | 23 ++ .../Menu/Image.face.id.imageset/Layer 1.png | Bin 0 -> 565 bytes .../Image.face.id.imageset/Layer 1@2x.png | Bin 0 -> 1043 bytes .../Image.face.id.imageset/Layer 1@3x.png | Bin 0 -> 1649 bytes .../Contents.json | 23 ++ .../advanced security.png | Bin 0 -> 522 bytes .../advanced security@2x.png | Bin 0 -> 931 bytes .../advanced security@3x.png | Bin 0 -> 1363 bytes .../Contents.json | 23 ++ .../eye.closed.png | Bin 0 -> 591 bytes .../eye.closed@2x.png | Bin 0 -> 1128 bytes .../eye.closed@3x.png | Bin 0 -> 1585 bytes .../image.change.pin.imageset/Contents.json | 23 ++ .../image.change.pin.imageset/Layer_1.png | Bin 0 -> 659 bytes .../image.change.pin.imageset/Layer_1@2x.png | Bin 0 -> 1252 bytes .../image.change.pin.imageset/Layer_1@3x.png | Bin 0 -> 1731 bytes .../Contents.json | 23 ++ .../Layer_1.png | Bin 0 -> 350 bytes .../Layer_1@2x.png | Bin 0 -> 661 bytes .../Layer_1@3x.png | Bin 0 -> 959 bytes .../image.reset.wallet.imageset/Contents.json | 23 ++ .../reset wallet.png | Bin 0 -> 698 bytes .../reset wallet@2x.png | Bin 0 -> 1044 bytes .../reset wallet@3x.png | Bin 0 -> 1731 bytes .../image.touch.id.imageset/Contents.json | 23 ++ .../image.touch.id.imageset/fingerprint.png | Bin 0 -> 1025 bytes .../fingerprint@2x.png | Bin 0 -> 2042 bytes .../fingerprint@3x.png | Bin 0 -> 3086 bytes .../UI/Menu/Main/MainMenuViewController.swift | 2 +- .../Security/DWSecurityMenuViewController.h | 37 -- .../Security/DWSecurityMenuViewController.m | 346 ------------------ .../DWResetWalletInfoViewController.h | 2 +- .../Security/SecurityMenuViewController.swift | 235 ++++++++++++ .../Menu/Security/SecurityMenuViewModel.swift | 134 +++++++ DashWallet/dashwallet-Bridging-Header.h | 11 +- 36 files changed, 554 insertions(+), 394 deletions(-) create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Layer 1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Layer 1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Layer 1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.advanced.security.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.advanced.security.imageset/advanced security.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.advanced.security.imageset/advanced security@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.advanced.security.imageset/advanced security@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.change.pin.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.change.pin.imageset/Layer_1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.change.pin.imageset/Layer_1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.change.pin.imageset/Layer_1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.recovery.phrase.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.recovery.phrase.imageset/Layer_1.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.recovery.phrase.imageset/Layer_1@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.recovery.phrase.imageset/Layer_1@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/reset wallet.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/reset wallet@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/reset wallet@3x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/Contents.json create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint@2x.png create mode 100644 DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint@3x.png delete mode 100644 DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.h delete mode 100644 DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.m create mode 100644 DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift create mode 100644 DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 42a010c43..b16f8cf67 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -184,7 +184,6 @@ 2A7A7BBF2347950700451078 /* DWMainMenuTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */; }; 2A7A7BC3234797FC00451078 /* DWMainMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC2234797FC00451078 /* DWMainMenuModel.m */; }; 2A7A7BC92347E0D700451078 /* DWBaseFormTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */; }; - 2A7A7BCD2347F01B00451078 /* DWSecurityMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BCC2347F01B00451078 /* DWSecurityMenuViewController.m */; }; 2A7A7BD02348A34800451078 /* DWSecurityMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */; }; 2A7A7BD62348CB6600451078 /* SettingsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */; }; 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */; }; @@ -544,6 +543,10 @@ 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; 752D03B22E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; 752D03B32E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; + 752F81982E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */; }; + 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; + 752F819A2E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */; }; + 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; 75303FE52AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 75303FE62AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 7531308D2B47EC910069C9B7 /* UpholdClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7531308C2B47EC910069C9B7 /* UpholdClient.swift */; }; @@ -1483,7 +1486,6 @@ C9D2C8D32A320AA000D15901 /* SendAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B30D7F291123D30080C326 /* SendAmountViewController.swift */; }; C9D2C8D52A320AA000D15901 /* AccountService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47CF46A0296540EF0067B6EE /* AccountService.swift */; }; C9D2C8D62A320AA000D15901 /* ListHandlerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6E6E6291A90B2003FEDF2 /* ListHandlerView.swift */; }; - C9D2C8D72A320AA000D15901 /* DWSecurityMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BCC2347F01B00451078 /* DWSecurityMenuViewController.m */; }; C9D2C8D82A320AA000D15901 /* CrowdNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11BD738028E7356100A34022 /* CrowdNode.swift */; }; C9D2C8D92A320AA000D15901 /* SQLite+ExloreDash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8B9E28BFAD8200490F5E /* SQLite+ExloreDash.swift */; }; C9D2C8DC2A320AA000D15901 /* DWAdvancedSecurityModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A1F6414238FEEA900A9B505 /* DWAdvancedSecurityModel.m */; }; @@ -1968,8 +1970,6 @@ 2A7A7BC42347982A00451078 /* DWMainMenuItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuItem.h; sourceTree = ""; }; 2A7A7BC72347E0D700451078 /* DWBaseFormTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBaseFormTableViewCell.h; sourceTree = ""; }; 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBaseFormTableViewCell.m; sourceTree = ""; }; - 2A7A7BCB2347F01B00451078 /* DWSecurityMenuViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSecurityMenuViewController.h; sourceTree = ""; }; - 2A7A7BCC2347F01B00451078 /* DWSecurityMenuViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSecurityMenuViewController.m; sourceTree = ""; }; 2A7A7BCE2348A34800451078 /* DWSecurityMenuModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSecurityMenuModel.h; sourceTree = ""; }; 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSecurityMenuModel.m; sourceTree = ""; }; 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuViewController.swift; sourceTree = ""; }; @@ -2472,6 +2472,8 @@ 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewController.swift; sourceTree = ""; }; 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewModel.swift; sourceTree = ""; }; 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewControllerDelegate.swift; sourceTree = ""; }; + 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuViewController.swift; sourceTree = ""; }; + 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuViewModel.swift; sourceTree = ""; }; 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CrowdNode.storyboard; sourceTree = ""; }; 7531308C2B47EC910069C9B7 /* UpholdClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdClient.swift; sourceTree = ""; }; 753130902B47EE920069C9B7 /* UpholdCapability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdCapability.swift; sourceTree = ""; }; @@ -4250,10 +4252,10 @@ children = ( 2A7F3B18238C643D00DEA3EF /* Advanced Security */, 2A10EB3F2358D29500C38B61 /* ResetWalletInfo */, - 2A7A7BCB2347F01B00451078 /* DWSecurityMenuViewController.h */, - 2A7A7BCC2347F01B00451078 /* DWSecurityMenuViewController.m */, 2A7A7BCE2348A34800451078 /* DWSecurityMenuModel.h */, 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */, + 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */, + 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */, ); path = Security; sourceTree = ""; @@ -8932,6 +8934,8 @@ 2A74EFF52305333000C475EB /* DWSeedUIConstants.m in Sources */, 2A0C69B32312E8A0001B8C90 /* DWWindow.m in Sources */, 472D13E3299E23B7006903F1 /* BalanceNotifier.swift in Sources */, + 752F819A2E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */, + 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */, 2AD1CE6422D9127600C99324 /* DWSeedWordModel.m in Sources */, 7592AA7C2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */, 7503643E2C89D49A0029EC0D /* CoinJoinService.swift in Sources */, @@ -9084,7 +9088,6 @@ 47C6E6E7291A90B3003FEDF2 /* ListHandlerView.swift in Sources */, 7566F4832BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */, 754D020E2D1558EB005CA466 /* GroupedTransactions.swift in Sources */, - 2A7A7BCD2347F01B00451078 /* DWSecurityMenuViewController.m in Sources */, 11BD738128E7356100A34022 /* CrowdNode.swift in Sources */, 47AE8B9F28BFAD8200490F5E /* SQLite+ExloreDash.swift in Sources */, 2A1F6415238FEEA900A9B505 /* DWAdvancedSecurityModel.m in Sources */, @@ -9605,6 +9608,8 @@ C9D2C7C22A320AA000D15901 /* (null) in Sources */, C9D2C7C32A320AA000D15901 /* DWDPRegistrationStatus.m in Sources */, C9D2C7C42A320AA000D15901 /* CurrencyExchanger_Objc.m in Sources */, + 752F81982E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */, + 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */, 7573C2E12B01103900F4C347 /* VotingFilterItemSelectableCell.swift in Sources */, C943B32B2A408CED00AF23C5 /* DWAvatarExternalLoadingView.m in Sources */, C943B5972A40EDDA00AF23C5 /* DWConfirmUsernameViewController.m in Sources */, @@ -9946,7 +9951,6 @@ C9D2C8D52A320AA000D15901 /* AccountService.swift in Sources */, C9D2C8D62A320AA000D15901 /* ListHandlerView.swift in Sources */, C943B5152A40A54600AF23C5 /* DWInvitationTableViewCell.m in Sources */, - C9D2C8D72A320AA000D15901 /* DWSecurityMenuViewController.m in Sources */, C9D2C8D82A320AA000D15901 /* CrowdNode.swift in Sources */, 755B4B232B0C903500B844F0 /* DWDateFormatter.swift in Sources */, C9D2C8D92A320AA000D15901 /* SQLite+ExloreDash.swift in Sources */, diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Contents.json new file mode 100644 index 000000000..dfd25a450 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Layer 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Layer 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Layer 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Layer 1.png b/DashWallet/Resources/AppAssets.xcassets/Menu/Image.face.id.imageset/Layer 1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbba7888b06cdff3f8513337e3aaa7acfed7ed91 GIT binary patch literal 565 zcmV-50?Pe~P)uh4YZoqk7SnEJ0f}VJktCqjp^J729#^H5O6QUG34rshO?rXCP zor%?B2euE9d)twj6d43tTe_k$#T;$?CupNZ92yffxSkB$&7g>gT*@{x(%cgy0$GN# z1SwpRdHb_vdHdmYWk!g+y6;|?nl_WA@PKY#Kzo961JVe^1?$@DkVFI$y&E$xSP<6sfvdk^5RA;ca82J%WTb2o(GK2DxrqX`%Ha{g#y z%{_yITlvgeF!wY3op8|<4$6cV(WRVZ4~v=MxWA1ijHY+;yZ6ATE2+$RnKCSQ<>Jp9 z@aRVc1?Uyb(41a{F+(NOX!^G3rm4jE_nF)x_R=8F|Rlee{dyV&t_hxH+m=54d8+0IFYT;J%tr+?f>yvbeCEDLY(#G-&dnuqly}%)y8^^<|4P2heZa84o^m`fPT?v5hw7iZgf{B2 zagDjVv>FV2J~VESk#$W0f^2~7GfONxgX6q3ZU|`yU4mRNQcN8%JFqhwcMu9+Rg zvXfz(F~RS5SBZSYRVK<+|80BlP4#y zgF2Y$b8$M})|d*^wFxitdvD2O9^}b8b%nZ0wB^xSnWwH2zIrI7?DIysRx9(=^G;P5 zO@;CIaeryg+6bH2LffPPY-O~+5+Vv<`+WN_(=yB0PPPK_yzU-ii7Z2j)Z@?!P{F}p zQK{#NHPhU8XVYoOfb~$NL{}OEJTCoSNOL9fRqYU@3>6%b^SZ8Wy^>EmunN`9tLmUQ zk$sbn8{lZ?3m%7^LVNP-5*(zUzQQB@Q&=PGRMiXQWf{Nj)eKVgD&uwYr2=^wnjTEZ z2B@4UP<;iJ>y-uJceN^wUgmctZ#!v+jsruv_XAa0)Rnn`R7}4Vy=`t0iSO8&PvGx9 zej6>I-P}nl6JW)dB^yFD8#~H)Ih9V<%BU$bD+wI6!wXn?Z4v zoPo_J){VWgF6COGNN=}_<0?5*o+6*`pQ+|wS0G!^sY;eBvuCICeX}R#;#((HMD^9B zEZG?5sK(=Y`e#B>PfQcS&V`mud9J15GD|qMTfhk)e+6L98LAQ1%(YBD{glEo>V#Iy z7PydY>1RRql6kVzHz^mY5>dTY3IYzZd(-5BmSfr{h>cVUzLCwX(Y|Z{B-wpH-oqs{%3(RKLcPt0u!eo;22AfJy%Wf7{O(u z2YF!l`3fA-)w~D3CfN9CgAn(?VGO;KF~kImeC1%$#;ebflxE~QAg&u52r{*#Q54ttRF> zNH)9{cb&o39j=k6ks6gKc$3wqz$-V>W7(GVk6!w6#VfFw{a8AJW~ zA*ibs3Tn@D{S?Pb6PP5?3aNoa&3^E62?B>t?YUptUK0m2JQ;gqJnx9sdPi8FxUT{#UBlax?p_c?ptew(OyF#z zvnY~OFS4{1M2-`1o}e}fOD>EMNFy`BiMJ)1Wh814pNbq!wt209fbH34h6!b8Hgr* zax`~X+Vc(yiiZMYTiGl6W-FQ~IB#{v4m0U^oQswC)$7iKW5=qIz=`4-w zWEN%6iYz^s^jYQb`xs1ww*0bDiubD~?g%KJB$Yit9-Zv;)rzD9yfKaXl#rw5+oXWUGWIt|ytSpNgPtWUGWIjwG`Btq&<8hkS+@ zx#N|Gpb8Z#aBa{S9OcwK?g$7~;Qj=Dy4b_^g+j>rL_~q9{m@ zBsrXquGTbx<#6UML3Co#kTy8=b)gFi@-uUx-fX^(;2Q0lL+vZj|;ER zm=?$fJ5Bd#tuCo}FiG6$4G$W&ZyRm=)iL@^$AOZ}TN(J5ADhbZQ%h(iyO2?o$;e{T z`LiSMk#hi0{#F3B?2q8L$tl!m-(ChhTO0lWOzwhAv22Xrf5R8F2>e={K3ANnM7h<_ zaRViX$C44G^uoZuP91o2<&Um(W-W_%CWK% zCMnF4vpa1iy4hfI9G25#C$Kb$1neGr!fIE#8|gzLFz<)T>9H2&ymOEiPRhX&m`Z5m zwV3+TaEPNjW8m@%Hc$!igP)e@9ibZ}5&^Egqu9LXG=$P5IF&!i zN}Tun`Ta+rK=d|%7E@@P(XNZO5LnUKCyc$vd}~PGr%-wZ7m#9x@N_P)NJq4NfJ-Pn zlw|WIT%#kVlHxLeYfzq~wX*E=&9X!H2(}1M67yW7R_gT@Ykg1gPio~wd9@?fFPQWK z+<5Hz)y@S18z_V%8)D*(=)-dhVsTC`2j-OvUUY_~=&O%gZ)x7|KCa1#i%JF}(5Od3 zYhHBI54cN};M(`=4mMW>_odRw-ghPZZO@`TaUMrt zN}Y)}uo>(si_ro+HrH?sYIliD&*2(0L!_xw<&d1YsLsp&;o9WC$svPZm^`hG_iQLo z(U^;rljNI;#>1zW!+*h5qN!Q5DZ7NM-1!N}ireuoDT8IKV|4e$-*(cD3Ix+$EC2ui M07*qoM6N<$f-5iUKmY&$ literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.advanced.security.imageset/advanced security@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.advanced.security.imageset/advanced security@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc3ca9dcf592b8c96bd3c698a8fce529348ebad GIT binary patch literal 931 zcmV;U16=%xP)>KI03}9%`i%F5Zg`hj zK7QMSusYP*!g?9er#)-9HPyu#J7nx7)^99h)29RH=H%~-k2B0Sq-r6XoYPF#x#1an zICd(+fkH)K>Z}1RU(Z)*79jyCOZZf-7WS{3yxgWIY#9M3(YR4j-wXrdX*A_X2 zGByX>f@u^!(dKvoD_7EO!wA}R3MOGg>)RvU_FVi=7{vSx`^M^a=?;c5Z}5`&#|;(~ zK}oesew{sJO@EJz_e@QX;i3|EjCcksT%cL}qT3wy9TiIS0_}yK735mEueh%~gp9|9 zfgUpk>6b*a*ou}g(SyiUbl;R4F|NS}aBl6uRaS;Zp-Q7w0{8S1dbvNP9zM>vtjCN& zQXTHnthPgqSOnH*>V4y52D z!A1(wZ#ot@sYa3gq_9I$-UL6FbcR``T$}+l9mpV&9G7zq^G6W#xlHg zL~b`}Bp2V)v2-ojm}9E`UgWRUcG>7K4m-YH-dY4hpLC9Tt|z&(jRErZTn z{a&f3V?EXN47X2jv-d<#mcij{Q6vcoJl*6k=FKDX{YmjMnX{IW4`unuhec8D^h+swzEiEG@I7Tr375 zSxs~vdv^N{%IyZOyHwCSj!5n2G4EVZP7wP9aZX@3!I&9)ZM+_PL{4CQf^klOeS&dLU{}l}TlR+T zyw^e=8PEsjNn#McDyCEtsHOkBZoMyAAr0Pr9jNZYsNbQm2a6`{tz$hI(KX)DHQqs+ zTXcT8PV*xbd(;W=!#fyzg!R4gBp#quAJA9m{QMC0rD!2O{re8qbn*QPFv|md&hVkp zUvzM>5Z=&(!4Wo-9*NPJ-8nCW_w|ydLJONspTuZ~cjy;~oh59%2uuqXbgv=4S;WP# zMgLx+Ty)4Xdc5Ha;r-WynG9&FiE=T5e%e82XEdD}<`Cr*fvLk(-9y2*h>PJp$|(fn ztU}}bp97Rv1g4I0byt(uwTH4(!2zui>Q|H=^_!;PWEW+Jf=GU9Y)UM#3U!SlG4_mB z?4R6+otpxwq9_dA_{p1IXipCpk7S+d6a`S6MO2^qbNlqThk__h2y$yv?aPT`*N8P@ zE5wwo5L4uy8j6A!W3Sw{rfj#(D1K3tdo=bh>2YL);PknA+Q;$pVt0g(k6l#Mp_m{n z^u+#&Dm__(alHF3P#Z{i$1+nxp*^?apSruF&8$BZdZV-pSJ;+$Z$H%?c<6KyI-*`(~Z8yi0 z;O|)T2mNM0Q3P)&5;V#PQBj^>6-$7NEAJaSF2;z0kEy4(I8ITj<1r^P31^w9;q!o) zN|HDpS)oxZLK6Z=3K5+08d`Va>WnMFQ^CTc&mIKHK!|7h(3LYWLEO}v%+j-L zxmt-|I9d%ZNSoSymi5>yEg}p*1v;q~z%at=KpgqR8tgGxwS0&@vGs%w4l%N|2ZFMkhKoOgLOd8E%x2@+4W`&gz~Nvyfjd~Mf;g0$~c#m ziQn$zJ5+w7XZfsxt)W`&^QJEZTZJ`klnsmLBK0>Ho9mLcL{o(CHPp*7pCvjUQkoov z`TV)S6|>_;E4*ty=;AMIvSskS&4|E6*P3%Eyyl8)h^2KfqBSA8EpR+;i8hYrO}J4t zrU;e3`@p>xsrI1V%W&Msw4Sd(`LPqXL*LRhUOR^|MHO!OHVjuws1024CHky>OS1I) z7d*C2XgPl6*ssV?)lLf$f#GxVx#J4IERv}${W{e0LKs(6SxlB91f&rIG1nM@T+T8N z5dzYQu@uV-VeNeTPM#tJ#EG%!8WUJvh|0L@_eZ%ub2OUvPUkB^Kp@8K_3$+=$^U>0 V4}v0{(1!p3002ovPDHLkV1g?WhNS=i literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/Contents.json new file mode 100644 index 000000000..f7e769e9b --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "eye.closed.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "eye.closed@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "eye.closed@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d1382dc7d83d83d9c5ea25b6c711b2d71fab3d18 GIT binary patch literal 591 zcmV-V05L#C1y(8do8T=71DA zk48muU?ZhHVuvz-mh!-$ao$9E5-`?^HLI( zgvmFRh<$+ywOAp2x=cnSNOvJWK2+)xw!(OzahcW&NebG(@>tPoBvV;KwGw3eFTkbd z63+R(gwnA@aV8NH!!I3nlfb*snU|1e;s!0S4RN=aIWpPKNV~6aJ#rnNmFauK5~*E} zT%Y9ofVV$gj(A&D1s@j?YZr|bEH#vauuG>pwBoPKdh9TMcd!)=G%snkb9MC%6XDi4 dl5o5k<{xhb0ohDc1Ze;O002ovPDHLkV1jx`@wET| literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.autohide.balance.imageset/eye.closed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5aef3b052e96a3f0aae32c1efb29fe3fc6674e85 GIT binary patch literal 1128 zcmV-u1eg1XP)!NQZQI&2vMnuB15l zM~-FLg!0W09LJXT^RBett{4JbyzE0vF6n3l<~4D+dW}y2K06YVCVj5ZUzLtKiqI#( zQs{Uk@{1+`D^IkZ=w7b|pKk-K3MMuo)Of*|`^$A2;X4^sgWJ=4bni9z_|}ySi+syNqV*y}txE<}Q5@3vTX63bjnzS( z8(HGa$C1$BtO@+Rvh@fvp8aSNp!wp9101jSvM%JtvqzNBxFc&^0HxqCkf1Z z^NG8?1(O(W#XXUn17i6GuzdL9<^+^Y+O`Oy1mvX2o0L*X(AzqyF!eXV7KFd2l2#E& z+s=or@Ts>DY7IBx;{mQn%h++q5Sx(hVsO`5zSs$t*f$UOxIq!v3P9 zY~}?`Kqsy$iXxASJzj6pX9F$}*qqut^FU_8FoKb?Obnib#8HLn4|WR|Ohb^N^-MCD zb>RZ;ZBV|bA&-iULoeG;h|75!&|Ki;j$OE+qvAP_>@Y#D>&(A{3pi>NLhKt{AVLq7 zB$&8LUSmnZhhrGAZLTJS3p_rEjkayP&W41y+=mM&+sjFuKlUUVm40ln^cRsuB4-g3 zLX~4tc&A1Ich)R2qlO`6Zx+%>$d$;=j*;}h04|t}qah>2z14k2?Ic$s2LVWVhzN*B zxPY@-^!w|jwE?B6SnmP+&mLw^#-VvYjhcXOaZjpbYw@oiO0AvH_Xc z!ea*gpE!z;kiV1dT27~RA?(o5n#KaKWaoh}g3cOOdt+|ZT+)gWC8sMak)jQnx0V?@KY;+c9kQ$XGsQOf z?kGEVjQxKL67B@TkYpyb%?hd!xax9D_nW64VrmnQwpdx8x*5MI9(wRBw^_|3MkM6E u>Y+aa;v|e>?tezmJd=h?Z@yx-nEV3@&K3naF^I$f0000iO*jZ28KaM|7o?PR*xA(X@9Q(>|a6%jq#B#@ZmMI4hFEJ@c3IP zP7_~L#*Ze5{d*kg_!pFyFcwg;+1z74Qn=KOI16kDjY8MP(nV)XHNCZxHJ)G?R z;X?^n?it%564k3!#+vd4BDO;$qJtu}ihMy&Afnwr!nw@APIS8**Evbf zena>#_q@Di2?<96l8~zd+Y;QX8GSw)KIlmm2y;t;>{7SJl5$3|65`BC-U^X2=0OJH z%u3&Qk*hV(NFYFb%p<{es{M z%XtfK7@+kYMC&&fat-Zutt3ptx8z7Kstu4`&k5vv+tC9v3sTne9hQNO@U1IXK#>3Y z>t&B#&MZh-&vLM_5ug^HZY;@TQ!SJQEz^3U*s!FJ{jL+A#Nn7W2$Ti6upZi#pdZOv zciFHcZ`cGC&ag`;PU&gf#Y7!!BQTmrTQqr#Q)9VSPKs=$ZGI){)snBwD}Rdj9RS|nM%gAfX5N7%*KE3gjhEgX`K5ZR-SiAVyz zf^`I1klOmSODK}BX2|nLo3bKt=z(?EA$PL2*&8Jb#DrdVE+x{?2m4fL6e~Z(rja(U zDH75sDw3N$`ifpmdR44J>J15GU-`5Ksg#yt=!)b@3bB-=wh zUQl$>%>Mi#gnHuffOVlPtJqQ!;sUHO^G0@p+&$|-_qO!`xwHt*_SpO#TN z+-g#9x>#rOm64cqAg;j;ZTR$5J|tQsRAN#_l(F^5m(zpftjW|}Ac8LLLNuW)x+2~5 zzZjLF=tg5%@wJ$%_^zTY8=#q&vw&=%_Xe`-*Dw-E#?ig&_@Q}R?l&p05;UXcx7vx7 z(h2`|j`I?_fI4fgsSimlFWD!Z&F3*DXLsb?l3)!QJ?WML;R9d{Y2swn?F%)zWT9Dk zxorJnA_<)8T)bRx1LYIRHv>J9NPIRtP8tQX6R1RR?=+iYIpm83zgLPSP))zQBO+y> zm&CclB55X)@2*IC0ufsy65U_+e5M=Z*ALp06C+PAT&(<;i8!54lFCBgf}*I&B>hOy zxyd@A)!oVoM97??ur061#**LN$_q4stck(p+W970S5XQMgL9KmiMc=%K0IDIPt(YfiPfvTNOlE^A{{wP)r3Zla2JI2x1e6oN4T!{Vn?1y4W?YiAagtW* zlcJ`v{bu~;d8|-}$y*5QU%=Xk{&isKaY&%>O8+0BTMrl>#8ni^Py9_}>5K>>Y=$`n z8v6q2($xE}3z+m}3vxzZ*4%wu)(4n;j$qA{-a>2-UNaGn0&S|u zMm+(kf0XVDjbS&D1G9U~xvd29s#*i;9nH;7+6uS^wbR5PiY_4h+tf9%F`B@#HFr{0 zEW6$EbHHvewmC>+62$TEKKQEW+QVk;y9kzrGcS<4&pxo$X?jbe=h%#VA$9cJ74<%J tH{IE?;~r&Q)}7oKDV?E!Y|c)sz#lVV<2fSq_sakP002ovPDHLkV1i+oBwqjk literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.change.pin.imageset/Layer_1@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.change.pin.imageset/Layer_1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..68d75889c0d55529373377d1daf1a664b710b38a GIT binary patch literal 1252 zcmVb_x-e@iJ8)O}b|+ z|0K&Zk}&vH`J?fS)jiXn*DZlO;C7aQ;w}Pg0HO>bHz7e|>ZKvjrS~q4-_z#=g(F4`dCaJDeR&QsmrL5jzFkr_(nOd>oEA zLw)t!bh?=W?sFNwe@nABF&}j4GfS6v0;Zdgw)Zo91SI%HyaIf5dgnh5#8MRpD>sqh$V7Hnw!il=n@6@XX@tb#I{~;<-GDIMS$J0p@vtbe<8|2{ACog zoLH#hh9XL-IW~UbwT$Zv3e%32`3UhjGR6WNl-6k%%_y*-D8h5a%T`2qh7>)RA}H=U zs{Atr?@Yt1#r}3ov3X|F5 zdY6$^Z0EG0BIrR6~*&)YvCDeYJxfs*=hxLVsQ^!aQb(MN*t}# zV&gg6d1TCs<{OS)N2RLDADkoXFCgo(^~F>t}#Nv3&aNED!jy{X`!3K71h~J zoA{W<`^1D(2tNFaJP;})sn6=DR%Ln2Uv%T3r>Z|mC9I%NE~HWlJ&OP6wd4_6y+A$y O0000l`5S$~?{&GJ`7^-2tv(;tC`yP`u2m`kat9E6}VUaRs^qofU{9nR)eH=`&Sz zK)RtDPWQPWGXM7x0%%{#sycN$2nb1ZTL-8$A%+&d`VBxdL8x{9OhGgCvjTef?*l&+ z+~D&aNOc39cUKS)0lp!j#I-h_=?}b75=I?t5pada`Uzk1*BJ`BV3Vo;bn6Q^6>;ZYY$L@asrC}#ie?12`^7;@<6kzY?kp& z5{mNa@AoL2YgiuP5KX>jy7qz;6VT^>c0kB)uy{vYhB{w+w_nI5mSok=a4(4cr5mMh0{O?^^}(gIp(?HQ5QqOpLw{Wh$&_KeW= z^dVyb3D}1J(NMEth!zkzXY1~R_znZuzywh6GrbN4bv7uDp>xa1n)SI!7DF?u@*DA> z1vXHVZ}08a^Xoqw)act{vlVbO)f99Eop+!_R`ff(rVFrPXl8PFuon2_@ZB*8tO-+t&laV=pkUVc zm_CC^>H?#gNp9QNl5lFdkm?^a+Uz3)_u7k|L;IP7ce{py*#SFvj-ZM?t#z=4G_d>Q z8%Wui+d0smZy5V0GR+wKTl(K zNIGx=$ucS2`XIMyC(w(hiJ2Z()pep)Pf>E6J{m=eNeZrAS~skE*3OJQoJ{B z3su3DC?4PqR6W4J;1uCBh|+@ru55?%yO}fbo!?C$o#se+Jf{bi!XYShaFw>q$MY&i z>4CtOPNz{kwJ?Ee=yBvMFq{NaB3#9U`-|uF0Q083#-=yn5EM4-bD8CXCrfxh6N~S_ z6((hfB%|~o_wy2Ii&H_Vzet06-~^1Ci@a$(?&KWfg{F7ZpaTsT50m+Q%ied-T6~&S2lVHdPkU9CyotpSK)93E%k_|o6 zYuoeEP9jLo2l*+SnPK9jLqg_7F&re5RToa}wU9_-#sbo27J4S<WiQY@ zQ!Y2bw17y9XksEH8N-vHehNFUMBUpA@~ga`?opG3ZGXE6opHd*`(KYC6jbq~o__}U z0wNVxwd+u|--SV@MfIzk63uFFW}yO~D7%@3pkGvRSbr3f81HRPeQADQOgH#KZY~J} z?GG_%UYa!yX=mQ7F_mS5?!~YLRjgO3H^heB=;E5JokcS!-ptioG^t0vT#lPNF6eU# z&IFYIVgWU{T$&Jom-0|wEI`nSD0Wawkhkf!_eR;-B>Q;@GC3)u7pF~GL*}Ip z$50X53l|hmk)YO8G3jlY>7srqa#nq$^^RH1o&P}a zgGv=^att%Oft=$WPWJ~KYOkWEsky!4VPRgzX;PB>$UDNvv)*dIv8>bChe8g)9KEdW zcE6lFD$jG?&J1c@dPCP`p)!wSV9Qw*wKwat`T7eS7f$awzoSXphD-Fh`~lH7`;Gnu z+?(UO?3#ME=*jRqN6fkT9Q0fdE1vVe@iy^k=((M97S2mxB=lyh$q4u5{icz z1BN8)^+K>&3I8NZYwxTw*^mE>b_h0-y*ARNEL2yw>2#3I>%2{T?zF942b059@o+7F zXWGb?-D=zDV7)XBF3RI{uq@|uQCmJ(mh(BCtR){T%lTYXt%GGbpNmEZYo>8k zjwT(J1xCq*5TX&a}X5E?91 zC)~=63N7<*ghI-BNo=}S_x*4HL*5!y2|7`m%Xy@kFD7c;gwU_7!dZmI?^L#$uIAL| vBC-OH)KIicQB@^C4?-q$q9l4)EwTOzT00^({jJ&g00000NkvXXu0mjfJ4-3s literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.recovery.phrase.imageset/Layer_1@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.recovery.phrase.imageset/Layer_1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8f34f844bf3e7276a710537b88aacfe9cefdac23 GIT binary patch literal 959 zcmV;w13>(VP)%i(A)rSkZ=O<6xM`oht%N&I45X&g2D~b6ObvP-DV%#>XVfj zLhKkhZbB^Un+fBQWTW3tvVT3tVbH;Qr~^&|5jz4y69NZRTF2Wmp}q{MFGKL?9`61? zXD60f8w-7Rib$N{?FGKZ2%Px<@5B8tTGnW};BS9UA)*epU+5wu`ds15uAf$!F4!A; zh;W8-(<9ODVqsFS_jF4`xD7M#N%YBl0e?{)N7fjzk~X@eX^!UzcgJn|dkZshDbhW; zp#*z>4-kbvY3l%HG6A0+!abbKhIG_|xnd=CL{5AWRuS%wA7Hj%NgQR4>)*#PU#z5# zz-e%DCrwm^8jfiWvyZ3@>@z3x-9S~KMUT8nm(42|q3)n4k+^~r^yED**M4#(7VWg< zR%*Rm`h~*9#onD(drcVKk_1*IA_sG!9L&meA3M~IOT6sW2yFT(^(3aX&jCjfoT-nZ z@F3-ci62WxOltca{|*(SnBbXRD};F8N|v#f%C=~>&q1*{tZ>P)`72$tRQjlc^qvjr za{_mFsMTJR{~@?k*g0%ERDw9J`>!5J7kO|2K=2DPA*eT*`C>F(2aQg^&i zn#dhzAEQiOT7>;XStR<%L#e!UjU|UH6B}KRZ`MmkJn4g3EuS|og_n+f@Xlq%1G*k~ z?I!Cnr}fe+VvUFCSiz=ay>xCCz4X^{gN}N;^ohp0^4OZJ$4jfu$w#ntt@e4?N-r&= z$5K4<+Va>rc1OinkC&E1TCgMS_IcPkFYP@x5i*aC+|X*Ti}lj0Vdt>vSiz=ay>xDD zUOEGtmxj$tuN#|}UICkz-e%;G&bMkQHxnLz&95pj3@O6m9+g4-;s`N7RfxnLCtE1L z>1O^smQ(k9f56r4guJZjgv!w=Rh zOehU0)mg~YOc1nb9ow4yvcvWwg@zQ>SJF)ky2LMKvL<-^>Ry9Rz(yDD30Qm^9g%yw hr@jng1Eul!<{#mkoz&j5w21%!002ovPDHLkV1i^Q!k7R6 literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/Contents.json new file mode 100644 index 000000000..b63786d1b --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "reset wallet.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "reset wallet@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "reset wallet@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/reset wallet.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.reset.wallet.imageset/reset wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..fc935680f670d966ddd05afc6be3b745fb274e2e GIT binary patch literal 698 zcmV;r0!96aP)>)Jb1@+At4&j>&3uF_1e`$(5Ku}Gykssda{8obEXA^=PE0@?&y!vy z?>P6!r&c}XdGmslL4*k!=RWkhe-oKnmc3jg`iir#SbS^ZUHSZzRzy+E4&INW7rvIy zUrPX+0HSqq0jZrG+;*aOCZ(E1NSqay1&BAZ!yexI;aROkL^k{bh-7C5x9#YD$Sby8 z}gava&L%YTfpaQ$Nk0mC^Qut1cHe$BG&eDLo=2z0Ho+ z?lvF>B*Hb5-<7Hj70D&LIqhgS7q!@WfF7p?+RbOxR)pN-=eQ}FsZpFyJKforQq5Ko zXmSvEp;A;2$X%cO3P<3={!saz_j!!xMmIJWRqsk_ZjwJ6Ij&Ii<_h9~sId6?-Qr~u zj1ET?9;p{rm&ti8l1c9(Run|9a>HJCBj+g$MAYzWhBeWi{#>%m1SVF6*#-3ix_&zB z)guKBa&9!jns9gNHVwkb^IVr=_lrLve^1$k@ES;e=3K39Rd^`H(XOco}ftg1qU^Gz#X{6vcOC(w8%0}^*zh2oa8 zu|ET?!txePR|TE`2)I3edbHVnOb%=q>H%3+_W;V!{ zRrNDkB_Cg&)(*M?@}(c(c2x6L-Y&gr)=iiIe&&qK49=W@+s1bC`HKbA-F-5CA&l{M z^!j(bE+rbhFXKOZHtCL?Bgn&qe0DI~{9-~tdLqui>7OXpuvIASO9?CYjj)$))Yc#X zSGo6@4tDq^7$Xg!??_t7YEU5;h2;uL*>_?K;82k9S$8+F0|EGxFRkBThwqFr@*oLi z5`6Y6U)+EI2n*`2_W-Yv*1vQ%rcY}KBQlQ2MVnM*zHwX~wZCewfRON=A4k|Ff2sU_ zTUv#Xgc87Op4MLl#)M_THeVA$5K2HtbhgI4Tc`M%5Q4x0>^ntH2;+vX$zd1*l7N8p zLf^=a{@8?e;z?mDAZ|Q9KpO=gnhcmkC_|%-!_}ml0Rtu#DYI(R)Cb~bDj;sA0>WUY zm=dcfaf$N}I|sSBU8Df{Ip`QqLK6W43kE(3yziLEXJA;hgFoXwz?HZz0|iGbfRg!9 zsvY+tus%$1;N$eea2E_Xm6Vi?(Hd?G0hPJ$wZ0GZj9yZ&ppJ>u2h@UrT2Lc{%1#j~ zY&@l(dyb}d++oy}fw6IZ3BJa7CRzcl+_K?nkaAP)qZ8p{JddwND!>w!;e4NNQmtP~ zPZiK9Vu0~$JU;4upq-S-MYW`;tIyg{)Y29ZddBlho&gi0BSj^}6SW59Hxt8*X9Oag zL$qW9iEyGA&j@P#2GMg@&30iMhnn@yaMir&eb6To&n<3jL$vTt>$%&uip6x}Yd`7@+oTkmJWkJNC*LA14?@Hba*RJU7gM`n80yg|ql08apZf`li)d4iC;&J?gRoq}h2 z5%&q=UbO*cp!sMU>tnksEMl;Zj)i5gh<-B+v5t;n{k3P$o;@o7G9tk^Cm)-SiY@oO zX*g8!&?rKRFvvTBoYBbV#~S0-)=97Zv;v7JPV3z=5t{tbgqr|j1HjuTcq7(${ikN+ zsj7xR7$96BfK*va44Q~ky}h?vQJoMf(DBR56e#8 ztKDF$QE>uj%uVe5+~_=bPM|MXoPaKo&IF1vteV`*BEUZ&MHobP`N5Z=hx;pxemxz` zbot<@ZP;r-QJv93g39gswgoBXaAwi;ke1jo9xF~M*`MCO;NNrd!MC8p?-xySsiwN9 z2e^7?fBPBSApW{PzhVGBRkb7GoEU>|LFB@k@=8Qc?$mdxFd+Uk%~GyaFp=D15PV8d z=jE}9uF<^cG?U`a{_eAbnR)g(xEafVG`p~yO zx=5k|`BN{!5?m7mw35{HACRa(ZR@#KT1IOL5+n~v;?XNIjB8DU@T}I??0b(Pa_V; zZ)huW=dkIm&PO z%saxeOWK53pao<+amk&MYsn8d?z9wcAaCOmqzDgSbSO4qn_@^6O{>}cJyFj>DI41&mjgPj@|lDV{tl4foP@GdiVFx4>9y# zJn6>4R%m^r)FZvUzwiips1Ps3g0eu&C+#yd& z1Xa$q2;|jtBKZa55#sRhem?vbMB%lK-`1@r-`r|M&q$FDW)~!YG?l%1XiLPNh9Oo` zRgWnH!Ow(>IXeJSG;@gcKl!no@JEYQMF=v&AV2c|%9(xZ{fB|G$XP zcRln~Au&#rNE5$V4UI^lsKgNrZhZwQB59GL#1V{kJdrAN(Q=1Kk+4tNiV{aK{CGlA zj%k9Y;eSS5EApH|ZW%PNPcn7Eq(9BetCo-!dPrGl)B-m=gure5N0(_Ce{MxztsDpcE8S=Rr4Bvb6P2Q53JN1{{^s*|K*$Q3vneP4! z1J31>&Mh@A8%GQrq)NZy$ZXZi{ap+ry4GTH5q?_JFhs+xF!D`kC=y4U;Il7MbQa*8 zNRcIo?aeniu>{wL#X0HFn8tq(HX>ya6$D1^nYEFf+Q`-XWPN*G#(uCP0M`I-C5Psu zk4_z`sqDz#H!2A1Aq&7+1bC`V+PBAkRes)>W^wGld>POyU)5ir$|+vBbrH)*ibO0O7+N8atH)Jh!{wP{;#SuD&+gU%UAmJ6p Z>i-7HY$fFHgR}qu002ovPDHLkV1g~4H$?yd literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/Contents.json b/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/Contents.json new file mode 100644 index 000000000..9850c6588 --- /dev/null +++ b/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fingerprint.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fingerprint@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fingerprint@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..7af4d044af18a70600933b23cfba1695f4e89a50 GIT binary patch literal 1025 zcmV+c1pfPpP)wcJVBkmhMAW693V0sf~By2sQa_h z9&A(w+=GI)o~o}iZv9H&vU{GSFwudYIoBY?8h1ryENsI{`3wl&1pbam=8^9`d@LQW zG7g~q06N_xEe2tMGqG6~!vLO;i9Qohgl8e}m!TM6Y@4P@_7Mat7jx+aP`#Y<$YyvHR@BxRJHm>hN7!RK^>*^ z;P{&jG+~!NYKWo=Fu4vIGucjbH+_-I;0r4u7B|s2u=UKiNeD`LB5LOjHN<7|QfhiY z)%DorrP`TGGuPRQU6m?a9DQ6@>ACeE{BnWrfR`886PfJJpH^AVUSQbSmGqTiti=D?Af&i4C=DDF?Iebsiv`(a^Ee zguNJgD+blzl^rJ_BB8E0*uih={Fp>#8>ow?X)kz}kiCSskHRcSlSK^Mr9kdDM1sYP zm@ztUgv^G%f7(hdtgVy&^+G2{hNjTwet9NM5}DEk~7vxY}tu}`^lZ5!Uhlr=+bhS$;QCBsEzaiLXtCbfO214`OnzeAkdEanH+{ex(WYkT*@tl$`x;Xj|h zb7#h~0$AJ9_VYYFTlNL;h5V0k=*URa*&O%Pea0%0X=ijubqIQdj8kt7sI0=e!@NFE vgFH`lCTWQH9c6M-di4-1ou0q^ubZ!bGdj)yG@Y~600000NkvXXu0mjfXTsR~ literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint@2x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb3b7cd0902ca57ef30f0f3854b89de3c7ae26e GIT binary patch literal 2042 zcmVOV{rn+2@oeRoB%k1ksZ4#Pl(sVAaR0-6BwTW`2@%(U>(cxtMZnz zv@_|Rp5NV-#M)KqD#6m4o%y=^>znVOV(*gP;NIe0NIrO$B z@SP&yTV(L5ivadO>toQ+Zt!M~pD{?d`d0AG025Fx&JbjG#f&rjIWy0zj1dT2WGB%3 zDTfB~Fu;Rp2NxeyfD$;RuR(|je9gx2Tg~D`nMJDuQgm?qv(g+hkn?TmZO`C=vL5i| z-_Jp-Vd)2zF9&Rr>Cpf^cns@+5(p?T@n8pP zlMdg5#iZg%TEpoEpU?1pOpUKst2{22f-N>~@!O8qDd@qgts$faJ#UnFWUz*7c)2x7 z*F(xFxU*v>Am;naK-U9)GrjX*iKm4=^j>v9l|F@vH_iCmKQA|g#+)a>FL6!n*Brx( zt$lb9;K3AW0H=O&k?nhqu_xZ*Q#+brf(E?0n=ovxP{=o6Cbj2rKsgImM$fp0ntR*IW*Ab@BsmhlS)8q>Ebp57J)W6?ttlr zWiN7C0{G%Hde&Ej5rRG8$#Jt#;?|CC#^+Qp{MmV+mr3j)&Us|#o*-{`8OxOB8(4k9 zXW=bY#l6)8-j=;CVb^b|Y{=UR&^YPnyE12;Bb;1LZ==m5@HW;fz3-ePS)l@_3f#Gz z7g*osXQY7xOB7+RZ+b5f-{kx;dSg5KJca^|q*BK60m>rghmnz|@cXo5ah&@xS>QZ- z_+ol*fK|PFU-3+wn9h(_X=1Dujt=f}^BYqk{=mPbr(K}Ho9W0?hMa+8Tl}(55*(a( zmxZ`z7BWUSZebOHeKf>U1UacTj`3+HNjiz%EuYL>PN)sq8M)G2PRE7<^dSRCr!@i= z3|O^@*L`WWOygOTsR3A=fGI^bEtnETHYgfo%&}jXLQFf@1=eO@1kp+NEzsO#GbI|8C;HGy%qNsSu;nTRr!nLnoKH@o z*8w}sM*|Jby3&M`N{Gu&v$$?s5RsR}j@S7}*w7h$wqM!xXdLO?fga$@g9~1E+y|3{ zLH4|H?tLi`Fol!cok3V!`=rSuU6+63aWN>n_V>G`XIi7zR~{T4=1J(>;SI6#5IuvF zx_%B9CB(Ia60X?C;Ji$#<02h-kdlld=R_`s5WI9$1;+_x*L-gu+96Sut>0p28DRVU z+U>SF4tWNYWE8o9rP(sifp#0oX5g{N!}mXwbtdW3;~oS@9 zXH^TX9aJKU)&}df3h$d^DTKts3MB0<7n0kB1F}vB%9Wgs_Yl`+=Y*YFaIW^sh)T-N z8yhSn&q;|#6-dl?rJpFd9q1~M1e{$^%dveSBvWi$9R3*GV!`i2RukPiodu25LJzBt zeo+TR>2a9c0x87E>l7Zs4Tvm^qicK^5V*M#$iI=!meN!zIVABkbraUHJ6u+b!#Z$a ze#d1<*o}otSzY+^WeX;o}7z4-{Dw74z%Hake2!R z^5?^v?{Y9l&ZtuG{c2bmx6Vt;g-?I>4;K~U_wshh@;dByJN*x=mYT3jM~}#uB8+Rb z@`_HYs^LoKm6@SVOn1_SSd6`%ZqDU%hxW(KyfROG7AaKQKl^Q5M}P$bR#Eb{M8${} zRKU_fT!f>b%tBJ?qHhf0bH|D8Q&hKcDSKE+K7eSA0(jA>7?FTmxNUletY^cjE!iqy z-ReWwjl$ubuSQPKHCZLCtg(OQclznXl7Z;t1h{8(<^*UfhR_{@S48v0vs5&$B+(1h zl_BB!d}j5zKfJs9R(x)z2r;F~6L%A1S;q!DBTT=-IYC!1thIot67cPp8*=5VzJ~K? z@~(X=s^!?Zp*!2fr@q&{`HN~fQ^%FgBu`w#qMJ^_6PJZjh zCpQqEtRZ1U_RNNU93B3TJXf6&LUnPwr>EJn7Fa!CCv0&Hw$H$*m+QCEz;i9)oAym) z^f7-A*O9Kv1Ea$~ZT}hWn1#P8H3Upty_j-6^c*!{`{tSZ80=l{zjZ4{xOM@Jec{@x zin!nA$7mzsHFj4)63|4JbvM(7bZEw;O&4x1mfK=yQd{(OG zJ4d0R7b=S`LXBU*AvBa`fGK3=>OK!mL6K2-1J8f`ub(sqOVW(P4;Axo0&Kj{|L@BGfcZ}O Y4`vnZ7vY3Svj6}907*qoM6N<$g46xi)&Kwi literal 0 HcmV?d00001 diff --git a/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint@3x.png b/DashWallet/Resources/AppAssets.xcassets/Menu/image.touch.id.imageset/fingerprint@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb2ac93b0a298308064ef8b658d9feb2c3e98dc GIT binary patch literal 3086 zcmV+p4Ds`cP)2rcYq`1g6&X z<}u1!D&h>b8z4E|4a^Mxl*(5nn;iTM(D?cXK-0iqiT%jqQeDi}wKe5V{X<;hwNrLD1xj ztq%5jfD_n*&4Pq*1-A79y5Ejq!`O@eTHp8JHt@$T@$)@U54QqPP{q6;90ILh))&Gvc6+Nh9fIT<9@ zPq6MV!=!R?a9S`T6d50aR>i>jBL0;HuPWvSX>Z6 z6)uuxg?mve0Pae`WMJH`w*^|D25rdPj=)EZE3TJ{C;DG5aV(uxjOk*6=zl?j=z59P zBm6r|4t6$qXOGu(r6UM#^L6dS0$bmScDA*@s4$uZQ6&V2YS5bWA{KZ7e06+Ju5?ft zNA$OI$B?)IDPR<$6~5=J3F7oP7(;SdYl)|*;S;(#psd-$_8to0`U!S~uC!$x~Jse>Bf zjPUOTJlh$Frzv5O&3N|RA=Dr(h~U3T-!kz$DFiRDH;`fh#SsqPg1sB8>`8t`-8Y89 z_NU46R8W-?MnmwG7Q{JPUm)wtkWz#=|J)sIBG8$G7AMbp6#^L`GmgZQ zm*YWHw z0)^2P^@{w1dZ(;2AHH}&!d2=JHf29j!YT)Rxn>-Z9Qbs_Nf^7Tq>J@SJ9a)MH{KUD za(DzkN!D55gD#X^AiC)|eo-Ni>!sCL|6Jl^IvEL~H@QUvT8++v`b|MXA*0RFR)PU8 z2s%&DmY=A}L5$ILd}PVh23P9U_}w)ANbN~R-i`nqdA5-Oqd)pgtEmU=;nM2lh0!`> zF$ws05(_zUC+9(nL*7UXYlidjCpAfBe7s705*=!HNu=&x|UEaXXM9>U_r zicY3zvUSlRP0A{prBx*IA~LoJf=GD^+j=No9=p_(%lZ%rfvB6i?#5iH58>Op&{h4t z{ERAKj@c7D48D6f_YkRtw093?<#sw)?VAUZ?xb_dene_B?ngo(6*%2_R4D|S6!q;V zw*b7i+WO6VEMhQkM=o2dNYO5B3(d#DFQPv>U!6^7`hO-XIMtv~A*&J;F-jlTQ2_Si z_wpGHoD3h?kn{0xVN$qC^gn$M&pS{B2T$0yOiuJ6h4CtKM22u-IX95Sc*s13oeugf zD;$XxT!al|spT84;wY57$QDtvKlLP<1>4i-mwvTr1E=AP@(^mGwC{*mu~qg%^Ww&s z-ZyO@1QAw_^c}4>MqV8L%upa^gLbEMD8fN%Q{_d{$Z!|?X6mI%gozH>6G?x9gV*A_ zR(t2qP)khJ!-|)Xm5strb09k^-pX>t2BN31FJIE9+!TrWEiw$Je{o1o!JTq*kt@`! zpbZ|dzSydV^7cTscYFRZG$K@-LqwT=kXbn`(t5 zKwza5h{ZEfJ`qjtK>yDCn~yEjVu|u^M^b&vWB-~k;0nu46XA5$!HzUuF)f{n;KCtE zwHF~F+7_uM7e-8f%?f7pLb(~#mP7Gg^pEqmfx2_ctthM`I`>h2_ZKlGEEAO9XQ=Sn z2SyF&65h=fN9sMt5i274v#`27xmM-Mty^hy^SfQE_7}&ZLSZu5fx4a2FW}o}>>MNp z3!f^J`qj~&V6=5k^TPthvI3ln0rix3CN3wnq(I6?iK@St{!*}k{tUtBvG=KkVT&3V zGb+nqcXdH53#06fKLqj~g`Q{8j?uRfERyt2(w_;_;vq3de2Bw^ylp{S=!NmeZT*Xs zJuxaD-Aatu1$mTiZu-cU0_>VDH?^ow}g;6ZrbPe6l?`Z=sJu-d5A(K}SAE0=Kn`+Bl7@^LE`TDMzHGDFLpL!!KC7y{F%JRBJCXhiUf#7>= z6dQ0|4)h(eQW=4Adil0Gf~#|3h<1CV+UwXuvd(GMRqZuWo~i;Uh=x^(Cd0P1_U=kn zr3jC$df|pp*LN^z!g@oDg(nli91qP(Bw-&HT6x9#yX42 zp}1jRQi9@rWw0V_6kO=R=(t@^MjJe1q@bW_qT=1lp($i{t#4pKgn&xy8jWN?lb~q- zFZEanMol!1NSA>!ehp`x#w{Ed1wqh(%*>V8Kab*S$~y=*>F*Y>E$$8IZsM7`Eni2+ z8}YS@4Vu{XN99=B^H1v>w+D*$U^UdQny0r5pEbK6Z(4C#UULMn;9kQ@|Gdc*V0~My zQA_XWyyT{)?^tR|4tnX`K^?jlU6Le&|)cHeeYgIw0ot?kSfUE3zl7RG(PCn6#7q$rn4K9OkGmWErafp|7cE-lol zF{Kkq=&L|={LXSSL$SuoobOvHb=rs3PP%c2?b9$q9997~un`DvjG=^p0gnrIc`IRc~h=&gHI;lkWLvhKhJQcSrbFtij&^TRYStR(#)E_fg>C?$lzsDXGE&O-OXXT_!s;QnvJC-!1~DB`!;^m_@mk~-^+ z*pm9a7@dVuRz3ac{LKwuGmNN1aAgnS-)Qkuzvc4jez;{O%zlVg-`Bmsz~2EOcGzC) cw_j`G{~F8yFn(O;$p8QV07*qoM6N<$f)#4tDgXcg literal 0 HcmV?d00001 diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 3f1e94e7e..42e274f32 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -176,7 +176,7 @@ class MainMenuViewController: UIViewController { } @objc private func showSecurity() { - let controller = DWSecurityMenuViewController() + let controller = SecurityMenuViewController() controller.delegate = delegate navigationController?.pushViewController(controller, animated: true) } diff --git a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.h b/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.h deleted file mode 100644 index 90e86e7ad..000000000 --- a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWWipeDelegate.h" - -NS_ASSUME_NONNULL_BEGIN - - -@interface DWSecurityMenuViewController : UIViewController - -@property (nullable, nonatomic, weak) id delegate; - -- (instancetype)init; - -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; -- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.m b/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.m deleted file mode 100644 index 99d750124..000000000 --- a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuViewController.m +++ /dev/null @@ -1,346 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWSecurityMenuViewController.h" - -#import - -#import "DWAdvancedSecurityViewController.h" -#import "DWFormTableViewController.h" -#import "DWPreviewSeedPhraseModel.h" -#import "DWPreviewSeedPhraseViewController.h" -#import "DWResetWalletInfoViewController.h" -#import "DWSecurityMenuModel.h" -#import "DWSetPinViewController.h" -#import "DWUIKit.h" -#import "dashwallet-Swift.h" - -#if SNAPSHOT -#import "DWDemoAdvancedSecurityViewController.h" -#endif /* SNAPSHOT */ - -NS_ASSUME_NONNULL_BEGIN - -@interface DWSecurityMenuViewController () - -@property (null_resettable, nonatomic, strong) DWSecurityMenuModel *model; -@property (nonatomic, strong) DWFormTableViewController *formController; - -@end - -@implementation DWSecurityMenuViewController - -- (instancetype)init { - self = [super initWithNibName:nil bundle:nil]; - if (self) { - - self.title = NSLocalizedString(@"Security", nil); - self.hidesBottomBarWhenPushed = YES; - } - return self; -} - -- (DWSecurityMenuModel *)model { - if (!_model) { - _model = [[DWSecurityMenuModel alloc] init]; - } - - return _model; -} - -- (NSArray *)items { - __weak typeof(self) weakSelf = self; - - NSMutableArray *items = [NSMutableArray array]; - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"View Recovery Phrase", nil)]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf showSeedPharseAction]; - }; - [items addObject:cellModel]; - } - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Change PIN", nil)]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf changePinAction]; - }; - [items addObject:cellModel]; - } - - if (self.model.hasTouchID || self.model.hasFaceID) { - NSString *title = self.model.hasTouchID ? NSLocalizedString(@"Enable Touch ID", nil) : NSLocalizedString(@"Enable Face ID", nil); - DWSwitcherFormCellModel *cellModel = [[DWSwitcherFormCellModel alloc] initWithTitle:title]; - cellModel.on = self.model.biometricsEnabled; - cellModel.didChangeValueBlock = ^(DWSwitcherFormCellModel *_Nonnull cellModel) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf biometricSwitchAction:cellModel]; - }; - [items addObject:cellModel]; - } - - { - DWSwitcherFormCellModel *cellModel = [[DWSwitcherFormCellModel alloc] initWithTitle:NSLocalizedString(@"Autohide Balance", nil)]; - cellModel.on = self.model.balanceHidden; - cellModel.didChangeValueBlock = ^(DWSwitcherFormCellModel *_Nonnull cellModel) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - strongSelf.model.balanceHidden = cellModel.on; - }; - [items addObject:cellModel]; - } - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Advanced Security", nil)]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf showAdvancedSecurity]; - }; -#if SNAPSHOT - cellModel.accessibilityIdentifier = @"menu_security_advanced_item"; -#endif /* SNAPSHOT */ - [items addObject:cellModel]; - } - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Reset Wallet", nil)]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf resetWalletAction]; - }; - [items addObject:cellModel]; - } - - return [items copy]; -} - -- (NSArray *)sections { - NSMutableArray *sections = [NSMutableArray array]; - - for (DWBaseFormCellModel *item in [self items]) { - DWFormSectionModel *section = [[DWFormSectionModel alloc] init]; - section.items = @[ item ]; - [sections addObject:section]; - } - - return [sections copy]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - - DWFormTableViewController *formController = [[DWFormTableViewController alloc] initWithStyle:UITableViewStylePlain]; - [formController setSections:[self sections] placeholderText:nil]; - - [self dw_embedChild:formController]; - self.formController = formController; -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -#pragma mark - DWSetPinViewControllerDelegate - -- (void)setPinViewControllerDidSetPin:(DWSetPinViewController *)controller { - [controller.navigationController dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)setPinViewControllerDidCancel:(DWSetPinViewController *)controller { - [controller.navigationController dismissViewControllerAnimated:YES completion:nil]; -} - -#pragma mark - DWSecureWalletDelegate - -- (void)secureWalletRoutineDidCancel:(UIViewController *)controller { - [self.navigationController popViewControllerAnimated:YES]; -} - -- (void)secureWalletRoutineDidVerify:(UIViewController *)controller { -} - -- (void)secureWalletRoutineDidFinish:(DWVerifiedSuccessfullyViewController *)controller { - NSAssert(NO, @"This delegate method shouldn't be called from a preview seed phrase VC"); -} - -#pragma mark - Private - -- (void)showSeedPharseAction { - DSAuthenticationManager *authenticationManager = [DSAuthenticationManager sharedInstance]; - [authenticationManager - authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticated, BOOL usedBiometrics, BOOL cancelled) { - if (!authenticated) { - return; - } - - DWPreviewSeedPhraseModel *model = [[DWPreviewSeedPhraseModel alloc] init]; - [model getOrCreateNewWallet]; - - DWPreviewSeedPhraseViewController *controller = - [[DWPreviewSeedPhraseViewController alloc] initWithModel:model]; - controller.hidesBottomBarWhenPushed = YES; - controller.delegate = self; - [self.navigationController pushViewController:controller animated:YES]; - }]; -} - -- (void)changePinAction { - [self.model changePinContinueBlock:^(BOOL allowed) { - if (!allowed) { - return; - } - - DWSetPinViewController *controller = [DWSetPinViewController controllerWithIntent:DWSetPinIntent_ChangePin]; - controller.delegate = self; - DWNavigationController *navigationController = [[DWNavigationController alloc] initWithRootViewController:controller]; - navigationController.modalPresentationStyle = UIModalPresentationFullScreen; - [self presentViewController:navigationController animated:YES completion:nil]; - }]; -} - -- (void)showAdvancedSecurity { -#if SNAPSHOT - DWDemoAdvancedSecurityViewController *controller = [[DWDemoAdvancedSecurityViewController alloc] init]; - [self.navigationController pushViewController:controller animated:YES]; -#else - DSAuthenticationManager *authenticationManager = [DSAuthenticationManager sharedInstance]; - [authenticationManager - authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticated, BOOL usedBiometrics, BOOL cancelled) { - if (!authenticated) { - return; - } - - DWAdvancedSecurityViewController *controller = [[DWAdvancedSecurityViewController alloc] init]; - [self.navigationController pushViewController:controller animated:YES]; - }]; -#endif /* SNAPSHOT */ -} - -- (void)biometricSwitchAction:(DWSwitcherFormCellModel *)cellModel { - __weak typeof(self) weakSelf = self; - [self.model setBiometricsEnabled:cellModel.on - completion:^(BOOL success) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - if (!success) { - const BOOL wasEnabled = cellModel.on; - cellModel.on = !cellModel.on; - - // Face / Touch ID access was disabled but the user wants to enabled it - if (wasEnabled) { - [strongSelf showBiometricsAccessAlertRequest]; - } - } - - [strongSelf.formController setSections:[strongSelf sections] - placeholderText:nil]; - }]; -} - -- (void)resetWalletAction { - DWResetWalletInfoViewController *controller = [DWResetWalletInfoViewController controller]; - controller.delegate = self.delegate; - [self.navigationController pushViewController:controller animated:YES]; -} - -- (void)showBiometricsAccessAlertRequest { - NSString *displayName = [NSBundle mainBundle].infoDictionary[@"CFBundleDisplayName"]; - NSString *titleString = nil; - NSString *messageString = nil; - if (self.model.hasTouchID) { - titleString = [NSString stringWithFormat:NSLocalizedString(@"%@ is not allowed to access Touch ID", nil), - displayName]; - messageString = NSLocalizedString(@"Allow Touch ID access in Settings", nil); - } - else if (self.model.hasFaceID) { - titleString = [NSString stringWithFormat:NSLocalizedString(@"%@ is not allowed to access Face ID", nil), - displayName]; - messageString = NSLocalizedString(@"Allow Face ID access in Settings", nil); - } - else { - NSAssert(NO, @"Inconsistent state"); - } - - UIAlertController *alert = [UIAlertController alertControllerWithTitle:titleString - message:messageString - preferredStyle:UIAlertControllerStyleAlert]; - UIAlertAction *okAction = [UIAlertAction - actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleCancel - handler:nil]; - [alert addAction:okAction]; - - UIAlertAction *settingsAction = [UIAlertAction - actionWithTitle:NSLocalizedString(@"Settings", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *_Nonnull action) { - NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; - if (url && [[UIApplication sharedApplication] canOpenURL:url]) { - [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; - } - }]; - [alert addAction:settingsAction]; - - alert.preferredAction = settingsAction; - - [self presentViewController:alert animated:YES completion:nil]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Security/ResetWalletInfo/DWResetWalletInfoViewController.h b/DashWallet/Sources/UI/Menu/Security/ResetWalletInfo/DWResetWalletInfoViewController.h index 8245fdf09..14651a720 100644 --- a/DashWallet/Sources/UI/Menu/Security/ResetWalletInfo/DWResetWalletInfoViewController.h +++ b/DashWallet/Sources/UI/Menu/Security/ResetWalletInfo/DWResetWalletInfoViewController.h @@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, nonatomic, weak) id delegate; -+ (instancetype)controller; ++ (instancetype)controller NS_SWIFT_NAME(make()); @end diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift new file mode 100644 index 000000000..5101c25ef --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift @@ -0,0 +1,235 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import SwiftUI +import Combine + +class SecurityMenuViewController: UIViewController { + @objc weak var delegate: DWWipeDelegate? + private lazy var viewModel = SecurityMenuViewModel() + private var cancellables = Set() + + @objc init() { + super.init(nibName: nil, bundle: nil) + title = NSLocalizedString("Security", comment: "") + hidesBottomBarWhenPushed = true + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.dw_secondaryBackground() + + let content = SecurityMenuContent(viewModel: self.viewModel) + let swiftUIController = UIHostingController(rootView: content) + swiftUIController.view.backgroundColor = UIColor.dw_secondaryBackground() + dw_embedChild(swiftUIController) + + setupNavigationObserver() + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + private func setupNavigationObserver() { + viewModel.$navigationDestination + .receive(on: DispatchQueue.main) + .sink { [weak self] destination in + switch destination { + case .viewRecoveryPhrase: + self?.showSeedPhraseAction() + case .changePin: + self?.changePinAction() + case .advancedSecurity: + self?.showAdvancedSecurity() + case .resetWallet: + self?.resetWalletAction() + case .none: + break + } + } + .store(in: &cancellables) + + viewModel.$showBiometricsAlert + .filter { $0 } + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.showBiometricsAccessAlertRequest() + } + .store(in: &cancellables) + } + + // MARK: - Actions + + private func showSeedPhraseAction() { + DSAuthenticationManager.sharedInstance() + .authenticate( + withPrompt: nil, + usingBiometricAuthentication: false, + alertIfLockout: true + ) { [weak self] authenticated, usedBiometrics, cancelled in + guard authenticated else { return } + + let model = DWPreviewSeedPhraseModel() + model.getOrCreateNewWallet() + + let controller = DWPreviewSeedPhraseViewController(model: model) + controller.hidesBottomBarWhenPushed = true + controller.delegate = self + self?.navigationController?.pushViewController(controller, animated: true) + } + } + + private func changePinAction() { + viewModel.model.changePinContinue { [weak self] allowed in + guard allowed else { return } + + let controller = DWSetPinViewController(intent: .changePin) + controller.delegate = self + let navigationController = BaseNavigationController(rootViewController: controller) + navigationController.modalPresentationStyle = .fullScreen + self?.present(navigationController, animated: true) + } + } + + private func showAdvancedSecurity() { + #if SNAPSHOT + let controller = DWDemoAdvancedSecurityViewController() + navigationController?.pushViewController(controller, animated: true) + #else + DSAuthenticationManager.sharedInstance() + .authenticate( + withPrompt: nil, + usingBiometricAuthentication: false, + alertIfLockout: true + ) { [weak self] authenticated, usedBiometrics, cancelled in + guard authenticated else { return } + + let controller = DWAdvancedSecurityViewController() + self?.navigationController?.pushViewController(controller, animated: true) + } + #endif + } + + private func resetWalletAction() { + let controller = DWResetWalletInfoViewController.make() + controller.delegate = delegate + navigationController?.pushViewController(controller, animated: true) + } + + private func showBiometricsAccessAlertRequest() { + let displayName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String ?? "" + let titleString: String + let messageString: String + + if viewModel.model.hasTouchID { + titleString = String(format: NSLocalizedString("%@ is not allowed to access Touch ID", comment: ""), displayName) + messageString = NSLocalizedString("Allow Touch ID access in Settings", comment: "") + } else if viewModel.model.hasFaceID { + titleString = String(format: NSLocalizedString("%@ is not allowed to access Face ID", comment: ""), displayName) + messageString = NSLocalizedString("Allow Face ID access in Settings", comment: "") + } else { + assertionFailure("Inconsistent state") + return + } + + let alert = UIAlertController(title: titleString, message: messageString, preferredStyle: .alert) + + let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) + alert.addAction(cancelAction) + + let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { _ in + if let url = URL(string: UIApplication.openSettingsURLString), + UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) + } + } + alert.addAction(settingsAction) + alert.preferredAction = settingsAction + + present(alert, animated: true) + } +} + +// MARK: - DWSetPinViewControllerDelegate + +extension SecurityMenuViewController: DWSetPinViewControllerDelegate { + func setPinViewControllerDidSetPin(_ controller: DWSetPinViewController) { + controller.navigationController?.dismiss(animated: true) + } + + func setPinViewControllerDidCancel(_ controller: DWSetPinViewController) { + controller.navigationController?.dismiss(animated: true) + } +} + +// MARK: - DWSecureWalletDelegate + +extension SecurityMenuViewController: DWSecureWalletDelegate { + func secureWalletRoutineDidFinish(_ controller: VerifiedSuccessfullyViewController) { + assertionFailure("This delegate method shouldn't be called from a preview seed phrase VC") + } + + func secureWalletRoutineDidCancel(_ controller: UIViewController) { + navigationController?.popViewController(animated: true) + } + + func secureWalletRoutineDidVerify(_ controller: UIViewController) { + // Verification handled + } +} + +// MARK: - SecurityMenuContent + +struct SecurityMenuContent: View { + @StateObject var viewModel: SecurityMenuViewModel + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(spacing: 0) { + ForEach(viewModel.items) { item in + MenuItem( + title: item.title, + subtitle: item.subtitle, + details: item.details, + icon: item.icon, + showInfo: item.showInfo, + showChevron: false, + showToggle: item.showToggle, + isToggled: item.isToggled, + action: item.action + ) + .frame(minHeight: 60) + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + + Spacer() + } + .padding(.horizontal, 20) + .padding(.top, 16) + } +} diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift new file mode 100644 index 000000000..17abbe4b3 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift @@ -0,0 +1,134 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2024 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import Combine + +enum SecurityMenuNavigationDestination { + case viewRecoveryPhrase + case changePin + case advancedSecurity + case resetWallet +} + +class SecurityMenuViewModel: ObservableObject { + @Published var navigationDestination: SecurityMenuNavigationDestination? + @Published var showBiometricsAlert = false + @Published var items: [MenuItemModel] = [] + @Published var biometricsEnabled = false + @Published var balanceHidden = false + + let model = DWSecurityMenuModel() + + init() { + setupItems() + biometricsEnabled = model.biometricsEnabled + balanceHidden = model.balanceHidden + } + + private func setupItems() { + var menuItems: [MenuItemModel] = [] + + menuItems.append(MenuItemModel( + title: NSLocalizedString("View Recovery Phrase", comment: ""), + icon: .custom("image.recovery.phrase", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .viewRecoveryPhrase + } + )) + + menuItems.append(MenuItemModel( + title: NSLocalizedString("Change PIN", comment: ""), + icon: .custom("image.change.pin", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .changePin + } + )) + + if model.hasTouchID || model.hasFaceID { + let title = model.hasTouchID ? NSLocalizedString("Enable Touch ID", comment: "") : NSLocalizedString("Enable Face ID", comment: "") + let iconName = model.hasTouchID ? "image.touch.id" : "image.face.id" + menuItems.append(MenuItemModel( + title: title, + icon: .custom(iconName, maxHeight: 22), + showToggle: true, + isToggled: self.biometricsEnabled, + action: { [weak self] in + guard let self = self else { return } + let newValue = !self.biometricsEnabled + self.toggleBiometrics(newValue) + } + )) + } + + menuItems.append(MenuItemModel( + title: NSLocalizedString("Autohide Balance", comment: ""), + icon: .custom("image.autohide.balance", maxHeight: 22), + showToggle: true, + isToggled: self.balanceHidden, + action: { [weak self] in + guard let self = self else { return } + let newValue = !self.balanceHidden + self.model.balanceHidden = newValue + } + )) + + menuItems.append(MenuItemModel( + title: NSLocalizedString("Advanced Security", comment: ""), + icon: .custom("image.advanced.security", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .advancedSecurity + } + )) + + menuItems.append(MenuItemModel( + title: NSLocalizedString("Reset Wallet", comment: ""), + icon: .custom("image.reset.wallet", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .resetWallet + } + )) + + items = menuItems + } + + private func toggleBiometrics(_ enabled: Bool) { + model.setBiometricsEnabled(enabled) { [weak self] success in + DispatchQueue.main.async { + if !success { + // Revert the toggle + self?.biometricsEnabled = !enabled + + // Show alert if trying to enable but access was denied + if enabled { + self?.showBiometricsAlert = true + } + } else { + self?.biometricsEnabled = enabled + } + + // Refresh items to update the toggle state + self?.setupItems() + } + } + } + + func resetNavigation() { + navigationDestination = nil + showBiometricsAlert = false + } +} diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index e8191c780..d489fba0c 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -165,7 +165,16 @@ static const bool _SNAPSHOT = 0; #import "DWSharedUIConstants.h" #import "DWUserProfileContainerView.h" #import "DWDashPayReadyProtocol.h" -#import "DWSecurityMenuViewController.h" +#import "DWSecurityMenuModel.h" +#import "DWSetPinViewController.h" +#import "DWAdvancedSecurityViewController.h" +#import "DWResetWalletInfoViewController.h" +#import "DWPreviewSeedPhraseModel.h" +#import "DWPreviewSeedPhraseViewController.h" +#import "DWSecureWalletDelegate.h" +#if SNAPSHOT +#import "DWDemoAdvancedSecurityViewController.h" +#endif //MARK: Onboarding #import "DWTransactionStub.h" From ffe0e82b9e98f23c4575301feebf1aec4811d723 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Wed, 23 Jul 2025 18:28:51 +0700 Subject: [PATCH 03/14] chore: cleanup unneeded classes --- DashWallet.xcodeproj/project.pbxproj | 54 ---- .../Views/Cells/DWMainMenuTableViewCell.h | 30 -- .../Views/Cells/DWMainMenuTableViewCell.m | 122 -------- .../Views/Cells/DWMainMenuTableViewCell.xib | 120 -------- .../Menu/Main/Views/MainMenuContentView.swift | 261 ------------------ .../UI/Menu/Main/Views/Model/DWMainMenuItem.h | 39 --- .../Menu/Main/Views/Model/DWMainMenuModel.h | 32 --- .../Menu/Main/Views/Model/DWMainMenuModel.m | 78 ------ DashWallet/ar.lproj/Localizable.strings | 21 -- DashWallet/bg.lproj/Localizable.strings | 21 -- DashWallet/ca.lproj/Localizable.strings | 21 -- DashWallet/cs.lproj/Localizable.strings | 21 -- DashWallet/da.lproj/Localizable.strings | 21 -- DashWallet/dashwallet-Bridging-Header.h | 2 - DashWallet/de.lproj/Localizable.strings | 21 -- DashWallet/el.lproj/Localizable.strings | 21 -- DashWallet/en.lproj/Localizable.strings | 21 -- DashWallet/eo.lproj/Localizable.strings | 21 -- DashWallet/es.lproj/Localizable.strings | 21 -- DashWallet/et.lproj/Localizable.strings | 21 -- DashWallet/fa.lproj/Localizable.strings | 21 -- DashWallet/fi.lproj/Localizable.strings | 21 -- DashWallet/fil.lproj/Localizable.strings | 21 -- DashWallet/fr.lproj/Localizable.strings | 21 -- DashWallet/hr.lproj/Localizable.strings | 21 -- DashWallet/hu.lproj/Localizable.strings | 21 -- DashWallet/id.lproj/Localizable.strings | 21 -- DashWallet/it.lproj/Localizable.strings | 21 -- DashWallet/ja.lproj/Localizable.strings | 21 -- DashWallet/ko.lproj/Localizable.strings | 21 -- DashWallet/mk.lproj/Localizable.strings | 21 -- DashWallet/ms.lproj/Localizable.strings | 21 -- DashWallet/nb.lproj/Localizable.strings | 21 -- DashWallet/nl.lproj/Localizable.strings | 21 -- DashWallet/pl.lproj/Localizable.strings | 21 -- DashWallet/pt.lproj/Localizable.strings | 21 -- DashWallet/ro.lproj/Localizable.strings | 21 -- DashWallet/ru.lproj/Localizable.strings | 21 -- DashWallet/sk.lproj/Localizable.strings | 21 -- DashWallet/sl.lproj/Localizable.strings | 21 -- DashWallet/sl_SI.lproj/Localizable.strings | 21 -- DashWallet/sq.lproj/Localizable.strings | 21 -- DashWallet/sr.lproj/Localizable.strings | 21 -- DashWallet/sv.lproj/Localizable.strings | 21 -- DashWallet/th.lproj/Localizable.strings | 21 -- DashWallet/tr.lproj/Localizable.strings | 21 -- DashWallet/uk.lproj/Localizable.strings | 21 -- DashWallet/vi.lproj/Localizable.strings | 21 -- DashWallet/zh-Hans.lproj/Localizable.strings | 21 -- .../zh-Hant-TW.lproj/Localizable.strings | 21 -- DashWallet/zh.lproj/Localizable.strings | 21 -- DashWallet/zh_TW.lproj/Localizable.strings | 21 -- 52 files changed, 1641 deletions(-) delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.h delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.m delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.xib delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/MainMenuContentView.swift delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuItem.h delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.h delete mode 100644 DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.m diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index b16f8cf67..47c17653a 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -180,9 +180,6 @@ 2A74EFFB2305464C00C475EB /* DWRecoverTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A74EFFA2305464C00C475EB /* DWRecoverTextView.m */; }; 2A74EFFE2305763F00C475EB /* DWRecoverModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A74EFFD2305763F00C475EB /* DWRecoverModel.m */; }; 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */; }; - 2A7A7BBE2347950700451078 /* DWMainMenuTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBC2347950700451078 /* DWMainMenuTableViewCell.m */; }; - 2A7A7BBF2347950700451078 /* DWMainMenuTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */; }; - 2A7A7BC3234797FC00451078 /* DWMainMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC2234797FC00451078 /* DWMainMenuModel.m */; }; 2A7A7BC92347E0D700451078 /* DWBaseFormTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */; }; 2A7A7BD02348A34800451078 /* DWSecurityMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */; }; 2A7A7BD62348CB6600451078 /* SettingsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */; }; @@ -762,8 +759,6 @@ 75EBAA262BBA9DC2004488E3 /* ZenLedger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA242BBA9DC2004488E3 /* ZenLedger.swift */; }; 75EBAA292BBBE385004488E3 /* ZenLedgerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA282BBBE385004488E3 /* ZenLedgerViewModel.swift */; }; 75EBAA2A2BBBE385004488E3 /* ZenLedgerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA282BBBE385004488E3 /* ZenLedgerViewModel.swift */; }; - 75EE38D32CBE9EFC00845FFF /* MainMenuContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EE38D22CBE9EFC00845FFF /* MainMenuContentView.swift */; }; - 75EE38D42CBE9EFC00845FFF /* MainMenuContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EE38D22CBE9EFC00845FFF /* MainMenuContentView.swift */; }; 75EE38D82CBFE52E00845FFF /* ContactsPlaceholderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EE38D72CBFE52B00845FFF /* ContactsPlaceholderViewController.swift */; }; 75EE9F422DE2F750000AD1AD /* DashSpendConfirmationDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EE9F412DE2F74B000AD1AD /* DashSpendConfirmationDialog.swift */; }; 75EE9F432DE2F750000AD1AD /* DashSpendConfirmationDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EE9F412DE2F74B000AD1AD /* DashSpendConfirmationDialog.swift */; }; @@ -1415,7 +1410,6 @@ C9D2C8712A320AA000D15901 /* DerivationPathKeysViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615029F158D700002D82 /* DerivationPathKeysViewController.swift */; }; C9D2C8722A320AA000D15901 /* DSTransaction+DashWallet.m in Sources */ = {isa = PBXBuildFile; fileRef = 4709C31D2880247C00B4BD48 /* DSTransaction+DashWallet.m */; }; C9D2C8742A320AA000D15901 /* DWLocalCurrencyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C1C234B771400451078 /* DWLocalCurrencyModel.m */; }; - C9D2C8752A320AA000D15901 /* DWMainMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC2234797FC00451078 /* DWMainMenuModel.m */; }; C9D2C8762A320AA000D15901 /* DWUpholdMainnetConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = FB8ACEB522E0502100EE5035 /* DWUpholdMainnetConstants.m */; }; C9D2C8792A320AA000D15901 /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FA829DC09CF001BC549 /* Style.swift */; }; C9D2C87A2A320AA000D15901 /* PayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C917024029D462C6008C034D /* PayViewController.swift */; }; @@ -1461,7 +1455,6 @@ C9D2C8B02A320AA000D15901 /* DWPhraseRepairChildViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A9172D225233F4F0024B4C5 /* DWPhraseRepairChildViewController.m */; }; C9D2C8B12A320AA000D15901 /* SingleInputAddressSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B8449928F6D5480082770C /* SingleInputAddressSelector.swift */; }; C9D2C8B22A320AA000D15901 /* CoinbaseAccountAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6EDFAC28C896BC000427E7 /* CoinbaseAccountAddress.swift */; }; - C9D2C8B32A320AA000D15901 /* DWMainMenuTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBC2347950700451078 /* DWMainMenuTableViewCell.m */; }; C9D2C8B42A320AA000D15901 /* CrowdNodeTransferViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1141E4C1291BB12200ACDA9E /* CrowdNodeTransferViewController.swift */; }; C9D2C8B62A320AA000D15901 /* CBAuthInterop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478483E729629C0700E05A5A /* CBAuthInterop.swift */; }; C9D2C8B82A320AA000D15901 /* CoinbaseAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4789D26F29825F5400BAFEFA /* CoinbaseAmountViewController.swift */; }; @@ -1568,7 +1561,6 @@ C9D2C93D2A320AA000D15901 /* QuickReceive.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A8C24B5233370A600000D43 /* QuickReceive.storyboard */; }; C9D2C93E2A320AA000D15901 /* Tx.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 47A514612848FEAD005A8E3E /* Tx.storyboard */; }; C9D2C93F2A320AA000D15901 /* DashSyncCurrentCommit in Resources */ = {isa = PBXBuildFile; fileRef = 2A8F420821BED16300858B91 /* DashSyncCurrentCommit */; }; - C9D2C9402A320AA000D15901 /* DWMainMenuTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */; }; C9D2C9412A320AA000D15901 /* VerifiedSuccessfully.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2AD1CE9E22DFBA6C00C99324 /* VerifiedSuccessfully.storyboard */; }; C9D2C9422A320AA000D15901 /* Setup.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A4430EA22CBBA82009BAF7F /* Setup.storyboard */; }; C9D2C9432A320AA000D15901 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C94F5E8729D3E7E30034FD57 /* GoogleService-Info.plist */; }; @@ -1962,12 +1954,6 @@ 2A74F0082305F1C100C475EB /* DWRecoverAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWRecoverAction.h; sourceTree = ""; }; 2A7A7BAC234770C900451078 /* DWCaptureSessionManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWCaptureSessionManager.h; sourceTree = ""; }; 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWCaptureSessionManager.m; sourceTree = ""; }; - 2A7A7BBB2347950700451078 /* DWMainMenuTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuTableViewCell.h; sourceTree = ""; }; - 2A7A7BBC2347950700451078 /* DWMainMenuTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWMainMenuTableViewCell.m; sourceTree = ""; }; - 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWMainMenuTableViewCell.xib; sourceTree = ""; }; - 2A7A7BC1234797FC00451078 /* DWMainMenuModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuModel.h; sourceTree = ""; }; - 2A7A7BC2234797FC00451078 /* DWMainMenuModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWMainMenuModel.m; sourceTree = ""; }; - 2A7A7BC42347982A00451078 /* DWMainMenuItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWMainMenuItem.h; sourceTree = ""; }; 2A7A7BC72347E0D700451078 /* DWBaseFormTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBaseFormTableViewCell.h; sourceTree = ""; }; 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBaseFormTableViewCell.m; sourceTree = ""; }; 2A7A7BCE2348A34800451078 /* DWSecurityMenuModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSecurityMenuModel.h; sourceTree = ""; }; @@ -2618,7 +2604,6 @@ 75EBAA242BBA9DC2004488E3 /* ZenLedger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZenLedger.swift; sourceTree = ""; }; 75EBAA282BBBE385004488E3 /* ZenLedgerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZenLedgerViewModel.swift; sourceTree = ""; }; 75EDC78DE1686E55AE12233C /* Pods-DashWalletScreenshotsUITests.testnet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashWalletScreenshotsUITests.testnet.xcconfig"; path = "Pods/Target Support Files/Pods-DashWalletScreenshotsUITests/Pods-DashWalletScreenshotsUITests.testnet.xcconfig"; sourceTree = ""; }; - 75EE38D22CBE9EFC00845FFF /* MainMenuContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuContentView.swift; sourceTree = ""; }; 75EE38D72CBFE52B00845FFF /* ContactsPlaceholderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsPlaceholderViewController.swift; sourceTree = ""; }; 75EE9F412DE2F74B000AD1AD /* DashSpendConfirmationDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashSpendConfirmationDialog.swift; sourceTree = ""; }; 75F2E0B61BE2D5F000EAE861 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; @@ -4205,40 +4190,9 @@ path = Menu; sourceTree = ""; }; - 2A7A7BB32347928B00451078 /* Views */ = { - isa = PBXGroup; - children = ( - 2A7A7BC0234797E700451078 /* Model */, - 2A7A7BB72347948F00451078 /* Cells */, - 75EE38D22CBE9EFC00845FFF /* MainMenuContentView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 2A7A7BB72347948F00451078 /* Cells */ = { - isa = PBXGroup; - children = ( - 2A7A7BBB2347950700451078 /* DWMainMenuTableViewCell.h */, - 2A7A7BBC2347950700451078 /* DWMainMenuTableViewCell.m */, - 2A7A7BBD2347950700451078 /* DWMainMenuTableViewCell.xib */, - ); - path = Cells; - sourceTree = ""; - }; - 2A7A7BC0234797E700451078 /* Model */ = { - isa = PBXGroup; - children = ( - 2A7A7BC1234797FC00451078 /* DWMainMenuModel.h */, - 2A7A7BC2234797FC00451078 /* DWMainMenuModel.m */, - 2A7A7BC42347982A00451078 /* DWMainMenuItem.h */, - ); - path = Model; - sourceTree = ""; - }; 2A7A7BC52347DF7100451078 /* Main */ = { isa = PBXGroup; children = ( - 2A7A7BB32347928B00451078 /* Views */, 752D03A62E2F758B00B88784 /* MainMenuView.swift */, 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */, 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */, @@ -7997,7 +7951,6 @@ 2A8C24B6233370A600000D43 /* QuickReceive.storyboard in Resources */, 47A514622848FEAD005A8E3E /* Tx.storyboard in Resources */, 2A8F420921BED16300858B91 /* DashSyncCurrentCommit in Resources */, - 2A7A7BBF2347950700451078 /* DWMainMenuTableViewCell.xib in Resources */, 2AD1CE9F22DFBA6C00C99324 /* VerifiedSuccessfully.storyboard in Resources */, 2A4430EB22CBBA82009BAF7F /* Setup.storyboard in Resources */, 752772122AAA1CE30066557E /* Coinbase-Info.plist in Resources */, @@ -8100,7 +8053,6 @@ C9D2C93D2A320AA000D15901 /* QuickReceive.storyboard in Resources */, C9D2C93E2A320AA000D15901 /* Tx.storyboard in Resources */, C9D2C93F2A320AA000D15901 /* DashSyncCurrentCommit in Resources */, - C9D2C9402A320AA000D15901 /* DWMainMenuTableViewCell.xib in Resources */, C9D2C9412A320AA000D15901 /* VerifiedSuccessfully.storyboard in Resources */, C9D2C9422A320AA000D15901 /* Setup.storyboard in Resources */, C9D2C9432A320AA000D15901 /* GoogleService-Info.plist in Resources */, @@ -8584,7 +8536,6 @@ C91E919729FBACE6003E7883 /* ExtendedPublicKeysModel.swift in Sources */, C9829CE22A562CEE007132E4 /* TappableTextView.swift in Sources */, 4751CAD5297024EA00F63AC4 /* OrderPreviewViewController.swift in Sources */, - 75EE38D32CBE9EFC00845FFF /* MainMenuContentView.swift in Sources */, 478C982F294305D800FAA0F0 /* ActivePaymentMethodView.swift in Sources */, 47CDEEC72949DC38008AE06D /* BasicInfoController.swift in Sources */, 2AD1CEA822E0C8C900C99324 /* DWPreviewSeedPhraseModel.m in Sources */, @@ -8998,7 +8949,6 @@ 75D6D8E42D96A6DB00E40A6D /* StubTransactionSource.swift in Sources */, 75CDD7802C0898E400F433D2 /* Shape.swift in Sources */, 2A7A7C1D234B771400451078 /* DWLocalCurrencyModel.m in Sources */, - 2A7A7BC3234797FC00451078 /* DWMainMenuModel.m in Sources */, FB8ACEB622E0502200EE5035 /* DWUpholdMainnetConstants.m in Sources */, C9F42FA929DC09CF001BC549 /* Style.swift in Sources */, C917024129D462C6008C034D /* PayViewController.swift in Sources */, @@ -9053,7 +9003,6 @@ 11B8449A28F6D5480082770C /* SingleInputAddressSelector.swift in Sources */, 0F6EDFCF28C896BD000427E7 /* CoinbaseAccountAddress.swift in Sources */, 7531308D2B47EC910069C9B7 /* UpholdClient.swift in Sources */, - 2A7A7BBE2347950700451078 /* DWMainMenuTableViewCell.m in Sources */, 75EBAA092BB9791B004488E3 /* Icon.swift in Sources */, 1141E4C2291BB12200ACDA9E /* CrowdNodeTransferViewController.swift in Sources */, 478483E829629C0700E05A5A /* CBAuthInterop.swift in Sources */, @@ -9183,7 +9132,6 @@ C9D2C69E2A320AA000D15901 /* AtmDetailsView.swift in Sources */, C9D2C69F2A320AA000D15901 /* DWPlaceholderFormTableViewCell.m in Sources */, C9D2C6A02A320AA000D15901 /* DWTitleDetailCellView.m in Sources */, - 75EE38D42CBE9EFC00845FFF /* MainMenuContentView.swift in Sources */, C9D2C6A12A320AA000D15901 /* AmountInputControl.swift in Sources */, C9D2C6A22A320AA000D15901 /* DWSegmentSliderFormTableViewCell.m in Sources */, 759609212C4553A400F3BF04 /* BuyCreditsViewController.swift in Sources */, @@ -9832,7 +9780,6 @@ C943B58D2A40ED6F00AF23C5 /* DWCreateUsernameViewController.m in Sources */, C943B58E2A40ED6F00AF23C5 /* DWAllowedCharactersUsernameValidationRule.m in Sources */, C9D2C8742A320AA000D15901 /* DWLocalCurrencyModel.m in Sources */, - C9D2C8752A320AA000D15901 /* DWMainMenuModel.m in Sources */, C9D2C8762A320AA000D15901 /* DWUpholdMainnetConstants.m in Sources */, C9D2C8792A320AA000D15901 /* Style.swift in Sources */, C9D2C87A2A320AA000D15901 /* PayViewController.swift in Sources */, @@ -9910,7 +9857,6 @@ 754565C82DAA52A000DA4E8E /* CTXSpendAPI.swift in Sources */, 754565CA2DAA52A000DA4E8E /* CTXSpendService.swift in Sources */, 754565CB2DAA52A000DA4E8E /* CTXSpendEndpoint.swift in Sources */, - C9D2C8B32A320AA000D15901 /* DWMainMenuTableViewCell.m in Sources */, C930784E2A6AD59E00906E4B /* ConfirmPaymentModel.swift in Sources */, C9D2C8B42A320AA000D15901 /* CrowdNodeTransferViewController.swift in Sources */, C9D2C8B62A320AA000D15901 /* CBAuthInterop.swift in Sources */, diff --git a/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.h b/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.h deleted file mode 100644 index d476f0034..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWMainMenuItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWMainMenuTableViewCell : UITableViewCell - -@property (nullable, nonatomic, strong) id model; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.m b/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.m deleted file mode 100644 index 04e813729..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.m +++ /dev/null @@ -1,122 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWMainMenuTableViewCell.h" - -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - -static UIImage *ImageByType(DWMainMenuItemType type) { - switch (type) { - case DWMainMenuItemType_BuySellDash: - return [UIImage imageNamed:@"menu_buySellDash"]; - case DWMainMenuItemType_Explore: - return [UIImage imageNamed:@"shortcut_explore"]; - case DWMainMenuItemType_Security: - return [UIImage imageNamed:@"menu_security"]; - case DWMainMenuItemType_Settings: - return [UIImage imageNamed:@"menu_settings"]; - case DWMainMenuItemType_Tools: - return [UIImage imageNamed:@"menu_tools"]; - case DWMainMenuItemType_Support: - return [UIImage imageNamed:@"menu_support"]; - case DWMainMenuItemType_Invite: - return [UIImage imageNamed:@"menu_invite"]; - case DWMainMenuItemType_Voting: - return [UIImage imageNamed:@"menu_voting"]; - } -} - -static NSString *TitleByType(DWMainMenuItemType type) { - switch (type) { - case DWMainMenuItemType_BuySellDash: - return NSLocalizedString(@"Buy & Sell Dash", nil); - case DWMainMenuItemType_Explore: - return NSLocalizedString(@"Explore", nil); - case DWMainMenuItemType_Security: - return NSLocalizedString(@"Security", nil); - case DWMainMenuItemType_Settings: - return NSLocalizedString(@"Settings", nil); - case DWMainMenuItemType_Tools: - return NSLocalizedString(@"Tools", nil); - case DWMainMenuItemType_Support: - return NSLocalizedString(@"Contact Support", nil); - case DWMainMenuItemType_Invite: - return NSLocalizedString(@"Invite", nil); - case DWMainMenuItemType_Voting: - return NSLocalizedString(@"Username voting", nil); - } -} - -static NSString *DescriptionByType(DWMainMenuItemType type) { - switch (type) { - case DWMainMenuItemType_BuySellDash: - return NSLocalizedString(@"Connect with third party exchanges", nil); - case DWMainMenuItemType_Explore: - return NSLocalizedString(@"Find merchants that accept DASH", nil); - case DWMainMenuItemType_Security: - return NSLocalizedString(@"View passphrase, backup wallet…", nil); - case DWMainMenuItemType_Settings: - return NSLocalizedString(@"Default currency, shortcuts, about…", nil); - case DWMainMenuItemType_Tools: - return NSLocalizedString(@"Import private key, Export CSV…", nil); - case DWMainMenuItemType_Support: - return NSLocalizedString(@"Report an Issue", nil); - case DWMainMenuItemType_Invite: - return NSLocalizedString(@"Let your friends and family to join Dash", nil); - case DWMainMenuItemType_Voting: - return nil; - } -} - -@interface DWMainMenuTableViewCell () - -@property (strong, nonatomic) IBOutlet UIImageView *iconImageView; -@property (strong, nonatomic) IBOutlet UILabel *titleLabel; -@property (strong, nonatomic) IBOutlet UILabel *descriptionLabel; - -@end - -@implementation DWMainMenuTableViewCell - -- (void)awakeFromNib { - [super awakeFromNib]; - - self.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleSubheadline]; - self.descriptionLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCaption1]; -} - -- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { - [super setHighlighted:highlighted animated:animated]; - - [self dw_pressedAnimation:DWPressedAnimationStrength_Light pressed:highlighted]; -} - -- (void)setModel:(nullable id)model { - _model = model; - - const DWMainMenuItemType type = model.type; - - self.iconImageView.image = ImageByType(type); - self.titleLabel.text = TitleByType(type); - self.descriptionLabel.text = DescriptionByType(type); -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.xib b/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.xib deleted file mode 100644 index c464c77e8..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/Cells/DWMainMenuTableViewCell.xib +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DashWallet/Sources/UI/Menu/Main/Views/MainMenuContentView.swift b/DashWallet/Sources/UI/Menu/Main/Views/MainMenuContentView.swift deleted file mode 100644 index a4b1ade02..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/MainMenuContentView.swift +++ /dev/null @@ -1,261 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit -import SwiftUI - -@objc(DWMainMenuContentViewDelegate) -protocol MainMenuContentViewDelegate: AnyObject { - func mainMenuContentView(_ view: MainMenuContentView, didSelectMenuItem item: DWMainMenuItem) - - #if DASHPAY - func mainMenuContentView(joinDashPayAction view: MainMenuContentView) - func mainMenuContentView(showQRAction view: MainMenuContentView) - func mainMenuContentView(editProfileAction view: MainMenuContentView) - func mainMenuContentView(showCoinJoin view: MainMenuContentView) - func mainMenuContentView(showRequestDetails view: MainMenuContentView) - #endif -} - -@objc(DWMainMenuContentView) -class MainMenuContentView: UIView { - - // MARK: - Properties - - @objc var model: DWMainMenuModel { - didSet { - tableView.reloadData() - } - } - @objc weak var delegate: MainMenuContentViewDelegate? - - private let tableView: UITableView - - #if DASHPAY - @objc var userModel: CurrentUserProfileModel? = nil - let joinDPViewModel = JoinDashPayViewModel(initialState: .none) - private let headerView: DWUserProfileContainerView - private var welcomeView: JoinDashPayView! - - var shouldShowMixDashDialog: Bool { - get { CoinJoinService.shared.mode == .none || !UsernamePrefs.shared.mixDashShown } - set(value) { UsernamePrefs.shared.mixDashShown = !value } - } - - var shouldShowDashPayInfo: Bool { - get { !UsernamePrefs.shared.joinDashPayInfoShown } - set(value) { UsernamePrefs.shared.joinDashPayInfoShown = !value } - } - #endif - - // MARK: - Initialization - - override init(frame: CGRect) { - self.model = DWMainMenuModel() - self.tableView = UITableView(frame: .zero, style: .plain) - - #if DASHPAY - self.headerView = DWUserProfileContainerView(frame: .zero) - #endif - - super.init(frame: frame) - - setupViews() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Setup - private var height = 0.0 - - private func setupViews() { - #if DASHPAY - welcomeView = JoinDashPayView( - viewModel: self.joinDPViewModel, - onTap: { state in - if state == .registered { - self.delegate?.mainMenuContentView(editProfileAction: self) - } else if state == .voting { - self.delegate?.mainMenuContentView(showRequestDetails: self) - } else if state == .none { - self.joinButtonAction() - } - }, onActionButton: { state in - if state == .blocked || state == .failed || state == .contested { - self.joinButtonAction() - } else { - self.delegate?.mainMenuContentView(editProfileAction: self) - self.joinDPViewModel.markAsDismissed() - } - }, onDismissButton: { state in - self.joinDPViewModel.markAsDismissed() - }, onSizeChange: { size in - self.height = size.height - if let header = self.tableView.tableHeaderView { - header.frame = CGRect(x: 0, y: 0, width: self.tableView.bounds.width, height: self.height) - self.tableView.tableHeaderView = header - } - } - ) - #endif - - backgroundColor = UIColor.dw_secondaryBackground() - - tableView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - tableView.backgroundColor = backgroundColor - tableView.dataSource = self - tableView.delegate = self - tableView.rowHeight = UITableView.automaticDimension - tableView.estimatedRowHeight = 74.0 - tableView.separatorStyle = .none - tableView.contentInset = UIEdgeInsets(top: DWDefaultMargin(), left: 0, bottom: DW_TABBAR_NOTCH, right: 0) - addSubview(tableView) - - let cellId = DWMainMenuTableViewCell.dw_reuseIdentifier - let nib = UINib(nibName: cellId, bundle: nil) - tableView.register(nib, forCellReuseIdentifier: cellId) - - #if DASHPAY - headerView.delegate = self - #endif - } - - // MARK: - Layout - - override func layoutSubviews() { - super.layoutSubviews() - - tableView.frame = self.bounds - } - - // MARK: - Public Methods - - #if DASHPAY - @objc func updateUserHeader() { - if userModel?.showJoinDashpay == true { - let hostingController = UIHostingController( - rootView: welcomeView - .padding(.bottom, 20) - .padding(.horizontal, 18) - ) - hostingController.view.backgroundColor = .clear - let header = hostingController.view - tableView.tableHeaderView = header - } else { - tableView.tableHeaderView = nil - } - - setNeedsLayout() - } - - private func joinButtonAction() { - if shouldShowMixDashDialog { - self.showMixDashDialog() - } else if shouldShowDashPayInfo { - self.showDashPayInfo() - } else { - self.delegate?.mainMenuContentView(joinDashPayAction: self) - } - } - - private func showMixDashDialog() { - let swiftUIView = MixDashDialog( - positiveAction: { - self.delegate?.mainMenuContentView(showCoinJoin: self) - }, negativeAction: { - if UsernamePrefs.shared.joinDashPayInfoShown { - self.delegate?.mainMenuContentView(joinDashPayAction: self) - } else { - UsernamePrefs.shared.joinDashPayInfoShown = true - self.showDashPayInfo() - } - } - ) - let hostingController = UIHostingController(rootView: swiftUIView) - hostingController.setDetent(260) - - if let parentVC = self.parentViewController() { - parentVC.present(hostingController, animated: true, completion: nil) - } else { - delegate?.mainMenuContentView(joinDashPayAction: self) - } - } - - private func showDashPayInfo() { - let swiftUIView = JoinDashPayInfoDialog { - self.delegate?.mainMenuContentView(joinDashPayAction: self) - } - let hostingController = UIHostingController(rootView: swiftUIView) - hostingController.setDetent(600) - - if let parentVC = self.parentViewController() { - parentVC.present(hostingController, animated: true, completion: nil) - } - } - #endif -} - -// MARK: - UITableViewDataSource - -extension MainMenuContentView: UITableViewDataSource { - public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return model.items.count - } - - public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cellId = DWMainMenuTableViewCell.dw_reuseIdentifier - let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! DWMainMenuTableViewCell - - let menuItem = model.items[indexPath.row] - cell.model = menuItem - - #if SNAPSHOT - if menuItem.type == .security { - cell.accessibilityIdentifier = "menu_security_item" - } - #endif - - return cell - } -} - -// MARK: - UITableViewDelegate - -extension MainMenuContentView: UITableViewDelegate { - public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - - let menuItem = model.items[indexPath.row] - delegate?.mainMenuContentView(self, didSelectMenuItem: menuItem) - } -} - -#if DASHPAY -// MARK: - DWCurrentUserProfileViewDelegate - -extension MainMenuContentView: DWCurrentUserProfileViewDelegate { - public func currentUserProfileView(_ view: DWCurrentUserProfileView, showQRAction sender: UIButton) { - delegate?.mainMenuContentView(showQRAction: self) - } - - public func currentUserProfileView(_ view: DWCurrentUserProfileView, editProfileAction sender: UIButton) { - delegate?.mainMenuContentView(editProfileAction: self) - } -} -#endif diff --git a/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuItem.h b/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuItem.h deleted file mode 100644 index 71565903d..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuItem.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -typedef NS_ENUM(NSUInteger, DWMainMenuItemType) { - DWMainMenuItemType_BuySellDash, - DWMainMenuItemType_Explore, - DWMainMenuItemType_Security, - DWMainMenuItemType_Settings, - DWMainMenuItemType_Tools, - DWMainMenuItemType_Support, - DWMainMenuItemType_Invite, - DWMainMenuItemType_Voting -}; - -@protocol DWMainMenuItem - -@property (readonly, nonatomic, assign) DWMainMenuItemType type; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.h b/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.h deleted file mode 100644 index d1b860d9f..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWMainMenuItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWMainMenuModel : NSObject - -@property (readonly, nonatomic, copy) NSArray> *items; - -- (instancetype)initWithInvitesEnabled:(BOOL)enabled votingEnabled:(BOOL)votingEnabled; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.m b/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.m deleted file mode 100644 index 8f9428305..000000000 --- a/DashWallet/Sources/UI/Menu/Main/Views/Model/DWMainMenuModel.m +++ /dev/null @@ -1,78 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWMainMenuModel.h" -#import "DWEnvironment.h" -#import "dashwallet-Swift.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWMainMenuItemImpl : NSObject - -@end - -@implementation DWMainMenuItemImpl - -@synthesize type = _type; - -- (instancetype)initWithType:(DWMainMenuItemType)type { - self = [super init]; - if (self) { - _type = type; - } - return self; -} - -@end - -#pragma mark - - -@implementation DWMainMenuModel - -- (instancetype)initWithInvitesEnabled:(BOOL)enabled votingEnabled:(BOOL)votingEnabled { - self = [super init]; - if (self) { - NSMutableArray> *items = [NSMutableArray array]; - - if (enabled) { - [items addObject:[[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Invite]]; - } - - if ([[DWEnvironment sharedInstance].currentChain isMainnet]) { - [items addObjectsFromArray:@[ [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_BuySellDash] ]]; - } - - [items addObjectsFromArray:@[ - [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Explore], - [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Security], - [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Settings], - [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Tools] - ]]; - - if (votingEnabled) { - [items addObjectsFromArray:@[ [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Voting] ]]; - } - - [items addObjectsFromArray:@[ [[DWMainMenuItemImpl alloc] initWithType:DWMainMenuItemType_Support] ]]; - _items = items; - } - return self; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index f76a766ec..cc6c6858d 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "يتم التأكيد"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "اتصال مع منصات الطرف الثالث"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "العملة الافتراضية ، الاختصارات ، حول ..."; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "استيراد مفتاح خاص"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "عرض عبارة المرور ، المحفظة الاحتياطية ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "عرض عبارة الاسترداد"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 573a86b21..a646728f3 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Купи & Продай Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Потвърждаване"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Свързване към трета страна за обмяна"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Валута по подразбиране,преки пътища, относно..."; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Импортиране на частен ключ."; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Преглед в Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Преглед на парола, резервен портфейл ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Виж фразата за възстановяване"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index 1f33bb759..fe4713ec4 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index e6b26d70a..7575edb5b 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Nákup a prodej Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Konfirmace"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Spojte se s burzami třetích stran"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Výchozí měna, zkratky, o aplikaci"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importovat Privátní Klíč"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Dejte mi vědět, až to bude hotové"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Nechte přátele a nejbližší, aby se připojili k Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Nechte přátele a nejbližší připojit se k Dash Network. Pozvěte je do světa sociálního bankingu."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Zobrazit ve vyhledávači"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Fráze pro obnovení, záloha peněženky..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Zobrazit frázi pro obnovení"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index e1abcff7c..c45aed5e7 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index d489fba0c..5aa93136d 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -159,9 +159,7 @@ static const bool _SNAPSHOT = 0; #import "UIViewController+DWDisplayError.h" #import "DWFormTableViewController.h" #import "DWAboutViewController.h" -#import "DWMainMenuModel.h" #import "DWCurrentUserProfileView.h" -#import "DWMainMenuTableViewCell.h" #import "DWSharedUIConstants.h" #import "DWUserProfileContainerView.h" #import "DWDashPayReadyProtocol.h" diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 40481a9fe..6d5aa7f2b 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Kaufe & Verkaufe"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Kaufe & Verkaufe Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Bestätige"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Mit Drittanbieter-Börsen verknüpfen"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Verbinde deine Krypto-Wallets mit der Zenledger Plattform. Lerne mehr darüber und beginne mit deinen Transaktionen in der Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Datum: Alt nach neu"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Standardwährung, Shortcuts, über..."; - /* Voting */ "Default filter setting" = "Standardmäßige Filtereinstellung"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Finde Händler die DASH akzeptieren"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Privaten Schlüssel importieren"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Private Key importieren, CSV exportieren..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Zusätzlich zu den angezeigten Coinbase-Gebühren wird ein Spread in den Preis eingerechnet. Bei der Verwendung von Advanced Trade ist kein Spread enthalten, da Sie direkt mit dem Orderbuch interagieren.\n\nDie Märkte für Kryptowährungen sind volatil, und dies ermöglicht es uns, vorübergehend einen Preis für die Handelsausführung festzulegen."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Benachrichtige mich, wenn dies abgeschlossen ist"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Lass deine Freunde und Familie bei Dash mitmachen"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Lass deine Freunde und Familie bei Dash mitmachen. Lade sie zur Welt des Social Banking ein."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Im Explorer ansehen"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Passphrase anzeigen, Wallet sichern..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Wiederherstellungsphrase ansehen"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index e76607c44..85424249f 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Αγορά και Πώληση"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Αγορά και Πώληση Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Επιβεβαίωση"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Συνδεθείτε με ανταλλακτήρια τρίτων"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Συνδέστε τα πορτοφόλια σας με την πλατφόρμα ZenLedger. Μάθετε περισσότερα και ξεκινήστε τις συναλλαγές σας με το Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Ημερομηνία: Παλαιά προς νέα"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Προεπιλεγμένο νόμισμα, συντομεύσεις, σχετικά με..."; - /* Voting */ "Default filter setting" = "Προεπιλεγμένη ρύθμιση φίλτρου"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Βρείτε εμπόρους που δέχονται DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Εισάγετε το ιδιωτικό κλειδί"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Εισαγωγή ιδιωτικού κλειδιού, εξαγωγή CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Εκτός από την εμφανιζόμενη αμοιβή της Coinbase, συμπεριλαμβάνουμε στην τιμή ένα spread. Όταν χρησιμοποιείτε το Advanced Trade, δεν περιλαμβάνεται spread, επειδή αλληλεπιδράτε απευθείας με το βιβλίο εντολών.\n\nΟι αγορές κρυπτονομισμάτων είναι ευμετάβλητες και αυτό μας επιτρέπει να κλειδώσουμε προσωρινά μια τιμή για την εκτέλεση των συναλλαγών."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Ενημερώστε με όταν ολοκληρωθεί"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Αφήστε τους φίλους και τους συγγενείς σας να συμμετάσχουν στο Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Αφήστε τους φίλους και την συγγενείς σας να ενταχθούν στο Dash Network. Προσκαλέστε τους στον κόσμο της κοινωνικής τραπεζικής."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Προβολή στον Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Προβολή φράσης πρόσβασης, εφεδρικού πορτοφολιού ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Προβολή Φράσης Ανάκτησης"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 0f51672f5..9040d38e1 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index ca511a99d..7be53faae 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index f957b7c4c..d4699124d 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Comprar y Vender"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Comprar y Vender Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirmando"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Conectar con exchanges de terceros"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Conecta tus billeteras criptográficas a la plataforma ZenLedger. Obten más información y comienza con tus transacciones de Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Fecha: Viejo a nuevo"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Moneda predeterminada, atajos, acerca..."; - /* Voting */ "Default filter setting" = "Configuración de filtro predeterminada"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Encuentra comerciantes que acepten DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Barrer billetera de papel"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Importar llave privada, exportar CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Además de la comisión de Coinbase mostrada, incluimos un diferencial en el precio. Cuando usas Comercio avanzado, no se incluye el margen porque estás interactuando directamente con el libro de pedidos.\n\nLos mercados de criptomonedas son volátiles y esto nos permite fijar temporalmente un precio para la ejecución de operaciones."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Avísame cuando esté listo"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Deja que tus amigos y familiares se unan a Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Deja que sus amigos y familiares se unan a la red de Dash. Invítalos al mundo de la banca social."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Ver en el explorador"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Ver frase de recuperación, hacer backup..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Ver frase de recuperación"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index e209b9ab3..e473b4559 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index ec915823b..6780d6c77 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "در حال تائید"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "ارتباط با صرافی‌های طرف سوم"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "کیف‌های پول‌تان را به پلتفرم ذن‌لجر متصل کنید. اطلاعات بیشتر و آغاز به کار با تراکنش‌هایتان در دش والت"; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "واحد پول پیش‌فرض، میان‌برها، درباره..."; - /* Voting */ "Default filter setting" = "تنظیمات پیش‌فرض فیلتر"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "فروشنده‌ای بیابید که دش می‌پذیرد"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "وارد کردن کلید خصوصی"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "مشاهده گذرواژه، کیف پول پشتیبان ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "مشاهده عبارت بازیابی"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 5f6ef2ec6..d6609e34d 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index c16bc0fb2..05c2ae297 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Bili At Benta"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Bumili at magbenta ng Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Kinukumpirma"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Ikonekta sa mga third party na palitan"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Ikonekta ang iyong mga crypto wallet sa platform ng ZenLedger. Matuto pa at magsimula sa iyong mga transaksyon sa Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Petsa: Luma sa bago"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default na pananalapi, shortcuts, about..."; - /* Voting */ "Default filter setting" = "Default na setting ng filter"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Maghanap ng mga merchant na tumatanggap ng DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "I-import ang private key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Mag-import ng pribadong key, Mag-export ng CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Bilang karagdagan sa ipinapakitang bayad sa Coinbase, nagsasama kami ng spread sa presyo. Kapag gumagamit ng Advanced Trade, walang spread na kasama dahil direktang nakikipag-ugnayan ka sa order book.\n\nAng mga merkado ng Cryptocurrency ay pabagu-bago, at nagbibigay-daan ito sa amin na pansamantalang i-lock ang isang presyo para sa pagpapatupad ng kalakalan."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Ipaalam sa akin kung kailan ito tapos"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Hayaan ang iyong mga kaibigan at pamilya na sumali sa Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Hayaan ang iyong mga kaibigan at pamilya na sumali sa Dash Network. Anyayahan sila sa mundo ng social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Tingnan sa Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Ipakita ang passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Ipakita ang recovery phrase"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index 9f473f9f8..f08d2073d 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Acheter & vendre"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Acheter & vendre des dashs"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirmation…"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Se connecter aux plateformes de change tierces"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connectez vos portefeuilles crypto à la plateforme ZenLedger. En savoir plus et se lancer avec vos transactions Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date : ancienne à récente"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Monnaie par défaut, raccourcis, à propos…"; - /* Voting */ "Default filter setting" = "Réglage de filtre par défaut"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Trouver des vendeurs qui acceptent Dash"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importer une clé privée"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Importer une clé privée, exporter CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "En plus des frais Coinbase affichés, nous incluons un écart dans le prix. En utilisant le mode avancé de trading, aucun écart n'est inclus car vous intervenez directement sur le registre d'ordres.\n\nLes marchés cryptomonétaires sont volatiles, et cela nous permet de verrouiller temporairement un cours pour l'exécution du trading."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Prévenez-moi quand c'est fait"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Permet à vos amis et votre famille de rejoindre Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Permet à vos amis et votre famille de rejoindre le réseau Dash. Invitez-les dans le monde de banque sociale."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Voir dans l'explorateur"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Voir la phrase de récupération, sauvegarder le portefeuille…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Voir la phrase de récupération"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index d40fda7ef..aefd9241d 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 61c91ca37..89ce3ec8f 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 2584391e3..9af140469 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Beli & Jual"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Beli & Jual Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Mengkonfirmasikan"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Terhubung dengan pertukaran pihak ketiga"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Hubungkan dompet crypto anda ke platform Zenledger. Pelajari lebih lanjut dan mulai dengan transaksi Domept Dash."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Tanggal: Lama ke baru"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Mata uang standar, pintasan, tentang ..."; - /* Voting */ "Default filter setting" = "Pengaturan filter default"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Temukan toko yang menerima Dash"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Impor kunci pribadi"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Impor kunci pribadi, Ekspor CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Selain biaya Coinbase yang ditampilkan, kami menyertakan Spread harga. Saat menggunakan Advanced Trade, tidak ada spread yang disertakan karena Anda berinteraksi langsung dengan buku pesanan.\n\nPasar Cryptocurrency tidak stabil, dan ini memungkinkan kami mengunci sementara harga untuk eksekusi perdagangan."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Beri tahu saya jika sudah selesai"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Biarkan teman dan keluarga Anda bergabung dengan Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Biarkan teman dan keluarga Anda bergabung dengan Dash Network. Ajak mereka ke dunia perbankan sosial."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Lihat di Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Lihat frasa sandi, cadangkan domept..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Lihat frasa pemulihan"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index f16e890f6..a6e1a8b56 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Compra & Vendi"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Compra & Vendi Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "In Conferma"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connetti a Exchanges esterni"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Collega i tuoi portafogli crittografici alla piattaforma ZenLedger. Scopri di più e inizia con le transazioni del tuo Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Data: dal Vecchio al nuovo"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Valuta predefinita, scorciatoie, riguardo ..."; - /* Voting */ "Default filter setting" = "Impostazione del filtro predefinita"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Trova commercianti che accettano DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importa chiave privata"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Importa chiave privata, Esporta CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Oltre alla commissione Coinbase visualizzata, includiamo uno spread nel prezzo. Quando si utilizza Advanced Trade, non è incluso nessuno spread perché si interagisce direttamente con il portafoglio ordini.\n\nI mercati delle criptovalute sono volatili e questo ci consente di bloccare temporaneamente un prezzo per l'esecuzione degli scambi."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Fammi sapere quando è fatto"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Consenti ai tuoi amici e familiari di unirsi a Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Consenti ai tuoi amici e familiari di unirsi alla Dash Network. Invitali nel mondo del social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Visualizza su Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Visualizza passphrase, di backup del portafoglio ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Visualizza la frase di recupero"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 74b7c5daf..9690fdfd7 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "売買"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Dashを売買する"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "確認中"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "サードパーティーの取引所に接続する"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "お手持ちのクリプトウォレットをZenLedgerのプラットフォームと紐づけましょう。詳細をご確認の上、Dashウォレットの取引を始めましょう。"; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "日付:古い順"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "初期設定の通貨、ショートカット、...について"; - /* Voting */ "Default filter setting" = "デフォルトのフィルター設定"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "DASHが使える加盟店を探す"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "プライベートキーをインポート"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "プライベートキーのインポート、CSVのエクスポート..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "表示されているCoinbaseの手数料に加え、スプレッドも価格に含まれています。アドバンスドトレードを利用する場合、注文帳簿と直接連動をするため、スプレッドは含まれません。\n\n仮想通貨市場は変動が激しいため、取引執行時の価格を一時的に固定できます。"; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "完了したらお知らせください"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "友達や家族を誘ってDashに参加しましょう"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "友達や家族をDashネットワークに招待しましょう。ソーシャルバンクの世界へご招待します。"; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "エクスプローラーで表示"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "パスフレーズを表示して、ウォレットをバックアップ ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "復元フレーズを表示する"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 8df3e9f96..b3cd94c00 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "매수 & 매도"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "대시 매수 & 매도"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "확인 중"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "제3자 거래소에 연결"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "당신의 암호화폐 지갑을 Zenledger 플랫폼에 연결하세요. 자세한 내용을 확인하시고 대시 지갑 거래를 통해 지금 시작하세요."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "날짜: 과거부터 현재"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "통화 기본값, 단축키, 관련 정보..."; - /* Voting */ "Default filter setting" = "디폴트 필터 설정"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "대시 거래를 허용하는 판매자 찾기"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "개인 키 불러오기"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "개인 키 가져오기, CSV 내보내기..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "금액에는 표시된 코인베이스 수수료 외에도 스프레드가 포함되었습니다. 향상된 거래 기능을 사용하는 경우에는 주문장과 직접 상호작용 하므로 스프레드가 포함되지 않습니다.\n\n암호화폐 시장은 변동성이 높기 때문에, 거래 수행을 위해서는 가격을 일시적으로 고정하게 됩니다."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "완료되면 알려주세요"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "당신의 친구와 가족이 대시에 가입하도록 도와주세요"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "당신의 친구와 가족들이 대시 네트워크에 가입하도록 도와주고, 소셜 뱅킹의 세계에 초대해보세요."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "탐색기에서 보기"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "비밀문구, 백업 지갑 보기...."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "복구 문구 확인"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 2e8feb8fa..a2a0a1d21 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index b1442888b..5599cd95b 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 8f501fee9..7f0f0cc39 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index 5969220b2..552cf0dc6 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Kopen & verkopen"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Koop & verkoop Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Aan het bevestigen"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Verbind met beurzen van derden"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Verbind je crypto portemonnees met het ZenLedger platform. Kom meer te weten en ga aan de slag met je Dash portemonnee transacties."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Datum: Oud naar nieuw"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Standaard valuta, snelkoppelingen, over... "; - /* Voting */ "Default filter setting" = "Standaard filterinstelling"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Vind winkeliers die Dash accepteren"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importeer prive-sleutel"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Privésleutel importeren, CSV exporteren..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Naast de getoonde Coinbase fee, nemen we een spread mee in de prijs. Bij gebruik van Advanced Trade optie is er geen spread inbegrepen omdat je rechtstreeks met het orderboek communiceert.\n\nCryptocurrency-markten zijn volatiel en dit stelt ons in staat om tijdelijk een prijs vast te leggen voor de uitvoering van transacties."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Laat me weten wanneer het klaar is"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Laat je vrienden en familie lid worden van Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Laat je vrienden en familie lid worden van het Dash Netwerk. Nodig ze uit in de wereld van sociaal bankieren."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Bekijk in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Bekijk wachtwoord, maak backup portemonnee ..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Toon herstelzin"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 85a670033..fc2c89392 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Kupuj i Sprzedawaj"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Kupuj i Sprzedawaj Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Potwierdzam"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Połącz się z giełdą stron trzecich"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Połącz swoje portfele kryptowalut z platformą ZenLedger. Dowiedz się więcej i rozpocznij wysyłanie lub otrzymywanie transakcji z Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Data: od najstarszej do najnowszej:"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Domyślna waluta, skróty, o…"; - /* Voting */ "Default filter setting" = "Domyślne ustawienie filtra"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Znajdź sprzedawców, którzy akceptują DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Zaimportuj Klucz Prywatny"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Importuj klucz prywatny, Eksportuj CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Oprócz pokazanej opłaty Coinbase, wliczamy również mały margines błędu. Kiedy używasz Zawansowengo trybu, margines nie jest wliczony, ponieważ używasz bezpośrednio książki zleceń\n\nRynki Kryptowalut są dosyć zmienne, więc ten margines pozwala nam na gwarancje ceny podczas transakcji. "; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Daj mi znać kiedy się skończy"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Pozwól twoim przyjaciołom i rodzinie na dołączenie do Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Pozwól twoim przyjaciołom i rodzinie na dołączenie do sieci Dash. Zaproś ich do świata społecznych finansów."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Zobacz na Eksplorerze"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Wyświetl hasło, kopia zapasowa portfela…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Pokaż Frazę Odzyskiwania Portfela"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index a686f0158..bde4658d6 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Comprar & Vender"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Comprar & Vender Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirmando"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Conectar com exchange de terceiros"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Conecte suas carteiras de criptomoedas à plataforma ZenLedger. Saiba mais e comece com suas transações da carteira Dash."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Data: Da mais antiga para a mais recente"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Moeda padrão, atalhos, sobre..."; - /* Voting */ "Default filter setting" = "Configuração de filtro padrão"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Encontrar comerciantes que aceitam DASH."; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importar Chave Privada"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Importar chave privada, Exportar CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Além da taxa Coinbase exibida, nós incluímos um spread no preço. Ao usar o Advanced Trade, nenhum spread é incluído porque você está interagindo diretamente com o livro de pedidos.\n\nOs mercados de criptomoedas são voláteis e isso nos permite bloquear temporariamente um preço para a execução da negociação."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Me avise quando estiver pronto"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Deixe seus amigos e familiares se juntarem ao Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Deixe seus amigos e familiares se juntarem à Rede Dash. Convide-os para o mundo do banco social."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Ver no Explorador"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Ver frase de recuperação, fazer backup..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Ver Frase de Recuperação"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index 3b1b6d74b..d71988120 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importă Cheia Privată"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 984ba62b7..113e6a545 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Купить и Продать"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Купить и продать"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Подтверждается"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Использовать сторонние биржи"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Подключите свои криптокошельки к платформе ZenLedger. Узнайте больше и начните с транзакций в Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "По дате: Сначала старые"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Валюта по умолчанию, ссылки, о программе…"; - /* Voting */ "Default filter setting" = "Настройки фильтра по умолчанию"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Найти магазины, где принимают DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Импорт ключа"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Импортировать приватный ключ, Выгрузить CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Помимо отображённой комиссии Coinbase, мы учитываем небольшой разброс цены. При работе в режиме Продвинутой Торговли разброс цены не учитывается, потому что вы работаете напрямую с портфелем заказов. \n\nКриптовалютным рынкам свойственна волатильность, и таким образом мы временно замораживаем цену для совершения сделки. "; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Сообщить, когда будет готово"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Пусть ваши друзья и семья присоединятся к Dash."; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Пусть ваши друзья и семья присоединятся к сети Dash. Пригласите их в мир социального банкинга."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Посмотреть в Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Показать кодовую фразу, сделать резервную копию кошелька..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Посмотреть фразу восстановления"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 3e0d847ac..473136b49 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Kúpiť a predať"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Kúpiť a predať Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Potvrdzuje sa"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Spojiť s burzami tretích strán"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Pripojte svoje kryptopeňaženky k platforme ZenLedger. Získajte viac informácií a začnite s Dash Wallet transakciami."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Dátum: Od najstarších"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Predvolená mena, skratky, o programe..."; - /* Voting */ "Default filter setting" = "Predvolené nastavenie filtra"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Nájdite obchodníkov, ktorí akceptujú DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importovať privátny kľúč"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Importovať privátny kľúč, exportovať CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Okrem zobrazeného Coinbase poplatku, sa do ceny započítavame aj rozptyl. Pri používaní pokročilého obchodovania nie je zahrnutý žiadny rozptyl, pretože interagujete priamo s knihou objednávok.\n\nTrhy s kryptomenami sú volatilné, čo nám umožňuje dočasne uzamknúť cenu na vykonanie obchodu."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Informovať ma keď bude hotovo"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Nechajte svojich priateľov a rodinu aby sa pripojili k Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Nechajte svojich priateľov a rodinu aby sa pripojili k sieti Dash. Pozvite ich do sveta sociálneho bankovníctva."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Zobraziť v prehliadači"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Zobraziť prístupové heslo, zálohovať peňaženku..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Zobraziť frázu pre obnovenie"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 4e1b8408a..a6d1dd464 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index ea201b6da..6c1307036 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Preveri seznam skrivnih besed za obnovo denarnice"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 640385287..6d511332e 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 252151ab6..e50d43052 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Uvezi privatni ključ"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 5bba538e0..e816ec6ea 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Köp & Sälj Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Importera Privat Nyckel"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 0af1f178d..3b571a813 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "ซื้อ ขาย"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "ซื้อ & ขาย Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "กำลังยืนยัน"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "เชื่อมต่อกับการแลกเปลี่ยนของบุคคลที่สาม"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "วันที่: เก่าไปใหม่"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "สกุลเงินเริ่มต้น, ทางลัด, เกี่ยวกับ..."; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "ค้นหาร้านค้าที่ยอมรับ DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "นำเข้ากุญแจส่วนตัว"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "นำเข้าคีย์ส่วนตัวส่งออก CSV ..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "นอกเหนือจากค่าธรรมเนียม Coinbase ที่แสดงแล้วเรายังรวมถึงสเปรดในราคา เมื่อใช้การค้าขั้นสูงจะไม่มีการแพร่กระจายเนื่องจากคุณมีปฏิสัมพันธ์โดยตรงกับหนังสือสั่งซื้อ\n\nตลาด cryptocurrency มีความผันผวนและสิ่งนี้ช่วยให้เราสามารถล็อคราคาสำหรับการดำเนินการทางการค้าชั่วคราว"; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "แจ้งให้ฉันทราบเมื่อเสร็จแล้ว"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "ให้เพื่อนและครอบครัวของคุณเข้าร่วม Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "ให้เพื่อนและครอบครัวของคุณเข้าร่วมเครือข่าย Dash เชิญพวกเขาเข้าสู่โลกของธนาคารเพื่อสังคม"; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "ดูใน Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "ดูวลี, สำรองวอลเล็ท..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "ดูวลีกู้คืน"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 5a50394a1..6f2c0f900 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Al & Sat"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Dash Al & Sat"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Onaylanıyor"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Üçüncü parti borsalara bağlanın"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Kripto cüzdanlarınızı ZenLedger platformuna bağlayın. Daha fazlasını öğrenin ve Dash Cüzdan işlemlerinize başlayın."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Tarih: Eskiden yeniye"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Varsayılan para birimi, kısayollar, hakkında…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "DASH'i kabul eden satıcıları bulun"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Özel Anahtarı İçe Aktar"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Özel anahtarı içe aktar, CSV'yi dışa aktar…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "Görüntülenen Coinbase ücretine ek olarak, fiyata bir makas dahil ediyoruz. Advanced Trade'i kullanırken, emir defteriyle doğrudan etkileşime girdiğiniz için herhangi bir makas ilave edilmez.\n\nKripto para piyasaları değişkendir ve bu, alım satımın yürütülmesi için geçici olarak bir fiyat belirlememize olanak tanır."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Bittiğinde bana haber ver"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Arkadaşlarınızın ve ailenizin Dash'e katılmasına izin verin"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Arkadaşlarınızın ve ailenizin Dash Ağı'na katılmasına izin verin. Onları sosyal bankacılık dünyasına davet edin."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Gezginde görüntüle"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Kurtarma sözcük grubunu göster, cüzdanı yedekle..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Kurtarma Sözcük Grubunu Göster"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 539ed8209..2ea421902 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Купити & Продати"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Купити & Продати Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Підтвердження"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Підключитися до сторонніх бірж"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Підключіть свої криптогаманці до платформи ZenLedger. Дізнайтеся більше та розпочніть роботу з транзакціями Dash Wallet."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Дата: від старої до нової"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Валюта за замовчуванням, ярлики, про програму."; - /* Voting */ "Default filter setting" = "Налаштування фільтра за замовчуванням"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Знайдіть продавців, які приймають DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Імпорт ключа"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Імпорт приватного ключа, експорт CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "На додаток до відображеної комісії Coinbase ми включаємо спред у ціну. Під час використання Advanced Trade спред не включається, оскільки ви взаємодієте безпосередньо з книгою замовлень. \n\nКриптовалютні ринки нестабільні, що дозволяє нам тимчасово зафіксувати ціну на здійснення торгів."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Повідомити, коли буде готово"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Нехай ваші друзі та родина приєднаються до Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Дозвольте своїм друзям і родині приєднатися до Dash Network. Запросіть їх у світ соціального банкінгу."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Переглянути в Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Показати кодову фразу, зробити резервну копію гаманця."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Переглянути фразу відновлення"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 77521779c..9659f7f72 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Mua & Bán Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Đang xác nhận"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Kết nối với sàn giao dịch của bên thứ ba"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Tiền tệ ngầm định, lối tắt, về..."; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Nhập khoá riêng"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Hãy cho tôi biết khi nó xong"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "Xem trên công cụ khám phá khối"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "Xem mật khẩu, sao lưu ví..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "Xem cụm từ phục hồi"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index 24e3b7d97..c4cd588c7 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 58eba26aa..a53c2300c 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "Buy & Sell"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "Buy & Sell Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "Confirming"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "Connect with third party exchanges"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "Date: Old to new"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "Default currency, shortcuts, about…"; - /* Voting */ "Default filter setting" = "Default filter setting"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "Find merchants that accept DASH"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "Import Private Key"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "Import private key, Export CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "Let me know when it’s done"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "Let your friends and family to join Dash"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "Let your friends and family to join the Dash Network. Invite them to the world of social banking."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "View in Explorer"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "View passphrase, backup wallet…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "View Recovery Phrase"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index d910a702f..903d476f8 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "购买 & 出售"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "买 & 卖 Dash"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "确认中"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "与第三方交易所连接"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "将您的加密数字货币钱包连接至 ZenLedger 平台. 了解更多信息并开始使用您的 Dash 钱包进行交易."; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "日期: 从旧到新"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "默认货币, 快捷方式, 关于..."; - /* Voting */ "Default filter setting" = "默认过滤器设置"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "查找接受 DASH 支付的商家"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "导入私钥"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "导入私钥, 导出 CSV..."; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "除了显示的 Coinbase费用外, 我们还包括价格差. 当使用高级交易时将不包括差价, 因为您正在直接与订单簿直接交互.\n\n加密货币市场变化无常, 这使我们能够暂时锁定交易执行的价格."; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "完成后通知我"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "让您的朋友和家人加入Dash网络"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "让您的朋友和家人加入Dash网络. 邀请他们进入社交银行的世界."; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "在浏览器中查看"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "查看密码, 备份钱包..."; - /* No comment provided by engineer. */ "View Recovery Phrase" = "查看助记词"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index 2d0fba993..ee791e00e 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -356,9 +356,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Buy & Sell" = "購買 & 出售"; -/* No comment provided by engineer. */ -"Buy & Sell Dash" = "買賣達世幣"; - /* No comment provided by engineer. */ "Buy & sell Dash" = "Buy & sell Dash"; @@ -506,9 +503,6 @@ /* No comment provided by engineer. */ "Confirming" = "確認中"; -/* No comment provided by engineer. */ -"Connect with third party exchanges" = "與第三方交易所連結"; - /* ZenLedger */ "Connect your crypto wallets to the ZenLedger platform. Learn more and get started with your Dash Wallet transactions." = "將您的加密錢包連接到 ZenLedger 平台。了解更多並開始使用您的達世幣錢包交易。"; @@ -719,9 +713,6 @@ /* Voting */ "Date: Old to new" = "日期:從舊到新"; -/* No comment provided by engineer. */ -"Default currency, shortcuts, about…" = "預設貨幣,捷徑,關於…"; - /* Voting */ "Default filter setting" = "預設過濾器設定"; @@ -955,9 +946,6 @@ /* No comment provided by engineer. */ "Find ATMs where you can buy or sell Dash." = "Find ATMs where you can buy or sell Dash."; -/* No comment provided by engineer. */ -"Find merchants that accept DASH" = "尋找接受達世幣付款的商家"; - /* No comment provided by engineer. */ "Find merchants that accept Dash payments." = "Find merchants that accept Dash payments."; @@ -1195,9 +1183,6 @@ /* Translate it as short as possible! (24 symbols max) */ "Import Private Key" = "導入私鑰"; -/* No comment provided by engineer. */ -"Import private key, Export CSV…" = "導入私鑰,導出 CSV…"; - /* Coinbase/Fee info */ "In addition to the displayed Coinbase fee, we include a spread in the price. When using Advanced Trade, no spread is included because you are interacting directly with the order book.\n\nCryptocurrency markets are volatile, and this allows us to temporarily lock in a price for trade execution." = "除了顯示的 Coinbase 費用外,我們還在價格中包含了價差。使用 Advanced Trade 時,不包括點差,因為您直接在訂單簿上進行交易。\n\n加密貨幣市場波動較大,這使我們能夠暫時鎖定交易執行的價格。"; @@ -1394,9 +1379,6 @@ /* No comment provided by engineer. */ "Let me know when it’s done" = "完成時通知我"; -/* No comment provided by engineer. */ -"Let your friends and family to join Dash" = "讓您的朋友和家人加入達世幣網絡"; - /* No comment provided by engineer. */ "Let your friends and family to join the Dash Network. Invite them to the world of social banking." = "讓您的朋友和家人加入達世幣網絡。邀請他們進入社交銀行的世界。"; @@ -2811,9 +2793,6 @@ /* No comment provided by engineer. */ "View in Block Explorer" = "在瀏覽器中查看"; -/* No comment provided by engineer. */ -"View passphrase, backup wallet…" = "查看恢復詞組, 備份錢包…"; - /* No comment provided by engineer. */ "View Recovery Phrase" = "查看恢復詞組"; From 8c7a5322da97bfe63df17fd8201cd99152519320 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 24 Jul 2025 12:15:14 +0700 Subject: [PATCH 04/14] chore: fold DWSecurityMenuModel into SecurityMenuViewModel --- DashWallet.xcodeproj/project.pbxproj | 8 - .../UI/Menu/Security/DWSecurityMenuModel.h | 40 ----- .../UI/Menu/Security/DWSecurityMenuModel.m | 155 ------------------ .../Security/SecurityMenuViewController.swift | 6 +- .../Menu/Security/SecurityMenuViewModel.swift | 74 ++++++++- DashWallet/dashwallet-Bridging-Header.h | 4 +- 6 files changed, 72 insertions(+), 215 deletions(-) delete mode 100644 DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.h delete mode 100644 DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.m diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 47c17653a..130bda7f2 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -181,7 +181,6 @@ 2A74EFFE2305763F00C475EB /* DWRecoverModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A74EFFD2305763F00C475EB /* DWRecoverModel.m */; }; 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */; }; 2A7A7BC92347E0D700451078 /* DWBaseFormTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */; }; - 2A7A7BD02348A34800451078 /* DWSecurityMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */; }; 2A7A7BD62348CB6600451078 /* SettingsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */; }; 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */; }; 2A7A7C16234B763600451078 /* DWLocalCurrencyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C15234B763600451078 /* DWLocalCurrencyViewController.m */; }; @@ -1242,7 +1241,6 @@ C9D2C78F2A320AA000D15901 /* CrowdNodeBalance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11517C89294B11DD004FC7BF /* CrowdNodeBalance.swift */; }; C9D2C7902A320AA000D15901 /* String+DashWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 471DD1B9290A962B00E030C8 /* String+DashWallet.swift */; }; C9D2C7932A320AA000D15901 /* DWBaseModalViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A0C69D623143B2F001B8C90 /* DWBaseModalViewController.m */; }; - C9D2C7942A320AA000D15901 /* DWSecurityMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */; }; C9D2C7952A320AA000D15901 /* KeysOverviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615829F29C9200002D82 /* KeysOverviewCell.swift */; }; C9D2C7962A320AA000D15901 /* UIViewController+DWShareReceiveInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD86D2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m */; }; C9D2C7972A320AA000D15901 /* OnlineAccountConfirmationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114D16B729828BCC009A124C /* OnlineAccountConfirmationController.swift */; }; @@ -1956,8 +1954,6 @@ 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWCaptureSessionManager.m; sourceTree = ""; }; 2A7A7BC72347E0D700451078 /* DWBaseFormTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBaseFormTableViewCell.h; sourceTree = ""; }; 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBaseFormTableViewCell.m; sourceTree = ""; }; - 2A7A7BCE2348A34800451078 /* DWSecurityMenuModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSecurityMenuModel.h; sourceTree = ""; }; - 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSecurityMenuModel.m; sourceTree = ""; }; 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuViewController.swift; sourceTree = ""; }; 2A7A7BD72348CB7300451078 /* DWSettingsMenuModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSettingsMenuModel.h; sourceTree = ""; }; 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSettingsMenuModel.m; sourceTree = ""; }; @@ -4206,8 +4202,6 @@ children = ( 2A7F3B18238C643D00DEA3EF /* Advanced Security */, 2A10EB3F2358D29500C38B61 /* ResetWalletInfo */, - 2A7A7BCE2348A34800451078 /* DWSecurityMenuModel.h */, - 2A7A7BCF2348A34800451078 /* DWSecurityMenuModel.m */, 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */, 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */, ); @@ -8732,7 +8726,6 @@ 2A0C69D723143B2F001B8C90 /* DWBaseModalViewController.m in Sources */, C956AF2D2A5CEA1F002FAB75 /* SheetViewController.swift in Sources */, C9C1335A2A561FFA00B66651 /* PasteboardContentView.swift in Sources */, - 2A7A7BD02348A34800451078 /* DWSecurityMenuModel.m in Sources */, 75050CCF2DF2CB0F00F586D6 /* GiftCardMetadataProvider.swift in Sources */, C909615929F29C9200002D82 /* KeysOverviewCell.swift in Sources */, 2ACCD86E2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m in Sources */, @@ -9492,7 +9485,6 @@ C9D2C78F2A320AA000D15901 /* CrowdNodeBalance.swift in Sources */, C9D2C7902A320AA000D15901 /* String+DashWallet.swift in Sources */, C9D2C7932A320AA000D15901 /* DWBaseModalViewController.m in Sources */, - C9D2C7942A320AA000D15901 /* DWSecurityMenuModel.m in Sources */, C943B32C2A408CED00AF23C5 /* DWAvatarExternalSourceConfig.m in Sources */, C9D2C7952A320AA000D15901 /* KeysOverviewCell.swift in Sources */, C93078482A6AD4F500906E4B /* ConfirmPaymentViewController.swift in Sources */, diff --git a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.h b/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.h deleted file mode 100644 index def739bc0..000000000 --- a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWSelectorFormItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWSecurityMenuModel : NSObject - -@property (readonly, assign, nonatomic) BOOL hasTouchID; -@property (readonly, assign, nonatomic) BOOL hasFaceID; -@property (readonly, assign, nonatomic) BOOL biometricsEnabled; -@property (assign, nonatomic) BOOL balanceHidden; - -- (void)changePinContinueBlock:(void (^)(BOOL allowed))continueBlock; -- (void)setupNewPin:(NSString *)pin; - -- (void)setBiometricsEnabled:(BOOL)enabled completion:(void (^)(BOOL success))completion; - -+ (instancetype)new NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.m b/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.m deleted file mode 100644 index b687f0b87..000000000 --- a/DashWallet/Sources/UI/Menu/Security/DWSecurityMenuModel.m +++ /dev/null @@ -1,155 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWSecurityMenuModel.h" - -#import -#import - -#import "DWAdvancedSecurityModel.h" -#import "DWBiometricAuthModel.h" -#import "DWGlobalOptions.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWBiometricsOption : NSObject - -@property (readonly, nonatomic, assign) uint64_t value; - -@end - -@implementation DWBiometricsOption - -@synthesize title = _title; - -- (instancetype)initWithTitle:(NSString *)title value:(uint64_t)value { - self = [super init]; - if (self) { - _title = title; - _value = value; - } - return self; -} - -@end - -#pragma mark - Model - -@interface DWSecurityMenuModel () - -@property (assign, nonatomic) BOOL biometricsEnabled; -@property (readonly, nonatomic, strong) DWBiometricAuthModel *biometricAuthModel; - -@end - -@implementation DWSecurityMenuModel - -- (instancetype)init { - self = [super init]; - if (self) { - - _biometricAuthModel = [[DWBiometricAuthModel alloc] init]; - - const LABiometryType biometryType = _biometricAuthModel.biometryType; - _hasTouchID = biometryType == LABiometryTypeTouchID; - _hasFaceID = biometryType == LABiometryTypeFaceID; - } - return self; -} - -- (BOOL)biometricsEnabled { - return [DWGlobalOptions sharedInstance].biometricAuthEnabled; -} - -- (void)setBiometricsEnabled:(BOOL)biometricsEnabled { - [DWGlobalOptions sharedInstance].biometricAuthEnabled = biometricsEnabled; - - const uint64_t limit = biometricsEnabled ? DW_DEFAULT_BIOMETRICS_SPENDING_LIMIT : 0; - [[DSAuthenticationManager sharedInstance] setBiometricSpendingLimitIfAuthenticated:limit]; -} - -- (BOOL)balanceHidden { - return [DWGlobalOptions sharedInstance].balanceHidden; -} - -- (void)setBalanceHidden:(BOOL)balanceHidden { - [DWGlobalOptions sharedInstance].balanceHidden = balanceHidden; -} - -- (void)changePinContinueBlock:(void (^)(BOOL allowed))continueBlock { - [[DSAuthenticationManager sharedInstance] - authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticated, BOOL usedBiometrics, BOOL cancelled) { - if (continueBlock) { - DSAuthenticationManager *authManager = [DSAuthenticationManager sharedInstance]; - authManager.didAuthenticate = NO; - - continueBlock(authenticated); - } - }]; -} - -- (void)setupNewPin:(NSString *)pin { - DSAuthenticationManager *authManager = [DSAuthenticationManager sharedInstance]; - __unused BOOL success = [authManager setupNewPin:pin]; - NSAssert(success, @"Pin setup failed"); -} - -- (void)setBiometricsEnabled:(BOOL)enabled completion:(void (^)(BOOL success))completion { - DSAuthenticationManager *authenticationManager = [DSAuthenticationManager sharedInstance]; - [authenticationManager - authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticatedOrSuccess, BOOL usedBiometrics, BOOL cancelled) { - if (authenticatedOrSuccess) { - if (enabled) { - __weak typeof(self) weakSelf = self; - [self.biometricAuthModel enableBiometricAuth:^(BOOL success) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - strongSelf.biometricsEnabled = success; - - if (completion) { - completion(success); - } - }]; - } - else { - self.biometricsEnabled = NO; - - if (completion) { - completion(YES); - } - } - } - else { - if (completion) { - completion(NO); - } - } - }]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift index 5101c25ef..5a1416df8 100644 --- a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift @@ -101,7 +101,7 @@ class SecurityMenuViewController: UIViewController { } private func changePinAction() { - viewModel.model.changePinContinue { [weak self] allowed in + viewModel.changePinContinueBlock { [weak self] allowed in guard allowed else { return } let controller = DWSetPinViewController(intent: .changePin) @@ -142,10 +142,10 @@ class SecurityMenuViewController: UIViewController { let titleString: String let messageString: String - if viewModel.model.hasTouchID { + if viewModel.hasTouchID { titleString = String(format: NSLocalizedString("%@ is not allowed to access Touch ID", comment: ""), displayName) messageString = NSLocalizedString("Allow Touch ID access in Settings", comment: "") - } else if viewModel.model.hasFaceID { + } else if viewModel.hasFaceID { titleString = String(format: NSLocalizedString("%@ is not allowed to access Face ID", comment: ""), displayName) messageString = NSLocalizedString("Allow Face ID access in Settings", comment: "") } else { diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift index 17abbe4b3..ca97709c3 100644 --- a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift @@ -17,6 +17,7 @@ import Foundation import Combine +import LocalAuthentication enum SecurityMenuNavigationDestination { case viewRecoveryPhrase @@ -32,12 +33,20 @@ class SecurityMenuViewModel: ObservableObject { @Published var biometricsEnabled = false @Published var balanceHidden = false - let model = DWSecurityMenuModel() + private let biometricAuthModel = DWBiometricAuthModel() + private let authenticationManager = DSAuthenticationManager.sharedInstance() + + let hasTouchID: Bool + let hasFaceID: Bool init() { + let biometryType = biometricAuthModel.biometryType + hasTouchID = biometryType == .touchID + hasFaceID = biometryType == .faceID + setupItems() - biometricsEnabled = model.biometricsEnabled - balanceHidden = model.balanceHidden + biometricsEnabled = DWGlobalOptions.sharedInstance().biometricAuthEnabled + balanceHidden = DWGlobalOptions.sharedInstance().balanceHidden } private func setupItems() { @@ -59,9 +68,9 @@ class SecurityMenuViewModel: ObservableObject { } )) - if model.hasTouchID || model.hasFaceID { - let title = model.hasTouchID ? NSLocalizedString("Enable Touch ID", comment: "") : NSLocalizedString("Enable Face ID", comment: "") - let iconName = model.hasTouchID ? "image.touch.id" : "image.face.id" + if hasTouchID || hasFaceID { + let title = hasTouchID ? NSLocalizedString("Enable Touch ID", comment: "") : NSLocalizedString("Enable Face ID", comment: "") + let iconName = hasTouchID ? "image.touch.id" : "image.face.id" menuItems.append(MenuItemModel( title: title, icon: .custom(iconName, maxHeight: 22), @@ -83,7 +92,8 @@ class SecurityMenuViewModel: ObservableObject { action: { [weak self] in guard let self = self else { return } let newValue = !self.balanceHidden - self.model.balanceHidden = newValue + DWGlobalOptions.sharedInstance().balanceHidden = newValue + self.balanceHidden = newValue } )) @@ -107,7 +117,7 @@ class SecurityMenuViewModel: ObservableObject { } private func toggleBiometrics(_ enabled: Bool) { - model.setBiometricsEnabled(enabled) { [weak self] success in + setBiometricsEnabled(enabled) { [weak self] success in DispatchQueue.main.async { if !success { // Revert the toggle @@ -127,8 +137,56 @@ class SecurityMenuViewModel: ObservableObject { } } + private func setBiometricsEnabled(_ enabled: Bool, completion: @escaping (Bool) -> Void) { + authenticationManager.authenticate( + withPrompt: nil, + usingBiometricAuthentication: false, + alertIfLockout: true + ) { [weak self] authenticatedOrSuccess, usedBiometrics, cancelled in + guard let self = self else { + completion(false) + return + } + + if authenticatedOrSuccess { + if enabled { + self.biometricAuthModel.enableBiometricAuth { success in + if success { + DWGlobalOptions.sharedInstance().biometricAuthEnabled = true + let limit = DW_DEFAULT_BIOMETRICS_SPENDING_LIMIT + self.authenticationManager.setBiometricSpendingLimitIfAuthenticated(limit) + } + completion(success) + } + } else { + DWGlobalOptions.sharedInstance().biometricAuthEnabled = false + self.authenticationManager.setBiometricSpendingLimitIfAuthenticated(0) + completion(true) + } + } else { + completion(false) + } + } + } + func resetNavigation() { navigationDestination = nil showBiometricsAlert = false } + + func changePinContinueBlock(_ continueBlock: @escaping (Bool) -> Void) { + authenticationManager.authenticate( + withPrompt: nil, + usingBiometricAuthentication: false, + alertIfLockout: true + ) { authenticated, usedBiometrics, cancelled in + self.authenticationManager.didAuthenticate = false + continueBlock(authenticated) + } + } + + func setupNewPin(_ pin: String) { + let success = authenticationManager.setupNewPin(pin) + assert(success, "Pin setup failed") + } } diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 5aa93136d..52ccf08af 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -150,6 +150,7 @@ static const bool _SNAPSHOT = 0; #import "DWHomeModel.h" #import "DWRecoverViewController.h" #import "DSAuthenticationManager.h" +#import "DSAuthenticationManager+Private.h" #import "DWSecureWalletDelegate.h" #import "DWSettingsMenuModel.h" #import "DWBasePayViewController.h" @@ -163,9 +164,10 @@ static const bool _SNAPSHOT = 0; #import "DWSharedUIConstants.h" #import "DWUserProfileContainerView.h" #import "DWDashPayReadyProtocol.h" -#import "DWSecurityMenuModel.h" #import "DWSetPinViewController.h" #import "DWAdvancedSecurityViewController.h" +#import "DWBiometricAuthModel.h" +#import "DWAdvancedSecurityModel.h" #import "DWResetWalletInfoViewController.h" #import "DWPreviewSeedPhraseModel.h" #import "DWPreviewSeedPhraseViewController.h" From efcfd31409b410899e3651015753ac454121a3b1 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 24 Jul 2025 12:55:38 +0700 Subject: [PATCH 05/14] chore: fold DWSettingsMenuModel into SettingsMenuViewModel --- DashWallet.xcodeproj/project.pbxproj | 20 +- .../Home/HomeViewController+Shortcuts.swift | 12 +- .../Menu/Security/SecurityMenuViewModel.swift | 1 + .../UI/Menu/Settings/DWSettingsMenuModel.h | 41 ---- .../UI/Menu/Settings/DWSettingsMenuModel.m | 140 -------------- .../Settings/SettingsMenuViewController.swift | 176 +++++++++++++++--- ...odel.swift => SettingsMenuViewModel.swift} | 81 +++++++- DashWallet/ar.lproj/Localizable.strings | 9 + DashWallet/bg.lproj/Localizable.strings | 9 + DashWallet/ca.lproj/Localizable.strings | 9 + DashWallet/cs.lproj/Localizable.strings | 9 + DashWallet/da.lproj/Localizable.strings | 9 + DashWallet/dashwallet-Bridging-Header.h | 3 +- DashWallet/de.lproj/Localizable.strings | 9 + DashWallet/el.lproj/Localizable.strings | 9 + DashWallet/en.lproj/Localizable.strings | 9 + DashWallet/eo.lproj/Localizable.strings | 9 + DashWallet/es.lproj/Localizable.strings | 9 + DashWallet/et.lproj/Localizable.strings | 9 + DashWallet/fa.lproj/Localizable.strings | 9 + DashWallet/fi.lproj/Localizable.strings | 9 + DashWallet/fil.lproj/Localizable.strings | 9 + DashWallet/fr.lproj/Localizable.strings | 9 + DashWallet/hr.lproj/Localizable.strings | 9 + DashWallet/hu.lproj/Localizable.strings | 9 + DashWallet/id.lproj/Localizable.strings | 9 + DashWallet/it.lproj/Localizable.strings | 9 + DashWallet/ja.lproj/Localizable.strings | 9 + DashWallet/ko.lproj/Localizable.strings | 9 + DashWallet/mk.lproj/Localizable.strings | 9 + DashWallet/ms.lproj/Localizable.strings | 9 + DashWallet/nb.lproj/Localizable.strings | 9 + DashWallet/nl.lproj/Localizable.strings | 9 + DashWallet/pl.lproj/Localizable.strings | 9 + DashWallet/pt.lproj/Localizable.strings | 9 + DashWallet/ro.lproj/Localizable.strings | 9 + DashWallet/ru.lproj/Localizable.strings | 9 + DashWallet/sk.lproj/Localizable.strings | 9 + DashWallet/sl.lproj/Localizable.strings | 9 + DashWallet/sl_SI.lproj/Localizable.strings | 9 + DashWallet/sq.lproj/Localizable.strings | 9 + DashWallet/sr.lproj/Localizable.strings | 9 + DashWallet/sv.lproj/Localizable.strings | 9 + DashWallet/th.lproj/Localizable.strings | 9 + DashWallet/tr.lproj/Localizable.strings | 9 + DashWallet/uk.lproj/Localizable.strings | 9 + DashWallet/vi.lproj/Localizable.strings | 9 + DashWallet/zh-Hans.lproj/Localizable.strings | 9 + .../zh-Hant-TW.lproj/Localizable.strings | 9 + DashWallet/zh.lproj/Localizable.strings | 9 + DashWallet/zh_TW.lproj/Localizable.strings | 9 + 51 files changed, 627 insertions(+), 234 deletions(-) delete mode 100644 DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.h delete mode 100644 DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.m rename DashWallet/Sources/UI/Menu/Settings/{SettingsViewModel.swift => SettingsMenuViewModel.swift} (63%) diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 130bda7f2..e2195df4e 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -182,7 +182,6 @@ 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */; }; 2A7A7BC92347E0D700451078 /* DWBaseFormTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */; }; 2A7A7BD62348CB6600451078 /* SettingsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */; }; - 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */; }; 2A7A7C16234B763600451078 /* DWLocalCurrencyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C15234B763600451078 /* DWLocalCurrencyViewController.m */; }; 2A7A7C1D234B771400451078 /* DWLocalCurrencyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C1C234B771400451078 /* DWLocalCurrencyModel.m */; }; 2A7A7C20234B79B700451078 /* DWLocalCurrencyTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C1F234B79B700451078 /* DWLocalCurrencyTableViewCell.m */; }; @@ -502,8 +501,8 @@ 75050CCF2DF2CB0F00F586D6 /* GiftCardMetadataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75050CCD2DF2CB0E00F586D6 /* GiftCardMetadataProvider.swift */; }; 75050CD12DF2FCC200F586D6 /* ServiceName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75050CD02DF2FCBF00F586D6 /* ServiceName.swift */; }; 75050CD22DF2FCC200F586D6 /* ServiceName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75050CD02DF2FCBF00F586D6 /* ServiceName.swift */; }; - 750CED602C94BFD7000FB837 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CED5F2C94BFD7000FB837 /* SettingsViewModel.swift */; }; - 750CED612C94BFD7000FB837 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CED5F2C94BFD7000FB837 /* SettingsViewModel.swift */; }; + 750CED602C94BFD7000FB837 /* SettingsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CED5F2C94BFD7000FB837 /* SettingsMenuViewModel.swift */; }; + 750CED612C94BFD7000FB837 /* SettingsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CED5F2C94BFD7000FB837 /* SettingsMenuViewModel.swift */; }; 750CEFA12CCA6EA100E87A32 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CEFA02CCA6EA100E87A32 /* TextInput.swift */; }; 750CEFA22CCA6EA100E87A32 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CEFA02CCA6EA100E87A32 /* TextInput.swift */; }; 750CEFA42CCA713300E87A32 /* CreateUsernameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CEFA32CCA712E00E87A32 /* CreateUsernameViewController.swift */; }; @@ -1339,7 +1338,6 @@ C9D2C81E2A320AA000D15901 /* DWGlobalOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD1CEAA22E18F1800C99324 /* DWGlobalOptions.m */; }; C9D2C81F2A320AA000D15901 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4430E622CBB6EC009BAF7F /* AppDelegate.m */; }; C9D2C8202A320AA000D15901 /* SendReceivePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C917023E29D44E0B008C034D /* SendReceivePageController.swift */; }; - C9D2C8212A320AA000D15901 /* DWSettingsMenuModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */; }; C9D2C8232A320AA000D15901 /* BaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478A2C6E28DC457000AD1420 /* BaseNavigationController.swift */; }; C9D2C8242A320AA000D15901 /* UIViewController+Coinbase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47CDEECB294A2BAD008AE06D /* UIViewController+Coinbase.swift */; }; C9D2C8262A320AA000D15901 /* CSVBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472D13E0299E1F2F006903F1 /* CSVBuilder.swift */; }; @@ -1955,8 +1953,6 @@ 2A7A7BC72347E0D700451078 /* DWBaseFormTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBaseFormTableViewCell.h; sourceTree = ""; }; 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBaseFormTableViewCell.m; sourceTree = ""; }; 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuViewController.swift; sourceTree = ""; }; - 2A7A7BD72348CB7300451078 /* DWSettingsMenuModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSettingsMenuModel.h; sourceTree = ""; }; - 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSettingsMenuModel.m; sourceTree = ""; }; 2A7A7C14234B763600451078 /* DWLocalCurrencyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWLocalCurrencyViewController.h; sourceTree = ""; }; 2A7A7C15234B763600451078 /* DWLocalCurrencyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWLocalCurrencyViewController.m; sourceTree = ""; }; 2A7A7C1B234B771400451078 /* DWLocalCurrencyModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWLocalCurrencyModel.h; sourceTree = ""; }; @@ -2430,7 +2426,7 @@ 7509C10E1AF3076100D03FD5 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 7509C1121AF3720100D03FD5 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 750C6CC01B5C8EB60038AAE9 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; - 750CED5F2C94BFD7000FB837 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = ""; }; + 750CED5F2C94BFD7000FB837 /* SettingsMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuViewModel.swift; sourceTree = ""; }; 750CEFA02CCA6EA100E87A32 /* TextInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextInput.swift; sourceTree = ""; }; 750CEFA32CCA712E00E87A32 /* CreateUsernameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateUsernameViewController.swift; sourceTree = ""; }; 7511E8CB1AE5FF240025F1B3 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; lineEnding = 0; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; @@ -4213,10 +4209,8 @@ children = ( 2A7A7C13234B761700451078 /* LocalCurrency */, 2A8F420A21BEE69E00858B91 /* About */, - 2A7A7BD72348CB7300451078 /* DWSettingsMenuModel.h */, - 2A7A7BD82348CB7300451078 /* DWSettingsMenuModel.m */, 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */, - 750CED5F2C94BFD7000FB837 /* SettingsViewModel.swift */, + 750CED5F2C94BFD7000FB837 /* SettingsMenuViewModel.swift */, ); path = Settings; sourceTree = ""; @@ -8523,7 +8517,7 @@ 75FFD6BB2BF48DF80032879E /* HomeViewController+JailbreakCheck.swift in Sources */, 477F50102950A55A003C7508 /* Coinbase+Error.swift in Sources */, 2A63003F2327B4BB00827825 /* DWPaymentOutput+DWView.m in Sources */, - 750CED602C94BFD7000FB837 /* SettingsViewModel.swift in Sources */, + 750CED602C94BFD7000FB837 /* SettingsMenuViewModel.swift in Sources */, 75D5D5342CC928630049ED7B /* UIHostingController+DashWallet.swift in Sources */, 2ACD53EE234C9D8E00650AD3 /* UIView+DWRecursiveSubview.m in Sources */, 11860923297598B400279FCC /* AddressStatus.swift in Sources */, @@ -8852,7 +8846,6 @@ 75D2B4A12D9D28AC00228DB0 /* BlockExplorerSelectionView.swift in Sources */, C917023F29D44E0B008C034D /* SendReceivePageController.swift in Sources */, 753FD7E22CA44BDD00B7751F /* CoinJoinProgress.swift in Sources */, - 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */, 753E46E82DE1E24300A3FF2A /* CTXSpendModels.swift in Sources */, 752D03AD2E2F758B00B88784 /* MainMenuViewModel.swift in Sources */, 752D03AF2E2F758B00B88784 /* MainMenuView.swift in Sources */, @@ -9300,7 +9293,7 @@ C9D2C7152A320AA000D15901 /* DWBasePayViewController.m in Sources */, C943B4AC2A40A54600AF23C5 /* DWContactsViewController.m in Sources */, C9D2C7162A320AA000D15901 /* CrowdNodeTransferModel.swift in Sources */, - 750CED612C94BFD7000FB837 /* SettingsViewModel.swift in Sources */, + 750CED612C94BFD7000FB837 /* SettingsMenuViewModel.swift in Sources */, C9D2C7172A320AA000D15901 /* DWSetPinViewController.m in Sources */, C943B3322A408CED00AF23C5 /* DWProfileDisplayNameCellModel.m in Sources */, C9D2C7182A320AA000D15901 /* ConfirmOrderController.swift in Sources */, @@ -9665,7 +9658,6 @@ C9D2C81E2A320AA000D15901 /* DWGlobalOptions.m in Sources */, C9D2C81F2A320AA000D15901 /* AppDelegate.m in Sources */, C9D2C8202A320AA000D15901 /* SendReceivePageController.swift in Sources */, - C9D2C8212A320AA000D15901 /* DWSettingsMenuModel.m in Sources */, C943B5242A40A54600AF23C5 /* UIColor+DWDashPay.m in Sources */, C943B4E82A40A54600AF23C5 /* DWProfileTxsFetchedDataSource.m in Sources */, C9D2C8232A320AA000D15901 /* BaseNavigationController.swift in Sources */, diff --git a/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift b/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift index 244caf2d1..7ac4dfd2b 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift @@ -29,7 +29,7 @@ extension HomeViewController: DWLocalCurrencyViewControllerDelegate, ExploreView case .buySellDash: buySellDashAction() case .syncNow: - DWSettingsMenuModel.rescanBlockchainAction(from: self, sourceView: sender!, sourceRect: sender!.bounds, completion: nil) + SettingsMenuViewController.presentRescanBlockchainAction(from: self, sourceView: sender!, sourceRect: sender!.bounds, completion: nil) case .payWithNFC: performNFCReadingAction() case .localCurrency: @@ -37,12 +37,14 @@ extension HomeViewController: DWLocalCurrencyViewControllerDelegate, ExploreView case .importPrivateKey: showImportPrivateKey() case .switchToTestnet: - DWSettingsMenuModel.switchToTestnet { success in - // NOP + Task { + let settingsViewModel = SettingsMenuViewModel() + _ = await settingsViewModel.switchToTestnet() } case .switchToMainnet: - DWSettingsMenuModel.switchToMainnet { success in - // NOP + Task { + let settingsViewModel = SettingsMenuViewModel() + _ = await settingsViewModel.switchToMainnet() } case .reportAnIssue: break diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift index ca97709c3..8a2e5179a 100644 --- a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift @@ -26,6 +26,7 @@ enum SecurityMenuNavigationDestination { case resetWallet } +@MainActor class SecurityMenuViewModel: ObservableObject { @Published var navigationDestination: SecurityMenuNavigationDestination? @Published var showBiometricsAlert = false diff --git a/DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.h b/DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.h deleted file mode 100644 index fb0969d17..000000000 --- a/DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface DWSettingsMenuModel : NSObject - -@property (readonly, copy, nonatomic) NSString *networkName; -@property (readonly, copy, nonatomic) NSString *localCurrencyCode; - -@property (assign, nonatomic) BOOL notificationsEnabled; - -+ (void)switchToMainnetWithCompletion:(void (^)(BOOL success))completion; -+ (void)switchToTestnetWithCompletion:(void (^)(BOOL success))completion; -+ (void)switchToEvonetWithCompletion:(void (^)(BOOL success))completion; - -+ (void)rescanBlockchainActionFromController:(UIViewController *)controller - sourceView:(UIView *)sourceView - sourceRect:(CGRect)sourceRect - completion:(void (^_Nullable)(BOOL confirmed))completion; - -+ (void)generateCSVReportWithCompletionHandler:(void (^)(NSString *fileName, NSURL *file))completionHandler errorHandler:(void (^)(NSError *error))errorHandler; -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.m b/DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.m deleted file mode 100644 index 4a8ffd2c9..000000000 --- a/DashWallet/Sources/UI/Menu/Settings/DWSettingsMenuModel.m +++ /dev/null @@ -1,140 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWSettingsMenuModel.h" - -#import "DWEnvironment.h" -#import "DWGlobalOptions.h" -#import "dashwallet-Swift.h" -NS_ASSUME_NONNULL_BEGIN - -@implementation DWSettingsMenuModel - -- (NSString *)networkName { - return [DWEnvironment sharedInstance].currentChain.name; -} - -- (NSString *)localCurrencyCode { - return CurrencyExchangerObjcWrapper.localCurrencyCode; -} - -- (BOOL)notificationsEnabled { - return [DWGlobalOptions sharedInstance].localNotificationsEnabled; -} - -- (void)setNotificationsEnabled:(BOOL)notificationsEnabled { - [DWGlobalOptions sharedInstance].localNotificationsEnabled = notificationsEnabled; -} - -+ (void)switchToMainnetWithCompletion:(void (^)(BOOL success))completion { - [[DWEnvironment sharedInstance] switchToMainnetWithCompletion:completion]; -} - -+ (void)switchToTestnetWithCompletion:(void (^)(BOOL success))completion { - [[DWEnvironment sharedInstance] switchToTestnetWithCompletion:completion]; -} - -+ (void)switchToEvonetWithCompletion:(void (^)(BOOL success))completion { - [[DWEnvironment sharedInstance] switchToEvonetWithCompletion:completion]; -} - -+ (void)rescanBlockchainActionFromController:(UIViewController *)controller - sourceView:(UIView *)sourceView - sourceRect:(CGRect)sourceRect - completion:(void (^_Nullable)(BOOL confirmed))completion { - UIAlertController *actionSheet = [UIAlertController - alertControllerWithTitle:NSLocalizedString(@"Rescan Blockchain", nil) - message:nil - preferredStyle:UIAlertControllerStyleActionSheet]; - UIAlertAction *rescanAction = [UIAlertAction - actionWithTitle:DSLocalizedString(@"Rescan Transactions (Suggested)", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - [DWGlobalOptions sharedInstance].resyncingWallet = YES; - - DSChainManager *chainManager = [DWEnvironment sharedInstance].currentChainManager; - [chainManager syncBlocksRescan]; - - if (completion) { - completion(YES); - } - }]; - - UIAlertAction *rescanMNLAndBlocksAction = [UIAlertAction - actionWithTitle:DSLocalizedString(@"Full Resync", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - [DWGlobalOptions sharedInstance].resyncingWallet = YES; - - DSChainManager *chainManager = [DWEnvironment sharedInstance].currentChainManager; - [chainManager masternodeListAndBlocksRescan]; - - if (completion) { - completion(YES); - } - }]; - -#if DEBUG - - UIAlertAction *rescanMNLAction = [UIAlertAction - actionWithTitle:DSLocalizedString(@"Resync Masternode List", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - [DWGlobalOptions sharedInstance].resyncingWallet = YES; - - DSChainManager *chainManager = [DWEnvironment sharedInstance].currentChainManager; - [chainManager masternodeListRescan]; - - if (completion) { - completion(YES); - } - }]; - -#endif - - UIAlertAction *cancelAction = [UIAlertAction - actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleCancel - handler:^(UIAlertAction *_Nonnull action) { - if (completion) { - completion(NO); - } - }]; - [actionSheet addAction:rescanAction]; - [actionSheet addAction:rescanMNLAndBlocksAction]; - -#if DEBUG - - [actionSheet addAction:rescanMNLAction]; - -#endif - [actionSheet addAction:cancelAction]; - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { - actionSheet.popoverPresentationController.sourceView = sourceView; - actionSheet.popoverPresentationController.sourceRect = sourceRect; - } - [controller presentViewController:actionSheet - animated:YES - completion:nil]; -} - -+ (void)generateCSVReportWithCompletionHandler:(void (^)(NSString *fileName, NSURL *file))completionHandler errorHandler:(void (^)(NSError *error))errorHandler { - return [TaxReportGenerator generateCSVReportWithCompletionHandler:completionHandler errorHandler:errorHandler]; -} -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift index e93671e66..4171f0f14 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift @@ -23,12 +23,76 @@ protocol SettingsMenuViewControllerDelegate: AnyObject { func settingsMenuViewControllerDidRescanBlockchain(_ controller: SettingsMenuViewController) } +extension SettingsMenuViewController { + // Static helper method for presenting rescan options from other view controllers + static func presentRescanBlockchainAction(from controller: UIViewController, + sourceView: UIView, + sourceRect: CGRect, + completion: ((Bool) -> Void)? = nil) { + let actionSheet = UIAlertController( + title: NSLocalizedString("Rescan Blockchain", comment: ""), + message: nil, + preferredStyle: .actionSheet + ) + + let viewModel = SettingsMenuViewModel() + + let rescanAction = UIAlertAction( + title: NSLocalizedString("Rescan Transactions (Suggested)", comment: ""), + style: .default + ) { _ in + viewModel.rescanTransactions() + completion?(true) + } + + let rescanMNLAndBlocksAction = UIAlertAction( + title: NSLocalizedString("Full Resync", comment: ""), + style: .default + ) { _ in + viewModel.fullResync() + completion?(true) + } + + #if DEBUG + let rescanMNLAction = UIAlertAction( + title: NSLocalizedString("Resync Masternode List", comment: ""), + style: .default + ) { _ in + viewModel.resyncMasternodeList() + completion?(true) + } + #endif + + let cancelAction = UIAlertAction( + title: NSLocalizedString("Cancel", comment: ""), + style: .cancel + ) { _ in + completion?(false) + } + + actionSheet.addAction(rescanAction) + actionSheet.addAction(rescanMNLAndBlocksAction) + + #if DEBUG + actionSheet.addAction(rescanMNLAction) + #endif + + actionSheet.addAction(cancelAction) + + if UIDevice.current.userInterfaceIdiom == .pad { + actionSheet.popoverPresentationController?.sourceView = sourceView + actionSheet.popoverPresentationController?.sourceRect = sourceRect + } + + controller.present(actionSheet, animated: true, completion: nil) + } +} + class SettingsMenuViewController: UIViewController, DWLocalCurrencyViewControllerDelegate { weak var delegate: SettingsMenuViewControllerDelegate? - private lazy var model: DWSettingsMenuModel = DWSettingsMenuModel() - private lazy var viewModel: SettingsViewModel = SettingsViewModel(model: model) + private lazy var viewModel: SettingsMenuViewModel = SettingsMenuViewModel() private var cancellables = Set() init() { @@ -106,17 +170,23 @@ class SettingsMenuViewController: UIViewController, DWLocalCurrencyViewControlle let actionSheet = UIAlertController(title: NSLocalizedString("Network", comment: ""), message: nil, preferredStyle: .actionSheet) let mainnetAction = UIAlertAction(title: NSLocalizedString("Mainnet", comment: ""), style: .default) { [weak self] _ in - DWSettingsMenuModel.switchToMainnet { success in + Task { + let success = await self?.viewModel.switchToMainnet() ?? false if success { - self?.updateView() + await MainActor.run { + self?.updateView() + } } } } let testnetAction = UIAlertAction(title: NSLocalizedString("Testnet", comment: ""), style: .default) { [weak self] _ in - DWSettingsMenuModel.switchToTestnet { success in + Task { + let success = await self?.viewModel.switchToTestnet() ?? false if success { - self?.updateView() + await MainActor.run { + self?.updateView() + } } } } @@ -164,31 +234,87 @@ class SettingsMenuViewController: UIViewController, DWLocalCurrencyViewControlle } private func rescanBlockchainAction() { - DWSettingsMenuModel.rescanBlockchainAction(from: self, sourceView: view, sourceRect: view.bounds) { [weak self] confirmed in - if confirmed { - self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) - } + let actionSheet = UIAlertController( + title: NSLocalizedString("Rescan Blockchain", comment: ""), + message: nil, + preferredStyle: .actionSheet + ) + + let rescanAction = UIAlertAction( + title: NSLocalizedString("Rescan Transactions (Suggested)", comment: ""), + style: .default + ) { [weak self] _ in + self?.viewModel.rescanTransactions() + self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) + } + + let rescanMNLAndBlocksAction = UIAlertAction( + title: NSLocalizedString("Full Resync", comment: ""), + style: .default + ) { [weak self] _ in + self?.viewModel.fullResync() + self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) + } + + #if DEBUG + let rescanMNLAction = UIAlertAction( + title: NSLocalizedString("Resync Masternode List", comment: ""), + style: .default + ) { [weak self] _ in + self?.viewModel.resyncMasternodeList() + self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) + } + #endif + + let cancelAction = UIAlertAction( + title: NSLocalizedString("Cancel", comment: ""), + style: .cancel, + handler: nil + ) + + actionSheet.addAction(rescanAction) + actionSheet.addAction(rescanMNLAndBlocksAction) + + #if DEBUG + actionSheet.addAction(rescanMNLAction) + #endif + + actionSheet.addAction(cancelAction) + + if UIDevice.current.userInterfaceIdiom == .pad { + actionSheet.popoverPresentationController?.sourceView = view + actionSheet.popoverPresentationController?.sourceRect = view.bounds } + + present(actionSheet, animated: true, completion: nil) } private func exportTransactionsInCSV() { view.dw_showProgressHUD(withMessage: NSLocalizedString("Generating CSV Report", comment: "")) - DWSettingsMenuModel.generateCSVReport { [weak self] fileName, file in - self?.view.dw_hideProgressHUD() - - let activityViewController = UIActivityViewController(activityItems: [file], applicationActivities: nil) - activityViewController.setValue(fileName, forKey: "subject") - - if UIDevice.current.userInterfaceIdiom == .pad { - activityViewController.popoverPresentationController?.sourceView = self?.view - activityViewController.popoverPresentationController?.sourceRect = self?.view.bounds ?? .zero + Task { + do { + let (fileName, file) = try await viewModel.generateCSVReport() + + await MainActor.run { + self.view.dw_hideProgressHUD() + + let activityViewController = UIActivityViewController(activityItems: [file], applicationActivities: nil) + activityViewController.setValue(fileName, forKey: "subject") + + if UIDevice.current.userInterfaceIdiom == .pad { + activityViewController.popoverPresentationController?.sourceView = self.view + activityViewController.popoverPresentationController?.sourceRect = self.view.bounds + } + + self.present(activityViewController, animated: true, completion: nil) + } + } catch { + await MainActor.run { + self.view.dw_hideProgressHUD() + self.dw_displayErrorModally(error) + } } - - self?.present(activityViewController, animated: true, completion: nil) - } errorHandler: { [weak self] error in - self?.view.dw_hideProgressHUD() - self?.dw_displayErrorModally(error) } } @@ -217,7 +343,7 @@ extension SettingsMenuViewController { } struct SettingsMenuContent: View { - @StateObject var viewModel: SettingsViewModel + @StateObject var viewModel: SettingsMenuViewModel var body: some View { VStack(alignment: .leading, spacing: 0) { diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift similarity index 63% rename from DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift rename to DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift index fd33ff6b5..eefddf689 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift @@ -16,6 +16,7 @@ // import Combine +import UIKit enum SettingsNavDest { case coinjoin @@ -26,15 +27,25 @@ enum SettingsNavDest { case none } -class SettingsViewModel: ObservableObject { +@MainActor +class SettingsMenuViewModel: ObservableObject { private var cancellableBag = Set() private let coinJoinService = CoinJoinService.shared - private var model: DWSettingsMenuModel + @Published var items: [MenuItemModel] = [] @Published private(set) var navigationDestination: SettingsNavDest = .none + @Published var notificationsEnabled: Bool + + var networkName: String { + return DWEnvironment.sharedInstance().currentChain.name + } - init(model: DWSettingsMenuModel) { - self.model = model + var localCurrencyCode: String { + return CurrencyExchangerObjcWrapper.localCurrencyCode + } + + init() { + self.notificationsEnabled = DWGlobalOptions.sharedInstance().localNotificationsEnabled refreshMenuItems() setupCoinJoinObservers() } @@ -73,7 +84,7 @@ class SettingsViewModel: ObservableObject { self.items = [ MenuItemModel( title: NSLocalizedString("Local Currency", comment: ""), - subtitle: model.localCurrencyCode, + subtitle: localCurrencyCode, icon: .custom("image.currency", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .currencySelector @@ -83,14 +94,17 @@ class SettingsViewModel: ObservableObject { title: NSLocalizedString("Enable Receive Notifications", comment: ""), icon: .custom("image.notifications", maxHeight: 22), showToggle: true, - isToggled: model.notificationsEnabled, + isToggled: notificationsEnabled, action: { [weak self] in - self?.model.notificationsEnabled.toggle() + guard let self = self else { return } + self.notificationsEnabled.toggle() + DWGlobalOptions.sharedInstance().localNotificationsEnabled = self.notificationsEnabled + self.refreshMenuItems() } ), MenuItemModel( title: NSLocalizedString("Network", comment: ""), - subtitle: model.networkName, + subtitle: networkName, icon: .custom("image.rescan", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .network @@ -136,4 +150,55 @@ class SettingsViewModel: ObservableObject { ]) #endif } + + // MARK: - Network Switching + + func switchToMainnet() async -> Bool { + return await DWEnvironment.sharedInstance().switchToMainnet() + } + + func switchToTestnet() async -> Bool { + return await DWEnvironment.sharedInstance().switchToTestnet() + } + + func switchToEvonet() async -> Bool { + return await DWEnvironment.sharedInstance().switchToEvonet() + } + + // MARK: - Blockchain Rescan Actions + + func rescanTransactions() { + DWGlobalOptions.sharedInstance().isResyncingWallet = true + let chainManager = DWEnvironment.sharedInstance().currentChainManager + chainManager.syncBlocksRescan() + } + + func fullResync() { + DWGlobalOptions.sharedInstance().isResyncingWallet = true + let chainManager = DWEnvironment.sharedInstance().currentChainManager + chainManager.masternodeListAndBlocksRescan() + } + + #if DEBUG + func resyncMasternodeList() { + DWGlobalOptions.sharedInstance().isResyncingWallet = true + let chainManager = DWEnvironment.sharedInstance().currentChainManager + chainManager.masternodeListRescan() + } + #endif + + // MARK: - CSV Report Generation + + func generateCSVReport() async throws -> (fileName: String, file: URL) { + try await withCheckedThrowingContinuation { continuation in + TaxReportGenerator.generateCSVReport( + completionHandler: { fileName, file in + continuation.resume(returning: (fileName, file)) + }, + errorHandler: { error in + continuation.resume(throwing: error) + } + ) + } + } } diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index cc6c6858d..a6c1264b4 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "اعادة نسخ بلوكشين"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "إعادة تعيين"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index a646728f3..0e1073932 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Повторно сканиране на блок-веригата"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Нулиране"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index fe4713ec4..cada04290 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reinicia"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index 7575edb5b..42616ac7c 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Skenovat blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Resetovat"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Uchovávat společnou transakční historii"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index c45aed5e7..959799971 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Nulstil"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 52ccf08af..57886f2ba 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -24,6 +24,8 @@ static const bool _SNAPSHOT = 0; #import "DSKeyManager.h" #import "BigIntTypes.h" #import "NSString+Dash.h" +#import "DSChainManager.h" +#import "DSChain.h" //MARK: DashWallet #import "DWEnvironment.h" @@ -152,7 +154,6 @@ static const bool _SNAPSHOT = 0; #import "DSAuthenticationManager.h" #import "DSAuthenticationManager+Private.h" #import "DWSecureWalletDelegate.h" -#import "DWSettingsMenuModel.h" #import "DWBasePayViewController.h" #import "DWHomeProtocol.h" diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 6d5aa7f2b..64f21c864 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "von deinem Coinbase Konto"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Vollständig gemixt"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Blockchain erneut scannen"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Zurücksetzen"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Ergebnisse"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Gemeinsamen Transaktionsverlauf erhalten"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 85424249f..d800f1c22 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "από τον λογαριασμό σας στην Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Πλήρως αναμεμειγμένα"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Επανασάρωση του blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Επαναφορά"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Αποτελέσματα"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Διατήρηση Ιστορικού Αμοιβαίων Συναλλαγών"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 9040d38e1..56859fdd0 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index 7be53faae..fe796a7a7 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reŝargi"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index d4699124d..fa24c37ec 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "desde tu cuenta de Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Completamente mezclado"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Escanear de nuevo la cadena de bloques"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reiniciar"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Resultados"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Conservar el historial de transacciones mutuas"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index e473b4559..cb4b4f99f 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 6780d6c77..9168080d3 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "اسکن دوباره بلاکچین"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "بازنشانی"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "نتایج"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index d6609e34d..ab6c898bb 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Nollaa"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 05c2ae297..7bcacdf14 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "mula sa iyong Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Ganap na Nahalo"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Muling i-scan ang blockchain "; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "I-reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Mga resulta"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Panatlihin ang Kasaysayan ng Kapwang Transaksyon"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index f08d2073d..ae22124aa 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "depuis votre compte Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Entièrement mélangé"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Réanalyser la blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Réinitialiser"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Résultats"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "conserver un historique de vos transactions mutuelles"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index aefd9241d..bca23ae6b 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 89ce3ec8f..5acc443f8 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Visszaállítás"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 9af140469..888f890d9 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "dari akun Coinbase Anda"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Tercampur sepenuhnya"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Piindai ulang blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Atur-ulang"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Hasil"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Simpan Sejarah Transaksi Bersama"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index a6e1a8b56..64b671d8e 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "dal tuo conto Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Completamente miscelato"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Riscansione blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Risultati"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Conserva la cronologia delle transazioni reciproche"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 9690fdfd7..367211762 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "Coinbaseアカウントから"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "完全にミキシングされました"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "ブロックチェーンの再スキャン"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "リセット"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "結果"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "双方の取引履歴を保持する"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index b3cd94c00..636a65cdd 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "당신의 코인베이스 계좌로부터"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "완전히 믹싱됨"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "블록체인 재스캔"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "리셋"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "결과"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "상호 거래 내역을 유지합니다"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index a2a0a1d21..9e50d2cd9 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Ресетирај"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 5599cd95b..0d20018b7 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 7f0f0cc39..b316e6e32 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Nullstill"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index 552cf0dc6..d556f18f8 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "vanaf je Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Volledig gemixt"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Blockchain opnieuw scannen"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Resultaten"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Bewaar de geschiedenis van gemeenschappelijke transacties"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index fc2c89392..65b5a38c8 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "z twojego konta na Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Całkowicie wymieszane"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Przeskanuj blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Resetuj"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Wyniki"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Zachowaj Wspólną Historię Transakcji"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index bde4658d6..54cd816c8 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "da sua conta Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Totalmente misturado"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Resetar"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Resultados"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Reter Histórico de Transações Mútuas"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index d71988120..f91eb51d2 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Scanează din nou blockchain-ul"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Resetează"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 113e6a545..45b9b5b8c 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "с аккаунта Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Полностью перемешано"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Пересинхронизировать блокчейн"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Сбросить"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Результаты"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Хранить историю взаимных транзакций"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 473136b49..f7a55ea18 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "z vášho Coinbase účtu"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Plne zmiešané"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Znova prehľadať reťazec blokov"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Obnoviť"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Výsledky"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Zachovať históriu vzájomných transakcií"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index a6d1dd464..9e479b2db 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Ponastavi"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index 6c1307036..97a0056ed 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Ponastavi"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 6d511332e..d1c8596be 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reseto"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index e50d43052..254994a5a 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Resetuj"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index e816ec6ea..e75ccd511 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Återställ"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 3b571a813..d1793fa64 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "จากบัญชี Coinbase ของคุณ"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "สแกน blockchain อีกครั้ง"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "ตั้งค่า"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "เก็บประวัติการทำธุรกรรมร่วมกัน"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 6f2c0f900..5afc3941d 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "Coinbase hesabınızdan"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Blok Zincirini Tekrar Tara"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Yeniden Başlat"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Sonuçlar"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Karşılıklı İşlem Geçmişini Saklayın"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 2ea421902..ef9358168 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "з вашого акаунта Coinbase"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Повністю змішано"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Пересканувати блокчейн"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Скидання"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Результати"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Зберігати взаємну історію транзакцій"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 9659f7f72..988b6ab6b 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Quét lại blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Thiết lập lại"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Giữ lại lịch sử các giao dịch qua lại"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index c4cd588c7..ff61f696b 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index a53c2300c..25a13de57 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "from your Coinbase account"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "Fully mixed"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "Rescan Blockchain"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "Reset"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "Results"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "Retain Mutual Transaction History"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 903d476f8..c086bd5f1 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "从您的 Coinbase 账户"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "充分混币"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "重新扫描区块链"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "重置"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "结果"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "保留相互交易记录"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index ee791e00e..a96bf5a6c 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -1003,6 +1003,9 @@ /* Coinbase */ "from your Coinbase account" = "從你的 Coinbase 帳戶"; +/* No comment provided by engineer. */ +"Full Resync" = "Full Resync"; + /* CoinJoin */ "Fully mixed" = "充分混合"; @@ -2054,6 +2057,9 @@ /* No comment provided by engineer. */ "Rescan Blockchain" = "重新掃瞄區塊鏈"; +/* No comment provided by engineer. */ +"Rescan Transactions (Suggested)" = "Rescan Transactions (Suggested)"; + /* No comment provided by engineer. */ "Reset" = "重設"; @@ -2072,6 +2078,9 @@ /* Usernames */ "Results" = "結果"; +/* No comment provided by engineer. */ +"Resync Masternode List" = "Resync Masternode List"; + /* emphasized text in: Add as your contact to Pay Directly to Username and Retain Mutual Transaction History */ "Retain Mutual Transaction History" = "保留相互交易記錄"; From a178424425ad8ef9db833bd04f606107ffad0056 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 24 Jul 2025 16:13:48 +0700 Subject: [PATCH 06/14] chore: fully transition Security VC to SwiftUI --- DashWallet.xcodeproj/project.pbxproj | 12 +- .../UI/Menu/Main/MainMenuViewController.swift | 19 +- .../Security/SecurityMenuViewController.swift | 235 ------------------ .../Menu/Security/SecurityMenuViewModel.swift | 5 +- .../UI/Menu/Security/SecurityScreen.swift | 159 ++++++++++++ DashWallet/ar.lproj/Localizable.strings | 13 +- DashWallet/bg.lproj/Localizable.strings | 13 +- DashWallet/ca.lproj/Localizable.strings | 13 +- DashWallet/cs.lproj/Localizable.strings | 13 +- DashWallet/da.lproj/Localizable.strings | 13 +- DashWallet/de.lproj/Localizable.strings | 13 +- DashWallet/el.lproj/Localizable.strings | 13 +- DashWallet/en.lproj/Localizable.strings | 13 +- DashWallet/eo.lproj/Localizable.strings | 13 +- DashWallet/es.lproj/Localizable.strings | 13 +- DashWallet/et.lproj/Localizable.strings | 13 +- DashWallet/fa.lproj/Localizable.strings | 13 +- DashWallet/fi.lproj/Localizable.strings | 13 +- DashWallet/fil.lproj/Localizable.strings | 13 +- DashWallet/fr.lproj/Localizable.strings | 13 +- DashWallet/hr.lproj/Localizable.strings | 13 +- DashWallet/hu.lproj/Localizable.strings | 13 +- DashWallet/id.lproj/Localizable.strings | 13 +- DashWallet/it.lproj/Localizable.strings | 13 +- DashWallet/ja.lproj/Localizable.strings | 13 +- DashWallet/ko.lproj/Localizable.strings | 13 +- DashWallet/mk.lproj/Localizable.strings | 13 +- DashWallet/ms.lproj/Localizable.strings | 13 +- DashWallet/nb.lproj/Localizable.strings | 13 +- DashWallet/nl.lproj/Localizable.strings | 13 +- DashWallet/pl.lproj/Localizable.strings | 13 +- DashWallet/pt.lproj/Localizable.strings | 13 +- DashWallet/ro.lproj/Localizable.strings | 13 +- DashWallet/ru.lproj/Localizable.strings | 13 +- DashWallet/sk.lproj/Localizable.strings | 13 +- DashWallet/sl.lproj/Localizable.strings | 13 +- DashWallet/sl_SI.lproj/Localizable.strings | 13 +- DashWallet/sq.lproj/Localizable.strings | 13 +- DashWallet/sr.lproj/Localizable.strings | 13 +- DashWallet/sv.lproj/Localizable.strings | 13 +- DashWallet/th.lproj/Localizable.strings | 13 +- DashWallet/tr.lproj/Localizable.strings | 13 +- DashWallet/uk.lproj/Localizable.strings | 13 +- DashWallet/vi.lproj/Localizable.strings | 13 +- DashWallet/zh-Hans.lproj/Localizable.strings | 13 +- .../zh-Hant-TW.lproj/Localizable.strings | 13 +- DashWallet/zh.lproj/Localizable.strings | 13 +- DashWallet/zh_TW.lproj/Localizable.strings | 13 +- 48 files changed, 387 insertions(+), 602 deletions(-) delete mode 100644 DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift create mode 100644 DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index e2195df4e..148e1e317 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -538,9 +538,9 @@ 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; 752D03B22E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; 752D03B32E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; - 752F81982E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */; }; + 752F81982E30F55E00ADA76D /* SecurityScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityScreen.swift */; }; 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; - 752F819A2E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */; }; + 752F819A2E30F55E00ADA76D /* SecurityScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityScreen.swift */; }; 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; 75303FE52AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 75303FE62AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; @@ -2450,7 +2450,7 @@ 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewController.swift; sourceTree = ""; }; 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewModel.swift; sourceTree = ""; }; 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewControllerDelegate.swift; sourceTree = ""; }; - 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuViewController.swift; sourceTree = ""; }; + 752F81962E30F55E00ADA76D /* SecurityScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityScreen.swift; sourceTree = ""; }; 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuViewModel.swift; sourceTree = ""; }; 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CrowdNode.storyboard; sourceTree = ""; }; 7531308C2B47EC910069C9B7 /* UpholdClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdClient.swift; sourceTree = ""; }; @@ -4198,7 +4198,7 @@ children = ( 2A7F3B18238C643D00DEA3EF /* Advanced Security */, 2A10EB3F2358D29500C38B61 /* ResetWalletInfo */, - 752F81962E30F55E00ADA76D /* SecurityMenuViewController.swift */, + 752F81962E30F55E00ADA76D /* SecurityScreen.swift */, 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */, ); path = Security; @@ -8871,7 +8871,7 @@ 2A74EFF52305333000C475EB /* DWSeedUIConstants.m in Sources */, 2A0C69B32312E8A0001B8C90 /* DWWindow.m in Sources */, 472D13E3299E23B7006903F1 /* BalanceNotifier.swift in Sources */, - 752F819A2E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */, + 752F819A2E30F55E00ADA76D /* SecurityScreen.swift in Sources */, 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */, 2AD1CE6422D9127600C99324 /* DWSeedWordModel.m in Sources */, 7592AA7C2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */, @@ -9541,7 +9541,7 @@ C9D2C7C22A320AA000D15901 /* (null) in Sources */, C9D2C7C32A320AA000D15901 /* DWDPRegistrationStatus.m in Sources */, C9D2C7C42A320AA000D15901 /* CurrencyExchanger_Objc.m in Sources */, - 752F81982E30F55E00ADA76D /* SecurityMenuViewController.swift in Sources */, + 752F81982E30F55E00ADA76D /* SecurityScreen.swift in Sources */, 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */, 7573C2E12B01103900F4C347 /* VotingFilterItemSelectableCell.swift in Sources */, C943B32B2A408CED00AF23C5 /* DWAvatarExternalLoadingView.m in Sources */, diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 42e274f32..a9a8aebee 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -19,12 +19,11 @@ import UIKit import SwiftUI import MessageUI -@objc(DWMainMenuViewController) class MainMenuViewController: UIViewController { // MARK: - Properties - @objc weak var delegate: DWWipeDelegate? + weak var delegate: DWWipeDelegate? private var viewModel: MainMenuViewModel! private var hostingController: UIHostingController! @@ -38,7 +37,7 @@ class MainMenuViewController: UIViewController { // MARK: - Initialization - @objc override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { #if DASHPAY self.receiveModel = nil self.dashPayReady = nil @@ -47,11 +46,10 @@ class MainMenuViewController: UIViewController { #endif super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) - setupViewController() } #if DASHPAY - @objc init(dashPayModel: DWDashPayProtocol, + init(dashPayModel: DWDashPayProtocol, receiveModel: DWReceiveModelProtocol, dashPayReady: DWDashPayReadyProtocol, userProfileModel: CurrentUserProfileModel) { @@ -61,7 +59,6 @@ class MainMenuViewController: UIViewController { self.userProfileModel = userProfileModel super.init(nibName: nil, bundle: nil) - setupViewController() } #endif @@ -69,12 +66,6 @@ class MainMenuViewController: UIViewController { fatalError("init(coder:) has not been implemented") } - // MARK: - Setup - - private func setupViewController() { -// title = NSLocalizedString("More", comment: "") todo - } - // MARK: - View Lifecycle override func loadView() { @@ -176,8 +167,8 @@ class MainMenuViewController: UIViewController { } @objc private func showSecurity() { - let controller = SecurityMenuViewController() - controller.delegate = delegate + let controller = UIHostingController(rootView: SecurityScreen(vc: navigationController!)) + controller.hidesBottomBarWhenPushed = true navigationController?.pushViewController(controller, animated: true) } diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift deleted file mode 100644 index 5a1416df8..000000000 --- a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewController.swift +++ /dev/null @@ -1,235 +0,0 @@ -// -// Created by Andrei Ashikhmin -// Copyright © 2024 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit -import SwiftUI -import Combine - -class SecurityMenuViewController: UIViewController { - @objc weak var delegate: DWWipeDelegate? - private lazy var viewModel = SecurityMenuViewModel() - private var cancellables = Set() - - @objc init() { - super.init(nibName: nil, bundle: nil) - title = NSLocalizedString("Security", comment: "") - hidesBottomBarWhenPushed = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = UIColor.dw_secondaryBackground() - - let content = SecurityMenuContent(viewModel: self.viewModel) - let swiftUIController = UIHostingController(rootView: content) - swiftUIController.view.backgroundColor = UIColor.dw_secondaryBackground() - dw_embedChild(swiftUIController) - - setupNavigationObserver() - } - - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - private func setupNavigationObserver() { - viewModel.$navigationDestination - .receive(on: DispatchQueue.main) - .sink { [weak self] destination in - switch destination { - case .viewRecoveryPhrase: - self?.showSeedPhraseAction() - case .changePin: - self?.changePinAction() - case .advancedSecurity: - self?.showAdvancedSecurity() - case .resetWallet: - self?.resetWalletAction() - case .none: - break - } - } - .store(in: &cancellables) - - viewModel.$showBiometricsAlert - .filter { $0 } - .receive(on: DispatchQueue.main) - .sink { [weak self] _ in - self?.showBiometricsAccessAlertRequest() - } - .store(in: &cancellables) - } - - // MARK: - Actions - - private func showSeedPhraseAction() { - DSAuthenticationManager.sharedInstance() - .authenticate( - withPrompt: nil, - usingBiometricAuthentication: false, - alertIfLockout: true - ) { [weak self] authenticated, usedBiometrics, cancelled in - guard authenticated else { return } - - let model = DWPreviewSeedPhraseModel() - model.getOrCreateNewWallet() - - let controller = DWPreviewSeedPhraseViewController(model: model) - controller.hidesBottomBarWhenPushed = true - controller.delegate = self - self?.navigationController?.pushViewController(controller, animated: true) - } - } - - private func changePinAction() { - viewModel.changePinContinueBlock { [weak self] allowed in - guard allowed else { return } - - let controller = DWSetPinViewController(intent: .changePin) - controller.delegate = self - let navigationController = BaseNavigationController(rootViewController: controller) - navigationController.modalPresentationStyle = .fullScreen - self?.present(navigationController, animated: true) - } - } - - private func showAdvancedSecurity() { - #if SNAPSHOT - let controller = DWDemoAdvancedSecurityViewController() - navigationController?.pushViewController(controller, animated: true) - #else - DSAuthenticationManager.sharedInstance() - .authenticate( - withPrompt: nil, - usingBiometricAuthentication: false, - alertIfLockout: true - ) { [weak self] authenticated, usedBiometrics, cancelled in - guard authenticated else { return } - - let controller = DWAdvancedSecurityViewController() - self?.navigationController?.pushViewController(controller, animated: true) - } - #endif - } - - private func resetWalletAction() { - let controller = DWResetWalletInfoViewController.make() - controller.delegate = delegate - navigationController?.pushViewController(controller, animated: true) - } - - private func showBiometricsAccessAlertRequest() { - let displayName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String ?? "" - let titleString: String - let messageString: String - - if viewModel.hasTouchID { - titleString = String(format: NSLocalizedString("%@ is not allowed to access Touch ID", comment: ""), displayName) - messageString = NSLocalizedString("Allow Touch ID access in Settings", comment: "") - } else if viewModel.hasFaceID { - titleString = String(format: NSLocalizedString("%@ is not allowed to access Face ID", comment: ""), displayName) - messageString = NSLocalizedString("Allow Face ID access in Settings", comment: "") - } else { - assertionFailure("Inconsistent state") - return - } - - let alert = UIAlertController(title: titleString, message: messageString, preferredStyle: .alert) - - let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) - alert.addAction(cancelAction) - - let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { _ in - if let url = URL(string: UIApplication.openSettingsURLString), - UIApplication.shared.canOpenURL(url) { - UIApplication.shared.open(url) - } - } - alert.addAction(settingsAction) - alert.preferredAction = settingsAction - - present(alert, animated: true) - } -} - -// MARK: - DWSetPinViewControllerDelegate - -extension SecurityMenuViewController: DWSetPinViewControllerDelegate { - func setPinViewControllerDidSetPin(_ controller: DWSetPinViewController) { - controller.navigationController?.dismiss(animated: true) - } - - func setPinViewControllerDidCancel(_ controller: DWSetPinViewController) { - controller.navigationController?.dismiss(animated: true) - } -} - -// MARK: - DWSecureWalletDelegate - -extension SecurityMenuViewController: DWSecureWalletDelegate { - func secureWalletRoutineDidFinish(_ controller: VerifiedSuccessfullyViewController) { - assertionFailure("This delegate method shouldn't be called from a preview seed phrase VC") - } - - func secureWalletRoutineDidCancel(_ controller: UIViewController) { - navigationController?.popViewController(animated: true) - } - - func secureWalletRoutineDidVerify(_ controller: UIViewController) { - // Verification handled - } -} - -// MARK: - SecurityMenuContent - -struct SecurityMenuContent: View { - @StateObject var viewModel: SecurityMenuViewModel - - var body: some View { - VStack(alignment: .leading, spacing: 0) { - VStack(spacing: 0) { - ForEach(viewModel.items) { item in - MenuItem( - title: item.title, - subtitle: item.subtitle, - details: item.details, - icon: item.icon, - showInfo: item.showInfo, - showChevron: false, - showToggle: item.showToggle, - isToggled: item.isToggled, - action: item.action - ) - .frame(minHeight: 60) - } - } - .padding(.vertical, 5) - .background(Color.secondaryBackground) - .cornerRadius(12) - .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) - - Spacer() - } - .padding(.horizontal, 20) - .padding(.top, 16) - } -} diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift index 8a2e5179a..4064e7bd0 100644 --- a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift @@ -175,13 +175,12 @@ class SecurityMenuViewModel: ObservableObject { showBiometricsAlert = false } - func changePinContinueBlock(_ continueBlock: @escaping (Bool) -> Void) { + func authenticate(_ continueBlock: @escaping (Bool) -> Void) { authenticationManager.authenticate( withPrompt: nil, usingBiometricAuthentication: false, alertIfLockout: true - ) { authenticated, usedBiometrics, cancelled in - self.authenticationManager.didAuthenticate = false + ) { authenticated, _, _ in continueBlock(authenticated) } } diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift b/DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift new file mode 100644 index 000000000..d46af147d --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift @@ -0,0 +1,159 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2025 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import SwiftUI +import UIKit + +struct SecurityScreen: View { + private let vc: UINavigationController + private let delegateInternal: DelegateInternal + + @StateObject private var viewModel = SecurityMenuViewModel() + @State private var showBiometricsAlert = false + + init(vc: UINavigationController) { + self.vc = vc + self.delegateInternal = DelegateInternal(onHide: { + vc.popViewController(animated: true) + }) + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(spacing: 0) { + ForEach(viewModel.items) { item in + MenuItem( + title: item.title, + subtitle: item.subtitle, + details: item.details, + icon: item.icon, + showInfo: item.showInfo, + showChevron: false, + showToggle: item.showToggle, + isToggled: item.isToggled, + action: item.action + ) + .frame(minHeight: 60) + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + + Spacer() + } + .padding(.horizontal, 20) + .padding(.top, 16) + .background(Color.primaryBackground) + .navigationBarTitleDisplayMode(.inline) + .onReceive(viewModel.$navigationDestination) { destination in + handleNavigation(destination) + } + .onReceive(viewModel.$showBiometricsAlert) { show in + showBiometricsAlert = show + } + .alert(NSLocalizedString("Biometrics Access Required", comment: ""), isPresented: $showBiometricsAlert) { + Button(NSLocalizedString("Cancel", comment: ""), role: .cancel) { } + Button(NSLocalizedString("Settings", comment: "")) { + openAppSettings() + } + } message: { + Text(biometricsAlertMessage) + } + } + + private func handleNavigation(_ destination: SecurityMenuNavigationDestination?) { + switch destination { + case .viewRecoveryPhrase: + viewModel.authenticate { authenticated in + if authenticated { + let model = DWPreviewSeedPhraseModel() + model.getOrCreateNewWallet() + let controller = DWPreviewSeedPhraseViewController(model: model) + controller.delegate = delegateInternal + self.vc.pushViewController(controller, animated: true) + } + } + case .changePin: + viewModel.authenticate { authenticated in + if authenticated { + let controller = DWSetPinViewController(intent: .changePin) + controller.delegate = delegateInternal + self.vc.pushViewController(controller, animated: true) + } + } + case .advancedSecurity: + viewModel.authenticate { authenticated in + if authenticated { + #if SNAPSHOT + let controller = DWDemoAdvancedSecurityViewController() + #else + let controller = DWAdvancedSecurityViewController() + #endif + self.vc.pushViewController(controller, animated: true) + } + } + case .resetWallet: + let controller = DWResetWalletInfoViewController.make() + controller.delegate = delegateInternal + self.vc.pushViewController(controller, animated: true) + case .none: + break + } + + // Reset navigation destination after handling + if destination != nil { + viewModel.resetNavigation() + } + } + + private var biometricsAlertMessage: String { + let displayName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String ?? "" + if viewModel.hasTouchID { + return String(format: NSLocalizedString("%@ is not allowed to access Touch ID. Allow Touch ID access in Settings", comment: ""), displayName) + } else if viewModel.hasFaceID { + return String(format: NSLocalizedString("%@ is not allowed to access Face ID. Allow Face ID access in Settings", comment: ""), displayName) + } else { + return "Biometrics access required" + } + } + + private func openAppSettings() { + if let url = URL(string: UIApplication.openSettingsURLString), + UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) + } + } +} + +extension SecurityScreen { + class DelegateInternal: NSObject, DWSecureWalletDelegate, DWSetPinViewControllerDelegate, DWWipeDelegate { + let onHide: () -> () + + init(onHide: @escaping () -> ()) { + self.onHide = onHide + } + + func secureWalletRoutineDidVerify(_ controller: UIViewController) { } + func secureWalletRoutineDidFinish(_ controller: VerifiedSuccessfullyViewController) { } + func secureWalletRoutineDidCancel(_ controller: UIViewController) { onHide() } + func setPinViewControllerDidSetPin(_ controller: DWSetPinViewController) { onHide() } + func setPinViewControllerDidCancel(_ controller: DWSetPinViewController) { onHide() } + func didWipeWallet() { onHide() } + } +} diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index a6c1264b4..10a9e4581 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@غير مسموح بالوصول إلى الكاميرا"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "المبلغ في داش"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "بين محفظة داش وحساب Coinbase الخاص بك"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "بلوك"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 0e1073932..d490c5b34 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ не е разрешен достъпа до Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ не е позволен достъп до камерата"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ не е разрешен достъпа до Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Разреши достъпа до камерата в Настройки"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Разреши достъпа до Face ID в Настройки"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Разреши достъпа до Touch ID в Настройки"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Блок"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index cada04290..09f0a9a95 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index 42616ac7c..26bddb0d0 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ si vás chce přidat mezi kontakty"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ nemá přístup k Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nemá přístup k fotoaparátu"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ nemá přístup k Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Povolte přístup k fotoaparátu v nastavení"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Povolte přístupk k Face ID v nastavení"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Povolote přístup k Touch ID v nastavení"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Blok"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index 959799971..15cfcc33f 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ har ikke tilladelse til at bruge kameraet"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 64f21c864..f7518011f 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ hat dir eine Kontaktanfrage geschickt"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ darf nicht auf die Face ID zugreifen"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ darf nicht auf die Kamera zugreifen"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ darf nicht auf die Touch ID zugreifen"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu Kontakte/ %3$lu Profil-Updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Zugriff auf Kamera in den Einstellungen erlauben"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Zugriff auf Face ID in den Einstellungen erlauben"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Erlaubst du, dass alle Transaktionen von der Dash Wallet an Zenledger gesendet werden?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Zugriff auf Touch ID in den Einstellungen erlauben"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Betrag in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Zwischen Dash Wallet und deinem Coinbase Konto"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index d800f1c22..958ebab23 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ σας έστειλε αίτημα επαφής"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ δεν επιτρέπεται να έχετε πρόσβαση στο Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ δεν επιτρέπεται να έχετε πρόσβαση στην κάμερα"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ δεν επιτρέπεται να έχετε πρόσβαση στο Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@~ %2$lu επαφές / %3$lu ενημερώσεις προφίλ"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Επιτρέψτε πρόσβαση της κάμερας στις Ρυθμίσεις"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Επιτρέψτε πρόσβαση του Face ID στις Ρυθμίσεις"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Να επιτρέπεται η αποστολή όλων των συναλλαγών από το Dash Wallet στο Zenledger;"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Επιτρέψτε πρόσβαση του Touch ID στις Ρυθμίσεις"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Ποσό σε Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Μεταξύ του Dash Wallet και του λογαριασμού σας στην Coinbase."; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Μπλόκ"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 56859fdd0..f3d2243bc 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index fe796a7a7..9b78dea31 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index fa24c37ec..4fc54a233 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ te ha enviado una solicitud de contacto"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ no está permitido a acceder al Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ No se permite acceder a la cámara"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ no está permitido a acceder al Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contactos / %3$lu actualizaciones de perfil"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Permite acceso a cámara en las Configuraciones"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Permite acceso al Face ID en Configuraciones"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "¿Permitir el envío de todas las transacciones desde Dash Wallet a Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Permite acceso al Touch ID en Configuraciones"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Monto en Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Entre la billetera de Dash y tu cuenta de Coinbase."; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Bloque"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index cb4b4f99f..c0ceb66bf 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = " %@ pole kaamerale ligipääsu"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 9168080d3..5a6b33f2e 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@درخواستی برایتان برای ارتباط فرستاد"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "اجازه ارسال همه تراکنش‌‌ها از دش والت به ذن‌لجر را می‌دهید؟ "; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "مبلغ بر حسب دش"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "بین داش والت و حساب کوین‌بیس شما"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "بلاک"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index ab6c898bb..3d39ebf2e 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 7bcacdf14..670b7dec3 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ ay nagpadala sa iyo ng isang kahilingan sa pakikipag-ugnay"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ ay hindi pinahihintulutang i-access ang Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ ay hindi pinahihintulutang i-access ang kamera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ ay hindi pinahihintulutang i-access ang Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu mga contact / %3$lu mga update sa profile"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Payagang i-access ang camera sa Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Payagang i-access ang Face ID sa Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Payagan ang pagpapadala ng lahat ng mga transaksyon mula sa Dash Wallet sa Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Payagang i-access ang Touch ID sa Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Halaga sa Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Sa pagitan ng Dash Wallet at ng iyong Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index ae22124aa..e4a812dad 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ vous a envoyé une demande de contact"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ n'est pas autorisé à accéder à Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ n'est pas autorisé à accéder à l'appareil photo"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ n'est pas autorisé à accéder à Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu mises à jour de profil"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Permettre l'accès à la caméra dans Réglages"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Permettre l'accès à Face ID dans Réglages"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Autoriser l'envoi de toutes les transactions depuis Dash Wallet vers ZenLedger ?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Permettre l'accès à Touch ID dans Réglages"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Montant en dashs"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Entre Dash Wallet et votre compte Coinbase"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Bloc"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index bca23ae6b..0d5e13dee 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 5acc443f8..87a85e881 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nem tud hozzáférni a kamerához"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 888f890d9..12999441b 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ telah mengirim anda permintaan kontak"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ tidak diizinkan mengakses Pengenal Wajah"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ tidak diizinkan mengakses kamera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ tidak diizinkan mengakses Pengenal Sentuh"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu kontak / %3$lu pembaruan profil"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Izinkan akses kamera di Pengaturan"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Izinkan akses Pengenal Wajah di Pengaturan"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Izinkan mengirim semua transaksi dari dompet Dash ke Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Izinkan akses Pengenal Sentuh di Pengaturan"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Jumlah dalam Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Antara Dash Wallet dan akun Coinbase Anda"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Blok"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 64b671d8e..85790fbb8 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ ti ha inviato una richiesta di contatto"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ non hai dato il permesso alla videocamera"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ non ha il permesso di accedere alla videocamera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ non hai dato il permesso al sensore biometrico digitale"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contatti / %3$lu aggiornamenti del profilo"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Abilita l'accesso alla videocamera in Impostazioni->Privacy->Fotocamera"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Consenti accesso Face ID in Impostazioni"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Consentire l'invio di tutte le transazioni da Dash Wallet a Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Consenti accesso Touch ID in Impostazioni"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Importo in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Tra Dash Wallet e il tuo account Coinbase"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Blocchi"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 367211762..36c311876 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ が連絡先リクエストを送信しました"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ はFace IDへのアクセスが許可されていません"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ はカメラへのアクセスが許可されていません"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@はTouch IDへのアクセスが許可されていません"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu の連絡先 / %3$lu のプロフィール更新"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "端末設定でカメラへのアクセスを許可する"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "端末設定でFace IDへのアクセスを許可する"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "DashウォレットからZenledgerに全ての取引の送信を許可しますか。"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "端末設定でTouch IDへのアクセスを許可する"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "金額(Dash)"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "DashウォレットとCoinbaseアカウント間"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "ブロック"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 636a65cdd..29f89ee02 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ 님이 당신에게 연락처 요청을 보냈습니다"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@에 페이스 ID 접근 권한이 없습니다"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@에 카메라 접근 권한이 없습니다"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@게 터치 ID 접근 권한이 없습니다"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu 연락처 / %3$lu 프로필 업데이트"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "설정에서 카메라 접근을 허용"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "설정에서 페이스 ID 접근을 허용"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "대시 지갑의 모든 거래를 Zenledger로 보내시겠습니까?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "설정에서 터치 ID 접근을 허용"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "대시 금액"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "대시 지갑과 코인베이스 계정간"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "블록"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 9e50d2cd9..0226593bb 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 0d20018b7..d938b2de7 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ tidak dibenarkan untuk mengakses kamera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index b316e6e32..e77e9209c 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ har ikke tilgang til kameraet"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index d556f18f8..8adfd326d 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ heeft u een contactverzoek gestuurd"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ heeft geen toegang tot gezichtsherkenning"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ heeft geen toegang tot de camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ heeft geen toegang tot vingeridentificatie"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacten / %3$lu profiel updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Camera toegang in Instellingen toestaan"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Gezichtsherkenning in Instellingen toestaan"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Toestaan ​​dat alle transacties van je Dash portemonnee naar Zenledger worden verzonden?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Vingeridentificatie toegang in Instellingen toestaan"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Bedrag in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Tussen Dash portemonnee en je Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 65b5a38c8..7caa9da50 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@wysłał ci zaproszenie do znajomych"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ nie ma zezwolenia na dostęp do Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nie na zezwolenia na dostęp do kamery"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ nie ma zezwolenia na dostęp do Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu kontakty/ %3$lu aktualizacje profilu"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Zezwól na dostęp do kamery w Ustawieniach"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Zezwól na dostęp do Face ID w Ustawieniach"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Pozwól na wysyłanie wszystkich transakcji z Dash Wallet do Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Zezwól na Touch ID w Ustawieniach"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Kwota w Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Pomiędzy twoim Portfelem Dash a twoim kontem na Coinbase"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Blok"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 54cd816c8..43ea6c548 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ lhe enviou uma solicitação de contato"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ não tem permissão para acessar Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ não tem permissão para acessar a câmera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ não tem permissão para acessar Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contatos / %3$lu atualizações de perfil"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Permita o uso da câmera em Configurações"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Permita o acesso a Face ID em Configurações"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Permitir enviar todas as transações da Carteira Dash para o Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Permita o acesso a Touch ID em Configurações"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Quantidade em Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Entre Carteira Dash e sua conta Coinbase"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Bloquear"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index f91eb51d2..af1167c3b 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nu are voie să acceseze camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 45b9b5b8c..f91e82e28 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@отправил вам запрос на добавление в контакты"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ запрещен доступ к Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ запрещен доступ к камере"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ запрещен доступ к Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu контактов / %3$lu обновлений профиля"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Разрешить доступ к камере в Настройках"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Разрешить доступ к Face ID в Настройках"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Разрешить переcылать все транзакции из Dash Wallet в Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Разрешить доступ к Touch ID в Настройках"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Сумма в Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Между Dash Wallet и вашим аккаунтом Coinbase"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Блок"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index f7a55ea18..18723db08 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ vám poslal žiadosť na kontakt"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ nemá povolený prístup k Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nemá povolený prístup ku kamere"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ nemá povolený prístup k Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu kontakty / %3$lu aktualizácie profilu"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Povoliť prístup ku kamere v nastaveniach"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Povoliť prístup k Face ID v nastaveniach"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Povoliť odosielanie všetkých transakcií z Dash Wallet do Zenledgeru?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Povoliť prístup k Touch ID v nastaveniach"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Suma v Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Medzi Dash peňaženkou a vaším účtom na Coinbase"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Blok"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 9e479b2db..477198449 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index 97a0056ed..402feed48 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ is not allowed to access the camera"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index d1c8596be..f3e15a32b 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nuk lejohet ti çaset kamerës"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 254994a5a..219d017a9 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ nema dozvolu za pristup kameri"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index e75ccd511..1d31e5c64 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ har ej tillåtelse att använda kameran"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index d1793fa64..e22934fee 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ ยอมรับคำขอติดต่อของคุณ"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ ไม่สามารถเข้าถึง Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ ไม่สามารถเข้าถึงกล้องถ่ายรูป"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ ไม่สามารถเข้าถึง Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "อนุญาตให้เข้าถึงกล้องถ่ายรูปในการตั้งค่า"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "อนุญาตให้เข้าถึง Face ID ในการตั้งค่า"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "อนุญาตให้เข้าถึง Touch ID ในการตั้งค่า"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "จำนวนเงินใน Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "ระหว่างกระเป๋าเงิน Dash และบัญชี Coinbase ของคุณ"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "บล็อก"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 5afc3941d..21abad6d3 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ size bir talep gönderdi"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ Yüz Kimliğine erişim izni verilmiyor"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ kameraya erişmesi için izin verilmedi"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ Dokunmatik Kimliğe erişim izni verilmiyor"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Ayarlardan kamera erişimine izin ver"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Ayarlardan Yüz Kimliğine erişim izni ver"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Tüm işlemlerin Dash Cüzdanından Zenledger'a gönderilmesine izin verilsin mi?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Ayarlardan Dokunmatik Kimliğe erişim izni ver"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Dash'teki Tutar"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Dash Cüzdanı ile Coinbase hesabınız arasında"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Blok"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index ef9358168..d96d61136 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ надіслав вам запит на додавання в контакти"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ не має доступу до Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ не має доступу до камери"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ не має доступу до Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu контактів / %3$lu оновлень профілю"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Дозволити доступ до камери в налаштуваннях"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Дозволити доступ до Face ID в налаштуваннях"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Дозволити надсилати всі транзакції з Dash Wallet до Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Дозволити доступ до Touch ID в налаштуваннях"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Сума в Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Між Dash Wallet і вашим Coinbase акаунтом"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Блок"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 988b6ab6b..c3c1f7b86 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ đã gửi bạn một yêu cầu liên hệ"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ không được cho phép truy cập Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ không được cho phép truy cập đến chức năng chụp ảnh"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ không được cho phép truy cập chức năng Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Cho phép truy cập máy ảnh trong Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Cho phép truy cập Face ID trong Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Cho phép truy cập Touch ID trong Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Khối"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index ff61f696b..b5de0424a 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@不被允许访问照相机"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 25a13de57..1a79526ad 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ has sent you a contact request"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ is not allowed to access Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ 不允許使用照相"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ is not allowed to access Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu contacts / %3$lu profile updates"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "Allow camera access in Settings"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "Allow Face ID access in Settings"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "Allow sending all transactions from Dash Wallet to Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "Allow Touch ID access in Settings"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Amount in Dash"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "Between Dash Wallet and your Coinbase account"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "Block"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index c086bd5f1..50e579d12 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@向您发送了朋友申请"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ 不被允许访问脸部识别"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@不被允许访问照相机"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ 不被允许访问指纹识别"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu 联系人/ %3$lu 个人资料更新"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "在设置中允许访问照相机"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "在设置中允许访问脸部识别"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "允许将所有交易从 Dash 钱包发送到 Zenledger?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "在设置中允许访问指纹识别"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "Dash 金额"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "在Dash钱包和您的Coinbase账户之间"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "区块"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index a96bf5a6c..4fba6f66a 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -14,13 +14,13 @@ "%@ has sent you a contact request" = "%@ 已向您發送了聯繫請求"; /* No comment provided by engineer. */ -"%@ is not allowed to access Face ID" = "%@ 不允許訪問Face ID"; +"%@ is not allowed to access Face ID. Allow Face ID access in Settings" = "%@ is not allowed to access Face ID. Allow Face ID access in Settings"; /* No comment provided by engineer. */ "%@ is not allowed to access the camera" = "%@ 不允許使用照相"; /* No comment provided by engineer. */ -"%@ is not allowed to access Touch ID" = "%@ 不允許訪問Touch ID"; +"%@ is not allowed to access Touch ID. Allow Touch ID access in Settings" = "%@ is not allowed to access Touch ID. Allow Touch ID access in Settings"; /* Credits */ "%@ ~ %lu contacts / %lu profile updates" = "%1$@ ~ %2$lu 聯絡人/ %3$lu 個人資料更新"; @@ -187,15 +187,9 @@ /* No comment provided by engineer. */ "Allow camera access in Settings" = "在設置中允許攝像頭訪問"; -/* No comment provided by engineer. */ -"Allow Face ID access in Settings" = "在設置中允許Face ID訪問"; - /* ZenLedger */ "Allow sending all transactions from Dash Wallet to Zenledger?" = "允許將所有交易從達世幣錢包發送到 Zenledger 嗎?"; -/* No comment provided by engineer. */ -"Allow Touch ID access in Settings" = "在設置中允許Touch ID訪問"; - /* Coinbase/Buy Dash */ "Amount in Dash" = "達世幣金額"; @@ -337,6 +331,9 @@ /* Dash Service Overview */ "Between Dash Wallet and your Coinbase account" = "在達世幣錢包和您的 Coinbase 帳戶之間"; +/* No comment provided by engineer. */ +"Biometrics Access Required" = "Biometrics Access Required"; + /* Voting */ "Block" = "區塊"; From fb64c53c5d25edc12c8ff8dd927d081c1423834a Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 24 Jul 2025 17:14:43 +0700 Subject: [PATCH 07/14] chore: transition SettingsScreen to SwiftUI --- DashWallet.xcodeproj/project.pbxproj | 12 +- .../Home/HomeViewController+Shortcuts.swift | 8 +- .../Shortcuts/Models/ShortcutAction.swift | 9 - .../UI/Menu/Main/MainMenuViewController.swift | 31 +- .../Settings/SettingsMenuViewController.swift | 401 ------------------ .../Menu/Settings/SettingsMenuViewModel.swift | 22 +- .../UI/Menu/Settings/SettingsScreen.swift | 239 +++++++++++ DashWallet/ar.lproj/Localizable.strings | 3 - DashWallet/bg.lproj/Localizable.strings | 3 - DashWallet/ca.lproj/Localizable.strings | 3 - DashWallet/cs.lproj/Localizable.strings | 3 - DashWallet/da.lproj/Localizable.strings | 3 - DashWallet/de.lproj/Localizable.strings | 3 - DashWallet/el.lproj/Localizable.strings | 3 - DashWallet/en.lproj/Localizable.strings | 3 - DashWallet/eo.lproj/Localizable.strings | 3 - DashWallet/es.lproj/Localizable.strings | 3 - DashWallet/et.lproj/Localizable.strings | 3 - DashWallet/fa.lproj/Localizable.strings | 3 - DashWallet/fi.lproj/Localizable.strings | 3 - DashWallet/fil.lproj/Localizable.strings | 3 - DashWallet/fr.lproj/Localizable.strings | 3 - DashWallet/hr.lproj/Localizable.strings | 3 - DashWallet/hu.lproj/Localizable.strings | 3 - DashWallet/id.lproj/Localizable.strings | 3 - DashWallet/it.lproj/Localizable.strings | 3 - DashWallet/ja.lproj/Localizable.strings | 3 - DashWallet/ko.lproj/Localizable.strings | 3 - DashWallet/mk.lproj/Localizable.strings | 3 - DashWallet/ms.lproj/Localizable.strings | 3 - DashWallet/nb.lproj/Localizable.strings | 3 - DashWallet/nl.lproj/Localizable.strings | 3 - DashWallet/pl.lproj/Localizable.strings | 3 - DashWallet/pt.lproj/Localizable.strings | 3 - DashWallet/ro.lproj/Localizable.strings | 3 - DashWallet/ru.lproj/Localizable.strings | 3 - DashWallet/sk.lproj/Localizable.strings | 3 - DashWallet/sl.lproj/Localizable.strings | 3 - DashWallet/sl_SI.lproj/Localizable.strings | 3 - DashWallet/sq.lproj/Localizable.strings | 3 - DashWallet/sr.lproj/Localizable.strings | 3 - DashWallet/sv.lproj/Localizable.strings | 3 - DashWallet/th.lproj/Localizable.strings | 3 - DashWallet/tr.lproj/Localizable.strings | 3 - DashWallet/uk.lproj/Localizable.strings | 3 - DashWallet/vi.lproj/Localizable.strings | 3 - DashWallet/zh-Hans.lproj/Localizable.strings | 3 - .../zh-Hant-TW.lproj/Localizable.strings | 3 - DashWallet/zh.lproj/Localizable.strings | 3 - DashWallet/zh_TW.lproj/Localizable.strings | 3 - 50 files changed, 278 insertions(+), 573 deletions(-) delete mode 100644 DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift create mode 100644 DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 148e1e317..96c622add 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -181,7 +181,7 @@ 2A74EFFE2305763F00C475EB /* DWRecoverModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A74EFFD2305763F00C475EB /* DWRecoverModel.m */; }; 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */; }; 2A7A7BC92347E0D700451078 /* DWBaseFormTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */; }; - 2A7A7BD62348CB6600451078 /* SettingsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */; }; + 2A7A7BD62348CB6600451078 /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsScreen.swift */; }; 2A7A7C16234B763600451078 /* DWLocalCurrencyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C15234B763600451078 /* DWLocalCurrencyViewController.m */; }; 2A7A7C1D234B771400451078 /* DWLocalCurrencyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C1C234B771400451078 /* DWLocalCurrencyModel.m */; }; 2A7A7C20234B79B700451078 /* DWLocalCurrencyTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7C1F234B79B700451078 /* DWLocalCurrencyTableViewCell.m */; }; @@ -1052,7 +1052,7 @@ C9D2C6AD2A320AA000D15901 /* HairlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AE8C1428C6378E00490F5E /* HairlineView.swift */; }; C9D2C6AE2A320AA000D15901 /* DWInitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A913E9423A3F75F006A2A59 /* DWInitialViewController.m */; }; C9D2C6AF2A320AA000D15901 /* BuySellPortalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751136B28D9A3DB00223B77 /* BuySellPortalViewController.swift */; }; - C9D2C6B02A320AA000D15901 /* SettingsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */; }; + C9D2C6B02A320AA000D15901 /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A7BD52348CB6600451078 /* SettingsScreen.swift */; }; C9D2C6B22A320AA000D15901 /* UISpringTimingParameters+DWInit.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A0C69D92314727F001B8C90 /* UISpringTimingParameters+DWInit.m */; }; C9D2C6B62A320AA000D15901 /* NumberKeyboardButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C661AC28F972BD00028A8D /* NumberKeyboardButton.swift */; }; C9D2C6B72A320AA000D15901 /* IsDefaultEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11AE3DD72997C599000856EE /* IsDefaultEmail.swift */; }; @@ -1952,7 +1952,7 @@ 2A7A7BAD234770C900451078 /* DWCaptureSessionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWCaptureSessionManager.m; sourceTree = ""; }; 2A7A7BC72347E0D700451078 /* DWBaseFormTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBaseFormTableViewCell.h; sourceTree = ""; }; 2A7A7BC82347E0D700451078 /* DWBaseFormTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBaseFormTableViewCell.m; sourceTree = ""; }; - 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuViewController.swift; sourceTree = ""; }; + 2A7A7BD52348CB6600451078 /* SettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreen.swift; sourceTree = ""; }; 2A7A7C14234B763600451078 /* DWLocalCurrencyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWLocalCurrencyViewController.h; sourceTree = ""; }; 2A7A7C15234B763600451078 /* DWLocalCurrencyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWLocalCurrencyViewController.m; sourceTree = ""; }; 2A7A7C1B234B771400451078 /* DWLocalCurrencyModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWLocalCurrencyModel.h; sourceTree = ""; }; @@ -4209,7 +4209,7 @@ children = ( 2A7A7C13234B761700451078 /* LocalCurrency */, 2A8F420A21BEE69E00858B91 /* About */, - 2A7A7BD52348CB6600451078 /* SettingsMenuViewController.swift */, + 2A7A7BD52348CB6600451078 /* SettingsScreen.swift */, 750CED5F2C94BFD7000FB837 /* SettingsMenuViewModel.swift */, ); path = Settings; @@ -8496,7 +8496,7 @@ 47AE8C1528C6378E00490F5E /* HairlineView.swift in Sources */, 2A913E9523A3F75F006A2A59 /* DWInitialViewController.m in Sources */, 4751136C28D9A3DB00223B77 /* BuySellPortalViewController.swift in Sources */, - 2A7A7BD62348CB6600451078 /* SettingsMenuViewController.swift in Sources */, + 2A7A7BD62348CB6600451078 /* SettingsScreen.swift in Sources */, 2A0C69DA2314727F001B8C90 /* UISpringTimingParameters+DWInit.m in Sources */, 47C661AD28F972BD00028A8D /* NumberKeyboardButton.swift in Sources */, 11AE3DD82997C599000856EE /* IsDefaultEmail.swift in Sources */, @@ -9140,7 +9140,7 @@ C9D2C6AE2A320AA000D15901 /* DWInitialViewController.m in Sources */, C943B52D2A40A54600AF23C5 /* DWDashPayContactsUpdater.m in Sources */, C9D2C6AF2A320AA000D15901 /* BuySellPortalViewController.swift in Sources */, - C9D2C6B02A320AA000D15901 /* SettingsMenuViewController.swift in Sources */, + C9D2C6B02A320AA000D15901 /* SettingsScreen.swift in Sources */, 751B61C52ADFFD0700D1C2EF /* IntegrationViewController+Uphold.swift in Sources */, C943B5022A40A54600AF23C5 /* DWDPGenericStatusItemView.m in Sources */, C9D2C6B22A320AA000D15901 /* UISpringTimingParameters+DWInit.m in Sources */, diff --git a/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift b/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift index 7ac4dfd2b..a0b40223d 100644 --- a/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift +++ b/DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift @@ -28,8 +28,6 @@ extension HomeViewController: DWLocalCurrencyViewControllerDelegate, ExploreView delegate?.showPaymentsController(withActivePage: PaymentsViewControllerState.enterAddress.rawValue) case .buySellDash: buySellDashAction() - case .syncNow: - SettingsMenuViewController.presentRescanBlockchainAction(from: self, sourceView: sender!, sourceRect: sender!.bounds, completion: nil) case .payWithNFC: performNFCReadingAction() case .localCurrency: @@ -38,13 +36,11 @@ extension HomeViewController: DWLocalCurrencyViewControllerDelegate, ExploreView showImportPrivateKey() case .switchToTestnet: Task { - let settingsViewModel = SettingsMenuViewModel() - _ = await settingsViewModel.switchToTestnet() + await DWEnvironment.sharedInstance().switchToTestnet() } case .switchToMainnet: Task { - let settingsViewModel = SettingsMenuViewModel() - _ = await settingsViewModel.switchToMainnet() + await DWEnvironment.sharedInstance().switchToMainnet() } case .reportAnIssue: break diff --git a/DashWallet/Sources/UI/Home/Views/Shortcuts/Models/ShortcutAction.swift b/DashWallet/Sources/UI/Home/Views/Shortcuts/Models/ShortcutAction.swift index bb146356d..048e52e03 100644 --- a/DashWallet/Sources/UI/Home/Views/Shortcuts/Models/ShortcutAction.swift +++ b/DashWallet/Sources/UI/Home/Views/Shortcuts/Models/ShortcutAction.swift @@ -25,7 +25,6 @@ enum ShortcutActionType: Int { case scanToPay case payToAddress case buySellDash - case syncNow case payWithNFC case localCurrency case importPrivateKey @@ -60,11 +59,6 @@ extension ShortcutActionType { fatalError("Image not found for shortcut type: \(self)") } return image - case .syncNow: - guard let image = UIImage(named: "shortcut_syncNow") else { - fatalError("Image not found for shortcut type: \(self)") - } - return image case .payWithNFC: guard let image = UIImage(named: "shortcut_payWithNFC") else { fatalError("Image not found for shortcut type: \(self)") @@ -121,9 +115,6 @@ extension ShortcutActionType { case .buySellDash: return NSLocalizedString("Buy & Sell", comment: "Translate it as short as possible! (24 symbols max)") - case .syncNow: - return NSLocalizedString("Sync Now", - comment: "Translate it as short as possible! (24 symbols max)") case .payWithNFC: return NSLocalizedString("Send with NFC", comment: "Translate it as short as possible! (24 symbols max)") diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index a9a8aebee..c9dae6dfc 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -167,15 +167,25 @@ class MainMenuViewController: UIViewController { } @objc private func showSecurity() { - let controller = UIHostingController(rootView: SecurityScreen(vc: navigationController!)) + guard let navigationController = navigationController else { return } + + let controller = UIHostingController(rootView: SecurityScreen(vc: navigationController)) controller.hidesBottomBarWhenPushed = true - navigationController?.pushViewController(controller, animated: true) + navigationController.pushViewController(controller, animated: true) } @objc private func showSettings() { - let controller = SettingsMenuViewController() - controller.delegate = self - navigationController?.pushViewController(controller, animated: true) + guard let navigationController = navigationController else { return } + + let screen = SettingsScreen(vc: navigationController, onDidRescan: { + navigationController.popToRootViewController(animated: false) + if let mainMenuDelegate = self.delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.mainMenuViewControllerOpenHomeScreen(self) + } + }) + let controller = UIHostingController(rootView: screen) + controller.hidesBottomBarWhenPushed = true + navigationController.pushViewController(controller, animated: true) } @objc private func showTools() { @@ -279,17 +289,6 @@ extension MainMenuViewController: ToolsMenuViewControllerDelegate { } } -// MARK: - DWSettingsMenuViewControllerDelegate - -extension MainMenuViewController: SettingsMenuViewControllerDelegate { - func settingsMenuViewControllerDidRescanBlockchain(_ controller: SettingsMenuViewController) { - navigationController?.popToRootViewController(animated: false) - if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.mainMenuViewControllerOpenHomeScreen(self) - } - } -} - // MARK: - DWExploreViewControllerDelegate extension MainMenuViewController: ExploreViewControllerDelegate { diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift deleted file mode 100644 index 4171f0f14..000000000 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewController.swift +++ /dev/null @@ -1,401 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit -import SwiftUI -import Combine - -protocol SettingsMenuViewControllerDelegate: AnyObject { - func settingsMenuViewControllerDidRescanBlockchain(_ controller: SettingsMenuViewController) -} - -extension SettingsMenuViewController { - // Static helper method for presenting rescan options from other view controllers - static func presentRescanBlockchainAction(from controller: UIViewController, - sourceView: UIView, - sourceRect: CGRect, - completion: ((Bool) -> Void)? = nil) { - let actionSheet = UIAlertController( - title: NSLocalizedString("Rescan Blockchain", comment: ""), - message: nil, - preferredStyle: .actionSheet - ) - - let viewModel = SettingsMenuViewModel() - - let rescanAction = UIAlertAction( - title: NSLocalizedString("Rescan Transactions (Suggested)", comment: ""), - style: .default - ) { _ in - viewModel.rescanTransactions() - completion?(true) - } - - let rescanMNLAndBlocksAction = UIAlertAction( - title: NSLocalizedString("Full Resync", comment: ""), - style: .default - ) { _ in - viewModel.fullResync() - completion?(true) - } - - #if DEBUG - let rescanMNLAction = UIAlertAction( - title: NSLocalizedString("Resync Masternode List", comment: ""), - style: .default - ) { _ in - viewModel.resyncMasternodeList() - completion?(true) - } - #endif - - let cancelAction = UIAlertAction( - title: NSLocalizedString("Cancel", comment: ""), - style: .cancel - ) { _ in - completion?(false) - } - - actionSheet.addAction(rescanAction) - actionSheet.addAction(rescanMNLAndBlocksAction) - - #if DEBUG - actionSheet.addAction(rescanMNLAction) - #endif - - actionSheet.addAction(cancelAction) - - if UIDevice.current.userInterfaceIdiom == .pad { - actionSheet.popoverPresentationController?.sourceView = sourceView - actionSheet.popoverPresentationController?.sourceRect = sourceRect - } - - controller.present(actionSheet, animated: true, completion: nil) - } -} - -class SettingsMenuViewController: UIViewController, DWLocalCurrencyViewControllerDelegate { - - weak var delegate: SettingsMenuViewControllerDelegate? - - private lazy var viewModel: SettingsMenuViewModel = SettingsMenuViewModel() - private var cancellables = Set() - - init() { - super.init(nibName: nil, bundle: nil) - title = NSLocalizedString("Settings", comment: "") - hidesBottomBarWhenPushed = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .dw_secondaryBackground() - - let content = SettingsMenuContent(viewModel: self.viewModel) - let swiftUIController = UIHostingController(rootView: content) - swiftUIController.view.backgroundColor = .dw_secondaryBackground() - dw_embedChild(swiftUIController) - setupNavigationObserver() - } - - private func setupNavigationObserver() { - viewModel.$navigationDestination - .receive(on: DispatchQueue.main) - .sink { [weak self] dest in - switch dest { - case .coinjoin: - self?.showCoinJoinController() - case .currencySelector: - self?.showCurrencySelector() - case .network: - self?.showChangeNetwork() - case .rescan: - self?.showWarningAboutReclassifiedTransactions() - case .about: - self?.showAboutController() - default: - break - } - } - .store(in: &cancellables) - } - - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - // MARK: - LocalCurrencyViewControllerDelegate - - func localCurrencyViewController(_ controller: DWLocalCurrencyViewController, didSelectCurrency currencyCode: String) { - navigationController?.popViewController(animated: true) - } - - func localCurrencyViewControllerDidCancel(_ controller: DWLocalCurrencyViewController) { - assertionFailure("Not supported") - } - - // MARK: - Private - - private func showCurrencySelector() { - let controller = DWLocalCurrencyViewController(navigationAppearance: .default, presentationMode: .screen, currencyCode: nil) - controller.delegate = self - navigationController?.pushViewController(controller, animated: true) - } - - private func showAboutController() { - let aboutViewController = DWAboutViewController.create() - navigationController?.pushViewController(aboutViewController, animated: true) - } - - private func showChangeNetwork() { - let actionSheet = UIAlertController(title: NSLocalizedString("Network", comment: ""), message: nil, preferredStyle: .actionSheet) - - let mainnetAction = UIAlertAction(title: NSLocalizedString("Mainnet", comment: ""), style: .default) { [weak self] _ in - Task { - let success = await self?.viewModel.switchToMainnet() ?? false - if success { - await MainActor.run { - self?.updateView() - } - } - } - } - - let testnetAction = UIAlertAction(title: NSLocalizedString("Testnet", comment: ""), style: .default) { [weak self] _ in - Task { - let success = await self?.viewModel.switchToTestnet() ?? false - if success { - await MainActor.run { - self?.updateView() - } - } - } - } - - let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil) - - actionSheet.addAction(mainnetAction) - actionSheet.addAction(testnetAction) - actionSheet.addAction(cancelAction) - - if UIDevice.current.userInterfaceIdiom == .pad { - actionSheet.popoverPresentationController?.sourceView = view - actionSheet.popoverPresentationController?.sourceRect = view.bounds - } - - present(actionSheet, animated: true, completion: nil) - } - - private func showWarningAboutReclassifiedTransactions() { - let actionSheet = UIAlertController( - title: NSLocalizedString("You will lose all your manually reclassified transactions types", comment: ""), - message: NSLocalizedString("If you would like to save manually reclassified types for transactions you should export a CSV transaction file.", comment: ""), - preferredStyle: .actionSheet) - - let continueAction = UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default) { [weak self] _ in - self?.rescanBlockchainAction() - } - - let exportAction = UIAlertAction(title: NSLocalizedString("Export CSV", comment: ""), style: .default) { [weak self] _ in - self?.exportTransactionsInCSV() - } - - let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil) - - actionSheet.addAction(exportAction) - actionSheet.addAction(continueAction) - actionSheet.addAction(cancelAction) - - if UIDevice.current.userInterfaceIdiom == .pad { - actionSheet.popoverPresentationController?.sourceView = view - actionSheet.popoverPresentationController?.sourceRect = view.bounds - } - - present(actionSheet, animated: true, completion: nil) - } - - private func rescanBlockchainAction() { - let actionSheet = UIAlertController( - title: NSLocalizedString("Rescan Blockchain", comment: ""), - message: nil, - preferredStyle: .actionSheet - ) - - let rescanAction = UIAlertAction( - title: NSLocalizedString("Rescan Transactions (Suggested)", comment: ""), - style: .default - ) { [weak self] _ in - self?.viewModel.rescanTransactions() - self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) - } - - let rescanMNLAndBlocksAction = UIAlertAction( - title: NSLocalizedString("Full Resync", comment: ""), - style: .default - ) { [weak self] _ in - self?.viewModel.fullResync() - self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) - } - - #if DEBUG - let rescanMNLAction = UIAlertAction( - title: NSLocalizedString("Resync Masternode List", comment: ""), - style: .default - ) { [weak self] _ in - self?.viewModel.resyncMasternodeList() - self?.delegate?.settingsMenuViewControllerDidRescanBlockchain(self!) - } - #endif - - let cancelAction = UIAlertAction( - title: NSLocalizedString("Cancel", comment: ""), - style: .cancel, - handler: nil - ) - - actionSheet.addAction(rescanAction) - actionSheet.addAction(rescanMNLAndBlocksAction) - - #if DEBUG - actionSheet.addAction(rescanMNLAction) - #endif - - actionSheet.addAction(cancelAction) - - if UIDevice.current.userInterfaceIdiom == .pad { - actionSheet.popoverPresentationController?.sourceView = view - actionSheet.popoverPresentationController?.sourceRect = view.bounds - } - - present(actionSheet, animated: true, completion: nil) - } - - private func exportTransactionsInCSV() { - view.dw_showProgressHUD(withMessage: NSLocalizedString("Generating CSV Report", comment: "")) - - Task { - do { - let (fileName, file) = try await viewModel.generateCSVReport() - - await MainActor.run { - self.view.dw_hideProgressHUD() - - let activityViewController = UIActivityViewController(activityItems: [file], applicationActivities: nil) - activityViewController.setValue(fileName, forKey: "subject") - - if UIDevice.current.userInterfaceIdiom == .pad { - activityViewController.popoverPresentationController?.sourceView = self.view - activityViewController.popoverPresentationController?.sourceRect = self.view.bounds - } - - self.present(activityViewController, animated: true, completion: nil) - } - } catch { - await MainActor.run { - self.view.dw_hideProgressHUD() - self.dw_displayErrorModally(error) - } - } - } - } - - private func updateView() { - cancellables.removeAll() - viewModel.resetNavigation() - // Trigger a view update - viewDidLoad() - } -} - -// MARK: - CoinJoin - -extension SettingsMenuViewController { - private func showCoinJoinController() { - let vc: UIViewController - - if CoinJoinLevelViewModel.shared.infoShown { - vc = CoinJoinLevelsViewController.controller() - } else { - vc = CoinJoinInfoViewController.controller() - } - - navigationController?.pushViewController(vc, animated: true) - } -} - -struct SettingsMenuContent: View { - @StateObject var viewModel: SettingsMenuViewModel - - var body: some View { - VStack(alignment: .leading, spacing: 0) { - VStack(spacing: 0) { - ForEach(viewModel.items) { item in - if let cjItem = item as? CoinJoinMenuItemModel { - MenuItem( - title: cjItem.title, - subtitleView: AnyView(CoinJoinSubtitle(cjItem)), - icon: .custom("image.coinjoin.menu", maxHeight: 22), - badgeText: nil, - action: cjItem.action - ) - .frame(minHeight: 60) - } else { - MenuItem( - title: item.title, - subtitle: item.subtitle, - details: item.details, - icon: item.icon, - showInfo: item.showInfo, - showChevron: false, - showToggle: item.showToggle, - isToggled: item.isToggled, - action: item.action - ) - .frame(minHeight: 60) - } - } - } - .padding(.vertical, 5) - .background(Color.secondaryBackground) - .cornerRadius(12) - .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) - - Spacer() - } - .padding(.horizontal, 20) - .padding(.top, 16) - } - - @ViewBuilder - private func CoinJoinSubtitle(_ cjItem: CoinJoinMenuItemModel) -> some View { - if cjItem.isOn { - CoinJoinProgressInfo(state: cjItem.state, progress: cjItem.progress, mixed: cjItem.mixed, total: cjItem.total, textColor: .tertiaryText, font: .caption) - .padding(.top, 2) - } else { - Text(NSLocalizedString("Turned off", comment: "CoinJoin")) - .font(.caption) - .foregroundColor(.tertiaryText) - .padding(.leading, 4) - .padding(.top, 2) - } - } -} diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift index eefddf689..83b3a02c7 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift @@ -18,13 +18,13 @@ import Combine import UIKit -enum SettingsNavDest { +enum SettingsMenuNavigationDestination { case coinjoin case currencySelector case network case rescan case about - case none + case exportCSV } @MainActor @@ -33,8 +33,10 @@ class SettingsMenuViewModel: ObservableObject { private let coinJoinService = CoinJoinService.shared @Published var items: [MenuItemModel] = [] - @Published private(set) var navigationDestination: SettingsNavDest = .none + @Published var navigationDestination: SettingsMenuNavigationDestination? @Published var notificationsEnabled: Bool + @Published var showCSVExportActivity = false + @Published var csvExportData: (fileName: String, file: URL)? var networkName: String { return DWEnvironment.sharedInstance().currentChain.name @@ -51,7 +53,9 @@ class SettingsMenuViewModel: ObservableObject { } func resetNavigation() { - self.navigationDestination = .none + navigationDestination = nil + showCSVExportActivity = false + csvExportData = nil } private func setupCoinJoinObservers() { @@ -154,7 +158,7 @@ class SettingsMenuViewModel: ObservableObject { // MARK: - Network Switching func switchToMainnet() async -> Bool { - return await DWEnvironment.sharedInstance().switchToMainnet() + await DWEnvironment.sharedInstance().switchToMainnet() } func switchToTestnet() async -> Bool { @@ -162,7 +166,7 @@ class SettingsMenuViewModel: ObservableObject { } func switchToEvonet() async -> Bool { - return await DWEnvironment.sharedInstance().switchToEvonet() + await DWEnvironment.sharedInstance().switchToEvonet() } // MARK: - Blockchain Rescan Actions @@ -201,4 +205,10 @@ class SettingsMenuViewModel: ObservableObject { ) } } + + func exportCSV() async throws { + let result = try await generateCSVReport() + csvExportData = result + showCSVExportActivity = true + } } diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift new file mode 100644 index 000000000..80b6d62cb --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift @@ -0,0 +1,239 @@ +// +// Created by Andrew Podkovyrin +// Copyright © 2019 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import SwiftUI +import Combine + +struct SettingsScreen: View { + private let vc: UINavigationController + private let delegateInternal: DelegateInternal + private let onDidRescan: () -> () + + @StateObject private var viewModel = SettingsMenuViewModel() + @State private var showNetworkAlert = false + @State private var showRescanWarningAlert = false + @State private var showRescanActionAlert = false + @State private var showCSVExportActivity = false + + init(vc: UINavigationController, onDidRescan: @escaping () -> ()) { + self.vc = vc + self.onDidRescan = onDidRescan + self.delegateInternal = DelegateInternal(onHide: { + vc.popViewController(animated: true) + }) + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(spacing: 0) { + ForEach(viewModel.items) { item in + if let cjItem = item as? CoinJoinMenuItemModel { + MenuItem( + title: cjItem.title, + subtitleView: AnyView(CoinJoinSubtitle(cjItem)), + icon: .custom("image.coinjoin.menu", maxHeight: 22), + badgeText: nil, + action: cjItem.action + ) + .frame(minHeight: 60) + } else { + MenuItem( + title: item.title, + subtitle: item.subtitle, + details: item.details, + icon: item.icon, + showInfo: item.showInfo, + showChevron: false, + showToggle: item.showToggle, + isToggled: item.isToggled, + action: item.action + ) + .frame(minHeight: 60) + } + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + + Spacer() + } + .padding(.horizontal, 20) + .padding(.top, 16) + .background(Color.primaryBackground) + .navigationBarTitleDisplayMode(.inline) + .onReceive(viewModel.$navigationDestination) { destination in + handleNavigation(destination) + } + .onReceive(viewModel.$showCSVExportActivity) { show in + showCSVExportActivity = show + } + .alert(NSLocalizedString("Network", comment: ""), isPresented: $showNetworkAlert) { + Button(NSLocalizedString("Mainnet", comment: "")) { + Task { + let success = await viewModel.switchToMainnet() + if success { + updateView() + } + } + } + Button(NSLocalizedString("Testnet", comment: "")) { + Task { + let success = await viewModel.switchToTestnet() + if success { + updateView() + } + } + } + Button(NSLocalizedString("Cancel", comment: ""), role: .cancel) { } + } + .alert(NSLocalizedString("You will lose all your manually reclassified transactions types", comment: ""), isPresented: $showRescanWarningAlert) { + Button(NSLocalizedString("Export CSV", comment: "")) { + handleCSVExport() + } + Button(NSLocalizedString("Continue", comment: "")) { + showRescanActionAlert = true + } + Button(NSLocalizedString("Cancel", comment: ""), role: .cancel) { } + } message: { + Text(NSLocalizedString("If you would like to save manually reclassified types for transactions you should export a CSV transaction file.", comment: "")) + } + .alert(NSLocalizedString("Rescan Blockchain", comment: ""), isPresented: $showRescanActionAlert) { + Button(NSLocalizedString("Rescan Transactions (Suggested)", comment: "")) { + viewModel.rescanTransactions() + onDidRescan() + } + Button(NSLocalizedString("Full Resync", comment: "")) { + viewModel.fullResync() + onDidRescan() + } + #if DEBUG + Button(NSLocalizedString("Resync Masternode List", comment: "")) { + viewModel.resyncMasternodeList() + onDidRescan() + } + #endif + Button(NSLocalizedString("Cancel", comment: ""), role: .cancel) { } + } + .sheet(isPresented: $showCSVExportActivity) { + if let csvData = viewModel.csvExportData { + ActivityView(activityItems: [csvData.file]) + } + } + } + + private func handleNavigation(_ destination: SettingsMenuNavigationDestination?) { + switch destination { + case .coinjoin: + showCoinJoinController() + case .currencySelector: + showCurrencySelector() + case .network: + showNetworkAlert = true + case .rescan: + showRescanWarningAlert = true + case .about: + showAboutController() + case .exportCSV: + handleCSVExport() + case .none: + break + } + + // Reset navigation destination after handling + if destination != nil { + viewModel.resetNavigation() + } + } + + private func showCoinJoinController() { + let nextVC: UIViewController + + if CoinJoinLevelViewModel.shared.infoShown { + nextVC = CoinJoinLevelsViewController.controller() + } else { + nextVC = CoinJoinInfoViewController.controller() + } + + vc.pushViewController(nextVC, animated: true) + } + + private func showCurrencySelector() { + let controller = DWLocalCurrencyViewController(navigationAppearance: .default, presentationMode: .screen, currencyCode: nil) + controller.delegate = delegateInternal + vc.pushViewController(controller, animated: true) + } + + private func showAboutController() { + let controller = DWAboutViewController.create() + vc.pushViewController(controller, animated: true) + } + + private func handleCSVExport() { + Task { + do { + try await viewModel.exportCSV() + } catch { + // Handle error display if needed + } + } + } + + private func updateView() { + // Trigger view refresh after network change + viewModel.resetNavigation() + } + + @ViewBuilder + private func CoinJoinSubtitle(_ cjItem: CoinJoinMenuItemModel) -> some View { + if cjItem.isOn { + CoinJoinProgressInfo(state: cjItem.state, progress: cjItem.progress, mixed: cjItem.mixed, total: cjItem.total, textColor: .tertiaryText, font: .caption) + .padding(.top, 2) + } else { + Text(NSLocalizedString("Turned off", comment: "CoinJoin")) + .font(.caption) + .foregroundColor(.tertiaryText) + .padding(.leading, 4) + .padding(.top, 2) + } + } +} + +extension SettingsScreen { + class DelegateInternal: NSObject, DWLocalCurrencyViewControllerDelegate { + let onHide: () -> () + + init(onHide: @escaping () -> ()) { + self.onHide = onHide + } + + func localCurrencyViewController(_ controller: DWLocalCurrencyViewController, didSelectCurrency currencyCode: String) { onHide() } + func localCurrencyViewControllerDidCancel(_ controller: DWLocalCurrencyViewController) { onHide() } + } +} + +struct ActivityView: UIViewControllerRepresentable { + let activityItems: [Any] + + func makeUIViewController(context: Context) -> UIActivityViewController { + return UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {} +} diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 10a9e4581..0de1c2e5c 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "المزامنة جارية... قد لا تكون النتائج كاملة."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "متزامن مع محفظة داش الحالية"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index d490c5b34..43ff290be 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Синхронизирай сега"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index 09f0a9a95..d36bac3e7 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index 26bddb0d0..d5e1fabd6 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Synchronizovat"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index 15cfcc33f..2dd46532d 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index f7518011f..1f76857a3 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Synchronisierung läuft... Ergebnisse können unvollständig sein."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Jetzt synchronisieren"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Mit aktueller Dash Wallet synchronisiert"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 958ebab23..93c6611cf 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Συγχρονισμός σε εξέλιξη... Τα αποτελέσματα μπορεί να μην είναι πλήρη."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Συγχρονισμός Τώρα"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Συγχρονισμένο με το τρέχον Dash Wallet"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index f3d2243bc..8c3fde536 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index 9b78dea31..3d1695e71 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index 4fc54a233..2bfbe34b8 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sincronización en curso… Es posible que los resultados no estén completos."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sincronizar Ahora"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Sincronizado con la billetera de Dash actual"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index c0ceb66bf..e4e0e14cc 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 5a6b33f2e..1e12c42d2 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "فرآیند همزمان‌سازی در جریان است...نتایج شاید کامل نباشد. "; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "همزمان‌سازی با دش والت کنونی"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 3d39ebf2e..389ac01f4 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 670b7dec3..3fe4d6294 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Kasalukuyang isinasagawa ang pag-sync... Maaaring hindi kumpleto ang resulta."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "I-sync ngayon"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Naka-sync sa kasalukuyang Dash Wallet"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index e4a812dad..a633c3f75 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Synchronisation en cours… Les résultats peuvent être encore incomplets."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Synchroniser maintenant"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synchronisé avec le Dash Wallet actuel"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 0d5e13dee..170826cd9 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 87a85e881..20939d68a 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 12999441b..96c0a81c7 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sinkronisasi sedang berlangsung... Hasil mungkin tidak lengkap."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sinkronkan Sekarang"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Disinkronkan dengan Dompet Dash saat ini"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 85790fbb8..83270a0e6 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sincronizzazione in corso... I risultati potrebbero non essere completi."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sincronizza Ora"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Sincronizzato con l'attuale Dash Wallet"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 36c311876..fbd6dc624 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "同期中... 入力結果が完了していない可能性があります。"; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "すぐに同期する"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "現在使用しているDash Walletと同期"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 29f89ee02..c904bd26d 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "동기화 중... 결과가 나타나지 않을 수 있습니다."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "지금 동기화합니다"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "현재 대시 지갑과 동기화됨"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 0226593bb..bce3eb33b 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index d938b2de7..409c915a3 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index e77e9209c..7fe2d274e 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index 8adfd326d..ae0f952e5 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Synchronisatie bezig... Resultaten zijn mogelijk niet compleet."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Nu synchroniseren"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Gesynchroniseerd met huidige Dash portemonnee"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 7caa9da50..78b9c95a1 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Synchronizacja w toku... Wyniki mogą nie być kompletne."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Synchronizuj Teraz"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Zsynchronizowane z obecnym portfelem Dash"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 43ea6c548..61340dd65 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sincronização em andamento... Os resultados podem não estar completos."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sincronizar Agora"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Sincronizado com a Carteira Dash atual"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index af1167c3b..c6b30bb58 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index f91e82e28..84bea1f12 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Синхронизация… Результаты могут быть неполными."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Синхронизировать"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Синхронизирован с активным Dash Wallet"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index 18723db08..cba3c7e29 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Prebieha synchronizácia… Výsledky nemusia byť úplné."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Synchronizovať teraz"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synchronizované s aktuálnou Dash peňaženkou "; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 477198449..327820a1e 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index 402feed48..af3436c97 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index f3e15a32b..4f66b68e2 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 219d017a9..1aef10ef0 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 1d31e5c64..20899c888 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index e22934fee..3b0b23835 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "กำลังซิงค์... ผลลัพธ์อาจไม่สมบูรณ์"; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "ซิงค์ตอนนี้"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "ซิงค์กับกระเป๋าเงิน Dash ปัจจุบัน"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 21abad6d3..271301cb3 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Senkronizasyon devam ediyor... Sonuçlar tamamlanmayabilir."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Şimdi Senkronize Et"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Mevcut Dash Cüzdanı ile senkronize edildi"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index d96d61136..32649fa35 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Триває синхронізація... Результати можуть бути неповними."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Синхронізувати зараз"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Синхронізовано з Dash Wallet"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index c3c1f7b86..46d06fd29 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Đồng bộ luôn"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index b5de0424a..c4e5d6fcd 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 1a79526ad..d7e92f679 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "Sync in progress… Results may not be complete."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "Sync Now"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "Synced with current Dash Wallet"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 50e579d12..5b1fb7172 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "同步中… 结果可能不完整."; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "立刻同步"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "已与当前Dash钱包同步"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index 4fba6f66a..f535ca6df 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -2392,9 +2392,6 @@ /* Explore Dash */ "Sync in progress… Results may not be complete." = "同步中... 結果可能不完整。"; -/* Translate it as short as possible! (24 symbols max) */ -"Sync Now" = "立即同步"; - /* CrowdNode Portal */ "Synced with current Dash Wallet" = "與當前達世幣錢包同步"; From 20b2b4650eb43e721720e175157a9ac62150f2e9 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 24 Jul 2025 17:56:15 +0700 Subject: [PATCH 08/14] chore: transition ToolsMenuScreen to full SwiftUI --- DashWallet.xcodeproj/project.pbxproj | 18 +- .../Sources/UI/Menu/Main/MainMenuView.swift | 29 --- .../UI/Menu/Main/MainMenuViewController.swift | 27 +- .../UI/Menu/Tools/ToolsMenuScreen.swift | 199 +++++++++++++++ .../Menu/Tools/ToolsMenuViewController.swift | 240 ------------------ .../UI/Menu/Tools/ToolsMenuViewModel.swift | 107 ++++++++ DashWallet/ar.lproj/Localizable.strings | 3 - DashWallet/bg.lproj/Localizable.strings | 3 - DashWallet/ca.lproj/Localizable.strings | 3 - DashWallet/cs.lproj/Localizable.strings | 3 - DashWallet/da.lproj/Localizable.strings | 3 - DashWallet/de.lproj/Localizable.strings | 3 - DashWallet/el.lproj/Localizable.strings | 3 - DashWallet/en.lproj/Localizable.strings | 3 - DashWallet/eo.lproj/Localizable.strings | 3 - DashWallet/es.lproj/Localizable.strings | 3 - DashWallet/et.lproj/Localizable.strings | 3 - DashWallet/fa.lproj/Localizable.strings | 3 - DashWallet/fi.lproj/Localizable.strings | 3 - DashWallet/fil.lproj/Localizable.strings | 3 - DashWallet/fr.lproj/Localizable.strings | 3 - DashWallet/hr.lproj/Localizable.strings | 3 - DashWallet/hu.lproj/Localizable.strings | 3 - DashWallet/id.lproj/Localizable.strings | 3 - DashWallet/it.lproj/Localizable.strings | 3 - DashWallet/ja.lproj/Localizable.strings | 3 - DashWallet/ko.lproj/Localizable.strings | 3 - DashWallet/mk.lproj/Localizable.strings | 3 - DashWallet/ms.lproj/Localizable.strings | 3 - DashWallet/nb.lproj/Localizable.strings | 3 - DashWallet/nl.lproj/Localizable.strings | 3 - DashWallet/pl.lproj/Localizable.strings | 3 - DashWallet/pt.lproj/Localizable.strings | 3 - DashWallet/ro.lproj/Localizable.strings | 3 - DashWallet/ru.lproj/Localizable.strings | 3 - DashWallet/sk.lproj/Localizable.strings | 3 - DashWallet/sl.lproj/Localizable.strings | 3 - DashWallet/sl_SI.lproj/Localizable.strings | 3 - DashWallet/sq.lproj/Localizable.strings | 3 - DashWallet/sr.lproj/Localizable.strings | 3 - DashWallet/sv.lproj/Localizable.strings | 3 - DashWallet/th.lproj/Localizable.strings | 3 - DashWallet/tr.lproj/Localizable.strings | 3 - DashWallet/uk.lproj/Localizable.strings | 3 - DashWallet/vi.lproj/Localizable.strings | 3 - DashWallet/zh-Hans.lproj/Localizable.strings | 3 - .../zh-Hant-TW.lproj/Localizable.strings | 3 - DashWallet/zh.lproj/Localizable.strings | 3 - DashWallet/zh_TW.lproj/Localizable.strings | 3 - 49 files changed, 331 insertions(+), 418 deletions(-) create mode 100644 DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift delete mode 100644 DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift create mode 100644 DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewModel.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 96c622add..cb2544e63 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -542,6 +542,8 @@ 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; 752F819A2E30F55E00ADA76D /* SecurityScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityScreen.swift */; }; 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; + 752F81A92E323FDB00ADA76D /* ToolsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */; }; + 752F81AA2E323FDB00ADA76D /* ToolsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */; }; 75303FE52AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 75303FE62AE7B70500870D8B /* CrowdNode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */; }; 7531308D2B47EC910069C9B7 /* UpholdClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7531308C2B47EC910069C9B7 /* UpholdClient.swift */; }; @@ -620,8 +622,8 @@ 755E6DFE2A99E7A000A42870 /* DWInvitationSetupState.m in Sources */ = {isa = PBXBuildFile; fileRef = 755E6DFC2A99E7A000A42870 /* DWInvitationSetupState.m */; }; 756557B52CE84FFA0060348D /* FeeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756557B42CE84FF70060348D /* FeeInfo.swift */; }; 756557B62CE84FFA0060348D /* FeeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756557B42CE84FF70060348D /* FeeInfo.swift */; }; - 7566F4832BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */; }; - 7566F4842BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */; }; + 7566F4832BB6949E005238D2 /* ToolsMenuScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4822BB69498005238D2 /* ToolsMenuScreen.swift */; }; + 7566F4842BB6949E005238D2 /* ToolsMenuScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4822BB69498005238D2 /* ToolsMenuScreen.swift */; }; 7566F48A2BB6CAF2005238D2 /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4892BB6CAF2005238D2 /* MenuItem.swift */; }; 7566F48B2BB6CAF2005238D2 /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566F4892BB6CAF2005238D2 /* MenuItem.swift */; }; 7569D6832DE6DA6800768BFF /* ExploreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7569D6822DE6DA6800768BFF /* ExploreViewController.swift */; }; @@ -2452,6 +2454,7 @@ 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewControllerDelegate.swift; sourceTree = ""; }; 752F81962E30F55E00ADA76D /* SecurityScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityScreen.swift; sourceTree = ""; }; 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuViewModel.swift; sourceTree = ""; }; + 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolsMenuViewModel.swift; sourceTree = ""; }; 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CrowdNode.storyboard; sourceTree = ""; }; 7531308C2B47EC910069C9B7 /* UpholdClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdClient.swift; sourceTree = ""; }; 753130902B47EE920069C9B7 /* UpholdCapability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpholdCapability.swift; sourceTree = ""; }; @@ -2499,7 +2502,7 @@ 755E6DFC2A99E7A000A42870 /* DWInvitationSetupState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWInvitationSetupState.m; sourceTree = ""; }; 755E6DFD2A99E7A000A42870 /* DWInvitationSetupState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWInvitationSetupState.h; sourceTree = ""; }; 756557B42CE84FF70060348D /* FeeInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeeInfo.swift; sourceTree = ""; }; - 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolsMenuViewController.swift; sourceTree = ""; }; + 7566F4822BB69498005238D2 /* ToolsMenuScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolsMenuScreen.swift; sourceTree = ""; }; 7566F4892BB6CAF2005238D2 /* MenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = ""; }; 7569D6822DE6DA6800768BFF /* ExploreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreViewController.swift; sourceTree = ""; }; 7569D6852DE6DB1B00768BFF /* ExploreHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreHeaderView.swift; sourceTree = ""; }; @@ -4222,7 +4225,8 @@ 2A8DBA772630A6BE009094BD /* ExtendedKeys */, 2A10EB322358994400C38B61 /* ImportWallet */, FB3FF0B0222641210059A9A5 /* Masternode Keys */, - 7566F4822BB69498005238D2 /* ToolsMenuViewController.swift */, + 7566F4822BB69498005238D2 /* ToolsMenuScreen.swift */, + 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */, ); path = Tools; sourceTree = ""; @@ -8660,6 +8664,7 @@ 114D16B629812730009A124C /* OnlineAccountDetailsController.swift in Sources */, C9F451E92A0BDAE700825057 /* UIApplication+DashWallet.swift in Sources */, 110D1784298E68A8005BEB30 /* OnlineAccountInfoController.swift in Sources */, + 752F81AA2E323FDB00ADA76D /* ToolsMenuViewModel.swift in Sources */, 470AE1882926600A001A0514 /* PaymentController.swift in Sources */, 751C05DE2D3E39A800475E52 /* TransactionListDataItem.swift in Sources */, 2ADB396C242615C200A6F898 /* CALayer+MBAnimationPersistence.m in Sources */, @@ -9021,7 +9026,7 @@ 47B30D80291123D30080C326 /* SendAmountViewController.swift in Sources */, 47CF46A1296540EF0067B6EE /* AccountService.swift in Sources */, 47C6E6E7291A90B3003FEDF2 /* ListHandlerView.swift in Sources */, - 7566F4832BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */, + 7566F4832BB6949E005238D2 /* ToolsMenuScreen.swift in Sources */, 754D020E2D1558EB005CA466 /* GroupedTransactions.swift in Sources */, 11BD738128E7356100A34022 /* CrowdNode.swift in Sources */, 47AE8B9F28BFAD8200490F5E /* SQLite+ExloreDash.swift in Sources */, @@ -9512,7 +9517,7 @@ C9D2C7AB2A320AA000D15901 /* DWBaseFormTableViewCell.m in Sources */, C9D2C7AC2A320AA000D15901 /* AccountCell.swift in Sources */, C9D2C7AD2A320AA000D15901 /* DWTransactionListDataProviderStub.m in Sources */, - 7566F4842BB6949E005238D2 /* ToolsMenuViewController.swift in Sources */, + 7566F4842BB6949E005238D2 /* ToolsMenuScreen.swift in Sources */, C943B33A2A408CED00AF23C5 /* DWUploadAvatarModel.m in Sources */, C943B3392A408CED00AF23C5 /* DWUploadAvatarViewController.m in Sources */, 759609242C455B2000F3BF04 /* SendIntro.swift in Sources */, @@ -9879,6 +9884,7 @@ 757514E02B15D8DE0026AD8E /* VotingConstants.swift in Sources */, C943B51E2A40A54600AF23C5 /* InvitationTopView.swift in Sources */, C9D2C8D52A320AA000D15901 /* AccountService.swift in Sources */, + 752F81A92E323FDB00ADA76D /* ToolsMenuViewModel.swift in Sources */, C9D2C8D62A320AA000D15901 /* ListHandlerView.swift in Sources */, C943B5152A40A54600AF23C5 /* DWInvitationTableViewCell.m in Sources */, C9D2C8D82A320AA000D15901 /* CrowdNode.swift in Sources */, diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift index e128edb97..306fbd852 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift @@ -167,35 +167,6 @@ extension Notification.Name { #endif } -// MARK: - MenuItemType Hashable - -extension MenuItemType: Hashable { - func hash(into hasher: inout Hasher) { - switch self { - case .joinDashPay: - hasher.combine("joinDashPay") - case .buySellDash: - hasher.combine("buySellDash") - case .explore: - hasher.combine("explore") - case .security: - hasher.combine("security") - case .settings: - hasher.combine("settings") - case .tools: - hasher.combine("tools") - case .support: - hasher.combine("support") - #if DASHPAY - case .invite: - hasher.combine("invite") - case .voting: - hasher.combine("voting") - #endif - } - } -} - #Preview { #if DASHPAY let viewModel = MainMenuViewModel( diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index c9dae6dfc..63e556c19 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -189,9 +189,19 @@ class MainMenuViewController: UIViewController { } @objc private func showTools() { - let controller = ToolsMenuViewController() - controller.delegate = self - navigationController?.pushViewController(controller, animated: true) + guard let navigationController = navigationController else { return } + let screen = ToolsMenuScreen(vc: navigationController, onImportPrivateKey: { [weak self] in + guard let self = self else { return } + + navigationController.popToRootViewController(animated: false) + if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { + mainMenuDelegate.mainMenuViewControllerImportPrivateKey(self) + } + }) + + let controller = UIHostingController(rootView: screen) + controller.hidesBottomBarWhenPushed = true + navigationController.pushViewController(controller, animated: true) } @objc private func showSupport() { @@ -278,17 +288,6 @@ class MainMenuViewController: UIViewController { #endif } -// MARK: - DWToolsMenuViewControllerDelegate - -extension MainMenuViewController: ToolsMenuViewControllerDelegate { - func toolsMenuViewControllerImportPrivateKey(_ controller: ToolsMenuViewController) { - navigationController?.popToRootViewController(animated: false) - if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.mainMenuViewControllerImportPrivateKey(self) - } - } -} - // MARK: - DWExploreViewControllerDelegate extension MainMenuViewController: ExploreViewControllerDelegate { diff --git a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift new file mode 100644 index 000000000..46c41422f --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift @@ -0,0 +1,199 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2025 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import SwiftUI +import SafariServices + +struct ToolsMenuScreen: View { + private let vc: UINavigationController + private let delegateInternal: DelegateInternal + private let onImportPrivateKey: () -> () + + @StateObject private var viewModel = ToolsMenuViewModel() + @State private var showCSVExportAlert = false + @State private var showCSVExportActivity = false + @State private var showZenLedgerSheet = false + + init(vc: UINavigationController, onImportPrivateKey: @escaping () -> ()) { + self.vc = vc + self.onImportPrivateKey = onImportPrivateKey + self.delegateInternal = DelegateInternal(onImportPrivateKey: onImportPrivateKey) + } + + var body: some View { + VStack(alignment: .leading, spacing: 16) { + // First group - all items except ZenLedger + VStack(spacing: 0) { + ForEach(viewModel.items.dropLast()) { item in + MenuItem( + title: item.title, + subtitle: item.subtitle, + details: item.details, + icon: item.icon, + showInfo: item.showInfo, + showChevron: false, + isToggled: item.isToggled, + action: item.action + ) + .frame(minHeight: 60) + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + + // Second group - ZenLedger + if let zenLedgerItem = viewModel.items.last { + VStack(spacing: 0) { + MenuItem( + title: zenLedgerItem.title, + subtitle: zenLedgerItem.subtitle, + details: zenLedgerItem.details, + icon: zenLedgerItem.icon, + showInfo: zenLedgerItem.showInfo, + showChevron: false, + isToggled: zenLedgerItem.isToggled, + action: zenLedgerItem.action + ) + .frame(minHeight: 60) + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + } + + Spacer() + } + .padding(.horizontal, 20) + .padding(.top, 16) + .background(Color.primaryBackground) + .navigationBarTitleDisplayMode(.inline) + .onReceive(viewModel.$navigationDestination) { destination in + handleNavigation(destination) + } + .onReceive(viewModel.$showCSVExportActivity) { show in + showCSVExportActivity = show + } + .alert(NSLocalizedString("CSV Export", comment: ""), isPresented: $showCSVExportAlert) { + Button(NSLocalizedString("Continue", comment: "")) { + handleCSVExport() + } + Button(NSLocalizedString("Cancel", comment: ""), role: .cancel) { } + } message: { + Text(NSLocalizedString("All payments will be considered as an Expense and all incoming transactions will be Income. The owner of this wallet is responsible for making any cost basis adjustments in their chosen tax reporting system.", comment: "")) + } + .sheet(isPresented: $showCSVExportActivity) { + if let csvData = viewModel.csvExportData { + ActivityView(activityItems: [csvData.file]) + } + } + .sheet(isPresented: $showZenLedgerSheet, onDismiss: { + if let link = viewModel.safariLink { + openSafariLink(link) + viewModel.safariLink = nil + } + }) { + if #available(iOS 16.0, *) { + ZenLedgerInfoSheet(safariLink: $viewModel.safariLink) + .presentationDetents([.height(450)]) + } else { + ZenLedgerInfoSheet(safariLink: $viewModel.safariLink) + } + } + } + + private func handleNavigation(_ destination: ToolsMenuNavigationDestination?) { + switch destination { + case .importPrivateKey: + showImportPrivateKey() + case .extendedPublicKeys: + showExtendedPublicKeys() + case .masternodeKeys: + showMasternodeKeys() + case .csvExport: + showCSVExportAlert = true + case .zenLedger: + showZenLedgerSheet = true + case .none: + break + } + + // Reset navigation destination after handling + if destination != nil { + viewModel.resetNavigation() + } + } + + private func showImportPrivateKey() { + let controller = DWImportWalletInfoViewController.createController() + controller.delegate = delegateInternal + vc.pushViewController(controller, animated: true) + } + + private func showExtendedPublicKeys() { + let controller = ExtendedPublicKeysViewController() + controller.hidesBottomBarWhenPushed = true + vc.pushViewController(controller, animated: true) + } + + private func showMasternodeKeys() { + let controller = KeysOverviewViewController() + controller.hidesBottomBarWhenPushed = true + vc.pushViewController(controller, animated: true) + } + + private func handleCSVExport() { + Task { + do { + try await viewModel.exportCSV() + } catch { + // Handle error display if needed + } + } + } + + private func openSafariLink(_ link: String) { + if let url = URL(string: link) { + let controller = SFSafariViewController(url: url) + vc.present(controller, animated: true, completion: nil) + } + } +} + +extension DWImportWalletInfoViewController { + static func createController() -> DWImportWalletInfoViewController { + let storyboard = UIStoryboard(name: "ImportWalletInfo", bundle: nil) + let controller = storyboard.instantiateInitialViewController() as! DWImportWalletInfoViewController + controller.hidesBottomBarWhenPushed = true + return controller + } +} + +extension ToolsMenuScreen { + class DelegateInternal: NSObject, DWImportWalletInfoViewControllerDelegate { + let onImportPrivateKey: () -> () + + init(onImportPrivateKey: @escaping () -> ()) { + self.onImportPrivateKey = onImportPrivateKey + } + + @objc func importWalletInfoViewControllerScanPrivateKeyAction(_ controller: DWImportWalletInfoViewController) { onImportPrivateKey() } + } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift deleted file mode 100644 index 92f112981..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewController.swift +++ /dev/null @@ -1,240 +0,0 @@ -// -// Created by Andrei Ashikhmin -// Copyright © 2024 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit -import SwiftUI - -protocol ToolsMenuViewControllerDelegate: AnyObject { - func toolsMenuViewControllerImportPrivateKey(_ controller: ToolsMenuViewController) -} - -class ToolsMenuViewController: UIViewController, DWImportWalletInfoViewControllerDelegate { - weak var delegate: ToolsMenuViewControllerDelegate? - - override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { - super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) - self.title = NSLocalizedString("Tools", comment: "") - self.hidesBottomBarWhenPushed = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - - self.view.backgroundColor = UIColor.dw_secondaryBackground() - - let items = [ - MenuItemModel( - title: NSLocalizedString("Import Private Key", comment: ""), - icon: .custom("image.import.private.key", maxHeight: 22), - action: { [weak self] in - self?.showImportPrivateKey() - } - ), - MenuItemModel( - title: NSLocalizedString("Extended Public Keys", comment: ""), - icon: .custom("image.extend.public.key", maxHeight: 22), - action: { [weak self] in - self?.showExtendedPublicKeys() - } - ), - MenuItemModel( - title: NSLocalizedString("Show Masternode Keys", comment: ""), - icon: .custom("image.masternode.keys", maxHeight: 22), - action: { [weak self] in - self?.showMasternodeKeys() - } - ), - MenuItemModel( - title: NSLocalizedString("CSV Export", comment: ""), - icon: .custom("image.csv.export", maxHeight: 22), - action: { [weak self] in - self?.askToExportTransactionsInCSV() - } - ), - MenuItemModel( - title: NSLocalizedString("ZenLedger", comment: ""), - subtitle: NSLocalizedString("Simplify your crypto taxes", comment: ""), - icon: .custom("zenledger") - ) - ] - - let content = ToolsMenuContent(items: items, onOpenSafari: { link in - let controller = SFSafariViewController(url: URL(string: link)!) - self.present(controller, animated: true, completion: nil) - }) - let swiftUIController = UIHostingController(rootView: content) - swiftUIController.view.backgroundColor = UIColor.dw_secondaryBackground() - self.dw_embedChild(swiftUIController) - } - - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - // MARK: - DWImportWalletInfoViewControllerDelegate - - @objc func importWalletInfoViewControllerScanPrivateKeyAction(_ controller: DWImportWalletInfoViewController) { - delegate?.toolsMenuViewControllerImportPrivateKey(self) - } - - // MARK: - Private - - private func showImportPrivateKey() { - let controller = DWImportWalletInfoViewController.createController() - controller.delegate = self - self.navigationController?.pushViewController(controller, animated: true) - } - - private func showMasternodeKeys() { - let keysViewController = KeysOverviewViewController() - keysViewController.hidesBottomBarWhenPushed = true - self.navigationController?.pushViewController(keysViewController, animated: true) - } - - private func showExtendedPublicKeys() { - let controller = ExtendedPublicKeysViewController() - controller.hidesBottomBarWhenPushed = true - self.navigationController?.pushViewController(controller, animated: true) - } - - private func askToExportTransactionsInCSV() { - let title = NSLocalizedString("CSV Export", comment: "") - let message = NSLocalizedString("All payments will be considered as an Expense and all incoming transactions will be Income. The owner of this wallet is responsible for making any cost basis adjustments in their chosen tax reporting system.", comment: "") - - let alert = UIAlertController(title: title, message: message, preferredStyle: .actionSheet) - alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { [weak self] _ in - self?.exportTransactionsInCSV() - })) - alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil)) - - if UIDevice.current.userInterfaceIdiom == .pad { - alert.popoverPresentationController?.sourceView = self.view - alert.popoverPresentationController?.sourceRect = self.view.bounds - } - - self.present(alert, animated: true, completion: nil) - } - - private func exportTransactionsInCSV() { - self.view.dw_showProgressHUD(withMessage: NSLocalizedString("Generating CSV Report", comment: "")) - - TaxReportGenerator.generateCSVReport { [weak self] fileName, file in - self?.view.dw_hideProgressHUD() - - let activityViewController = UIActivityViewController(activityItems: [file], applicationActivities: nil) - activityViewController.setValue(fileName, forKey: "subject") - - if UIDevice.current.userInterfaceIdiom == .pad { - activityViewController.popoverPresentationController?.sourceView = self?.view - activityViewController.popoverPresentationController?.sourceRect = self?.view.bounds ?? .zero - } - - self?.present(activityViewController, animated: true, completion: nil) - } errorHandler: { [weak self] error in - self?.view.dw_hideProgressHUD() - self?.dw_displayErrorModally(error) - } - } -} - -extension DWImportWalletInfoViewController { - static func createController() -> DWImportWalletInfoViewController { - let storyboard = UIStoryboard(name: "ImportWalletInfo", bundle: nil) - let controller = storyboard.instantiateInitialViewController() as! DWImportWalletInfoViewController - controller.hidesBottomBarWhenPushed = true - return controller - } -} - -struct ToolsMenuContent: View { - var items: [MenuItemModel] - @State private var showZenLedgerSheet: Bool = false - @State private var safariLink: String? = nil - - var onOpenSafari: (String) -> Void - - var body: some View { - VStack(alignment: .leading, spacing: 16) { - // First group - all items except ZenLedger - VStack(spacing: 0) { - ForEach(items.dropLast(), id: \.self) { item in - MenuItem( - title: item.title, - subtitle: item.subtitle, - details: item.details, - icon: item.icon, - showInfo: item.showInfo, - showChevron: false, - isToggled: item.isToggled, - action: { - item.action?() - } - ) - .frame(minHeight: 60) - } - } - .padding(.vertical, 5) - .background(Color.secondaryBackground) - .cornerRadius(12) - .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) - - // Second group - ZenLedger - if let zenLedgerItem = items.last { - VStack(spacing: 0) { - MenuItem( - title: zenLedgerItem.title, - subtitle: zenLedgerItem.subtitle, - details: zenLedgerItem.details, - icon: zenLedgerItem.icon, - showInfo: zenLedgerItem.showInfo, - showChevron: false, - isToggled: zenLedgerItem.isToggled, - action: { - showZenLedgerSheet = true - } - ) - .frame(minHeight: 60) - } - .padding(.vertical, 5) - .background(Color.secondaryBackground) - .cornerRadius(12) - .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) - } - - Spacer() - } - .padding(.horizontal, 20) - .padding(.top, 16) - .sheet(isPresented: $showZenLedgerSheet, onDismiss: { - if let link = safariLink { - safariLink = nil - onOpenSafari(link) - } - }) { - if #available(iOS 16.0, *) { - ZenLedgerInfoSheet(safariLink: $safariLink) - .presentationDetents([.height(450)]) - } else { - ZenLedgerInfoSheet(safariLink: $safariLink) - } - } - } -} diff --git a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewModel.swift new file mode 100644 index 000000000..b69353001 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuViewModel.swift @@ -0,0 +1,107 @@ +// +// Created by Andrei Ashikhmin +// Copyright © 2025 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import Combine + +enum ToolsMenuNavigationDestination { + case importPrivateKey + case extendedPublicKeys + case masternodeKeys + case csvExport + case zenLedger +} + +@MainActor +class ToolsMenuViewModel: ObservableObject { + @Published var items: [MenuItemModel] = [] + @Published var navigationDestination: ToolsMenuNavigationDestination? + @Published var showCSVExportActivity = false + @Published var csvExportData: (fileName: String, file: URL)? + @Published var safariLink: String? + + init() { + setupMenuItems() + } + + private func setupMenuItems() { + items = [ + MenuItemModel( + title: NSLocalizedString("Import Private Key", comment: ""), + icon: .custom("image.import.private.key", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .importPrivateKey + } + ), + MenuItemModel( + title: NSLocalizedString("Extended Public Keys", comment: ""), + icon: .custom("image.extend.public.key", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .extendedPublicKeys + } + ), + MenuItemModel( + title: NSLocalizedString("Show Masternode Keys", comment: ""), + icon: .custom("image.masternode.keys", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .masternodeKeys + } + ), + MenuItemModel( + title: NSLocalizedString("CSV Export", comment: ""), + icon: .custom("image.csv.export", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .csvExport + } + ), + MenuItemModel( + title: NSLocalizedString("ZenLedger", comment: ""), + subtitle: NSLocalizedString("Simplify your crypto taxes", comment: ""), + icon: .custom("zenledger"), + action: { [weak self] in + self?.navigationDestination = .zenLedger + } + ) + ] + } + + func resetNavigation() { + navigationDestination = nil + showCSVExportActivity = false + csvExportData = nil + safariLink = nil + } + + func exportCSV() async throws { + let result = try await generateCSVReport() + csvExportData = result + showCSVExportActivity = true + } + + private func generateCSVReport() async throws -> (fileName: String, file: URL) { + try await withCheckedThrowingContinuation { continuation in + TaxReportGenerator.generateCSVReport( + completionHandler: { fileName, file in + continuation.resume(returning: (fileName, file)) + }, + errorHandler: { error in + continuation.resume(throwing: error) + } + ) + } + } +} diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 0de1c2e5c..6d7958919 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "احصل على السعر"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 43ff290be..c78b1dfa9 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index d36bac3e7..269cab29c 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index d5e1fabd6..89f340910 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generovat rozšířený veřejný klíč?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index 2dd46532d..edd6db6ee 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 1f76857a3..8d52a5681 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Erweiterten öffentlichen Schlüssel generieren?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "CSV-Bericht erstellen"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Angebot einholen"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 93c6611cf..a6a793319 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Δημιουργία Εκτεταμένου Δημόσιου Κλειδιού"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Δημιουργία αναφοράς CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Αποκτήστε προσφορά"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 8c3fde536..89d5654f6 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index 3d1695e71..c410016bb 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index 2bfbe34b8..aea1c12c7 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "¿Generar claves públicas extendidas?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generando informe CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Obtener cotización"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index e4e0e14cc..e9ac3cf8e 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index 1e12c42d2..ffe32ba7f 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "دریافت قیمت تخمینی"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 389ac01f4..f14b9fd88 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 3fe4d6294..1275482cc 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Bumuo ng pinalawig na mga public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Pagbuo ng CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Kumuha ng Quote"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index a633c3f75..3521cc82e 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Générer des clés publiques étendues ?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Génération du report CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Obtenir un devis"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 170826cd9..a156fd478 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 20939d68a..7f20e7323 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 96c0a81c7..0015bbdf8 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Hasilkan kunci publik yang diperluas?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Membuat Laporan CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Dapatkan Penawaran"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 83270a0e6..200656506 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generare chiavi pubbliche estese?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generazione rapporto CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Ottieni preventivo"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index fbd6dc624..3fa1f05a7 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "拡張されたパブリックキーを作成しますか。"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "CSVレポートの作成"; - /* Coinbase/Convert Crypto */ "Get Quote" = "見積もりを得る"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index c904bd26d..0a9b37153 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "확장된 공개 키를 생성합니까?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "CSV 보고서 생성중"; - /* Coinbase/Convert Crypto */ "Get Quote" = "견적 받기"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index bce3eb33b..2a0d83ef6 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 409c915a3..cf0bf8149 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 7fe2d274e..9dc0602c9 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index ae0f952e5..da738f8ba 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Genereer uitgebreide publieke sleutels?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "CSV rapport genereren"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Offerte aanvragen"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 78b9c95a1..6eb90c382 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Chcesz stworzyć rozszerzone klucze publiczne?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generuje raport CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Otrzymaj wycenę"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 61340dd65..528d03096 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Gerar chaves públicas estendidas?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Gerando relatório CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Obter cotação"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index c6b30bb58..f73cd3207 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 84bea1f12..efe2cc1c2 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Создать расширенный публичный ключ?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Создание отчёта в CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Получить Quote"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index cba3c7e29..f036b4b12 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generovať rozšírené verejné kľúče?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generovanie CSV správy"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Získajte ponuku"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 327820a1e..0e3c4bab1 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index af3436c97..63d4f38ee 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 4f66b68e2..01485db3a 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 1aef10ef0..8cd340889 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 20899c888..28a02b910 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 3b0b23835..8ba342bff 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "สร้างขยายกุญแจสาธารณะหรือไม่"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "สร้างรายงาน CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "รับใบเสนอราคา"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 271301cb3..0ec03cbab 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Genişletilmiş umumi anahtarlar oluşturulsun mu?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "CSV Raporu Oluşturma"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Teklif Al"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 32649fa35..49ad3f642 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Згенерувати розширені відкриті ключі?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Створення звіту CSV"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Отримати пропозицію"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 46d06fd29..e9ba8df0f 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Tạo khoá công khai mở rộng?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index c4e5d6fcd..f99904d7c 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index d7e92f679..cdcb4dc1d 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "Generate extended public keys?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "Generating CSV Report"; - /* Coinbase/Convert Crypto */ "Get Quote" = "Get Quote"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index 5b1fb7172..da1e05350 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "生成扩展公钥?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "正在生成 CSV 报告"; - /* Coinbase/Convert Crypto */ "Get Quote" = "获得报价"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index f535ca6df..186cdb62f 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -1012,9 +1012,6 @@ /* No comment provided by engineer. */ "Generate extended public keys?" = "要生成擴展的公共密鑰嗎?"; -/* No comment provided by engineer. */ -"Generating CSV Report" = "正在生成 CSV 報告"; - /* Coinbase/Convert Crypto */ "Get Quote" = "獲得報價"; From c1e5bd653dda13ec8fc213c59774626d896fac1c Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Thu, 24 Jul 2025 19:45:27 +0700 Subject: [PATCH 09/14] chore: moving navigation down to MainMenu SwiftUI view --- DashWallet.xcodeproj/project.pbxproj | 6 - .../DWMainMenuViewController+DashPay.swift | 7 +- .../RootEditProfileViewController.swift | 5 - .../UI/Main/MainTabbarController.swift | 4 +- .../Sources/UI/Menu/Main/MainMenuView.swift | 183 -------- .../UI/Menu/Main/MainMenuViewController.swift | 439 +++++++++++++----- .../Main/MainMenuViewControllerDelegate.swift | 4 +- .../UI/Menu/Main/MainMenuViewModel.swift | 92 ++-- .../UI/Menu/Settings/SettingsScreen.swift | 2 +- DashWallet/dashwallet-Bridging-Header.h | 1 + 10 files changed, 370 insertions(+), 373 deletions(-) delete mode 100644 DashWallet/Sources/UI/Menu/Main/MainMenuView.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index cb2544e63..bfa09a370 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -531,10 +531,8 @@ 752772122AAA1CE30066557E /* Coinbase-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 752772112AAA1CE30066557E /* Coinbase-Info.plist */; }; 752C3ED22B1AF19C00F46CD3 /* BuySellPortal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9FAABB42AB793CE00878224 /* BuySellPortal.storyboard */; }; 752D03A92E2F758B00B88784 /* MainMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */; }; - 752D03AB2E2F758B00B88784 /* MainMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A62E2F758B00B88784 /* MainMenuView.swift */; }; 752D03AC2E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; 752D03AD2E2F758B00B88784 /* MainMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */; }; - 752D03AF2E2F758B00B88784 /* MainMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A62E2F758B00B88784 /* MainMenuView.swift */; }; 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; 752D03B22E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; 752D03B32E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; @@ -2448,7 +2446,6 @@ 7527720C2AA9B2630066557E /* SupportedTopperAssets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedTopperAssets.swift; sourceTree = ""; }; 7527720E2AA9F58E0066557E /* TopperViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopperViewModel.swift; sourceTree = ""; }; 752772112AAA1CE30066557E /* Coinbase-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Coinbase-Info.plist"; sourceTree = ""; }; - 752D03A62E2F758B00B88784 /* MainMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuView.swift; sourceTree = ""; }; 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewController.swift; sourceTree = ""; }; 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewModel.swift; sourceTree = ""; }; 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewControllerDelegate.swift; sourceTree = ""; }; @@ -4188,7 +4185,6 @@ 2A7A7BC52347DF7100451078 /* Main */ = { isa = PBXGroup; children = ( - 752D03A62E2F758B00B88784 /* MainMenuView.swift */, 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */, 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */, 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */, @@ -8853,7 +8849,6 @@ 753FD7E22CA44BDD00B7751F /* CoinJoinProgress.swift in Sources */, 753E46E82DE1E24300A3FF2A /* CTXSpendModels.swift in Sources */, 752D03AD2E2F758B00B88784 /* MainMenuViewModel.swift in Sources */, - 752D03AF2E2F758B00B88784 /* MainMenuView.swift in Sources */, 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */, 478A2C7228DC909C00AD1420 /* BaseNavigationController.swift in Sources */, 47CDEECC294A2BAD008AE06D /* UIViewController+Coinbase.swift in Sources */, @@ -9241,7 +9236,6 @@ C9D2C6F32A320AA000D15901 /* ExploreDatabaseConnection.swift in Sources */, C9D2C6F42A320AA000D15901 /* WithdrawalLimitsController.swift in Sources */, 752D03A92E2F758B00B88784 /* MainMenuViewModel.swift in Sources */, - 752D03AB2E2F758B00B88784 /* MainMenuView.swift in Sources */, 752D03AC2E2F758B00B88784 /* MainMenuViewController.swift in Sources */, C943B31B2A408CED00AF23C5 /* DWUpdatingUserProfileView.m in Sources */, C9D2C6F52A320AA000D15901 /* CoinbaseTransactionResponse.swift in Sources */, diff --git a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift index f0faadb69..c8e654655 100644 --- a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift +++ b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift @@ -17,10 +17,11 @@ import UIKit -extension DWMainMenuViewController: RootEditProfileViewControllerDelegate { +extension MainMenuViewController: RootEditProfileViewControllerDelegate { func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { - guard let view = self.view as? MainMenuContentView else { return } - view.userModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + #if DASHPAY + viewModel.userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + #endif controller.dismiss(animated: true, completion: nil) if MOCK_DASHPAY.boolValue { diff --git a/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift b/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift index 5e00e3c11..d7fbed3cb 100644 --- a/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift +++ b/DashWallet/Sources/UI/DashPay/Profile/Edit Profile/RootEditProfileViewController.swift @@ -18,18 +18,14 @@ import UIKit #if DASHPAY -@objc(DWRootEditProfileViewControllerDelegate) protocol RootEditProfileViewControllerDelegate: AnyObject { func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) } -@objc(DWRootEditProfileViewController) class RootEditProfileViewController: ActionButtonViewController, DWEditProfileViewControllerDelegate, DWSaveAlertViewControllerDelegate, NavigationBarDisplayable { var isBackButtonHidden: Bool = false - - @objc weak var delegate: RootEditProfileViewControllerDelegate? private var editController: DWEditProfileViewController! var blockchainIdentity: DSBlockchainIdentity? { @@ -110,6 +106,5 @@ class RootEditProfileViewController: ActionButtonViewController, DWEditProfileVi } } #else -@objc(DWRootEditProfileViewControllerDelegate) protocol RootEditProfileViewControllerDelegate: AnyObject { } #endif diff --git a/DashWallet/Sources/UI/Main/MainTabbarController.swift b/DashWallet/Sources/UI/Main/MainTabbarController.swift index 85a5ad5d9..07c160bb6 100644 --- a/DashWallet/Sources/UI/Main/MainTabbarController.swift +++ b/DashWallet/Sources/UI/Main/MainTabbarController.swift @@ -337,11 +337,11 @@ extension MainTabbarController { // MARK: MainMenuViewControllerDelegate extension MainTabbarController: MainMenuViewControllerDelegate { - func mainMenuViewControllerImportPrivateKey(_ controller: UIViewController) { + func mainMenuViewControllerImportPrivateKey() { performScanQRCodeAction() } - func mainMenuViewControllerOpenHomeScreen(_ controller: UIViewController) { + func mainMenuViewControllerOpenHomeScreen() { selectedIndex = MainTabbarTabs.home.rawValue } diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift deleted file mode 100644 index 306fbd852..000000000 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuView.swift +++ /dev/null @@ -1,183 +0,0 @@ -// -// Created by Andrei Ashikhmin -// Copyright © 2025 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import SwiftUI - -struct MainMenuView: View { - @StateObject private var viewModel: MainMenuViewModel - - #if DASHPAY - let joinDPViewModel = JoinDashPayViewModel(initialState: .none) - #endif - - init(viewModel: MainMenuViewModel) { - self._viewModel = StateObject(wrappedValue: viewModel) - } - - var body: some View { - ScrollView { - LazyVStack(alignment: .leading, spacing: 20) { - // Header - HStack { - Text(NSLocalizedString("More", comment: "")) - .font(.title) - .fontWeight(.bold) - .foregroundColor(.primaryText) - Spacer() - } - .padding(.horizontal, 20) - .padding(.top, 10) - - #if DASHPAY - // Join DashPay section (if needed) - if viewModel.userProfileModel?.showJoinDashpay == true { - JoinDashPayView( - viewModel: joinDPViewModel, - onTap: { state in - handleJoinDashPayTap(state: state) - }, - onActionButton: { state in - handleJoinDashPayAction(state: state) - }, - onDismissButton: { state in - joinDPViewModel.markAsDismissed() - }, - onSizeChange: { size in - // Handle size changes if needed - } - ) - .padding(.horizontal, 18) - .padding(.bottom, 20) - } - #endif - - // Menu sections - ForEach(Array(viewModel.menuSections.enumerated()), id: \.offset) { index, section in - MenuSectionView(section: section) { menuItem in - viewModel.handleMenuAction(menuItem) - } - } - - Spacer(minLength: 60) // Bottom padding for tab bar - } - } - .background(Color.primaryBackground) - .onAppear { - viewModel.updateModel() - } - } - - #if DASHPAY - private func handleJoinDashPayTap(state: JoinDashPayViewState) { - switch state { - case .registered: - NotificationCenter.default.post(name: .editProfile, object: nil) - case .voting: - NotificationCenter.default.post(name: .showRequestDetails, object: nil) - case .none: - handleJoinButtonAction() - default: - break - } - } - - private func handleJoinDashPayAction(state: JoinDashPayViewState) { - switch state { - case .blocked, .failed, .contested: - handleJoinButtonAction() - default: - NotificationCenter.default.post(name: .editProfile, object: nil) - joinDPViewModel.markAsDismissed() - } - } - - private func handleJoinButtonAction() { - let shouldShowMixDashDialog = CoinJoinService.shared.mode == .none || !UsernamePrefs.shared.mixDashShown - let shouldShowDashPayInfo = !UsernamePrefs.shared.joinDashPayInfoShown - - if shouldShowMixDashDialog { - NotificationCenter.default.post(name: .showMixDashDialog, object: nil) - } else if shouldShowDashPayInfo { - NotificationCenter.default.post(name: .showDashPayInfo, object: nil) - } else { - NotificationCenter.default.post(name: .joinDashPay, object: nil) - } - } - #endif -} - -struct MenuSectionView: View { - let section: MenuSection - let onMenuItemTap: (MenuItemType) -> Void - - var body: some View { - VStack(spacing: 0) { - ForEach(section.items, id: \.self) { item in - MenuItemView(item: item) { - onMenuItemTap(item) - } - } - } - .padding(.vertical, 5) - .background(Color.secondaryBackground) - .cornerRadius(12) - .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) - .padding(.horizontal, 20) - } -} - -struct MenuItemView: View { - let item: MenuItemType - let action: () -> Void - - var body: some View { - MenuItem( - title: item.title, - subtitle: item.subtitle, - icon: item.iconName, - showChevron: false, - action: action - ) - } -} - -// MARK: - Additional Notification Names - -extension Notification.Name { - #if DASHPAY - static let editProfile = Notification.Name("editProfile") - static let showRequestDetails = Notification.Name("showRequestDetails") - static let showMixDashDialog = Notification.Name("showMixDashDialog") - static let showDashPayInfo = Notification.Name("showDashPayInfo") - static let joinDashPay = Notification.Name("joinDashPay") - #endif -} - -#Preview { - #if DASHPAY - let viewModel = MainMenuViewModel( - dashPayModel: nil, - receiveModel: nil, - dashPayReady: nil, - userProfileModel: nil - ) - #else - let viewModel = MainMenuViewModel() - #endif - - return MainMenuView(viewModel: viewModel) -} diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 63e556c19..c7eb2df22 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -25,7 +25,7 @@ class MainMenuViewController: UIViewController { weak var delegate: DWWipeDelegate? - private var viewModel: MainMenuViewModel! + var viewModel: MainMenuViewModel! private var hostingController: UIHostingController! #if DASHPAY @@ -75,7 +75,7 @@ class MainMenuViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - setupNotificationObservers() + // Navigation is now handled in SwiftUI } override func viewWillAppear(_ animated: Bool) { @@ -89,7 +89,7 @@ class MainMenuViewController: UIViewController { } deinit { - NotificationCenter.default.removeObserver(self) + // No longer needed since navigation is in SwiftUI } // MARK: - SwiftUI Setup @@ -106,7 +106,12 @@ class MainMenuViewController: UIViewController { viewModel = MainMenuViewModel() #endif - let swiftUIView = MainMenuView(viewModel: viewModel) + let swiftUIView = MainMenuView( + vc: navigationController!, + viewModel: viewModel, + delegate: delegate as? MainMenuViewControllerDelegate, + wipeDelegate: delegate + ) hostingController = UIHostingController(rootView: swiftUIView) addChild(hostingController) @@ -122,153 +127,281 @@ class MainMenuViewController: UIViewController { ]) } - // MARK: - Notification Observers + // MARK: - Support Email (keeping as requested) - private func setupNotificationObservers() { - NotificationCenter.default.addObserver(self, selector: #selector(showBuySellPortal), name: .showBuySellPortal, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showExplore), name: .showExplore, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showSecurity), name: .showSecurity, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showSettings), name: .showSettings, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showTools), name: .showTools, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showSupport), name: .showSupport, object: nil) - - #if DASHPAY - NotificationCenter.default.addObserver(self, selector: #selector(showInvite), name: .showInvite, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showVoting), name: .showVoting, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(editProfile), name: .editProfile, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showRequestDetails), name: .showRequestDetails, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showMixDashDialog), name: .showMixDashDialog, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(showDashPayInfo), name: .showDashPayInfo, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(joinDashPay), name: .joinDashPay, object: nil) - #endif + override func presentSupportEmailController() { + // TODO: Implementation kept as requested - to be handled later + } +} + + +// MARK: - MFMailComposeViewControllerDelegate + +extension MainMenuViewController: MFMailComposeViewControllerDelegate { + func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { + controller.dismiss(animated: true) } +} + +struct MainMenuView: View { + private let vc: UINavigationController + private let delegateInternal: DelegateInternal + @StateObject private var viewModel: MainMenuViewModel + @State private var openSettings: Bool = false + @State private var showTools: Bool = false + @State private var showSecurity: Bool = false - // MARK: - Navigation Handlers + #if DASHPAY + let joinDPViewModel = JoinDashPayViewModel(initialState: .none) + #endif - @objc private func showBuySellPortal() { - DSAuthenticationManager.sharedInstance().authenticate( - withPrompt: nil, - usingBiometricAuthentication: DWGlobalOptions.sharedInstance().biometricAuthEnabled, - alertIfLockout: true - ) { [weak self] authenticated, usedBiometrics, cancelled in - if authenticated { - let controller = BuySellPortalViewController.controller() - controller.hidesBottomBarWhenPushed = true - self?.navigationController?.pushViewController(controller, animated: true) + init(vc: UINavigationController, viewModel: MainMenuViewModel, delegate: MainMenuViewControllerDelegate? = nil, wipeDelegate: DWWipeDelegate? = nil) { + self.vc = vc + self._viewModel = StateObject(wrappedValue: viewModel) + self.delegateInternal = DelegateInternal( + delegate: delegate, + wipeDelegate: wipeDelegate, + viewModel: viewModel + ) + } + + var body: some View { + ScrollView { + LazyVStack(alignment: .leading, spacing: 20) { + // Header + HStack { + Text(NSLocalizedString("More", comment: "")) + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primaryText) + Spacer() + } + .padding(.horizontal, 20) + .padding(.top, 10) + + #if DASHPAY + // Join DashPay section (if needed) + if viewModel.userProfileModel?.showJoinDashpay == true { + JoinDashPayView( + viewModel: joinDPViewModel, + onTap: { state in + handleJoinDashPayTap(state: state) + }, + onActionButton: { state in + handleJoinDashPayAction(state: state) + }, + onDismissButton: { state in + joinDPViewModel.markAsDismissed() + }, + onSizeChange: { size in + // Handle size changes if needed + } + ) + .padding(.horizontal, 18) + .padding(.bottom, 20) + } + #endif + + // Menu sections + ForEach(Array(viewModel.menuSections.enumerated()), id: \.offset) { index, section in + MenuSectionView(section: section) { menuItem in + viewModel.handleMenuAction(menuItem) + } + } + + Spacer(minLength: 60) // Bottom padding for tab bar + } + + NavigationLink( + destination: SettingsScreen(vc: vc, onDidRescan: { + self.vc.popToRootViewController(animated: false) + self.delegateInternal.mainMenuViewControllerOpenHomeScreen() + }), + isActive: $openSettings + ) { + EmptyView() + } + + NavigationLink( + destination: ToolsMenuScreen(vc: vc, onImportPrivateKey: { + self.vc.popToRootViewController(animated: false) + self.delegateInternal.mainMenuViewControllerImportPrivateKey() + }), + isActive: $showTools + ) { + EmptyView() + } + + NavigationLink( + destination: SecurityScreen(vc: vc), + isActive: $showSecurity + ) { + EmptyView() } } + .background(Color.primaryBackground) + .onAppear { + viewModel.updateModel() + } + .onReceive(viewModel.$navigationDestination) { destination in + handleNavigation(destination) + } } - @objc private func showExplore() { - let controller = ExploreViewController() - controller.delegate = self - let navigationController = BaseNavigationController(rootViewController: controller) - present(navigationController, animated: true) + #if DASHPAY + private func handleJoinDashPayTap(state: JoinDashPayState) { + switch state { + case .registered: + viewModel.showEditProfile() + case .voting: + viewModel.showRequestDetails() + case .none: + handleJoinButtonAction() + default: + break + } } - @objc private func showSecurity() { - guard let navigationController = navigationController else { return } - - let controller = UIHostingController(rootView: SecurityScreen(vc: navigationController)) - controller.hidesBottomBarWhenPushed = true - navigationController.pushViewController(controller, animated: true) + private func handleJoinDashPayAction(state: JoinDashPayState) { + switch state { + case .blocked, .failed, .contested: + handleJoinButtonAction() + default: + viewModel.showEditProfile() + joinDPViewModel.markAsDismissed() + } } - @objc private func showSettings() { - guard let navigationController = navigationController else { return } + private func handleJoinButtonAction() { + let shouldShowMixDashDialog = CoinJoinService.shared.mode == .none || !UsernamePrefs.shared.mixDashShown + let shouldShowDashPayInfo = !UsernamePrefs.shared.joinDashPayInfoShown - let screen = SettingsScreen(vc: navigationController, onDidRescan: { - navigationController.popToRootViewController(animated: false) - if let mainMenuDelegate = self.delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.mainMenuViewControllerOpenHomeScreen(self) - } - }) - let controller = UIHostingController(rootView: screen) - controller.hidesBottomBarWhenPushed = true - navigationController.pushViewController(controller, animated: true) + if shouldShowMixDashDialog { + viewModel.showMixDashDialog() + } else if shouldShowDashPayInfo { + viewModel.showDashPayInfo() + } else { + viewModel.joinDashPay() + } } + #endif - @objc private func showTools() { - guard let navigationController = navigationController else { return } - let screen = ToolsMenuScreen(vc: navigationController, onImportPrivateKey: { [weak self] in - guard let self = self else { return } - - navigationController.popToRootViewController(animated: false) - if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.mainMenuViewControllerImportPrivateKey(self) - } - }) + private func handleNavigation(_ destination: MainMenuNavigationDestination?) { + switch destination { + case .buySellPortal: + showBuySellPortal() + case .explore: + showExplore() + case .security: + showSecurity = true + case .settings: + openSettings = true + case .tools: + showTools = true + case .support: + break // Skip as requested + #if DASHPAY + case .invite: + showInvite() + case .voting: + showVoting() + case .editProfile: + editProfile() + case .showRequestDetails: + showRequestDetails() + case .showMixDashDialog: + showMixDashDialog() + case .showDashPayInfo: + showDashPayInfo() + case .joinDashPay: + joinDashPay() + #endif + case .none: + return + } - let controller = UIHostingController(rootView: screen) + // Reset navigation destination after handling + if destination != nil { + viewModel.resetNavigation() + } + } + + // MARK: - Navigation Methods + + private func showBuySellPortal() { + let controller = BuySellPortalViewController.controller() controller.hidesBottomBarWhenPushed = true - navigationController.pushViewController(controller, animated: true) + vc.pushViewController(controller, animated: true) } - @objc private func showSupport() { - presentSupportEmailController() + private func showExplore() { + let controller = ExploreViewController() + controller.delegate = delegateInternal + let navigationController = BaseNavigationController(rootViewController: controller) + vc.pushViewController(navigationController, animated: true) } #if DASHPAY - @objc private func showInvite() { + private func showInvite() { let controller = DWInvitationHistoryViewController() controller.hidesBottomBarWhenPushed = true - navigationController?.pushViewController(controller, animated: true) + vc.pushViewController(controller, animated: true) } - @objc private func showVoting() { + private func showVoting() { let controller = UsernameVotingViewController.controller() controller.hidesBottomBarWhenPushed = true - navigationController?.pushViewController(controller, animated: true) + vc.pushViewController(controller, animated: true) } - @objc private func editProfile() { - let controller = DWRootEditProfileViewController() - controller.delegate = self - let navigation = DWNavigationController(rootViewController: controller) + private func editProfile() { + let controller = RootEditProfileViewController() + controller.delegate = delegateInternal + let navigation = BaseNavigationController(rootViewController: controller) navigation.modalPresentationStyle = .fullScreen - present(navigation, animated: true) + vc.present(navigation, animated: true) } - @objc private func showRequestDetails() { + private func showRequestDetails() { let controller = RequestDetailsViewController.controller() controller.hidesBottomBarWhenPushed = true - navigationController?.pushViewController(controller, animated: true) + vc.pushViewController(controller, animated: true) } - @objc private func showMixDashDialog() { + private func showMixDashDialog() { let swiftUIView = MixDashDialog( - positiveAction: { [weak self] in + positiveAction: { let controller = CoinJoinLevelsViewController.controller(isFullScreen: false) controller.hidesBottomBarWhenPushed = true - self?.navigationController?.pushViewController(controller, animated: true) + self.vc.pushViewController(controller, animated: true) }, - negativeAction: { [weak self] in + negativeAction: { if UsernamePrefs.shared.joinDashPayInfoShown { - self?.joinDashPay() + self.joinDashPay() } else { UsernamePrefs.shared.joinDashPayInfoShown = true - self?.showDashPayInfo() + self.showDashPayInfo() } } ) let hostingController = UIHostingController(rootView: swiftUIView) hostingController.setDetent(260) - present(hostingController, animated: true) + vc.present(hostingController, animated: true) } - @objc private func showDashPayInfo() { - let swiftUIView = JoinDashPayInfoDialog { [weak self] in - self?.joinDashPay() + private func showDashPayInfo() { + let swiftUIView = JoinDashPayInfoDialog { + self.joinDashPay() } let hostingController = UIHostingController(rootView: swiftUIView) hostingController.setDetent(600) - present(hostingController, animated: true) + vc.present(hostingController, animated: true) } - @objc private func joinDashPay() { - guard let dashPayModel = dashPayModel else { return } + private func joinDashPay() { + guard let dashPayModel = viewModel.dashPayModel else { return } let controller = CreateUsernameViewController( dashPayModel: dashPayModel, @@ -276,62 +409,120 @@ class MainMenuViewController: UIViewController { definedUsername: nil ) controller.hidesBottomBarWhenPushed = true - controller.completionHandler = { [weak self] result in - if result { - self?.view.dw_showInfoHUD(withText: NSLocalizedString("Username was successfully requested", comment: "Usernames"), offsetForNavBar: true) - } else { - self?.view.dw_showInfoHUD(withText: NSLocalizedString("Your request was cancelled", comment: "Usernames"), offsetForNavBar: true) + controller.completionHandler = { result in + let message = result + ? NSLocalizedString("Username was successfully requested", comment: "Usernames") + : NSLocalizedString("Your request was cancelled", comment: "Usernames") + + // Find the root view controller to show HUD + if let rootVC = self.vc.viewControllers.first { + rootVC.view.dw_showInfoHUD(withText: message, offsetForNavBar: true) } } - navigationController?.pushViewController(controller, animated: true) + vc.pushViewController(controller, animated: true) } #endif } -// MARK: - DWExploreViewControllerDelegate +struct MenuSectionView: View { + let section: MenuSection + let onMenuItemTap: (MenuItemType) -> Void + + var body: some View { + VStack(spacing: 0) { + ForEach(section.items, id: \.self) { item in + MenuItemView(item: item) { + onMenuItemTap(item) + } + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + .padding(.horizontal, 20) + } +} + +struct MenuItemView: View { + let item: MenuItemType + let action: () -> Void + + var body: some View { + MenuItem( + title: item.title, + subtitle: item.subtitle, + icon: item.iconName, + showChevron: false, + action: action + ) + } +} -extension MainMenuViewController: ExploreViewControllerDelegate { - func exploreViewControllerShowSendPayment(_ controller: ExploreViewController) { - if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.showPaymentsController(withActivePage: PaymentsViewControllerState.pay.rawValue) +// MARK: - DelegateInternal + +extension MainMenuView { + class DelegateInternal: NSObject { + private weak var delegate: MainMenuViewControllerDelegate? + private weak var wipeDelegate: DWWipeDelegate? + private let viewModel: MainMenuViewModel + + init(delegate: MainMenuViewControllerDelegate?, wipeDelegate: DWWipeDelegate?, viewModel: MainMenuViewModel) { + self.delegate = delegate + self.wipeDelegate = wipeDelegate + self.viewModel = viewModel + } + + func mainMenuViewControllerOpenHomeScreen() { + if let delegate = delegate { + delegate.mainMenuViewControllerOpenHomeScreen() + } + } + + func mainMenuViewControllerImportPrivateKey() { + if let delegate = delegate { + delegate.mainMenuViewControllerImportPrivateKey() + } + } + + func showPaymentsController(withActivePage pageIndex: Int) { + delegate?.showPaymentsController(withActivePage: pageIndex) + } + + func showGiftCard(_ txId: Data) { + delegate?.showGiftCard(txId) } } +} + +extension MainMenuView.DelegateInternal: ExploreViewControllerDelegate { + func exploreViewControllerShowSendPayment(_ controller: ExploreViewController) { + showPaymentsController(withActivePage: PaymentsViewControllerState.pay.rawValue) + } func exploreViewControllerShowReceivePayment(_ controller: ExploreViewController) { - if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.showPaymentsController(withActivePage: PaymentsViewControllerState.receive.rawValue) - } + showPaymentsController(withActivePage: PaymentsViewControllerState.receive.rawValue) } func exploreViewControllerShowGiftCard(_ controller: ExploreViewController, txId: Data) { - if let mainMenuDelegate = delegate as? MainMenuViewControllerDelegate { - mainMenuDelegate.showGiftCard(txId) - } + showGiftCard(txId) } } -// MARK: - DWRootEditProfileViewControllerDelegate - #if DASHPAY -extension MainMenuViewController: DWRootEditProfileViewControllerDelegate { - func editProfileViewController(_ controller: DWRootEditProfileViewController, +extension MainMenuView.DelegateInternal: RootEditProfileViewControllerDelegate { + func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { - userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + #if DASHPAY + viewModel.userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + #endif controller.dismiss(animated: true) } - func editProfileViewControllerDidCancel(_ controller: DWRootEditProfileViewController) { + func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) { controller.dismiss(animated: true) } } #endif - -// MARK: - MFMailComposeViewControllerDelegate - -extension MainMenuViewController: MFMailComposeViewControllerDelegate { - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { - controller.dismiss(animated: true) - } -} diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift index 37c1bf7a0..9ee0e4624 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewControllerDelegate.swift @@ -18,8 +18,8 @@ import Foundation protocol MainMenuViewControllerDelegate: AnyObject { - func mainMenuViewControllerImportPrivateKey(_ controller: UIViewController) - func mainMenuViewControllerOpenHomeScreen(_ controller: UIViewController) + func mainMenuViewControllerImportPrivateKey() + func mainMenuViewControllerOpenHomeScreen() func showPaymentsController(withActivePage pageIndex: Int) func showGiftCard(_ txId: Data) } diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift index 6a6007255..ccbb68d05 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift @@ -18,6 +18,24 @@ import SwiftUI import Combine +enum MainMenuNavigationDestination { + case buySellPortal + case explore + case security + case settings + case tools + case support + #if DASHPAY + case invite + case voting + case editProfile + case showRequestDetails + case showMixDashDialog + case showDashPayInfo + case joinDashPay + #endif +} + protocol MainMenuViewModelDelegate: AnyObject { func mainMenuViewModelImportPrivateKey() func mainMenuViewModelOpenHomeScreen() @@ -31,6 +49,7 @@ class MainMenuViewModel: ObservableObject { // MARK: - Published Properties @Published var menuSections: [MenuSection] = [] + @Published var navigationDestination: MainMenuNavigationDestination? // MARK: - Dependencies @@ -98,34 +117,29 @@ class MainMenuViewModel: ObservableObject { func handleMenuAction(_ item: MenuItemType) { switch item { case .joinDashPay: - handleJoinDashPay() + // This will be handled by the JoinDashPayView integration + break case .buySellDash: handleBuySellDash() case .explore: - handleExplore() + navigationDestination = .explore case .security: - handleSecurity() + navigationDestination = .security case .settings: - handleSettings() + navigationDestination = .settings case .tools: - handleTools() + navigationDestination = .tools case .support: - handleSupport() + navigationDestination = .support #if DASHPAY case .invite: - handleInvite() + navigationDestination = .invite case .voting: - handleVoting() + navigationDestination = .voting #endif } } - - private func handleJoinDashPay() { - #if DASHPAY - // This will be handled by the JoinDashPayView integration - #endif - } - + private func handleBuySellDash() { DSAuthenticationManager.sharedInstance().authenticate( withPrompt: nil, @@ -133,40 +147,38 @@ class MainMenuViewModel: ObservableObject { alertIfLockout: true ) { [weak self] authenticated, usedBiometrics, cancelled in if authenticated { - NotificationCenter.default.post(name: .showBuySellPortal, object: nil) + self?.navigationDestination = .buySellPortal } } } - private func handleExplore() { - NotificationCenter.default.post(name: .showExplore, object: nil) - } + // MARK: - DashPay Navigation Methods - private func handleSecurity() { - NotificationCenter.default.post(name: .showSecurity, object: nil) + #if DASHPAY + func showEditProfile() { + navigationDestination = .editProfile } - private func handleSettings() { - NotificationCenter.default.post(name: .showSettings, object: nil) + func showRequestDetails() { + navigationDestination = .showRequestDetails } - private func handleTools() { - NotificationCenter.default.post(name: .showTools, object: nil) + func showMixDashDialog() { + navigationDestination = .showMixDashDialog } - private func handleSupport() { - NotificationCenter.default.post(name: .showSupport, object: nil) + func showDashPayInfo() { + navigationDestination = .showDashPayInfo } - #if DASHPAY - private func handleInvite() { - NotificationCenter.default.post(name: .showInvite, object: nil) + func joinDashPay() { + navigationDestination = .joinDashPay } + #endif - private func handleVoting() { - NotificationCenter.default.post(name: .showVoting, object: nil) + func resetNavigation() { + navigationDestination = nil } - #endif func updateModel() { #if DASHPAY @@ -273,17 +285,3 @@ enum MenuItemType: CaseIterable { } } -// MARK: - Notification Names - -extension Notification.Name { - static let showBuySellPortal = Notification.Name("showBuySellPortal") - static let showExplore = Notification.Name("showExplore") - static let showSecurity = Notification.Name("showSecurity") - static let showSettings = Notification.Name("showSettings") - static let showTools = Notification.Name("showTools") - static let showSupport = Notification.Name("showSupport") - #if DASHPAY - static let showInvite = Notification.Name("showInvite") - static let showVoting = Notification.Name("showVoting") - #endif -} diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift index 80b6d62cb..786560012 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift @@ -170,7 +170,7 @@ struct SettingsScreen: View { } else { nextVC = CoinJoinInfoViewController.controller() } - + nextVC.hidesBottomBarWhenPushed = true vc.pushViewController(nextVC, animated: true) } diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 57886f2ba..2c0d9209d 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -134,6 +134,7 @@ static const bool _SNAPSHOT = 0; #import "DWGetStartedContentViewController.h" #import "DWDashPayContactsUpdater.h" #import "DWDPUpdateProfileModel.h" +#import "DWInvitationHistoryViewController.h" #endif //MARK: CrowdNode From f4236506511b6debf57ff2f4c4918eeff4f9e629 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 25 Jul 2025 13:22:29 +0700 Subject: [PATCH 10/14] fix: dashpay items --- DashWallet.xcodeproj/project.pbxproj | 2 +- .../Sources/Models/Voting/VotingPrefs.swift | 15 -- .../UI/Menu/Main/MainMenuViewController.swift | 154 ++++++++---------- .../UI/Menu/Main/MainMenuViewModel.swift | 45 ++--- .../Menu/Settings/SettingsMenuViewModel.swift | 2 +- 5 files changed, 84 insertions(+), 134 deletions(-) diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index c59bf8025..4f94633b7 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -4189,9 +4189,9 @@ 2A7A7BC52347DF7100451078 /* Main */ = { isa = PBXGroup; children = ( + 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */, 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */, 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */, - 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */, ); path = Main; sourceTree = ""; diff --git a/DashWallet/Sources/Models/Voting/VotingPrefs.swift b/DashWallet/Sources/Models/Voting/VotingPrefs.swift index d12586c5d..dce59b73c 100644 --- a/DashWallet/Sources/Models/Voting/VotingPrefs.swift +++ b/DashWallet/Sources/Models/Voting/VotingPrefs.swift @@ -21,21 +21,6 @@ private let kVotingEnabled = "votingEnabledKey" private let kIsVotingInfoShown = "votingInfoShownKey" private let kVotingPanelClosed = "votingPanelWasClosedKey" -// MARK: - ObjcWrapper - -@objc -class VotingPrefsWrapper: NSObject { - @objc - class func getIsEnabled() -> Bool { - VotingPrefs.shared.votingEnabled - } - - @objc - class func setIsEnabled(value: Bool) { - VotingPrefs.shared.votingEnabled = value - } -} - // MARK: - VotingPrefs class VotingPrefs { diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 9a4ddf43e..1cbddaea5 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -146,6 +146,8 @@ struct MainMenuView: View { @State private var openSettings: Bool = false @State private var showTools: Bool = false @State private var showSecurity: Bool = false + @State private var showMixDialog: Bool = false + @State private var showDashPayInfo: Bool = false #if DASHPAY let joinDPViewModel = JoinDashPayViewModel(initialState: .none) @@ -176,7 +178,6 @@ struct MainMenuView: View { .padding(.top, 10) #if DASHPAY - // Join DashPay section (if needed) if viewModel.userProfileModel?.showJoinDashpay == true { JoinDashPayView( viewModel: joinDPViewModel, @@ -188,9 +189,6 @@ struct MainMenuView: View { }, onDismissButton: { state in joinDPViewModel.markAsDismissed() - }, - onSizeChange: { size in - // Handle size changes if needed } ) .padding(.horizontal, 18) @@ -204,7 +202,7 @@ struct MainMenuView: View { } } - Spacer(minLength: 60) // Bottom padding for tab bar + Spacer(minLength: 60) } NavigationLink( @@ -241,15 +239,49 @@ struct MainMenuView: View { .onReceive(viewModel.$navigationDestination) { destination in handleNavigation(destination) } + .sheet(isPresented: $showMixDialog) { + let dialog = MixDashDialog( + positiveAction: { + let controller = CoinJoinLevelsViewController.controller(isFullScreen: false) + controller.hidesBottomBarWhenPushed = true + self.vc.pushViewController(controller, animated: true) + }, + negativeAction: { + if UsernamePrefs.shared.joinDashPayInfoShown { + self.joinDashPay() + } else { + UsernamePrefs.shared.joinDashPayInfoShown = true + showDashPayInfo = true + } + } + ) + + if #available(iOS 16.0, *) { + dialog.presentationDetents([.height(250)]) + } else { + dialog + } + } + .sheet(isPresented: $showDashPayInfo) { + let dialog = JoinDashPayInfoDialog { + self.joinDashPay() + } + + if #available(iOS 16.0, *) { + dialog.presentationDetents([.height(600)]) + } else { + dialog + } + } } #if DASHPAY private func handleJoinDashPayTap(state: JoinDashPayState) { switch state { case .registered: - viewModel.showEditProfile() + editProfile() case .voting: - viewModel.showRequestDetails() + showRequestDetails() case .none: handleJoinButtonAction() default: @@ -262,7 +294,7 @@ struct MainMenuView: View { case .blocked, .failed, .contested: handleJoinButtonAction() default: - viewModel.showEditProfile() + editProfile() joinDPViewModel.markAsDismissed() } } @@ -272,11 +304,11 @@ struct MainMenuView: View { let shouldShowDashPayInfo = !UsernamePrefs.shared.joinDashPayInfoShown if shouldShowMixDashDialog { - viewModel.showMixDashDialog() + showMixDialog = true } else if shouldShowDashPayInfo { - viewModel.showDashPayInfo() + showDashPayInfo = true } else { - viewModel.joinDashPay() + joinDashPay() } } #endif @@ -300,16 +332,6 @@ struct MainMenuView: View { showInvite() case .voting: showVoting() - case .editProfile: - editProfile() - case .showRequestDetails: - showRequestDetails() - case .showMixDashDialog: - showMixDashDialog() - case .showDashPayInfo: - showDashPayInfo() - case .joinDashPay: - joinDashPay() #endif case .none: return @@ -363,38 +385,6 @@ struct MainMenuView: View { vc.pushViewController(controller, animated: true) } - private func showMixDashDialog() { - let swiftUIView = MixDashDialog( - positiveAction: { - let controller = CoinJoinLevelsViewController.controller(isFullScreen: false) - controller.hidesBottomBarWhenPushed = true - self.vc.pushViewController(controller, animated: true) - }, - negativeAction: { - if UsernamePrefs.shared.joinDashPayInfoShown { - self.joinDashPay() - } else { - UsernamePrefs.shared.joinDashPayInfoShown = true - self.showDashPayInfo() - } - } - ) - - let hostingController = UIHostingController(rootView: swiftUIView) - hostingController.setDetent(260) - vc.present(hostingController, animated: true) - } - - private func showDashPayInfo() { - let swiftUIView = JoinDashPayInfoDialog { - self.joinDashPay() - } - - let hostingController = UIHostingController(rootView: swiftUIView) - hostingController.setDetent(600) - vc.present(hostingController, animated: true) - } - private func joinDashPay() { guard let dashPayModel = viewModel.dashPayModel else { return } @@ -457,7 +447,7 @@ struct MenuItemView: View { // MARK: - DelegateInternal extension MainMenuView { - class DelegateInternal: NSObject { + class DelegateInternal: NSObject, RootEditProfileViewControllerDelegate, ExploreViewControllerDelegate { private weak var delegate: MainMenuViewControllerDelegate? private weak var wipeDelegate: DWWipeDelegate? private let viewModel: MainMenuViewModel @@ -487,37 +477,33 @@ extension MainMenuView { func showGiftCard(_ txId: Data) { delegate?.showGiftCard(txId) } - } -} - -extension MainMenuView.DelegateInternal: ExploreViewControllerDelegate { - func exploreViewControllerShowSendPayment(_ controller: ExploreViewController) { - showPaymentsController(withActivePage: PaymentsViewControllerState.pay.rawValue) - } - - func exploreViewControllerShowReceivePayment(_ controller: ExploreViewController) { - showPaymentsController(withActivePage: PaymentsViewControllerState.receive.rawValue) - } - - func exploreViewControllerShowGiftCard(_ controller: ExploreViewController, txId: Data) { - showGiftCard(txId) - } -} - -#if DASHPAY -extension MainMenuView.DelegateInternal: RootEditProfileViewControllerDelegate { - func editProfileViewController(_ controller: RootEditProfileViewController, - updateDisplayName rawDisplayName: String, - aboutMe rawAboutMe: String, - avatarURLString: String?) { + + func exploreViewControllerShowSendPayment(_ controller: ExploreViewController) { + showPaymentsController(withActivePage: PaymentsViewControllerState.pay.rawValue) + } + + func exploreViewControllerShowReceivePayment(_ controller: ExploreViewController) { + showPaymentsController(withActivePage: PaymentsViewControllerState.receive.rawValue) + } + + func exploreViewControllerShowGiftCard(_ controller: ExploreViewController, txId: Data) { + showGiftCard(txId) + } + #if DASHPAY - viewModel.userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + func editProfileViewController(_ controller: RootEditProfileViewController, + updateDisplayName rawDisplayName: String, + aboutMe rawAboutMe: String, + avatarURLString: String?) { + #if DASHPAY + viewModel.userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + #endif + controller.dismiss(animated: true) + } + + func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) { + controller.dismiss(animated: true) + } #endif - controller.dismiss(animated: true) - } - - func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) { - controller.dismiss(animated: true) } } -#endif diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift index f9b87e52c..fef802a37 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift @@ -28,11 +28,6 @@ enum MainMenuNavigationDestination { #if DASHPAY case invite case voting - case editProfile - case showRequestDetails - case showMixDashDialog - case showDashPayInfo - case joinDashPay #endif } @@ -93,12 +88,20 @@ class MainMenuViewModel: ObservableObject { ])) // Settings section - sections.append(MenuSection(items: [ + var settingsItems: [MenuItemType] = [ .security, .settings, .tools, .support - ])) + ] + + #if DASHPAY + if VotingPrefs.shared.votingEnabled { + settingsItems.append(.voting) + } + #endif + + sections.append(MenuSection(items: settingsItems)) self.menuSections = sections } @@ -140,30 +143,6 @@ class MainMenuViewModel: ObservableObject { } } - // MARK: - DashPay Navigation Methods - - #if DASHPAY - func showEditProfile() { - navigationDestination = .editProfile - } - - func showRequestDetails() { - navigationDestination = .showRequestDetails - } - - func showMixDashDialog() { - navigationDestination = .showMixDashDialog - } - - func showDashPayInfo() { - navigationDestination = .showDashPayInfo - } - - func joinDashPay() { - navigationDestination = .joinDashPay - } - #endif - func resetNavigation() { navigationDestination = nil } @@ -226,9 +205,9 @@ enum MenuItemType: CaseIterable { return .custom("image.support", maxHeight: 22) #if DASHPAY case .invite: - return .custom("invite", maxHeight: 22) + return .custom("menu_invite", maxHeight: 22) case .voting: - return .custom("voting", maxHeight: 22) + return .custom("menu_voting", maxHeight: 22) #endif } } diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift index 4e63d363a..e9b8994b6 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift @@ -113,7 +113,7 @@ class SettingsMenuViewModel: ObservableObject { MenuItemModel( title: NSLocalizedString("Network", comment: ""), subtitle: networkName, - icon: .custom("image.rescan", maxHeight: 22), + icon: .custom("image.network.monitor", maxHeight: 22), action: { [weak self] in self?.navigationDestination = .network } From 8dc7f2ea1b4e8748e1fba472020e97588827d8f1 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 25 Jul 2025 15:52:03 +0700 Subject: [PATCH 11/14] chore: simplify MainMenuViewController --- DashWallet.xcodeproj/project.pbxproj | 12 -- .../DWMainMenuViewController+DashPay.swift | 56 ------- .../UI/Menu/Main/MainMenuViewController.swift | 148 ++++++++++++++---- .../UI/Menu/Main/MainMenuViewModel.swift | 18 +-- 4 files changed, 123 insertions(+), 111 deletions(-) delete mode 100644 DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 4f94633b7..9c52a1dd0 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -669,7 +669,6 @@ 758CE59E2BC566DE0062AF53 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */; }; 759063E92C411673002F2AA9 /* ZenLedgerInfoSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EBAA1C2BBA71D9004488E3 /* ZenLedgerInfoSheet.swift */; }; 759063ED2C42687F002F2AA9 /* RootEditProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */; }; - 759063EF2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759063EE2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift */; }; 7592AA7C2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */; }; 7592AA7D2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */; }; 7596091A2C4550F500F3BF04 /* DWDashPaySetupModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 759609182C4550F400F3BF04 /* DWDashPaySetupModel.m */; }; @@ -2531,7 +2530,6 @@ 758C4C4E2DFAC1C30028549B /* RadioButtonRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonRow.swift; sourceTree = ""; }; 758CE59B2BC566DE0062AF53 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 759063EC2C42687F002F2AA9 /* RootEditProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootEditProfileViewController.swift; sourceTree = ""; }; - 759063EE2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DWMainMenuViewController+DashPay.swift"; sourceTree = ""; }; 7592AA7B2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportedTopperPaymentMethods.swift; sourceTree = ""; }; 759609172C4550F400F3BF04 /* DWDashPaySetupModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWDashPaySetupModel.h; sourceTree = ""; }; 759609182C4550F400F3BF04 /* DWDashPaySetupModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWDashPaySetupModel.m; sourceTree = ""; }; @@ -6147,14 +6145,6 @@ path = "Edit Profile"; sourceTree = ""; }; - 7596091E2C4551E100F3BF04 /* Menu */ = { - isa = PBXGroup; - children = ( - 759063EE2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift */, - ); - path = Menu; - sourceTree = ""; - }; 7596091F2C45530B00F3BF04 /* Credits */ = { isa = PBXGroup; children = ( @@ -6658,7 +6648,6 @@ C943B34F2A40A54500AF23C5 /* DashPay */ = { isa = PBXGroup; children = ( - 7596091E2C4551E100F3BF04 /* Menu */, 759609192C4550F400F3BF04 /* Setup */, C943B3502A40A54500AF23C5 /* Contacts */, 7596091F2C45530B00F3BF04 /* Credits */, @@ -9840,7 +9829,6 @@ C9D2C8AD2A320AA000D15901 /* PointOfUseDetailsView.swift in Sources */, C9D2C8AE2A320AA000D15901 /* DSChain+DashWallet.m in Sources */, C9D2C8AF2A320AA000D15901 /* FromLabel.swift in Sources */, - 759063EF2C427324002F2AA9 /* DWMainMenuViewController+DashPay.swift in Sources */, C9D2C8B02A320AA000D15901 /* DWPhraseRepairChildViewController.m in Sources */, C9D2C8B12A320AA000D15901 /* SingleInputAddressSelector.swift in Sources */, 757422212DF87B5200CB0175 /* TerritoryPickerView.swift in Sources */, diff --git a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift b/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift deleted file mode 100644 index c8e654655..000000000 --- a/DashWallet/Sources/UI/DashPay/Menu/DWMainMenuViewController+DashPay.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// Created by PT -// Copyright © 2023 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit - -extension MainMenuViewController: RootEditProfileViewControllerDelegate { - func editProfileViewController(_ controller: RootEditProfileViewController, updateDisplayName rawDisplayName: String, aboutMe rawAboutMe: String, avatarURLString: String?) { - #if DASHPAY - viewModel.userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) - #endif - controller.dismiss(animated: true, completion: nil) - - if MOCK_DASHPAY.boolValue { - BuyCreditsModel.currentCredits -= 0.25 - let heading: String - let message: String - - if BuyCreditsModel.currentCredits <= 0 { - heading = NSLocalizedString("Your credit balance has been fully depleted", comment: "") - message = NSLocalizedString("You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance", comment: "") - } else if BuyCreditsModel.currentCredits <= 0.25 { - heading = NSLocalizedString("Your credit balance is low", comment: "") - message = NSLocalizedString("Top-up your credits to continue making changes to your profile and adding contacts", comment: "") - } else { - return - } - - showModalDialog(style: .warning, icon: .system("exclamationmark.triangle.fill"), heading: heading, textBlock1: message, positiveButtonText: NSLocalizedString("Buy credits", comment: ""), positiveButtonAction: { - - let vc = BuyCreditsViewController { - self.showToast(text: "Successful purchase", icon: .system("checkmark.circle.fill"), duration: 2) - } - let navigationController = BaseNavigationController(rootViewController: vc) - self.present(navigationController, animated: true) - }, negativeButtonText: NSLocalizedString("Maybe later", comment: "")) - } - } - - func editProfileViewControllerDidCancel(_ controller: RootEditProfileViewController) { - controller.dismiss(animated: true, completion: nil) - } -} diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 1cbddaea5..55d32ae15 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -25,8 +25,7 @@ class MainMenuViewController: UIViewController { weak var delegate: DWWipeDelegate? - var viewModel: MainMenuViewModel! - private var hostingController: UIHostingController! + private var hostingController: UIHostingController! #if DASHPAY private let receiveModel: DWReceiveModelProtocol? @@ -78,12 +77,6 @@ class MainMenuViewController: UIViewController { // Navigation is now handled in SwiftUI } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - navigationItem.largeTitleDisplayMode = .never - viewModel.buildMenuSections() - } - override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } @@ -92,22 +85,26 @@ class MainMenuViewController: UIViewController { private func setupSwiftUIView() { #if DASHPAY - viewModel = MainMenuViewModel( + let swiftUIView = MianMenuScreen( + vc: navigationController!, + delegate: delegate as? MainMenuViewControllerDelegate, + wipeDelegate: delegate, dashPayModel: dashPayModel, - receiveModel: receiveModel, dashPayReady: dashPayReady, userProfileModel: userProfileModel - ) + ) { + self.presentSupportEmailController() + } #else - viewModel = MainMenuViewModel() - #endif - let swiftUIView = MainMenuView( vc: navigationController!, - viewModel: viewModel, delegate: delegate as? MainMenuViewControllerDelegate, wipeDelegate: delegate - ) + ) { + self.presentSupportEmailController() + } + #endif + hostingController = UIHostingController(rootView: swiftUIView) addChild(hostingController) @@ -122,12 +119,6 @@ class MainMenuViewController: UIViewController { hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } - - // MARK: - Support Email (keeping as requested) - - override func presentSupportEmailController() { - // TODO: Implementation kept as requested - to be handled later - } } @@ -139,29 +130,67 @@ extension MainMenuViewController: MFMailComposeViewControllerDelegate { } } -struct MainMenuView: View { +struct MianMenuScreen: View { private let vc: UINavigationController private let delegateInternal: DelegateInternal - @StateObject private var viewModel: MainMenuViewModel + private let onContactSupport: () -> () + + @ObservedObject private var viewModel: MainMenuViewModel @State private var openSettings: Bool = false @State private var showTools: Bool = false @State private var showSecurity: Bool = false @State private var showMixDialog: Bool = false @State private var showDashPayInfo: Bool = false + @State private var showCreditsPurchasedToast: Bool = false #if DASHPAY - let joinDPViewModel = JoinDashPayViewModel(initialState: .none) - #endif - - init(vc: UINavigationController, viewModel: MainMenuViewModel, delegate: MainMenuViewControllerDelegate? = nil, wipeDelegate: DWWipeDelegate? = nil) { + private let joinDPViewModel = JoinDashPayViewModel(initialState: .none) + + init( + vc: UINavigationController, + delegate: MainMenuViewControllerDelegate? = nil, + wipeDelegate: DWWipeDelegate? = nil, + dashPayModel: DWDashPayProtocol? = nil, + dashPayReady: DWDashPayReadyProtocol? = nil, + userProfileModel: CurrentUserProfileModel? = nil, + onContactSupport: @escaping () -> () + ) { + self.vc = vc + self.onContactSupport = onContactSupport + let viewModel = MainMenuViewModel( + dashPayModel: dashPayModel, + dashPayReady: dashPayReady, + userProfileModel: userProfileModel + ) + self.delegateInternal = DelegateInternal( + delegate: delegate, + wipeDelegate: wipeDelegate, + viewModel: viewModel, + showCreditsWarning: { [weak viewModel] heading, message in + viewModel?.showCreditsWarning(heading: heading, message: message) + } + ) + self.viewModel = viewModel + } + #else + + init( + vc: UINavigationController, + delegate: MainMenuViewControllerDelegate? = nil, + wipeDelegate: DWWipeDelegate? = nil, + onContactSupport: @escaping () -> () + ) { self.vc = vc - self._viewModel = StateObject(wrappedValue: viewModel) + self.onContactSupport = onContactSupport + self.viewModel = MainMenuViewModel() self.delegateInternal = DelegateInternal( delegate: delegate, wipeDelegate: wipeDelegate, viewModel: viewModel ) } + #endif + var body: some View { ScrollView { @@ -205,6 +234,39 @@ struct MainMenuView: View { Spacer(minLength: 60) } + if showCreditsPurchasedToast { + ToastView( + text: NSLocalizedString("Successful purchase", comment: ""), + icon: .system("checkmark.circle.fill") + ) + .frame(height: 20) + .padding(.bottom, 30) + } + + if viewModel.showCreditsWarning { + ModalDialog( + style: .warning, + icon: .system("exclamationmark.triangle.fill"), + heading: viewModel.creditsWarningHeading, + textBlock1: viewModel.creditsWarningMessage, + positiveButtonText: NSLocalizedString("Buy credits", comment: ""), + positiveButtonAction: { + let viewController = BuyCreditsViewController { + self.showCreditsPurchasedToast = true + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + self.showCreditsPurchasedToast = false + } + } + let navigationController = BaseNavigationController(rootViewController: viewController) + vc.present(navigationController, animated: true) + }, + negativeButtonText: NSLocalizedString("Maybe later", comment: "") + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(Color.black.opacity(0.7)) + .edgesIgnoringSafeArea(.all) + } + NavigationLink( destination: SettingsScreen(vc: vc, onDidRescan: { self.vc.popToRootViewController(animated: false) @@ -326,7 +388,7 @@ struct MainMenuView: View { case .tools: showTools = true case .support: - break // TODO + onContactSupport() #if DASHPAY case .invite: showInvite() @@ -444,18 +506,18 @@ struct MenuItemView: View { } } -// MARK: - DelegateInternal - -extension MainMenuView { +extension MianMenuScreen { class DelegateInternal: NSObject, RootEditProfileViewControllerDelegate, ExploreViewControllerDelegate { private weak var delegate: MainMenuViewControllerDelegate? private weak var wipeDelegate: DWWipeDelegate? private let viewModel: MainMenuViewModel + private let showCreditsWarning: (String, String) -> Void - init(delegate: MainMenuViewControllerDelegate?, wipeDelegate: DWWipeDelegate?, viewModel: MainMenuViewModel) { + init(delegate: MainMenuViewControllerDelegate?, wipeDelegate: DWWipeDelegate?, viewModel: MainMenuViewModel, showCreditsWarning: @escaping (String, String) -> Void) { self.delegate = delegate self.wipeDelegate = wipeDelegate self.viewModel = viewModel + self.showCreditsWarning = showCreditsWarning } func mainMenuViewControllerOpenHomeScreen() { @@ -497,6 +559,24 @@ extension MainMenuView { avatarURLString: String?) { #if DASHPAY viewModel.userProfileModel?.updateModel.update(withDisplayName: rawDisplayName, aboutMe: rawAboutMe, avatarURLString: avatarURLString) + + if MOCK_DASHPAY.boolValue { + BuyCreditsModel.currentCredits -= 0.25 + let heading: String + let message: String + + if BuyCreditsModel.currentCredits <= 0 { + heading = NSLocalizedString("Your credit balance has been fully depleted", comment: "") + message = NSLocalizedString("You can continue to use DashPay for payments but you cannot update your profile or add more contacts until you top up your credit balance", comment: "") + } else if BuyCreditsModel.currentCredits <= 0.25 { + heading = NSLocalizedString("Your credit balance is low", comment: "") + message = NSLocalizedString("Top-up your credits to continue making changes to your profile and adding contacts", comment: "") + } else { + return + } + + showCreditsWarning(heading, message) + } #endif controller.dismiss(animated: true) } diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift index fef802a37..fecaf76c0 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift @@ -41,15 +41,13 @@ protocol MainMenuViewModelDelegate: AnyObject { @MainActor class MainMenuViewModel: ObservableObject { - // MARK: - Published Properties - @Published var menuSections: [MenuSection] = [] @Published var navigationDestination: MainMenuNavigationDestination? - - // MARK: - Dependencies + @Published var showCreditsWarning: Bool = false + @Published var creditsWarningHeading: String = "" + @Published var creditsWarningMessage: String = "" #if DASHPAY - let receiveModel: DWReceiveModelProtocol? let dashPayReady: DWDashPayReadyProtocol? let dashPayModel: DWDashPayProtocol? let userProfileModel: CurrentUserProfileModel? @@ -57,15 +55,11 @@ class MainMenuViewModel: ObservableObject { weak var delegate: MainMenuViewModelDelegate? - // MARK: - Initialization - #if DASHPAY init(dashPayModel: DWDashPayProtocol? = nil, - receiveModel: DWReceiveModelProtocol? = nil, dashPayReady: DWDashPayReadyProtocol? = nil, userProfileModel: CurrentUserProfileModel? = nil) { self.dashPayModel = dashPayModel - self.receiveModel = receiveModel self.dashPayReady = dashPayReady self.userProfileModel = userProfileModel buildMenuSections() @@ -146,6 +140,12 @@ class MainMenuViewModel: ObservableObject { func resetNavigation() { navigationDestination = nil } + + func showCreditsWarning(heading: String, message: String) { + creditsWarningHeading = heading + creditsWarningMessage = message + showCreditsWarning = true + } } // MARK: - Data Models From 5133283759f0943d588a6857aeb3d96c1e301f9f Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 25 Jul 2025 16:05:32 +0700 Subject: [PATCH 12/14] chore: unify menu item model in all setting screens --- .../UI/Menu/Main/MainMenuViewController.swift | 87 ++++----- .../UI/Menu/Main/MainMenuViewModel.swift | 170 +++++++----------- DashWallet/ar.lproj/Localizable.strings | 6 +- DashWallet/bg.lproj/Localizable.strings | 6 +- DashWallet/ca.lproj/Localizable.strings | 6 +- DashWallet/cs.lproj/Localizable.strings | 6 +- DashWallet/da.lproj/Localizable.strings | 6 +- DashWallet/de.lproj/Localizable.strings | 6 +- DashWallet/el.lproj/Localizable.strings | 6 +- DashWallet/en.lproj/Localizable.strings | 6 +- DashWallet/eo.lproj/Localizable.strings | 6 +- DashWallet/es.lproj/Localizable.strings | 6 +- DashWallet/et.lproj/Localizable.strings | 6 +- DashWallet/fa.lproj/Localizable.strings | 6 +- DashWallet/fi.lproj/Localizable.strings | 6 +- DashWallet/fil.lproj/Localizable.strings | 6 +- DashWallet/fr.lproj/Localizable.strings | 6 +- DashWallet/hr.lproj/Localizable.strings | 6 +- DashWallet/hu.lproj/Localizable.strings | 6 +- DashWallet/id.lproj/Localizable.strings | 6 +- DashWallet/it.lproj/Localizable.strings | 6 +- DashWallet/ja.lproj/Localizable.strings | 6 +- DashWallet/ko.lproj/Localizable.strings | 6 +- DashWallet/mk.lproj/Localizable.strings | 6 +- DashWallet/ms.lproj/Localizable.strings | 6 +- DashWallet/nb.lproj/Localizable.strings | 6 +- DashWallet/nl.lproj/Localizable.strings | 6 +- DashWallet/pl.lproj/Localizable.strings | 6 +- DashWallet/pt.lproj/Localizable.strings | 6 +- DashWallet/ro.lproj/Localizable.strings | 6 +- DashWallet/ru.lproj/Localizable.strings | 6 +- DashWallet/sk.lproj/Localizable.strings | 6 +- DashWallet/sl.lproj/Localizable.strings | 6 +- DashWallet/sl_SI.lproj/Localizable.strings | 6 +- DashWallet/sq.lproj/Localizable.strings | 6 +- DashWallet/sr.lproj/Localizable.strings | 6 +- DashWallet/sv.lproj/Localizable.strings | 6 +- DashWallet/th.lproj/Localizable.strings | 6 +- DashWallet/tr.lproj/Localizable.strings | 6 +- DashWallet/uk.lproj/Localizable.strings | 6 +- DashWallet/vi.lproj/Localizable.strings | 6 +- DashWallet/zh-Hans.lproj/Localizable.strings | 6 +- .../zh-Hant-TW.lproj/Localizable.strings | 6 +- DashWallet/zh.lproj/Localizable.strings | 6 +- DashWallet/zh_TW.lproj/Localizable.strings | 6 +- 45 files changed, 237 insertions(+), 278 deletions(-) diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 55d32ae15..54240286a 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -25,7 +25,7 @@ class MainMenuViewController: UIViewController { weak var delegate: DWWipeDelegate? - private var hostingController: UIHostingController! + private var hostingController: UIHostingController! #if DASHPAY private let receiveModel: DWReceiveModelProtocol? @@ -85,7 +85,7 @@ class MainMenuViewController: UIViewController { private func setupSwiftUIView() { #if DASHPAY - let swiftUIView = MianMenuScreen( + let swiftUIView = MainMenuScreen( vc: navigationController!, delegate: delegate as? MainMenuViewControllerDelegate, wipeDelegate: delegate, @@ -130,7 +130,7 @@ extension MainMenuViewController: MFMailComposeViewControllerDelegate { } } -struct MianMenuScreen: View { +struct MainMenuScreen: View { private let vc: UINavigationController private let delegateInternal: DelegateInternal private let onContactSupport: () -> () @@ -224,12 +224,49 @@ struct MianMenuScreen: View { } #endif - // Menu sections - ForEach(Array(viewModel.menuSections.enumerated()), id: \.offset) { index, section in - MenuSectionView(section: section) { menuItem in - viewModel.handleMenuAction(menuItem) + // Menu items grouped in sections + VStack(spacing: 16) { + // First group - main services (first 2 items) + if viewModel.items.count >= 2 { + VStack(spacing: 0) { + ForEach(viewModel.items.prefix(2)) { item in + MenuItem( + title: item.title, + subtitle: item.subtitle, + icon: item.icon, + showChevron: false, + action: item.action + ) + .frame(minHeight: 60) + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) + } + + // Second group - settings items (remaining items) + if viewModel.items.count > 2 { + VStack(spacing: 0) { + ForEach(viewModel.items.dropFirst(2)) { item in + MenuItem( + title: item.title, + subtitle: item.subtitle, + icon: item.icon, + showChevron: false, + action: item.action + ) + .frame(minHeight: 60) + } + } + .padding(.vertical, 5) + .background(Color.secondaryBackground) + .cornerRadius(12) + .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) } } + .padding(.horizontal, 20) Spacer(minLength: 60) } @@ -471,42 +508,8 @@ struct MianMenuScreen: View { #endif } -struct MenuSectionView: View { - let section: MenuSection - let onMenuItemTap: (MenuItemType) -> Void - - var body: some View { - VStack(spacing: 0) { - ForEach(section.items, id: \.self) { item in - MenuItemView(item: item) { - onMenuItemTap(item) - } - } - } - .padding(.vertical, 5) - .background(Color.secondaryBackground) - .cornerRadius(12) - .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) - .padding(.horizontal, 20) - } -} - -struct MenuItemView: View { - let item: MenuItemType - let action: () -> Void - - var body: some View { - MenuItem( - title: item.title, - subtitle: nil, - icon: item.iconName, - showChevron: false, - action: action - ) - } -} -extension MianMenuScreen { +extension MainMenuScreen { class DelegateInternal: NSObject, RootEditProfileViewControllerDelegate, ExploreViewControllerDelegate { private weak var delegate: MainMenuViewControllerDelegate? private weak var wipeDelegate: DWWipeDelegate? diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift index fecaf76c0..6a5fcab51 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift @@ -41,7 +41,7 @@ protocol MainMenuViewModelDelegate: AnyObject { @MainActor class MainMenuViewModel: ObservableObject { - @Published var menuSections: [MenuSection] = [] + @Published var items: [MenuItemModel] = [] @Published var navigationDestination: MainMenuNavigationDestination? @Published var showCreditsWarning: Bool = false @Published var creditsWarningHeading: String = "" @@ -73,57 +73,79 @@ class MainMenuViewModel: ObservableObject { // MARK: - Menu Building func buildMenuSections() { - var sections: [MenuSection] = [] + var allItems: [MenuItemModel] = [] - // Main services section - sections.append(MenuSection(items: [ - .buySellDash, - .explore - ])) + // Buy & Sell Dash + allItems.append(MenuItemModel( + title: NSLocalizedString("Buy & sell Dash", comment: ""), + icon: .custom("image.buy.and.sell", maxHeight: 22), + action: { [weak self] in + self?.handleBuySellDash() + } + )) + + // Explore + allItems.append(MenuItemModel( + title: NSLocalizedString("Explore", comment: ""), + icon: .custom("image.explore", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .explore + } + )) - // Settings section - var settingsItems: [MenuItemType] = [ - .security, - .settings, - .tools, - .support - ] + // Security + allItems.append(MenuItemModel( + title: NSLocalizedString("Security", comment: ""), + icon: .custom("image.security", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .security + } + )) + + // Settings + allItems.append(MenuItemModel( + title: NSLocalizedString("Settings", comment: ""), + icon: .custom("image.settings", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .settings + } + )) + + // Tools + allItems.append(MenuItemModel( + title: NSLocalizedString("Tools", comment: ""), + icon: .custom("image.tools", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .tools + } + )) + + // Support + allItems.append(MenuItemModel( + title: NSLocalizedString("Support", comment: ""), + icon: .custom("image.support", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .support + } + )) #if DASHPAY + // Voting if VotingPrefs.shared.votingEnabled { - settingsItems.append(.voting) + allItems.append(MenuItemModel( + title: NSLocalizedString("Voting", comment: ""), + icon: .custom("menu_voting", maxHeight: 22), + action: { [weak self] in + self?.navigationDestination = .voting + } + )) } #endif - sections.append(MenuSection(items: settingsItems)) - - self.menuSections = sections + self.items = allItems } // MARK: - Actions - - func handleMenuAction(_ item: MenuItemType) { - switch item { - case .buySellDash: - handleBuySellDash() - case .explore: - navigationDestination = .explore - case .security: - navigationDestination = .security - case .settings: - navigationDestination = .settings - case .tools: - navigationDestination = .tools - case .support: - navigationDestination = .support - #if DASHPAY - case .invite: - navigationDestination = .invite - case .voting: - navigationDestination = .voting - #endif - } - } private func handleBuySellDash() { DSAuthenticationManager.sharedInstance().authenticate( @@ -147,69 +169,3 @@ class MainMenuViewModel: ObservableObject { showCreditsWarning = true } } - -// MARK: - Data Models - -struct MenuSection { - let items: [MenuItemType] -} - -enum MenuItemType: CaseIterable { - case buySellDash - case explore - case security - case settings - case tools - case support - #if DASHPAY - case invite - case voting - #endif - - var title: String { - switch self { - case .buySellDash: - return NSLocalizedString("Buy & sell Dash", comment: "") - case .explore: - return NSLocalizedString("Explore", comment: "") - case .security: - return NSLocalizedString("Security", comment: "") - case .settings: - return NSLocalizedString("Settings", comment: "") - case .tools: - return NSLocalizedString("Tools", comment: "") - case .support: - return NSLocalizedString("Support", comment: "") - #if DASHPAY - case .invite: - return NSLocalizedString("Invite", comment: "") - case .voting: - return NSLocalizedString("Voting", comment: "") - #endif - } - } - - var iconName: IconName { - switch self { - case .buySellDash: - return .custom("image.buy.and.sell", maxHeight: 22) - case .explore: - return .custom("image.explore", maxHeight: 22) - case .security: - return .custom("image.security", maxHeight: 22) - case .settings: - return .custom("image.settings", maxHeight: 22) - case .tools: - return .custom("image.tools", maxHeight: 22) - case .support: - return .custom("image.support", maxHeight: 22) - #if DASHPAY - case .invite: - return .custom("menu_invite", maxHeight: 22) - case .voting: - return .custom("menu_voting", maxHeight: 22) - #endif - } - } -} - diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 6d7958919..215c44e62 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "إنشاء حساب"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index c78b1dfa9..cc9ddd965 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index 269cab29c..6a9fa87cd 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index 89f340910..941ef0b8d 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Vytvořit účet"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index edd6db6ee..c39f6618a 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index 8d52a5681..bb721c6a6 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Nutzernamen erstellen."; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Konto erstellen"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Einreichen"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index a6a793319..8b2b11fca 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Δημιουργία όνομα χρήστη"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Δημιουργία λογαριασμού"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Υποβολή"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 89d5654f6..9c5406ca8 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index c410016bb..5943f875a 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index aea1c12c7..af938bbcb 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Crear nombre de usuario"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Crear una cuenta"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Entregar"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index e9ac3cf8e..6af4bc61b 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index ffe32ba7f..c4d48c59e 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "ایجاد یک حساب کاربری"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "ایجاد حساب"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "ثبت"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index f14b9fd88..2c5a9ae34 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 1275482cc..76fc2d194 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Gumawa ng username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Lumikha ng Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Isumite"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index 3521cc82e..49dcd8148 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Créer un nom d'utilisateur"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Créer un compte"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Valider"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index a156fd478..2c2b7c30b 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index 7f20e7323..c902863f8 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 0015bbdf8..97d791ccf 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Buat Nama Pengguna"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Buat Akun"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Kirim"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 200656506..d67a311a3 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Crea un nome utente"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Crea un Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Invia"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 3fa1f05a7..97d481f4e 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "ユーザー名を作成する"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "アカウントの作成"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "提出する"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 0a9b37153..499313573 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "사용자이름 생성하기"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "계정 생성하기"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "제출"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index 2a0d83ef6..f2610a179 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index cf0bf8149..7307e407b 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index 9dc0602c9..cc16f7e6f 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index da738f8ba..557fb737d 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Maak een gebruikersnaam"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Maak account aan"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Indienen"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 6eb90c382..cdd7c467a 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Stwórz nazwę użytkownika"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Stwórz Konto"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Wyślij"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 528d03096..58ed16258 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Criar um nome de usuário"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Criar Conta"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Enviar"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index f73cd3207..727f9a15d 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index efe2cc1c2..d24685863 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Создать имя пользователя"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Создать аккаунт"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Отправить"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index f036b4b12..e85cd65dc 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Vytvoriť používateľské meno"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Vytvoriť účet"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Odoslať"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index 0e3c4bab1..cfb21e671 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index 63d4f38ee..5c55eb677 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 01485db3a..d5a36e449 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index 8cd340889..b6643e54f 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 28a02b910..c9ab57406 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 8ba342bff..2e923a1c3 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "กำหนดชื่อผู้ใช้"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "สร้างบัญชี"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 0ec03cbab..f8c0b7148 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Kullanıcı adı oluştur"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Hesab Oluştur"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 49ad3f642..138fcb97e 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Створити ім'я користувача"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Створити обліковий запис"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Надіслати"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index e9ba8df0f..67f81bbc6 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index f99904d7c..2f0a39d74 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index cdcb4dc1d..2418ede4c 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "Create a username"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "Create Account"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "Submit"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index da1e05350..db8207690 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "创建一个用户名"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "创建账户"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "提交"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index 186cdb62f..d49fa691e 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -592,9 +592,6 @@ /* Usernames */ "Create a username" = "創建一個用戶名稱"; -/* No comment provided by engineer. */ -"Create a username and say goodbye to numerical addresses" = "Create a username and say goodbye to numerical addresses"; - /* CrowdNode */ "Create Account" = "創建帳號"; @@ -2371,6 +2368,9 @@ /* Voting */ "Submit" = "提交"; +/* No comment provided by engineer. */ +"Successful purchase" = "Successful purchase"; + /* No comment provided by engineer. */ "Support" = "Support"; From 83725b34af78b3f5d0759ac7df1dbe6f9d8c9248 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 25 Jul 2025 17:57:22 +0700 Subject: [PATCH 13/14] chore: final fixes --- DashWallet.xcodeproj/project.pbxproj | 28 +-- .../Home Balance View/BalanceModel.swift | 1 + .../UI/Menu/Main/MainMenuViewController.swift | 16 +- .../Sources/UI/Menu/MenuItemModel.swift | 4 +- ...yScreen.swift => SecurityMenuScreen.swift} | 38 +++- .../Menu/Security/SecurityMenuViewModel.swift | 4 +- .../Menu/Settings/SettingsMenuViewModel.swift | 10 + .../UI/Menu/Settings/SettingsScreen.swift | 36 +++- .../UI/Menu/Tools/ToolsMenuScreen.swift | 43 +++- .../UI/SwiftUI Components/MenuItem.swift | 193 +++++++++--------- 10 files changed, 242 insertions(+), 131 deletions(-) rename DashWallet/Sources/UI/Menu/Security/{SecurityScreen.swift => SecurityMenuScreen.swift} (83%) diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index 9c52a1dd0..1c3b726c2 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -536,9 +536,9 @@ 752D03B02E2F758B00B88784 /* MainMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */; }; 752D03B22E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; 752D03B32E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */; }; - 752F81982E30F55E00ADA76D /* SecurityScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityScreen.swift */; }; + 752F81982E30F55E00ADA76D /* SecurityMenuScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityMenuScreen.swift */; }; 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; - 752F819A2E30F55E00ADA76D /* SecurityScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityScreen.swift */; }; + 752F819A2E30F55E00ADA76D /* SecurityMenuScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81962E30F55E00ADA76D /* SecurityMenuScreen.swift */; }; 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */; }; 752F81A92E323FDB00ADA76D /* ToolsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */; }; 752F81AA2E323FDB00ADA76D /* ToolsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */; }; @@ -2450,7 +2450,7 @@ 752D03A72E2F758B00B88784 /* MainMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewController.swift; sourceTree = ""; }; 752D03A82E2F758B00B88784 /* MainMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewModel.swift; sourceTree = ""; }; 752D03B12E2F7B3C00B88784 /* MainMenuViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuViewControllerDelegate.swift; sourceTree = ""; }; - 752F81962E30F55E00ADA76D /* SecurityScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityScreen.swift; sourceTree = ""; }; + 752F81962E30F55E00ADA76D /* SecurityMenuScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuScreen.swift; sourceTree = ""; }; 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityMenuViewModel.swift; sourceTree = ""; }; 752F81A82E323FD000ADA76D /* ToolsMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolsMenuViewModel.swift; sourceTree = ""; }; 75303FE42AE7B70500870D8B /* CrowdNode.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CrowdNode.storyboard; sourceTree = ""; }; @@ -4199,7 +4199,7 @@ children = ( 2A7F3B18238C643D00DEA3EF /* Advanced Security */, 2A10EB3F2358D29500C38B61 /* ResetWalletInfo */, - 752F81962E30F55E00ADA76D /* SecurityScreen.swift */, + 752F81962E30F55E00ADA76D /* SecurityMenuScreen.swift */, 752F81972E30F55E00ADA76D /* SecurityMenuViewModel.swift */, ); path = Security; @@ -8870,7 +8870,7 @@ 2A74EFF52305333000C475EB /* DWSeedUIConstants.m in Sources */, 2A0C69B32312E8A0001B8C90 /* DWWindow.m in Sources */, 472D13E3299E23B7006903F1 /* BalanceNotifier.swift in Sources */, - 752F819A2E30F55E00ADA76D /* SecurityScreen.swift in Sources */, + 752F819A2E30F55E00ADA76D /* SecurityMenuScreen.swift in Sources */, 752F819B2E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */, 2AD1CE6422D9127600C99324 /* DWSeedWordModel.m in Sources */, 7592AA7C2B9B08C000417F9E /* SupportedTopperPaymentMethods.swift in Sources */, @@ -9539,7 +9539,7 @@ C9D2C7C22A320AA000D15901 /* (null) in Sources */, C9D2C7C32A320AA000D15901 /* DWDPRegistrationStatus.m in Sources */, C9D2C7C42A320AA000D15901 /* CurrencyExchanger_Objc.m in Sources */, - 752F81982E30F55E00ADA76D /* SecurityScreen.swift in Sources */, + 752F81982E30F55E00ADA76D /* SecurityMenuScreen.swift in Sources */, 752F81992E30F55E00ADA76D /* SecurityMenuViewModel.swift in Sources */, 7573C2E12B01103900F4C347 /* VotingFilterItemSelectableCell.swift in Sources */, C943B32B2A408CED00AF23C5 /* DWAvatarExternalLoadingView.m in Sources */, @@ -10667,7 +10667,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10689,7 +10689,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -10714,7 +10714,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -10741,7 +10741,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -11650,7 +11650,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11675,7 +11675,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -11959,7 +11959,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -11984,7 +11984,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 8.4.0; + MARKETING_VERSION = 8.4.1; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; diff --git a/DashWallet/Sources/UI/Home/Views/Home Balance View/BalanceModel.swift b/DashWallet/Sources/UI/Home/Views/Home Balance View/BalanceModel.swift index 4c4da0a70..d4bb0d47d 100644 --- a/DashWallet/Sources/UI/Home/Views/Home Balance View/BalanceModel.swift +++ b/DashWallet/Sources/UI/Home/Views/Home Balance View/BalanceModel.swift @@ -72,6 +72,7 @@ final class BalanceModel: ObservableObject { } options.userHasBalance = balanceValue > 0 + isBalanceHidden = DWGlobalOptions.sharedInstance().balanceHidden } func toggleBalanceVisibility() { diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift index 54240286a..6e397e303 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewController.swift @@ -96,7 +96,7 @@ class MainMenuViewController: UIViewController { self.presentSupportEmailController() } #else - let swiftUIView = MainMenuView( + let swiftUIView = MainMenuScreen( vc: navigationController!, delegate: delegate as? MainMenuViewControllerDelegate, wipeDelegate: delegate @@ -182,12 +182,14 @@ struct MainMenuScreen: View { ) { self.vc = vc self.onContactSupport = onContactSupport - self.viewModel = MainMenuViewModel() + let viewModel = MainMenuViewModel() self.delegateInternal = DelegateInternal( delegate: delegate, wipeDelegate: wipeDelegate, - viewModel: viewModel + viewModel: viewModel, + showCreditsWarning: { _, _ in } ) + self.viewModel = viewModel } #endif @@ -204,7 +206,7 @@ struct MainMenuScreen: View { Spacer() } .padding(.horizontal, 20) - .padding(.top, 10) + .padding(.top, 5) #if DASHPAY if viewModel.userProfileModel?.showJoinDashpay == true { @@ -280,6 +282,7 @@ struct MainMenuScreen: View { .padding(.bottom, 30) } + #if DASHPAY if viewModel.showCreditsWarning { ModalDialog( style: .warning, @@ -303,6 +306,7 @@ struct MainMenuScreen: View { .background(Color.black.opacity(0.7)) .edgesIgnoringSafeArea(.all) } + #endif NavigationLink( destination: SettingsScreen(vc: vc, onDidRescan: { @@ -325,7 +329,7 @@ struct MainMenuScreen: View { } NavigationLink( - destination: SecurityScreen(vc: vc), + destination: SecurityMenuScreen(vc: vc), isActive: $showSecurity ) { EmptyView() @@ -338,6 +342,7 @@ struct MainMenuScreen: View { .onReceive(viewModel.$navigationDestination) { destination in handleNavigation(destination) } + #if DASHPAY .sheet(isPresented: $showMixDialog) { let dialog = MixDashDialog( positiveAction: { @@ -372,6 +377,7 @@ struct MainMenuScreen: View { dialog } } + #endif } #if DASHPAY diff --git a/DashWallet/Sources/UI/Menu/MenuItemModel.swift b/DashWallet/Sources/UI/Menu/MenuItemModel.swift index aa47c6f08..3b172f485 100644 --- a/DashWallet/Sources/UI/Menu/MenuItemModel.swift +++ b/DashWallet/Sources/UI/Menu/MenuItemModel.swift @@ -26,7 +26,7 @@ class MenuItemModel: Identifiable, Equatable, Hashable { var icon: IconName? = nil var showInfo: Bool = false var showToggle: Bool = false - @State var isToggled: Bool = false + var isToggled: Bool = false var action: (() -> Void)? = nil init(title: String, subtitle: String? = nil, details: String? = nil, icon: IconName? = nil, showInfo: Bool = false, showToggle: Bool = false, isToggled: Bool = false, action: (() -> Void)? = nil) { @@ -36,7 +36,7 @@ class MenuItemModel: Identifiable, Equatable, Hashable { self.icon = icon self.showInfo = showInfo self.showToggle = showToggle - self._isToggled = State.init(initialValue: isToggled) + self.isToggled = isToggled self.action = action } diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuScreen.swift similarity index 83% rename from DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift rename to DashWallet/Sources/UI/Menu/Security/SecurityMenuScreen.swift index d46af147d..2d188d7c8 100644 --- a/DashWallet/Sources/UI/Menu/Security/SecurityScreen.swift +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuScreen.swift @@ -18,7 +18,7 @@ import SwiftUI import UIKit -struct SecurityScreen: View { +struct SecurityMenuScreen: View { private let vc: UINavigationController private let delegateInternal: DelegateInternal @@ -34,6 +34,35 @@ struct SecurityScreen: View { var body: some View { VStack(alignment: .leading, spacing: 0) { + // Back button + HStack { + Button(action: { + vc.popViewController(animated: true) + }) { + Image(systemName: "chevron.left") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(.black) + .frame(width: 36, height: 36) + .overlay( + Circle().stroke(Color.gray300.opacity(0.3), lineWidth: 1) + ) + } + Spacer() + } + .padding(.horizontal, 5) + .padding(.top, 10) + + // Header + HStack { + Text(NSLocalizedString("Security", comment: "")) + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primaryText) + Spacer() + } + .padding(.top, 30) + .padding(.bottom, 20) + VStack(spacing: 0) { ForEach(viewModel.items) { item in MenuItem( @@ -58,9 +87,8 @@ struct SecurityScreen: View { Spacer() } .padding(.horizontal, 20) - .padding(.top, 16) .background(Color.primaryBackground) - .navigationBarTitleDisplayMode(.inline) + .navigationBarHidden(true) .onReceive(viewModel.$navigationDestination) { destination in handleNavigation(destination) } @@ -86,6 +114,7 @@ struct SecurityScreen: View { model.getOrCreateNewWallet() let controller = DWPreviewSeedPhraseViewController(model: model) controller.delegate = delegateInternal + controller.hidesBottomBarWhenPushed = true self.vc.pushViewController(controller, animated: true) } } @@ -94,6 +123,7 @@ struct SecurityScreen: View { if authenticated { let controller = DWSetPinViewController(intent: .changePin) controller.delegate = delegateInternal + controller.hidesBottomBarWhenPushed = true self.vc.pushViewController(controller, animated: true) } } @@ -141,7 +171,7 @@ struct SecurityScreen: View { } } -extension SecurityScreen { +extension SecurityMenuScreen { class DelegateInternal: NSObject, DWSecureWalletDelegate, DWSetPinViewControllerDelegate, DWWipeDelegate { let onHide: () -> () diff --git a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift index 4064e7bd0..548652cea 100644 --- a/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Security/SecurityMenuViewModel.swift @@ -44,10 +44,10 @@ class SecurityMenuViewModel: ObservableObject { let biometryType = biometricAuthModel.biometryType hasTouchID = biometryType == .touchID hasFaceID = biometryType == .faceID - - setupItems() biometricsEnabled = DWGlobalOptions.sharedInstance().biometricAuthEnabled balanceHidden = DWGlobalOptions.sharedInstance().balanceHidden + + setupItems() } private func setupItems() { diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift index e9b8994b6..bccfe9243 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsMenuViewModel.swift @@ -54,6 +54,7 @@ class SettingsMenuViewModel: ObservableObject { self.notificationsEnabled = DWGlobalOptions.sharedInstance().localNotificationsEnabled refreshMenuItems() setupCoinJoinObservers() + setupCurrencyChangeObserver() } func resetNavigation() { @@ -88,6 +89,15 @@ class SettingsMenuViewModel: ObservableObject { .store(in: &cancellableBag) } + private func setupCurrencyChangeObserver() { + NotificationCenter.default.publisher(for: Notification.Name.fiatCurrencyDidChange) + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.refreshMenuItems() + } + .store(in: &cancellableBag) + } + private func refreshMenuItems() { self.items = [ MenuItemModel( diff --git a/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift b/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift index 477ce17f4..c14513cc3 100644 --- a/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift +++ b/DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift @@ -40,6 +40,35 @@ struct SettingsScreen: View { var body: some View { VStack(alignment: .leading, spacing: 0) { + // Back button + HStack { + Button(action: { + vc.popViewController(animated: true) + }) { + Image(systemName: "chevron.left") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(.black) + .frame(width: 36, height: 36) + .overlay( + Circle().stroke(Color.gray300.opacity(0.3), lineWidth: 1) + ) + } + Spacer() + } + .padding(.horizontal, 5) + .padding(.top, 10) + + // Header + HStack { + Text(NSLocalizedString("Settings", comment: "")) + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primaryText) + Spacer() + } + .padding(.top, 30) + .padding(.bottom, 20) + VStack(spacing: 0) { ForEach(viewModel.items) { item in if let cjItem = item as? CoinJoinMenuItemModel { @@ -75,9 +104,8 @@ struct SettingsScreen: View { Spacer() } .padding(.horizontal, 20) - .padding(.top, 16) .background(Color.primaryBackground) - .navigationBarTitleDisplayMode(.inline) + .navigationBarHidden(true) .onReceive(viewModel.$navigationDestination) { destination in handleNavigation(destination) } @@ -223,7 +251,9 @@ extension SettingsScreen { self.onHide = onHide } - func localCurrencyViewController(_ controller: DWLocalCurrencyViewController, didSelectCurrency currencyCode: String) { onHide() } + func localCurrencyViewController(_ controller: DWLocalCurrencyViewController, didSelectCurrency currencyCode: String) { + onHide() + } func localCurrencyViewControllerDidCancel(_ controller: DWLocalCurrencyViewController) { onHide() } } } diff --git a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift index 46c41422f..b36eff5fc 100644 --- a/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift +++ b/DashWallet/Sources/UI/Menu/Tools/ToolsMenuScreen.swift @@ -36,9 +36,39 @@ struct ToolsMenuScreen: View { } var body: some View { - VStack(alignment: .leading, spacing: 16) { - // First group - all items except ZenLedger - VStack(spacing: 0) { + VStack(alignment: .leading, spacing: 0) { + // Back button + HStack { + Button(action: { + vc.popViewController(animated: true) + }) { + Image(systemName: "chevron.left") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(.black) + .frame(width: 36, height: 36) + .overlay( + Circle().stroke(Color.gray300.opacity(0.3), lineWidth: 1) + ) + } + Spacer() + } + .padding(.horizontal, 5) + .padding(.top, 10) + + // Header + HStack { + Text(NSLocalizedString("Tools", comment: "")) + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primaryText) + Spacer() + } + .padding(.top, 30) + .padding(.bottom, 20) + + VStack(alignment: .leading, spacing: 16) { + // First group - all items except ZenLedger + VStack(spacing: 0) { ForEach(viewModel.items.dropLast()) { item in MenuItem( title: item.title, @@ -78,13 +108,12 @@ struct ToolsMenuScreen: View { .cornerRadius(12) .shadow(color: Color.shadow, radius: 20, x: 0, y: 5) } - - Spacer() + Spacer() + } } .padding(.horizontal, 20) - .padding(.top, 16) .background(Color.primaryBackground) - .navigationBarTitleDisplayMode(.inline) + .navigationBarHidden(true) .onReceive(viewModel.$navigationDestination) { destination in handleNavigation(destination) } diff --git a/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift b/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift index b7b64bb90..fbad1b1dd 100644 --- a/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift +++ b/DashWallet/Sources/UI/SwiftUI Components/MenuItem.swift @@ -32,7 +32,7 @@ struct MenuItem: View { var dashAmount: Int64? = nil var overrideFiatAmount: String? = nil var showToggle: Bool = false - @State var isToggled: Bool = false + @State private var isToggled: Bool = false var action: (() -> Void)? = nil init(title: String, @@ -109,108 +109,117 @@ struct MenuItem: View { } var body: some View { - HStack(spacing: 4) { - if let icon = icon { - ZStack(alignment: .leading) { - Icon(name: icon) - .frame(width: 30, height: 30) - .padding(0) - - if let secondaryIcon = secondaryIcon { - VStack { - Spacer() - HStack { + Button(action: { + if showToggle { + isToggled.toggle() + } else { + action?() + } + }) { + HStack(spacing: 4) { + if let icon = icon { + ZStack(alignment: .leading) { + Icon(name: icon) + .frame(width: 30, height: 30) + .padding(0) + + if let secondaryIcon = secondaryIcon { + VStack { Spacer() - Icon(name: secondaryIcon) - .padding(2) - .frame(width: 20, height: 20) - .background(Color.secondaryBackground) - .clipShape(.circle) - .offset(x: 2, y: 2) + HStack { + Spacer() + Icon(name: secondaryIcon) + .padding(2) + .frame(width: 20, height: 20) + .background(Color.secondaryBackground) + .clipShape(.circle) + .offset(x: 2, y: 2) + } } } } - } - .frame(width: 36, height: 36) - } - - VStack(alignment: .leading, spacing: 0) { - if let topText = topText { - Text(topText) - .font(.caption) - .lineSpacing(3) - .foregroundColor(.tertiaryText) - .padding(.leading, 4) - .padding(.bottom, 2) + .frame(width: 36, height: 36) } - HStack(spacing: 6) { - Text(title) - .font(.subheadline) - .fontWeight(.medium) - .lineSpacing(3) - .foregroundColor(.primaryText) + VStack(alignment: .leading, spacing: 0) { + if let topText = topText { + Text(topText) + .font(.caption) + .lineSpacing(3) + .foregroundColor(.tertiaryText) + .padding(.leading, 4) + .padding(.bottom, 2) + } - if showInfo { - Image(systemName: "info.circle.fill") - .foregroundColor(.gray300) - .imageScale(.small) + HStack(spacing: 6) { + Text(title) + .font(.subheadline) + .fontWeight(.medium) + .lineSpacing(3) + .foregroundColor(.primaryText) + + if showInfo { + Image(systemName: "info.circle.fill") + .foregroundColor(.gray300) + .imageScale(.small) + } + + Spacer() + + if let badgeText = badgeText { + Text(badgeText) + .font(.caption) + .foregroundColor(.systemYellow) + .padding(.vertical, 4) + .padding(.horizontal, 8) + .background(Color.systemYellow.opacity(0.2)) + .clipShape(RoundedRectangle(cornerRadius: 6)) + } } - - Spacer() - - if let badgeText = badgeText { - Text(badgeText) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.leading, 4) + + if let subtitle = subtitleView { + subtitle + } + + if let details = details { + Text(details) .font(.caption) - .foregroundColor(.systemYellow) - .padding(.vertical, 4) - .padding(.horizontal, 8) - .background(Color.systemYellow.opacity(0.2)) - .clipShape(RoundedRectangle(cornerRadius: 6)) + .lineSpacing(3) + .foregroundColor(.tertiaryText) + .padding(.leading, 4) + .padding(.top, 2) } } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.leading, 4) + .frame(maxWidth: .infinity) - if let subtitle = subtitleView { - subtitle + if showToggle { + Toggle(isOn: $isToggled) { } + .tint(Color.dashBlue) + .scaleEffect(0.75) + .frame(maxWidth: 60) } - if let details = details { - Text(details) - .font(.caption) - .lineSpacing(3) - .foregroundColor(.tertiaryText) - .padding(.leading, 4) - .padding(.top, 2) - } - } - .frame(maxWidth: .infinity) - - if showToggle { - Toggle(isOn: $isToggled) { } - .tint(Color.dashBlue) - .scaleEffect(0.75) - .frame(maxWidth: 60) - } - - if showChevron { - Image(systemName: "chevron.right") - .imageScale(.small) - .foregroundColor(Color.gray) - .padding(.trailing, 10) - } else { - VStack(alignment: .trailing) { - if let dashAmount = dashAmount { - DashAmount(amount: dashAmount) - - if dashAmount != 0 && dashAmount != Int64.max && dashAmount != Int64.min { - if let overriden = overrideFiatAmount { - Text(overriden) - .font(.caption) - .foregroundColor(.secondaryText) - } else { - FormattedFiatText(from: dashAmount) + if showChevron { + Image(systemName: "chevron.right") + .imageScale(.small) + .foregroundColor(Color.gray) + .padding(.trailing, 10) + } else { + VStack(alignment: .trailing) { + if let dashAmount = dashAmount { + DashAmount(amount: dashAmount) + .foregroundColor(.primaryText) + + if dashAmount != 0 && dashAmount != Int64.max && dashAmount != Int64.min { + if let overriden = overrideFiatAmount { + Text(overriden) + .font(.caption) + .foregroundColor(.secondaryText) + } else { + FormattedFiatText(from: dashAmount) + } } } } @@ -220,11 +229,7 @@ struct MenuItem: View { .contentShape(Rectangle()) .padding(10) .frame(maxWidth: .infinity) - .onTapGesture { - if showToggle { - isToggled.toggle() - } - + .onChange(of: isToggled) { newValue in action?() } } From e95bdcc04eaa5c381510b56f2b0ae0a0b46c1d26 Mon Sep 17 00:00:00 2001 From: Andrei Ashikhmin Date: Fri, 25 Jul 2025 18:02:56 +0700 Subject: [PATCH 14/14] chore: cleanup --- DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift | 2 +- DashWallet/ar.lproj/Localizable.strings | 2 +- DashWallet/bg.lproj/Localizable.strings | 2 +- DashWallet/ca.lproj/Localizable.strings | 2 +- DashWallet/cs.lproj/Localizable.strings | 2 +- DashWallet/da.lproj/Localizable.strings | 2 +- DashWallet/de.lproj/Localizable.strings | 2 +- DashWallet/el.lproj/Localizable.strings | 2 +- DashWallet/en.lproj/Localizable.strings | 2 +- DashWallet/eo.lproj/Localizable.strings | 2 +- DashWallet/es.lproj/Localizable.strings | 2 +- DashWallet/et.lproj/Localizable.strings | 2 +- DashWallet/fa.lproj/Localizable.strings | 2 +- DashWallet/fi.lproj/Localizable.strings | 2 +- DashWallet/fil.lproj/Localizable.strings | 2 +- DashWallet/fr.lproj/Localizable.strings | 2 +- DashWallet/hr.lproj/Localizable.strings | 2 +- DashWallet/hu.lproj/Localizable.strings | 2 +- DashWallet/id.lproj/Localizable.strings | 2 +- DashWallet/it.lproj/Localizable.strings | 2 +- DashWallet/ja.lproj/Localizable.strings | 2 +- DashWallet/ko.lproj/Localizable.strings | 2 +- DashWallet/mk.lproj/Localizable.strings | 2 +- DashWallet/ms.lproj/Localizable.strings | 2 +- DashWallet/nb.lproj/Localizable.strings | 2 +- DashWallet/nl.lproj/Localizable.strings | 2 +- DashWallet/pl.lproj/Localizable.strings | 2 +- DashWallet/pt.lproj/Localizable.strings | 2 +- DashWallet/ro.lproj/Localizable.strings | 2 +- DashWallet/ru.lproj/Localizable.strings | 2 +- DashWallet/sk.lproj/Localizable.strings | 2 +- DashWallet/sl.lproj/Localizable.strings | 2 +- DashWallet/sl_SI.lproj/Localizable.strings | 2 +- DashWallet/sq.lproj/Localizable.strings | 2 +- DashWallet/sr.lproj/Localizable.strings | 2 +- DashWallet/sv.lproj/Localizable.strings | 2 +- DashWallet/th.lproj/Localizable.strings | 2 +- DashWallet/tr.lproj/Localizable.strings | 2 +- DashWallet/uk.lproj/Localizable.strings | 2 +- DashWallet/vi.lproj/Localizable.strings | 2 +- DashWallet/zh-Hans.lproj/Localizable.strings | 2 +- DashWallet/zh-Hant-TW.lproj/Localizable.strings | 2 +- DashWallet/zh.lproj/Localizable.strings | 2 +- DashWallet/zh_TW.lproj/Localizable.strings | 2 +- 44 files changed, 44 insertions(+), 44 deletions(-) diff --git a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift index 6a5fcab51..dccbe33a4 100644 --- a/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift +++ b/DashWallet/Sources/UI/Menu/Main/MainMenuViewModel.swift @@ -77,7 +77,7 @@ class MainMenuViewModel: ObservableObject { // Buy & Sell Dash allItems.append(MenuItemModel( - title: NSLocalizedString("Buy & sell Dash", comment: ""), + title: NSLocalizedString("Buy & Sell Dash", comment: ""), icon: .custom("image.buy.and.sell", maxHeight: 22), action: { [weak self] in self?.handleBuySellDash() diff --git a/DashWallet/ar.lproj/Localizable.strings b/DashWallet/ar.lproj/Localizable.strings index 215c44e62..e082887df 100644 --- a/DashWallet/ar.lproj/Localizable.strings +++ b/DashWallet/ar.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "شراء بطاقة هدية"; diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index cc9ddd965..9938bcd15 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/ca.lproj/Localizable.strings b/DashWallet/ca.lproj/Localizable.strings index 6a9fa87cd..80614bd73 100644 --- a/DashWallet/ca.lproj/Localizable.strings +++ b/DashWallet/ca.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index 941ef0b8d..8cd296e79 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Nákup dárkového poukazu"; diff --git a/DashWallet/da.lproj/Localizable.strings b/DashWallet/da.lproj/Localizable.strings index c39f6618a..d3f2136de 100644 --- a/DashWallet/da.lproj/Localizable.strings +++ b/DashWallet/da.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index bb721c6a6..aa7f41e8b 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Kaufe & Verkaufe"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Gutscheinkarte kaufen"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 8b2b11fca..d6ecc03a9 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Αγορά και Πώληση"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Αγοράστε μια δωροκάρτα"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 9c5406ca8..fdcb94baf 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/eo.lproj/Localizable.strings b/DashWallet/eo.lproj/Localizable.strings index 5943f875a..bc9e1d566 100644 --- a/DashWallet/eo.lproj/Localizable.strings +++ b/DashWallet/eo.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index af938bbcb..f8fa30a56 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Comprar y Vender"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Comprar una Tarjeta de regalo"; diff --git a/DashWallet/et.lproj/Localizable.strings b/DashWallet/et.lproj/Localizable.strings index 6af4bc61b..3ce29d34e 100644 --- a/DashWallet/et.lproj/Localizable.strings +++ b/DashWallet/et.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/fa.lproj/Localizable.strings b/DashWallet/fa.lproj/Localizable.strings index c4d48c59e..52d0956ac 100644 --- a/DashWallet/fa.lproj/Localizable.strings +++ b/DashWallet/fa.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "خرید کارت هدیه"; diff --git a/DashWallet/fi.lproj/Localizable.strings b/DashWallet/fi.lproj/Localizable.strings index 2c5a9ae34..610505791 100644 --- a/DashWallet/fi.lproj/Localizable.strings +++ b/DashWallet/fi.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/fil.lproj/Localizable.strings b/DashWallet/fil.lproj/Localizable.strings index 76fc2d194..e42de6e68 100644 --- a/DashWallet/fil.lproj/Localizable.strings +++ b/DashWallet/fil.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Bili At Benta"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Bumili ng Gift Card"; diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index 49dcd8148..b4970aae4 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Acheter & vendre"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Acheter une carte-cadeau"; diff --git a/DashWallet/hr.lproj/Localizable.strings b/DashWallet/hr.lproj/Localizable.strings index 2c2b7c30b..6889b8e54 100644 --- a/DashWallet/hr.lproj/Localizable.strings +++ b/DashWallet/hr.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/hu.lproj/Localizable.strings b/DashWallet/hu.lproj/Localizable.strings index c902863f8..7579a5abc 100644 --- a/DashWallet/hu.lproj/Localizable.strings +++ b/DashWallet/hu.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index 97d791ccf..445535d2d 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Beli & Jual"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Beli Kartu Hadiah"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index d67a311a3..3593dd3c8 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Compra & Vendi"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Acquista una carta regalo "; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index 97d481f4e..88d8beab1 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "売買"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "ギフトカードを購入する"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 499313573..e73330423 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "매수 & 매도"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "기프트 카드 구매"; diff --git a/DashWallet/mk.lproj/Localizable.strings b/DashWallet/mk.lproj/Localizable.strings index f2610a179..5379e98c9 100644 --- a/DashWallet/mk.lproj/Localizable.strings +++ b/DashWallet/mk.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/ms.lproj/Localizable.strings b/DashWallet/ms.lproj/Localizable.strings index 7307e407b..c4732b365 100644 --- a/DashWallet/ms.lproj/Localizable.strings +++ b/DashWallet/ms.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/nb.lproj/Localizable.strings b/DashWallet/nb.lproj/Localizable.strings index cc16f7e6f..373b6224b 100644 --- a/DashWallet/nb.lproj/Localizable.strings +++ b/DashWallet/nb.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index 557fb737d..5f633e97d 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Kopen & verkopen"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Koop een geschenkbon"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index cdd7c467a..ce32726a9 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Kupuj i Sprzedawaj"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Kup Kartę Podarunkową"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 58ed16258..745226990 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Comprar & Vender"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Comprar um Cartão Presente"; diff --git a/DashWallet/ro.lproj/Localizable.strings b/DashWallet/ro.lproj/Localizable.strings index 727f9a15d..1ca8676ef 100644 --- a/DashWallet/ro.lproj/Localizable.strings +++ b/DashWallet/ro.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index d24685863..508c1e1e8 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Купить и Продать"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Купить подарочную карту"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index e85cd65dc..aee07ce3e 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Kúpiť a predať"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Kúpiť darčekovú kartu"; diff --git a/DashWallet/sl.lproj/Localizable.strings b/DashWallet/sl.lproj/Localizable.strings index cfb21e671..9b0e5c69a 100644 --- a/DashWallet/sl.lproj/Localizable.strings +++ b/DashWallet/sl.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/sl_SI.lproj/Localizable.strings b/DashWallet/sl_SI.lproj/Localizable.strings index 5c55eb677..12b6a4789 100644 --- a/DashWallet/sl_SI.lproj/Localizable.strings +++ b/DashWallet/sl_SI.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index d5a36e449..17f0fc05b 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/sr.lproj/Localizable.strings b/DashWallet/sr.lproj/Localizable.strings index b6643e54f..0effde767 100644 --- a/DashWallet/sr.lproj/Localizable.strings +++ b/DashWallet/sr.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index c9ab57406..b85cb5adf 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 2e923a1c3..30e9affa2 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "ซื้อ ขาย"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "ซื้อบัตรของขวัญ"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index f8c0b7148..0423eee0f 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Al & Sat"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Hediye Kartı Satın Alın"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 138fcb97e..3b79a107f 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Купити & Продати"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Купити подарункову карту"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index 67f81bbc6..5f9476933 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index 2f0a39d74..d8b701acd 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 2418ede4c..43ae024f2 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "Buy & Sell"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; diff --git a/DashWallet/zh.lproj/Localizable.strings b/DashWallet/zh.lproj/Localizable.strings index db8207690..c175e08dd 100644 --- a/DashWallet/zh.lproj/Localizable.strings +++ b/DashWallet/zh.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "购买 & 出售"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "购买礼品卡"; diff --git a/DashWallet/zh_TW.lproj/Localizable.strings b/DashWallet/zh_TW.lproj/Localizable.strings index d49fa691e..27b991032 100644 --- a/DashWallet/zh_TW.lproj/Localizable.strings +++ b/DashWallet/zh_TW.lproj/Localizable.strings @@ -354,7 +354,7 @@ "Buy & Sell" = "購買 & 出售"; /* No comment provided by engineer. */ -"Buy & sell Dash" = "Buy & sell Dash"; +"Buy & Sell Dash" = "Buy & Sell Dash"; /* Buy a Gift Card */ "Buy a Gift Card" = "購買禮品卡";