diff --git a/UnstoppableWallet/IntentExtension/Info.plist b/UnstoppableWallet/IntentExtension/Info.plist index 0b06fe4163..5c80afc1c6 100644 --- a/UnstoppableWallet/IntentExtension/Info.plist +++ b/UnstoppableWallet/IntentExtension/Info.plist @@ -12,6 +12,7 @@ IntentsSupported + CoinPriceListIntent SingleCoinPriceIntent diff --git a/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj b/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj index 00e788bef1..b09c9f6a40 100644 --- a/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj +++ b/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj @@ -73,6 +73,7 @@ 11B350B3D287EE732007892B /* WalletCoinPriceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3508A42F804E2010C7BB3 /* WalletCoinPriceService.swift */; }; 11B350B7D3DDBEE4F5B6E914 /* SendEvmTransactionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35785C46145F04D21302C /* SendEvmTransactionViewModel.swift */; }; 11B350BFC559991F9BA7A63F /* CexAssetRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AD211091A7C8619CEA2 /* CexAssetRecordStorage.swift */; }; + 11B350C1B04946C9AA8B3430 /* ListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AA43C4832521D428799 /* ListSection.swift */; }; 11B350C214D423CE2DCD6853 /* CexAssetRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35195509787CD52A6873A /* CexAssetRecord.swift */; }; 11B350C265D84964DCB0B317 /* CoinAuditsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35792F63B15682C00A3D9 /* CoinAuditsModule.swift */; }; 11B350CA618DD7BBA452FC33 /* AppearanceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353955E2C534319A5EBE9 /* AppearanceViewModel.swift */; }; @@ -119,6 +120,7 @@ 11B3512E20E90C3332EFCC1B /* RestoreSettingRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3546480B733000550BEB6 /* RestoreSettingRecord.swift */; }; 11B3512E66B939A93AE62F37 /* EnabledWallet_v_0_10.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353A0B705D8EABC5B6827 /* EnabledWallet_v_0_10.swift */; }; 11B35133B5C8937A33A0208C /* StorageMigrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35A1AE56A94BEB52AC4D1 /* StorageMigrator.swift */; }; + 11B3513A8C5CFB4A4495D935 /* HorizontalDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D0EBAF33901578520E1 /* HorizontalDivider.swift */; }; 11B3513AC9A4C945E6432475 /* EvmAddressViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35962622F74F89FD32D2B /* EvmAddressViewModel.swift */; }; 11B3513C8E7B2C3651F00F8F /* AccountStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E87C15A3AE82F471007 /* AccountStorage.swift */; }; 11B35146CA9BE897C858AB73 /* BinanceChainKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3525F8436F286491A241F /* BinanceChainKit.swift */; }; @@ -149,6 +151,7 @@ 11B3518B594ECB199242C5CB /* InputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352E52084020190C21D8C /* InputView.swift */; }; 11B3518BEA8865CADA5DA684 /* LaunchScreenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35BEEC0AB0B09C7E4209A /* LaunchScreenManager.swift */; }; 11B3518C9B837CB6C740AABB /* CreatePasscodeModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352951AD68524C33022C0 /* CreatePasscodeModule.swift */; }; + 11B3518F3962FEA97AE6C7CD /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */; }; 11B351909FE0FA637B5B1EC5 /* CoinValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3513A7417C236F56E5383 /* CoinValue.swift */; }; 11B35191E1A9626DF75D6A51 /* MarkdownViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359B9C1E0BB4D32599695 /* MarkdownViewModel.swift */; }; 11B35193A8E75B6D6117FBC7 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352978EC570F59F442BD5 /* View.swift */; }; @@ -210,7 +213,6 @@ 11B3523E47942D2118DBC290 /* ManageAccountService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DC48EEBE1160676B269 /* ManageAccountService.swift */; }; 11B3523E8B466F259DB32E37 /* SecondaryCircleButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3584D2C3754A605975D6C /* SecondaryCircleButtonStyle.swift */; }; 11B352407989CB29F849C0BA /* CexAsset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357EC69F650DCA696F48D /* CexAsset.swift */; }; - 11B3524397840BBE0CE092DB /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */; }; 11B3524401E294D8A919186E /* EnabledWallet_v_0_20.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35577CFC2384E3A454329 /* EnabledWallet_v_0_20.swift */; }; 11B35245BBF4B5F9F07676F4 /* CexWithdrawConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3517F84E9913C9030E749 /* CexWithdrawConfirmViewController.swift */; }; 11B35245CD0D5B0E44E413F4 /* AppearanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357511F8F17D8221B64E2 /* AppearanceView.swift */; }; @@ -275,10 +277,12 @@ 11B352EDBB48A02E732FA0A0 /* ReceiveService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E3DD6021EEB699A8EBF /* ReceiveService.swift */; }; 11B352EF6AAB706DF2586AC7 /* SingleCoinPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */; }; 11B352F14D96C26D946E3877 /* EvmSyncSourceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D9C2409FD9060974F67 /* EvmSyncSourceManager.swift */; }; + 11B352F16ADEABF640D2B9FD /* TopCoinsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */; }; 11B352FA9E8AA06F3DB87C3E /* MarkdownHeader3Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B358A78367D108DD529C1B /* MarkdownHeader3Cell.swift */; }; 11B352FC06650CD111076054 /* TextInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35968F5DE9FDA6EC26FCD /* TextInputCell.swift */; }; 11B352FF1C3FA152E2EEFE67 /* EvmMethodLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E3F01D5A5CFE5A4E94B /* EvmMethodLabel.swift */; }; 11B3530088E70831A648EC63 /* CexDepositNetworkRaw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3502198C667A95C21DCF3 /* CexDepositNetworkRaw.swift */; }; + 11B3530307FFDC0AF9D3A8F2 /* CoinPriceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */; }; 11B35307AE70D7996F483DAE /* InputStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353BA87FDCB1BCBA92E61 /* InputStackView.swift */; }; 11B353096900F82EDF084F3B /* SetPasscodeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F99E093B7DDB24D39C9 /* SetPasscodeViewModel.swift */; }; 11B35309CE9FBDA200067C4F /* ActiveAccount_v_0_36.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3528DDD55DDA1BAC2BADB /* ActiveAccount_v_0_36.swift */; }; @@ -326,6 +330,7 @@ 11B3538CDAA5FE6682A661D0 /* EvmAccountManagerFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F980B34E005B9F02B8F /* EvmAccountManagerFactory.swift */; }; 11B3538D0F8C037E40623A81 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352972B14FA6EBEFD6904 /* Text.swift */; }; 11B3538F09621AE16E30E26A /* BaseCurrencySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352034B036C9CB7A52724 /* BaseCurrencySettingsViewController.swift */; }; + 11B3538FA5A4953A7C9AC9E6 /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */; }; 11B353917D2223D2B275429A /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359D48FD6D82735C8969A /* Error.swift */; }; 11B35394C8DD94B9C726B22B /* CexAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359198B26152903D5CA14 /* CexAccount.swift */; }; 11B353973C1ADD51D174AC74 /* CoinRankService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3513AC6560B9C37C342F3 /* CoinRankService.swift */; }; @@ -355,6 +360,7 @@ 11B353F671EA70F8BE7F02F0 /* NftAssetTitleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353D752983424F341F2FC /* NftAssetTitleCell.swift */; }; 11B353F6BB87F0F1933D63C2 /* AddEvmSyncSourceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F8A77664848396B7567 /* AddEvmSyncSourceService.swift */; }; 11B353F6D6B1944AE9EADF3C /* CexCoinSelectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B2E5AB093ABD8228769 /* CexCoinSelectViewModel.swift */; }; + 11B353FCD118CAB48511CF12 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; }; 11B353FCF929C0CF960C96FA /* WalletModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350B97B976126C34F9A5F /* WalletModule.swift */; }; 11B353FD73E7731A9BC50C4E /* HighlightedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AC2D01DF06DC50EAC6A /* HighlightedTextView.swift */; }; 11B3540028CD7F96521D674F /* WalletTokenListService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F0240E56EF4591D1C8F /* WalletTokenListService.swift */; }; @@ -379,7 +385,6 @@ 11B3542A74C72C4CE03C727B /* CoinToggleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35A3B8FB90E561DE3F22B /* CoinToggleViewController.swift */; }; 11B3542D112D915738AB1045 /* SimpleActivateModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35178643181B9CE1D6C8B /* SimpleActivateModule.swift */; }; 11B35434C09F1E3818DC857B /* ReceiveDerivationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357EEC98939F9C7AA3271 /* ReceiveDerivationViewModel.swift */; }; - 11B35438D5201808E7476A41 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; }; 11B3543A420A23064B056925 /* ReceiveAddressViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3532A1DC90E3D0E3403F8 /* ReceiveAddressViewModel.swift */; }; 11B3543A7A9EB1E0E0E8753D /* DuressModeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F5B696CF0677865FA2C /* DuressModeViewModel.swift */; }; 11B3543EF331DA9E5E33822A /* SingleCoinPriceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E514EF2784402C7DC2A /* SingleCoinPriceEntry.swift */; }; @@ -422,6 +427,7 @@ 11B354CBCCB0FFD2FDBEE757 /* MarketFilteredListService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35ADF9BC4D149F86F23E4 /* MarketFilteredListService.swift */; }; 11B354CC5E68F04E22D633D9 /* TopPlatformHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357E05A8AF5608ECF5D5F /* TopPlatformHeaderCell.swift */; }; 11B354CF393A2EAFDABE1C47 /* WalletTokenListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357D222B4819BE881E182 /* WalletTokenListViewController.swift */; }; + 11B354D628AADF3AFD9123E1 /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */; }; 11B354D6DE193776FFACE1B5 /* AddEvmSyncSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F33517C6DDA1E7AF59 /* AddEvmSyncSourceViewController.swift */; }; 11B354D754D2E2312223F9C0 /* ReceiveSelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3580D6EDF1BB135965CC5 /* ReceiveSelectorViewController.swift */; }; 11B354D8DCBDAA82A6C51205 /* ManageAccountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B355949F6D268EF1977DC9 /* ManageAccountViewModel.swift */; }; @@ -454,6 +460,8 @@ 11B3551F51D987A150C3BC26 /* TabButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351DBFA79DAF0A82A1925 /* TabButtonStyle.swift */; }; 11B35521FDF21F9B1667AF72 /* Eip20Kit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3524B273DD5AB2FF5C7A6 /* Eip20Kit.swift */; }; 11B35525C4BAEF22CF73F261 /* CreateAccountSimpleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351628BA5984C6EBB412E /* CreateAccountSimpleViewController.swift */; }; + 11B35529AB46C98BC35C72E4 /* CoinPriceListProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */; }; + 11B35530A9FC0972D8716C31 /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */; }; 11B3553109794AE192BF7591 /* MarketCategoryModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350CAB1C54A2CAA4C76F6 /* MarketCategoryModule.swift */; }; 11B35531B3F80D06EF040301 /* CoinType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357B2D07C69579BAEC997 /* CoinType.swift */; }; 11B355342F86DF79AE7000B9 /* Cex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D6718A1DEB73A0CEC02 /* Cex.swift */; }; @@ -525,7 +533,6 @@ 11B3561679C05C31F16EDC77 /* BaseUnlockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F8A0A9EB045377C152 /* BaseUnlockViewModel.swift */; }; 11B3561A469C906B67F24459 /* FeeRateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359BBFCD82C3C6DC06F96 /* FeeRateProvider.swift */; }; 11B3561E7DF566A274210E01 /* EvmSyncSourceRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B56F5C8138085588EE5 /* EvmSyncSourceRecord.swift */; }; - 11B35622E46852AA38E42DF5 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; }; 11B3562466F0ADD109244158 /* NftCollectionAssetsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35100DD6E2DBF905FD19B /* NftCollectionAssetsModule.swift */; }; 11B3562D78E70F5F14B81B3A /* CexWithdrawNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3572F134D41A670EE9244 /* CexWithdrawNetwork.swift */; }; 11B3562EE896D758066FEECB /* CexDepositNetworkSelectService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35850DF16D11D45C44A60 /* CexDepositNetworkSelectService.swift */; }; @@ -557,6 +564,7 @@ 11B35678A2523AEDBE824743 /* FormCautionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350F5D363E9B1D6C9120F /* FormCautionCell.swift */; }; 11B35683BF79A4A5AECA616F /* CoinAuditsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3566146F353C8B6C919CA /* CoinAuditsViewController.swift */; }; 11B3568483AFF7864F050E0F /* LockManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F57D462E2C9E9AEF67C /* LockManager.swift */; }; + 11B35685AC079B7BC7D1A534 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; }; 11B3568EFCE57D12D377F7E4 /* ManageAccountsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D805327837A9E81801C /* ManageAccountsViewController.swift */; }; 11B35696E9CD808522BEFCD6 /* BlockchainSettingRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353FA8AE18587D516754B /* BlockchainSettingRecordStorage.swift */; }; 11B356A19A721D3557D7213C /* CoinReportsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E767DA0B5D7C0DAF203 /* CoinReportsViewModel.swift */; }; @@ -603,6 +611,7 @@ 11B3571EE86803DB473BA1F7 /* WatchEvmAddressService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350A8930819ED5C2729F6 /* WatchEvmAddressService.swift */; }; 11B35720BCE41151CDDF9185 /* BitcoinCashCoinType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B176A5FDEBBE94D307E /* BitcoinCashCoinType.swift */; }; 11B35721F1DA4DD77AD70637 /* NftKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35464B8D90CBE6E864B92 /* NftKey.swift */; }; + 11B357229EFFA602F38D6C2C /* CoinPriceListEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */; }; 11B35727A4950C1E066F2244 /* LogRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35822E26E7298100CD69D /* LogRecordStorage.swift */; }; 11B35729848FDBC47F038553 /* AppVersionRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35888BDB55DCFD0ECF655 /* AppVersionRecordStorage.swift */; }; 11B3572C418CAD9739CAE3EC /* BlockchainTokensViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350B29B000CD809F81228 /* BlockchainTokensViewModel.swift */; }; @@ -639,6 +648,7 @@ 11B3579C9B49D3B2F1DB389F /* TransactionsCoinSelectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352D7E1CB9D978EE1BC15 /* TransactionsCoinSelectViewController.swift */; }; 11B357A607396E857705024F /* WalletTokenCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B64097CCFA552310E3D /* WalletTokenCell.swift */; }; 11B357A9F8949912C12A17D7 /* NftCollectionOverviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351436E090F4C05243103 /* NftCollectionOverviewViewModel.swift */; }; + 11B357AD2632BDF26DCB4BFC /* HorizontalDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D0EBAF33901578520E1 /* HorizontalDivider.swift */; }; 11B357ADA154348A3C1A987B /* CoinTreasuriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351E253E310F1738EBE13 /* CoinTreasuriesViewController.swift */; }; 11B357AE8B51E09D0EB60D87 /* NftPriceRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B451378835F7F060012 /* NftPriceRecord.swift */; }; 11B357BA09F0FA21477F0A59 /* CoinOverviewViewModelNew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35363A530051B79BFFFD0 /* CoinOverviewViewModelNew.swift */; }; @@ -702,6 +712,7 @@ 11B35854327D3A8CC787E985 /* WatchModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531B7AC10796F8D26455 /* WatchModule.swift */; }; 11B35854532EEA0AE6AC2010 /* RateAppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35FA360A91FDE3EB0B85C /* RateAppManager.swift */; }; 11B3585461729AD144448426 /* NumPadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353E1284B381BE56AC663 /* NumPadView.swift */; }; + 11B358587D9C3A1F10EC15A6 /* PriceChangeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */; }; 11B35858954659DEE0C44618 /* TransactionsViewItemFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357D89546EBA13B01A1ED /* TransactionsViewItemFactory.swift */; }; 11B3585AC6E5D92F98A71758 /* RestoreSettingRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3546480B733000550BEB6 /* RestoreSettingRecord.swift */; }; 11B3585E88319E5BBBB9CD3F /* EvmPrivateKeyModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D652AE2C3D9E084AC0F /* EvmPrivateKeyModule.swift */; }; @@ -745,11 +756,13 @@ 11B358B90E2D1A8832637F34 /* MarkdownBlockQuoteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3552D3F84BA594EFE964C /* MarkdownBlockQuoteCell.swift */; }; 11B358B9159434442870D34E /* WatchEvmAddressService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350A8930819ED5C2729F6 /* WatchEvmAddressService.swift */; }; 11B358C1D982EAC4F0A308ED /* MarkdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DF08505C3A7CB1BBBB4 /* MarkdownViewController.swift */; }; + 11B358C289DE4AE5EB5547BC /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; }; 11B358C3281DE0A34D192CF0 /* SwitchAccountModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351AEFE48529C069B892F /* SwitchAccountModule.swift */; }; 11B358C72B4E7F70331084AA /* SendEvmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35113CB935A0E54504C1C /* SendEvmViewController.swift */; }; 11B358CB129212E2A0E455E4 /* MarketAdvancedSearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353A1CC274EDBF8A67DEA /* MarketAdvancedSearchResultViewController.swift */; }; 11B358D1687049E5DACEBC96 /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352884D47E0B23DCF2C2C /* AppManager.swift */; }; 11B358D35D2270FD78C6EF82 /* AutoLockPeriod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E41142BD3D2FF59BAE7 /* AutoLockPeriod.swift */; }; + 11B358D519ACFE88A7823C7E /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; }; 11B358D913A404C1DA7D4E0E /* CoinInvestorsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35FF539B93A4C61AD1D00 /* CoinInvestorsViewModel.swift */; }; 11B358DC6827FC6035BF3225 /* TokenQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353684493AFDF3711DF2B /* TokenQuery.swift */; }; 11B358DC90F3372DB98BD4A5 /* CexDepositNetworkSelectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DDED1BC5B541DB6B4B3 /* CexDepositNetworkSelectViewModel.swift */; }; @@ -860,6 +873,7 @@ 11B35A07ED63F869C0203244 /* CexDepositNetworkSelectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35C227EDC2D4ED188A0FC /* CexDepositNetworkSelectViewController.swift */; }; 11B35A0F3111451717192084 /* NftCollectionAssetsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350CD0F79715E1A5EE8BF /* NftCollectionAssetsService.swift */; }; 11B35A108457DC44DD870138 /* MainBadgeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35C13937F82D36C823205 /* MainBadgeService.swift */; }; + 11B35A15391F470849534264 /* ListStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B356EF92FFD23F4385A991 /* ListStyle.swift */; }; 11B35A17137E171D3496A99E /* MarkdownModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35609D3FA1729A7D80153 /* MarkdownModule.swift */; }; 11B35A18AA61F8C06AB1C15B /* AppearanceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353955E2C534319A5EBE9 /* AppearanceViewModel.swift */; }; 11B35A1BD3EA5E3547D0E3FF /* RestoreBinanceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B2F781F7EDA04E955BB /* RestoreBinanceViewModel.swift */; }; @@ -893,6 +907,7 @@ 11B35A5DA8197D193B7CF8D9 /* AmountData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B617A9CE668EEF4978B /* AmountData.swift */; }; 11B35A66D997F86423C2F5A0 /* DonutChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35FC207C703EBF63FD56A /* DonutChartView.swift */; }; 11B35A6D6A552EF997ED09E9 /* ReceiveAddressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B354F94192C3C8D9011983 /* ReceiveAddressViewController.swift */; }; + 11B35A6F4E6931973277940A /* CoinPriceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */; }; 11B35A71C30FB6172C74D09D /* WalletConnectSendEthereumTransactionRequestService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35CA33956633E85EC5C16 /* WalletConnectSendEthereumTransactionRequestService.swift */; }; 11B35A71D59757280B126587 /* ReceiveDerivationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357EEC98939F9C7AA3271 /* ReceiveDerivationViewModel.swift */; }; 11B35A79476177D3BE7DE477 /* RestorePrivateKeyService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351EBA5DE11150CE2E3F9 /* RestorePrivateKeyService.swift */; }; @@ -969,6 +984,7 @@ 11B35B507F2F843A5B3E4C7C /* EvmNetworkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351895EE2816DE7BBC767 /* EvmNetworkViewModel.swift */; }; 11B35B5451BA0A3C825809A2 /* TabHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357D7156B86181DD0C6D4 /* TabHeaderView.swift */; }; 11B35B5B8F3FEED445647E56 /* EvmCoinServiceFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35410733A35D1558E55B2 /* EvmCoinServiceFactory.swift */; }; + 11B35B5EED35DD5F8F8B19A8 /* ListStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B356EF92FFD23F4385A991 /* ListStyle.swift */; }; 11B35B5FA3177BC9ED21B929 /* SwapApproveConfirmationModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B356671FA76C7DEDA50B94 /* SwapApproveConfirmationModule.swift */; }; 11B35B6586B14C6A9F35E39D /* MarketAdvancedSearchResultService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B358C7505D0DE60CD03B22 /* MarketAdvancedSearchResultService.swift */; }; 11B35B664765E4EAA7E0E14F /* Faq.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35450456BE5E3EE8F7391 /* Faq.swift */; }; @@ -1072,6 +1088,7 @@ 11B35CAD5A7E0C8709559FD2 /* WalletManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352D547F1BB38D2AD6AD5 /* WalletManager.swift */; }; 11B35CADA5EE093B974C5A4A /* EvmLabelManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F13BAFE57D363B9684F /* EvmLabelManager.swift */; }; 11B35CAE0540A2549BD4A960 /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EDE38851EC8658D8A99 /* ActivityView.swift */; }; + 11B35CB0098E9628FE81AC39 /* TopCoinsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */; }; 11B35CB0102019E63D7337D5 /* NftCollectionMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35690912F374FEE910193 /* NftCollectionMetadata.swift */; }; 11B35CB50F9904708B827F9F /* CoinToggleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350CDE31673BA1673B620 /* CoinToggleViewModel.swift */; }; 11B35CB5A90FCD0B53D59140 /* AlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357736B8C29DF38F5DCBA /* AlertViewController.swift */; }; @@ -1239,6 +1256,7 @@ 11B35E83437BEB5CCE342ACB /* SyncerState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B354BDDCAF7AF5A0582CAA /* SyncerState.swift */; }; 11B35E8777FC5A18BD07CF60 /* AccountRecord_v_0_10.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35BBC9FB99B388F1A388F /* AccountRecord_v_0_10.swift */; }; 11B35E87DDBCD81A36436A13 /* ExternalContractCallTransactionRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F42A8CA942DF400A928 /* ExternalContractCallTransactionRecord.swift */; }; + 11B35E88C40DC151A3BEC0B1 /* CoinPriceListProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */; }; 11B35E8BF94FD52708DBB0E1 /* CoinRecord_v19.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B2C6C103AFF4CCC6E91 /* CoinRecord_v19.swift */; }; 11B35E8D7BC94103A4ABD91C /* WalletHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E859456CF982321B46F /* WalletHeaderView.swift */; }; 11B35E8DED55EE76CE1F943D /* ModuleUnlockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B51E484CA62EC57790E /* ModuleUnlockViewModel.swift */; }; @@ -1283,6 +1301,7 @@ 11B35EF9D9E8C1A814005CFD /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35747FAD8381F2AD48276 /* MainViewModel.swift */; }; 11B35EFAFFA1E30F7765FEB2 /* MainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B6D6FCA3745DE0750BD /* MainService.swift */; }; 11B35F09A49A90BF058CA500 /* ReceiveSelectCoinViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350575488360C1A598DF3 /* ReceiveSelectCoinViewModel.swift */; }; + 11B35F0D313E455BCF24C42B /* PriceChangeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */; }; 11B35F1152FB1004E554B922 /* MarketOverviewMetricsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DCCC2D8CD00EF6A9A77 /* MarketOverviewMetricsCell.swift */; }; 11B35F134E5EF8572BF330CB /* NavigationRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3578FB80AA013BD351A26 /* NavigationRow.swift */; }; 11B35F1440C5946E9C3D94ED /* Auditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D8AF9D337A98530548D /* Auditor.swift */; }; @@ -1314,9 +1333,11 @@ 11B35F663F7E12BFDDE3C88B /* AccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35872950C107E4810AB6B /* AccountManager.swift */; }; 11B35F66D2561CD9555C8857 /* UnlinkModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3529D276325D741CAEEF5 /* UnlinkModule.swift */; }; 11B35F6B92C2FB142E522828 /* BtcBlockchainSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B358830357DB1F87FCA006 /* BtcBlockchainSettingsViewModel.swift */; }; + 11B35F6BC7EC8A90FDACD191 /* CoinPriceListEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */; }; 11B35F6CD2706B10781456E8 /* ExtendedKeyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F95A84DD0F232E5A9CD /* ExtendedKeyViewModel.swift */; }; 11B35F6FDB8640381081A06C /* FormAmountInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352A41EC99ADCC8F3E3E9 /* FormAmountInputView.swift */; }; 11B35F7233A2FC778A8DE0AB /* CurrencyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BE8A0802ADE2FAB0012DE7F /* CurrencyManager.swift */; }; + 11B35F728E5BE60FD7C87FA1 /* ListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AA43C4832521D428799 /* ListSection.swift */; }; 11B35F72D67DB96FA83C9004 /* AddEvmSyncSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F33517C6DDA1E7AF59 /* AddEvmSyncSourceViewController.swift */; }; 11B35F73153DEE805DD539CE /* EvmNetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35711A471C5A45DD87108 /* EvmNetworkViewController.swift */; }; 11B35F78F82224BE17D612AB /* RecoveryPhraseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351A0B1AE5F612E6A5FEE /* RecoveryPhraseService.swift */; }; @@ -1326,7 +1347,6 @@ 11B35F8649859802080BA580 /* NftViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D96B8963CDC30DC5643 /* NftViewModel.swift */; }; 11B35F890BE41B1BFAC3D75E /* RestoreMnemonicService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D55DCC92BED4FA87CA0 /* RestoreMnemonicService.swift */; }; 11B35F8BF4BD6481E6AF72AF /* TestNetManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EE072CE5471B0DFF841 /* TestNetManager.swift */; }; - 11B35F8CD1F9BD5D9B865560 /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */; }; 11B35F8FB24AB02560A1D018 /* MarketAdvancedSearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353A1CC274EDBF8A67DEA /* MarketAdvancedSearchResultViewController.swift */; }; 11B35F91E53BA1F835DD4B4F /* HorizontalDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D0EBAF33901578520E1 /* HorizontalDivider.swift */; }; 11B35F98393E6F3B76381ECF /* ModuleUnlockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B51E484CA62EC57790E /* ModuleUnlockViewModel.swift */; }; @@ -2781,10 +2801,7 @@ D3AF5A9129FFD87500C1399E /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = D3AF5A9029FFD87500C1399E /* RxRelay */; }; D3AF5A9329FFD87500C1399E /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = D3AF5A9229FFD87500C1399E /* RxSwift */; }; D3BA257F2ADFAD7C002B13EA /* AppWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3948EF62ADA846400FAE566 /* AppWidgetBundle.swift */; }; - D3BA25802ADFAD7C002B13EA /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; }; D3BA25812ADFAD7C002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */; }; - D3BA25822ADFAD7C002B13EA /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */; }; - D3BA25832ADFAD7C002B13EA /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */; }; D3BA25842ADFAD7C002B13EA /* SingleCoinPriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35CFAA2B156E439EB18B3 /* SingleCoinPriceView.swift */; }; D3BA25852ADFAD7C002B13EA /* SingleCoinPriceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E514EF2784402C7DC2A /* SingleCoinPriceEntry.swift */; }; D3BA25862ADFAD7C002B13EA /* SingleCoinPriceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F0C950836EA4166CEC5 /* SingleCoinPriceProvider.swift */; }; @@ -2795,7 +2812,6 @@ D3BA258D2ADFAD7C002B13EA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D3948EFA2ADA846800FAE566 /* Assets.xcassets */; }; D3BA25932ADFAF1E002B13EA /* WidgetExtension Prod.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D3BA25912ADFAD7C002B13EA /* WidgetExtension Prod.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; D3BA259B2ADFAF23002B13EA /* IntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3948F1C2ADA88D900FAE566 /* IntentHandler.swift */; }; - D3BA259C2ADFAF23002B13EA /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; }; D3BA259D2ADFAF23002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */; }; D3BA259F2ADFAF23002B13EA /* HsToolKit in Frameworks */ = {isa = PBXBuildFile; productRef = D3BA25982ADFAF23002B13EA /* HsToolKit */; }; D3BA25A02ADFAF23002B13EA /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3948F092ADA887300FAE566 /* Intents.framework */; }; @@ -2973,10 +2989,12 @@ 11B351E1107158B6A2BF2149 /* ActivateSubscriptionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivateSubscriptionService.swift; sourceTree = ""; }; 11B351E253E310F1738EBE13 /* CoinTreasuriesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinTreasuriesViewController.swift; sourceTree = ""; }; 11B351E61AB3FB570A4F7C66 /* Wallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = ""; }; + 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopCoinsWidget.swift; sourceTree = ""; }; 11B351EBA5DE11150CE2E3F9 /* RestorePrivateKeyService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RestorePrivateKeyService.swift; sourceTree = ""; }; 11B351EC6F1B4D72D52B4D16 /* NftActivityHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftActivityHeaderView.swift; sourceTree = ""; }; 11B351F1248EDA20F7141AB8 /* ExtendedKeyModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtendedKeyModule.swift; sourceTree = ""; }; 11B351F33517C6DDA1E7AF59 /* AddEvmSyncSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddEvmSyncSourceViewController.swift; sourceTree = ""; }; + 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleCoinPriceWidget.swift; sourceTree = ""; }; 11B351F8A0A9EB045377C152 /* BaseUnlockViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseUnlockViewModel.swift; sourceTree = ""; }; 11B351FDDBEF227E161F6A0E /* PageDescription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageDescription.swift; sourceTree = ""; }; 11B352034B036C9CB7A52724 /* BaseCurrencySettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseCurrencySettingsViewController.swift; sourceTree = ""; }; @@ -3009,7 +3027,6 @@ 11B3529CF33E51DA1C872106 /* EditPasscodeModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditPasscodeModule.swift; sourceTree = ""; }; 11B3529D276325D741CAEEF5 /* UnlinkModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnlinkModule.swift; sourceTree = ""; }; 11B3529DC8E74672659515B8 /* CoinPageViewModelNew.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPageViewModelNew.swift; sourceTree = ""; }; - 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueFormatter.swift; sourceTree = ""; }; 11B352A41EC99ADCC8F3E3E9 /* FormAmountInputView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormAmountInputView.swift; sourceTree = ""; }; 11B352A8C9C3AA2AB1776F3C /* UnlinkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnlinkViewController.swift; sourceTree = ""; }; 11B352ABFDEAEEA84D3FDD8B /* AddEvmTokenBlockchainService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddEvmTokenBlockchainService.swift; sourceTree = ""; }; @@ -3036,6 +3053,7 @@ 11B352FBA1B29357E0120055 /* BalanceHiddenManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalanceHiddenManager.swift; sourceTree = ""; }; 11B353002DD782C5BEE9BFD4 /* MarkdownImageTitleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownImageTitleCell.swift; sourceTree = ""; }; 11B353010933750F8F920E1E /* TermsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TermsViewModel.swift; sourceTree = ""; }; + 11B3531363949F235A210921 /* ApiProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiProvider.swift; sourceTree = ""; }; 11B3531B7AC10796F8D26455 /* WatchModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchModule.swift; sourceTree = ""; }; 11B3531E4476F43B9C2BA5A0 /* ExperimentalFeaturesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperimentalFeaturesView.swift; sourceTree = ""; }; 11B353262E45560C91FD6B65 /* EvmPrivateKeyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EvmPrivateKeyViewModel.swift; sourceTree = ""; }; @@ -3054,7 +3072,6 @@ 11B35368FF9DD8600557BF07 /* TextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextCell.swift; sourceTree = ""; }; 11B3536CE69BFC7513A9DFDF /* GuidesService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GuidesService.swift; sourceTree = ""; }; 11B3536DB4D3D3D7771B3EA4 /* MarkdownTextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTextCell.swift; sourceTree = ""; }; - 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleCoinPriceWidget.swift; sourceTree = ""; }; 11B3537769E4496D08EB0376 /* AppearanceModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppearanceModule.swift; sourceTree = ""; }; 11B3538387B200C894A68ADF /* SendEvmConfirmationModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendEvmConfirmationModule.swift; sourceTree = ""; }; 11B353885F7A93DF25F5023B /* EvmAddressViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EvmAddressViewController.swift; sourceTree = ""; }; @@ -3143,6 +3160,7 @@ 11B355B70AB1BC7B6F8B5241 /* WatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchViewController.swift; sourceTree = ""; }; 11B355BEB95969D89B3F8876 /* MarketListViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarketListViewModel.swift; sourceTree = ""; }; 11B355C1E3C922BAE804AAF9 /* WalletConnectSessionStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConnectSessionStorage.swift; sourceTree = ""; }; + 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPriceListView.swift; sourceTree = ""; }; 11B355D5EFD2B74DE15F0C2A /* FaqModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaqModule.swift; sourceTree = ""; }; 11B355DBB08BD360380F7EAF /* WalletConnectRequestViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConnectRequestViewController.swift; sourceTree = ""; }; 11B355DF40EB498107EDAA4A /* BrandFooterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrandFooterCell.swift; sourceTree = ""; }; @@ -3215,11 +3233,12 @@ 11B35779E6353B98B298FF29 /* CurrentDateProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrentDateProvider.swift; sourceTree = ""; }; 11B35785C46145F04D21302C /* SendEvmTransactionViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendEvmTransactionViewModel.swift; sourceTree = ""; }; 11B35785DD2AF78CEBD800F5 /* BackupVerifyWordsModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackupVerifyWordsModule.swift; sourceTree = ""; }; + 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PriceChangeType.swift; sourceTree = ""; }; 11B3578FB80AA013BD351A26 /* NavigationRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationRow.swift; sourceTree = ""; }; 11B35792F63B15682C00A3D9 /* CoinAuditsModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinAuditsModule.swift; sourceTree = ""; }; 11B35799B0DCCF655F0766BF /* CexDepositNetwork.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CexDepositNetwork.swift; sourceTree = ""; }; - 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiProvider.swift; sourceTree = ""; }; 11B3579EDE4F5BC0170FB711 /* TransactionsTableViewDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionsTableViewDataSource.swift; sourceTree = ""; }; + 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueFormatter.swift; sourceTree = ""; }; 11B357B1854BAD99C7CFB3DE /* NftHeaderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftHeaderViewModel.swift; sourceTree = ""; }; 11B357B185E8FECB3924FDF2 /* BlockchainType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockchainType.swift; sourceTree = ""; }; 11B357B2D07C69579BAEC997 /* CoinType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinType.swift; sourceTree = ""; }; @@ -3237,6 +3256,7 @@ 11B357EEC98939F9C7AA3271 /* ReceiveDerivationViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReceiveDerivationViewModel.swift; sourceTree = ""; }; 11B357F0A42CE7144C82D634 /* BlockchainSettingsModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockchainSettingsModule.swift; sourceTree = ""; }; 11B357F15913DDAE69C9B0E0 /* RestoreSettingsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RestoreSettingsManager.swift; sourceTree = ""; }; + 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPriceListEntry.swift; sourceTree = ""; }; 11B357F4747A6B256C31EC7C /* PoolGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PoolGroup.swift; sourceTree = ""; }; 11B35801399EA004F5A2A1F7 /* MarkdownService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownService.swift; sourceTree = ""; }; 11B3580953728946194D1187 /* NftCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftCollectionViewController.swift; sourceTree = ""; }; @@ -3543,6 +3563,7 @@ 11B35EDE31BA3EF80F78859A /* HsLabelProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HsLabelProvider.swift; sourceTree = ""; }; 11B35EDE38851EC8658D8A99 /* ActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; 11B35EE072CE5471B0DFF841 /* TestNetManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNetManager.swift; sourceTree = ""; }; + 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPriceListProvider.swift; sourceTree = ""; }; 11B35EF3688D60C8E6823267 /* BottomSingleSelectorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BottomSingleSelectorViewController.swift; sourceTree = ""; }; 11B35EFB45ECC2D403CA6C89 /* ValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueFormatter.swift; sourceTree = ""; }; 11B35F007444A766AF8CD20D /* EvmLabelStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EvmLabelStorage.swift; sourceTree = ""; }; @@ -4493,7 +4514,6 @@ isa = PBXGroup; children = ( 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */, - 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */, 11B35CFAA2B156E439EB18B3 /* SingleCoinPriceView.swift */, 11B35E514EF2784402C7DC2A /* SingleCoinPriceEntry.swift */, 11B35F0C950836EA4166CEC5 /* SingleCoinPriceProvider.swift */, @@ -5249,6 +5269,16 @@ path = Views; sourceTree = ""; }; + 11B355D8E54BBC0EF3467F0A /* CoinPriceList */ = { + isa = PBXGroup; + children = ( + 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */, + 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */, + 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */, + ); + path = CoinPriceList; + sourceTree = ""; + }; 11B355EAC554044B280B08AC /* Ethereum */ = { isa = PBXGroup; children = ( @@ -5398,6 +5428,16 @@ path = Passcode; sourceTree = ""; }; + 11B35693EA7B807D24C090E4 /* Misc */ = { + isa = PBXGroup; + children = ( + 11B3531363949F235A210921 /* ApiProvider.swift */, + 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */, + 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */, + ); + path = Misc; + sourceTree = ""; + }; 11B356A9BF5A101F8B2ABA7F /* Receive */ = { isa = PBXGroup; children = ( @@ -8128,9 +8168,11 @@ D3948EF62ADA846400FAE566 /* AppWidgetBundle.swift */, D3948EFA2ADA846800FAE566 /* Assets.xcassets */, D3948EFC2ADA846800FAE566 /* Info.plist */, - 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */, 11B350F316B662F48ABE6CBC /* SingleCoinPrice */, - 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */, + 11B355D8E54BBC0EF3467F0A /* CoinPriceList */, + 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */, + 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */, + 11B35693EA7B807D24C090E4 /* Misc */, ); path = Widget; sourceTree = ""; @@ -11208,16 +11250,24 @@ buildActionMask = 2147483647; files = ( D3948EF72ADA846400FAE566 /* AppWidgetBundle.swift in Sources */, - 11B35622E46852AA38E42DF5 /* ApiProvider.swift in Sources */, 11B35127A0500D2C7DA92B96 /* SingleCoinPriceWidget.intentdefinition in Sources */, - 11B3524397840BBE0CE092DB /* SingleCoinPriceWidget.swift in Sources */, - 11B35F8CD1F9BD5D9B865560 /* ValueFormatter.swift in Sources */, 11B350F24818BABB6DB6512A /* SingleCoinPriceView.swift in Sources */, 11B3543EF331DA9E5E33822A /* SingleCoinPriceEntry.swift in Sources */, 11B3525BA3799B70B25CF2FC /* SingleCoinPriceProvider.swift in Sources */, 11B356509E6083B971F37E0F /* Currency.swift in Sources */, 11B35C4E01C2AF2707691B96 /* CurrencyManager.swift in Sources */, 11B35E4A30997DC0E1E2BA48 /* SharedLocalStorage.swift in Sources */, + 11B3513A8C5CFB4A4495D935 /* HorizontalDivider.swift in Sources */, + 11B350C1B04946C9AA8B3430 /* ListSection.swift in Sources */, + 11B35B5EED35DD5F8F8B19A8 /* ListStyle.swift in Sources */, + 11B357229EFFA602F38D6C2C /* CoinPriceListEntry.swift in Sources */, + 11B35E88C40DC151A3BEC0B1 /* CoinPriceListProvider.swift in Sources */, + 11B35A6F4E6931973277940A /* CoinPriceListView.swift in Sources */, + 11B35CB0098E9628FE81AC39 /* TopCoinsWidget.swift in Sources */, + 11B3538FA5A4953A7C9AC9E6 /* SingleCoinPriceWidget.swift in Sources */, + 11B358D519ACFE88A7823C7E /* ApiProvider.swift in Sources */, + 11B358587D9C3A1F10EC15A6 /* PriceChangeType.swift in Sources */, + 11B35530A9FC0972D8716C31 /* ValueFormatter.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11226,8 +11276,8 @@ buildActionMask = 2147483647; files = ( D3948F1D2ADA88D900FAE566 /* IntentHandler.swift in Sources */, - 11B35438D5201808E7476A41 /* ApiProvider.swift in Sources */, 11B3589AA4B965989181F224 /* SingleCoinPriceWidget.intentdefinition in Sources */, + 11B358C289DE4AE5EB5547BC /* ApiProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11236,16 +11286,24 @@ buildActionMask = 2147483647; files = ( D3BA257F2ADFAD7C002B13EA /* AppWidgetBundle.swift in Sources */, - D3BA25802ADFAD7C002B13EA /* ApiProvider.swift in Sources */, D3BA25812ADFAD7C002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */, - D3BA25822ADFAD7C002B13EA /* SingleCoinPriceWidget.swift in Sources */, - D3BA25832ADFAD7C002B13EA /* ValueFormatter.swift in Sources */, D3BA25842ADFAD7C002B13EA /* SingleCoinPriceView.swift in Sources */, D3BA25852ADFAD7C002B13EA /* SingleCoinPriceEntry.swift in Sources */, D3BA25862ADFAD7C002B13EA /* SingleCoinPriceProvider.swift in Sources */, 11B35202BE66E6E764026D63 /* Currency.swift in Sources */, 11B35F7233A2FC778A8DE0AB /* CurrencyManager.swift in Sources */, 11B359A56AAFB4C4F6EF733C /* SharedLocalStorage.swift in Sources */, + 11B357AD2632BDF26DCB4BFC /* HorizontalDivider.swift in Sources */, + 11B35F728E5BE60FD7C87FA1 /* ListSection.swift in Sources */, + 11B35A15391F470849534264 /* ListStyle.swift in Sources */, + 11B35F6BC7EC8A90FDACD191 /* CoinPriceListEntry.swift in Sources */, + 11B35529AB46C98BC35C72E4 /* CoinPriceListProvider.swift in Sources */, + 11B3530307FFDC0AF9D3A8F2 /* CoinPriceListView.swift in Sources */, + 11B352F16ADEABF640D2B9FD /* TopCoinsWidget.swift in Sources */, + 11B354D628AADF3AFD9123E1 /* SingleCoinPriceWidget.swift in Sources */, + 11B353FCD118CAB48511CF12 /* ApiProvider.swift in Sources */, + 11B35F0D313E455BCF24C42B /* PriceChangeType.swift in Sources */, + 11B3518F3962FEA97AE6C7CD /* ValueFormatter.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11254,8 +11312,8 @@ buildActionMask = 2147483647; files = ( D3BA259B2ADFAF23002B13EA /* IntentHandler.swift in Sources */, - D3BA259C2ADFAF23002B13EA /* ApiProvider.swift in Sources */, D3BA259D2ADFAF23002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */, + 11B35685AC079B7BC7D1A534 /* ApiProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/UnstoppableWallet/UnstoppableWallet/Info.plist b/UnstoppableWallet/UnstoppableWallet/Info.plist index e1f7f069d1..49aca1bcaf 100644 --- a/UnstoppableWallet/UnstoppableWallet/Info.plist +++ b/UnstoppableWallet/UnstoppableWallet/Info.plist @@ -96,6 +96,7 @@ NSUserActivityTypes + CoinPriceListIntent SingleCoinPriceIntent OfficeMode diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift index 71abc234f2..e03853a65c 100644 --- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift +++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift @@ -1,4 +1,5 @@ import SwiftUI +import ThemeKit struct HorizontalDivider: View { private let color: Color diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift index e83bd90300..9c14134df9 100644 --- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift +++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift @@ -10,9 +10,7 @@ struct ListSection: View { _VariadicView.Tree(Layout()) { content } - .background(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous).fill(listStyle.backgroundColor)) - .clipShape(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous)) - .overlay(RoundedRectangle(cornerRadius: .cornerRadius12).stroke(listStyle.borderColor, lineWidth: .heightOneDp)) + .modifier(ListStyleModifier(listStyle: listStyle)) } } diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift index 113a9ecab3..a792d0e44b 100644 --- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift +++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift @@ -3,18 +3,36 @@ import SwiftUI enum ListStyle { case lawrence case bordered + case transparent +} + +struct ListStyleModifier: ViewModifier { + let listStyle: ListStyle - var backgroundColor: Color { - switch self { - case .lawrence: return .themeLawrence - case .bordered: return .clear + func body(content: Content) -> some View { + switch listStyle { + case .lawrence: + content + .background(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous).fill(Color.themeLawrence)) + .clipShape(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous)) + case .bordered: + content + .clipShape(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous)) + .overlay(RoundedRectangle(cornerRadius: .cornerRadius12).stroke(Color.themeSteel20, lineWidth: .heightOneDp)) + case .transparent: + content } } +} + +struct ListStyleButtonModifier: ViewModifier { + let listStyle: ListStyle + let isPressed: Bool - var borderColor: Color { - switch self { - case .lawrence: return .clear - case .bordered: return .themeSteel20 + func body(content: Content) -> some View { + switch listStyle { + case .lawrence: content.background(isPressed ? Color.themeLawrencePressed : Color.themeLawrence) + case .bordered, .transparent: content.background(isPressed ? Color.themeLawrencePressed : Color.clear) } } } diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift index 7e83f83c71..55c9d06231 100644 --- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift +++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift @@ -5,6 +5,6 @@ struct RowButtonStyle: ButtonStyle { func makeBody(configuration: Self.Configuration) -> some View { configuration.label - .background(configuration.isPressed ? Color.themeLawrencePressed : listStyle.backgroundColor) + .modifier(ListStyleButtonModifier(listStyle: listStyle, isPressed: configuration.isPressed)) } } diff --git a/UnstoppableWallet/Widget/AppWidgetBundle.swift b/UnstoppableWallet/Widget/AppWidgetBundle.swift index dccc7d0608..48cad1217c 100644 --- a/UnstoppableWallet/Widget/AppWidgetBundle.swift +++ b/UnstoppableWallet/Widget/AppWidgetBundle.swift @@ -5,5 +5,6 @@ import WidgetKit struct AppWidgetBundle: WidgetBundle { var body: some Widget { SingleCoinPriceWidget() + TopCoinsWidget() } } diff --git a/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListEntry.swift b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListEntry.swift new file mode 100644 index 0000000000..2501ddf929 --- /dev/null +++ b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListEntry.swift @@ -0,0 +1,20 @@ +import Foundation +import SwiftUI +import WidgetKit + +struct CoinPriceListEntry: TimelineEntry { + let date: Date + let title: String + let sortType: String + let items: [Item] + + struct Item { + let uid: String + let icon: Image? + let code: String + let name: String + let price: String + let priceChange: String + let priceChangeType: PriceChangeType + } +} diff --git a/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListProvider.swift b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListProvider.swift new file mode 100644 index 0000000000..3aa51faf61 --- /dev/null +++ b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListProvider.swift @@ -0,0 +1,107 @@ +import Foundation +import SwiftUI +import WidgetKit + +struct CoinPriceListProvider: IntentTimelineProvider { + func placeholder(in context: Context) -> CoinPriceListEntry { + let count: Int + + switch context.family { + case .systemSmall, .systemMedium: count = 3 + default: count = 6 + } + + return CoinPriceListEntry( + date: Date(), + title: "Top Coins", + sortType: "Highest Cap", + items: (1 ... count).map { index in + CoinPriceListEntry.Item( + uid: "coin\(index)", + icon: nil, + code: "COD\(index)", + name: "Coin Name \(index)", + price: "$1234", + priceChange: "1.23", + priceChangeType: .unknown + ) + } + ) + } + + func getSnapshot(for _: CoinPriceListIntent, in context: Context, completion: @escaping (CoinPriceListEntry) -> Void) { + Task { + let entry = try await fetch(sortType: .highestCap, family: context.family) + completion(entry) + } + } + + func getTimeline(for configuration: CoinPriceListIntent, in context: Context, completion: @escaping (Timeline) -> Void) { + Task { + let entry = try await fetch(sortType: configuration.sortBy, family: context.family) + + if let nextUpdate = Calendar.current.date(byAdding: DateComponents(minute: 15), to: Date()) { + let timeline = Timeline(entries: [entry], policy: .after(nextUpdate)) + completion(timeline) + } + } + } + + private func fetch(sortType: SortType, family: WidgetFamily) async throws -> CoinPriceListEntry { + let currency = CurrencyManager(storage: SharedLocalStorage()).baseCurrency + let apiProvider = ApiProvider(baseUrl: "https://api-dev.blocksdecoded.com") + + let listType: ApiProvider.ListType + let listOrder: ApiProvider.ListOrder + let limit: Int + + switch sortType { + case .highestCap, .lowestCap, .unknown: listType = .mcap + case .highestVolume, .lowestVolume: listType = .volume + case .topGainers, .topLosers: listType = .price + } + + switch sortType { + case .highestCap, .highestVolume, .topGainers, .unknown: listOrder = .desc + case .lowestCap, .lowestVolume, .topLosers: listOrder = .asc + } + + switch family { + case .systemSmall, .systemMedium: limit = 3 + default: limit = 6 + } + + let coins = try await apiProvider.listCoins(type: listType, order: listOrder, limit: limit, currencyCode: currency.code) + + return CoinPriceListEntry( + date: Date(), + title: "Top Coins", + sortType: title(sortType: sortType), + items: coins.map { coin in + let iconUrl = "https://cdn.blocksdecoded.com/coin-icons/32px/\(coin.uid)@3x.png" + let coinIcon = URL(string: iconUrl).flatMap { try? Data(contentsOf: $0) }.flatMap { UIImage(data: $0) }.map { Image(uiImage: $0) } + + return CoinPriceListEntry.Item( + uid: coin.uid, + icon: coinIcon, + code: coin.code, + name: coin.name, + price: coin.price.flatMap { ValueFormatter.format(currency: currency, value: $0) } ?? "n/a", + priceChange: coin.priceChange24h.flatMap { ValueFormatter.format(percentValue: $0) } ?? "n/a", + priceChangeType: coin.priceChange24h.map { $0 >= 0 ? .up : .down } ?? .unknown + ) + } + ) + } + + private func title(sortType: SortType) -> String { + switch sortType { + case .highestCap, .unknown: return "Highest Cap" + case .lowestCap: return "Lowest Cap" + case .highestVolume: return "Highest Volume" + case .lowestVolume: return "Lowest Volume" + case .topGainers: return "Top Gainers" + case .topLosers: return "Top Losers" + } + } +} diff --git a/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListView.swift b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListView.swift new file mode 100644 index 0000000000..f7144edbcc --- /dev/null +++ b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListView.swift @@ -0,0 +1,128 @@ +import Charts +import SwiftUI +import WidgetKit + +struct CoinPriceListView: View { + var entry: CoinPriceListProvider.Entry + + @Environment(\.widgetFamily) private var family + + var body: some View { + switch family { + case .systemSmall: smallView() + case .systemMedium: mediumView() + default: largeView() + } + } + + @ViewBuilder private func smallView() -> some View { + ListSection { + ForEach(entry.items, id: \.uid) { item in + HStack(spacing: .margin8) { + icon(image: item.icon) + + VStack(spacing: 1) { + Text(item.price) + .frame(maxWidth: .infinity, alignment: .leading) + .font(.themeSubhead1) + .foregroundColor(.themeLeah) + Text(item.priceChange) + .frame(maxWidth: .infinity, alignment: .leading) + .font(.themeCaption) + .foregroundColor(item.priceChangeType.color) + } + } + .padding(.horizontal, .margin16) + .frame(maxHeight: .infinity) + } + } + .listStyle(.transparent) + .frame(maxHeight: .infinity) + .padding(.vertical, .margin4) + } + + @ViewBuilder private func mediumView() -> some View { + ListSection { + ForEach(entry.items, id: \.uid) { item in + row(item: item) + } + } + .listStyle(.transparent) + .frame(maxHeight: .infinity) + .padding(.vertical, .margin4) + } + + @ViewBuilder private func largeView() -> some View { + VStack(spacing: 0) { + HStack(spacing: .margin16) { + Text(entry.title) + .frame(maxWidth: .infinity, alignment: .leading) + .font(.themeSubhead1) + .foregroundColor(.themeLeah) + + Text(entry.sortType) + .frame(maxWidth: .infinity, alignment: .trailing) + .font(.themeSubhead2) + .foregroundColor(.themeGray) + } + .padding(.margin16) + + HorizontalDivider() + + ListSection { + ForEach(entry.items, id: \.uid) { item in + row(item: item) + } + } + .listStyle(.transparent) + .frame(maxHeight: .infinity) + } + .padding(.vertical, .margin4) + } + + @ViewBuilder private func icon(image: Image?) -> some View { + if let image = image { + image + .resizable() + .scaledToFit() + .frame(width: .iconSize32, height: .iconSize32) + } else { + Circle() + .fill(Color.themeGray) + .frame(width: .iconSize32, height: .iconSize32) + } + } + + @ViewBuilder private func row(item: CoinPriceListEntry.Item) -> some View { + HStack(spacing: .margin16) { + icon(image: item.icon) + + VStack(spacing: 1) { + HStack(spacing: .margin16) { + Text(item.code.uppercased()) + .frame(maxWidth: .infinity, alignment: .leading) + .font(.themeSubhead1) + .foregroundColor(.themeLeah) + + Text(item.price) + .frame(maxWidth: .infinity, alignment: .trailing) + .font(.themeSubhead1) + .foregroundColor(.themeLeah) + } + + HStack(spacing: .margin16) { + Text(item.name) + .frame(maxWidth: .infinity, alignment: .leading) + .font(.themeSubhead2) + .foregroundColor(.themeGray) + + Text(item.priceChange) + .font(.themeSubhead2) + .foregroundColor(item.priceChangeType.color) + } + } + } + .padding(.horizontal, .margin16) + .frame(maxHeight: .infinity) + } +} diff --git a/UnstoppableWallet/Widget/ApiProvider.swift b/UnstoppableWallet/Widget/Misc/ApiProvider.swift similarity index 73% rename from UnstoppableWallet/Widget/ApiProvider.swift rename to UnstoppableWallet/Widget/Misc/ApiProvider.swift index afe6836f65..7d29e766af 100644 --- a/UnstoppableWallet/Widget/ApiProvider.swift +++ b/UnstoppableWallet/Widget/Misc/ApiProvider.swift @@ -36,17 +36,27 @@ class ApiProvider { return try await networkManager.fetch(url: "\(baseUrl)/v1/coins", method: .get, parameters: parameters, headers: headers) } - func coinWithPrice(uid: String, currencyCode: String) async throws -> CoinWithPrice { + func listCoins(type: ListType, order: ListOrder, limit: Int, currencyCode: String) async throws -> [Coin] { + let parameters: Parameters = [ + "order": order.rawValue, + "limit": limit, + "currency": currencyCode.lowercased(), + ] + + return try await networkManager.fetch(url: "\(baseUrl)/v1/coins/top-movers-by/\(type.rawValue)", method: .get, parameters: parameters, headers: headers) + } + + func coinWithPrice(uid: String, currencyCode: String) async throws -> Coin { let parameters: Parameters = [ "uids": uid, "fields": "uid,name,code,price,price_change_24h", "currency": currencyCode.lowercased(), ] - let coinsWithPrice: [CoinWithPrice] = try await networkManager.fetch(url: "\(baseUrl)/v1/coins", method: .get, parameters: parameters, headers: headers) + let coins: [Coin] = try await networkManager.fetch(url: "\(baseUrl)/v1/coins", method: .get, parameters: parameters, headers: headers) - if let coinWithPrice = coinsWithPrice.first { - return coinWithPrice + if let coin = coins.first { + return coin } else { throw ResponseError.coinNotFound } @@ -65,33 +75,32 @@ class ApiProvider { enum ResponseError: Error { case coinNotFound } -} -struct Coin: ImmutableMappable { - let uid: String - let name: String - let code: String + enum ListOrder: String { + case asc + case desc + } - init(map: Map) throws { - uid = try map.value("uid") - name = try map.value("name") - code = try map.value("code") + enum ListType: String { + case price + case volume + case mcap } } -struct CoinWithPrice: ImmutableMappable { +struct Coin: ImmutableMappable { let uid: String let name: String let code: String - let price: Decimal - let priceChange24h: Decimal + let price: Decimal? + let priceChange24h: Decimal? init(map: Map) throws { uid = try map.value("uid") name = try map.value("name") code = try map.value("code") - price = try map.value("price", using: Transform.stringToDecimalTransform) - priceChange24h = try map.value("price_change_24h", using: Transform.stringToDecimalTransform) + price = try? map.value("price", using: Transform.stringToDecimalTransform) + priceChange24h = try? map.value("price_change_24h", using: Transform.stringToDecimalTransform) } } diff --git a/UnstoppableWallet/Widget/Misc/PriceChangeType.swift b/UnstoppableWallet/Widget/Misc/PriceChangeType.swift new file mode 100644 index 0000000000..5ae78da73d --- /dev/null +++ b/UnstoppableWallet/Widget/Misc/PriceChangeType.swift @@ -0,0 +1,14 @@ +import SwiftUI +import ThemeKit + +enum PriceChangeType { + case up, down, unknown + + var color: Color { + switch self { + case .up: return .themeRemus + case .down: return .themeLucian + case .unknown: return .themeGray + } + } +} diff --git a/UnstoppableWallet/Widget/ValueFormatter.swift b/UnstoppableWallet/Widget/Misc/ValueFormatter.swift similarity index 100% rename from UnstoppableWallet/Widget/ValueFormatter.swift rename to UnstoppableWallet/Widget/Misc/ValueFormatter.swift diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift index 44708e61b7..de06d1dfa9 100644 --- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift +++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift @@ -7,9 +7,9 @@ struct SingleCoinPriceEntry: TimelineEntry { let coinUid: String let coinIcon: Image? let coinCode: String - let price: Decimal - let currency: Currency - let priceChange: Decimal + let price: String + let priceChange: String + let priceChangeType: PriceChangeType let chartPoints: [ChartPoint]? struct ChartPoint: Identifiable { diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift index 416c9eb1c3..204b8c7e36 100644 --- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift +++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift @@ -11,9 +11,9 @@ struct SingleCoinPriceProvider: IntentTimelineProvider { coinUid: fallbackCoinUid, coinIcon: nil, coinCode: "BTC", - price: 30000, - currency: Currency(code: "USD", symbol: "$", decimal: 2), - priceChange: 2.45, + price: "$30000", + priceChange: "2.45", + priceChangeType: .unknown, chartPoints: placeholderChartPoints() ) } @@ -39,17 +39,17 @@ struct SingleCoinPriceProvider: IntentTimelineProvider { } private func fetch(coinUid: String) async throws -> SingleCoinPriceEntry { - let currencyManager = CurrencyManager(storage: SharedLocalStorage()) + let currency = CurrencyManager(storage: SharedLocalStorage()).baseCurrency let apiProvider = ApiProvider(baseUrl: "https://api-dev.blocksdecoded.com") - let coin = try await apiProvider.coinWithPrice(uid: coinUid, currencyCode: currencyManager.baseCurrency.code) + let coin = try await apiProvider.coinWithPrice(uid: coinUid, currencyCode: currency.code) let iconUrl = "https://cdn.blocksdecoded.com/coin-icons/32px/\(coin.uid)@3x.png" let coinIcon = URL(string: iconUrl).flatMap { try? Data(contentsOf: $0) }.flatMap { UIImage(data: $0) }.map { Image(uiImage: $0) } var chartPoints: [SingleCoinPriceEntry.ChartPoint]? - if let points = try? await apiProvider.coinPriceChart(coinUid: coinUid, currencyCode: currencyManager.baseCurrency.code) { + if let points = try? await apiProvider.coinPriceChart(coinUid: coinUid, currencyCode: currency.code) { chartPoints = points .sorted { point, point2 in point.timestamp < point2.timestamp @@ -67,9 +67,9 @@ struct SingleCoinPriceProvider: IntentTimelineProvider { coinUid: coin.uid, coinIcon: coinIcon, coinCode: coin.code, - price: coin.price, - currency: currencyManager.baseCurrency, - priceChange: coin.priceChange24h, + price: coin.price.flatMap { ValueFormatter.format(currency: currency, value: $0) } ?? "n/a", + priceChange: coin.priceChange24h.flatMap { ValueFormatter.format(percentValue: $0) } ?? "n/a", + priceChangeType: coin.priceChange24h.map { $0 >= 0 ? .up : .down } ?? .unknown, chartPoints: chartPoints ) } diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift index 96e94251c7..cadc50c2c7 100644 --- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift +++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift @@ -49,21 +49,18 @@ struct SingleCoinPriceView: View { } VStack(alignment: .leading, spacing: 1) { - if let formattedValue = ValueFormatter.format(percentValue: entry.priceChange) { - Text(formattedValue) - .font(.themeSubhead2) - .foregroundColor(entry.priceChange >= 0 ? .themeRemus : .themeLucian) - } + Text(entry.priceChange) + .font(.themeSubhead2) + .foregroundColor(entry.priceChangeType.color) - if let formattedValue = ValueFormatter.format(currency: entry.currency, value: entry.price) { - Text(formattedValue) - .frame(maxWidth: .infinity, alignment: .leading) - .frame(height: 26) - .minimumScaleFactor(0.5) - .font(.themeHeadline1) - .foregroundColor(.themeLeah) - } + Text(entry.price) + .frame(maxWidth: .infinity, alignment: .leading) + .frame(height: 26) + .minimumScaleFactor(0.5) + .font(.themeHeadline1) + .foregroundColor(.themeLeah) } } + .padding(.margin16) } } diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition index 72c9ff2cf6..56bea18d0a 100644 --- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition +++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition @@ -3,13 +3,97 @@ INEnums - + + + INEnumDisplayName + Sort Type + INEnumDisplayNameID + ZBHf6A + INEnumGeneratesHeader + + INEnumName + SortType + INEnumType + Regular + INEnumValues + + + INEnumValueDisplayName + unknown + INEnumValueDisplayNameID + XtJmIS + INEnumValueName + unknown + + + INEnumValueDisplayName + Highest Cap + INEnumValueDisplayNameID + qHGyuo + INEnumValueIndex + 1 + INEnumValueName + highestCap + + + INEnumValueDisplayName + Lowest Cap + INEnumValueDisplayNameID + tVjZ7W + INEnumValueIndex + 2 + INEnumValueName + lowestCap + + + INEnumValueDisplayName + Highest Volume + INEnumValueDisplayNameID + t6AKQ5 + INEnumValueIndex + 3 + INEnumValueName + highestVolume + + + INEnumValueDisplayName + Lowest Volume + INEnumValueDisplayNameID + C1LmDj + INEnumValueIndex + 4 + INEnumValueName + lowestVolume + + + INEnumValueDisplayName + Top Gainers + INEnumValueDisplayNameID + Rl3a0T + INEnumValueIndex + 5 + INEnumValueName + topGainers + + + INEnumValueDisplayName + Top Losers + INEnumValueDisplayNameID + x1kK4T + INEnumValueIndex + 6 + INEnumValueName + topLosers + + + + INIntentDefinitionModelVersion 1.2 INIntentDefinitionNamespace 5N3KPh INIntentDefinitionSystemVersion - 22G91 + 23A344 INIntentDefinitionToolsBuildVersion 15A240d INIntentDefinitionToolsVersion @@ -47,6 +131,89 @@ INIntentParameterObjectTypeNamespace 5N3KPh INIntentParameterPromptDialogs + + + INIntentParameterPromptDialogCustom + + INIntentParameterPromptDialogType + Configuration + + + INIntentParameterPromptDialogCustom + + INIntentParameterPromptDialogType + Primary + + + INIntentParameterSupportsDynamicEnumeration + + INIntentParameterTag + 2 + INIntentParameterType + Object + + + INIntentResponse + + INIntentResponseCodes + + + INIntentResponseCodeName + success + INIntentResponseCodeSuccess + + + + INIntentResponseCodeName + failure + + + + INIntentTitle + Single Coin Price + INIntentTitleID + hrLfmt + INIntentType + Custom + INIntentVerb + Do + + + INIntentCategory + information + INIntentDescriptionID + rCV9fg + INIntentEligibleForWidgets + + INIntentIneligibleForSuggestions + + INIntentLastParameterTag + 3 + INIntentName + CoinPriceList + INIntentParameters + + + INIntentParameterConfigurable + + INIntentParameterDisplayName + Sort By + INIntentParameterDisplayNameID + 8vJheC + INIntentParameterDisplayPriority + 1 + INIntentParameterEnumType + SortType + INIntentParameterEnumTypeNamespace + 5N3KPh + INIntentParameterMetadata + + INIntentParameterMetadataDefaultValue + highestCap + + INIntentParameterName + sortBy + INIntentParameterPromptDialogs INIntentParameterPromptDialogCustom @@ -64,9 +231,9 @@ INIntentParameterPromptDialogCustom INIntentParameterPromptDialogFormatString - There are ${count} options matching ‘${selectedCoin}’. + There are ${count} options matching ‘${sortBy}’. INIntentParameterPromptDialogFormatStringID - 2fP1jb + nj8Co9 INIntentParameterPromptDialogType DisambiguationIntroduction @@ -74,19 +241,17 @@ INIntentParameterPromptDialogCustom INIntentParameterPromptDialogFormatString - Just to confirm, you wanted ‘${selectedCoin}’? + Just to confirm, you wanted ‘${sortBy}’? INIntentParameterPromptDialogFormatStringID - jqvOcG + Iodq3O INIntentParameterPromptDialogType Confirmation - INIntentParameterSupportsDynamicEnumeration - INIntentParameterTag - 2 + 3 INIntentParameterType - Object + Integer INIntentResponse @@ -106,13 +271,13 @@ INIntentTitle - Single Coin Price + Coin Price List INIntentTitleID - hrLfmt + 2puq80 INIntentType Custom INIntentVerb - Do + View INTypes diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.swift b/UnstoppableWallet/Widget/SingleCoinPriceWidget.swift similarity index 94% rename from UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.swift rename to UnstoppableWallet/Widget/SingleCoinPriceWidget.swift index 4114867cd7..7394310eaf 100644 --- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.swift +++ b/UnstoppableWallet/Widget/SingleCoinPriceWidget.swift @@ -1,6 +1,5 @@ import Foundation import SwiftUI -import ThemeKit import WidgetKit struct SingleCoinPriceWidget: Widget { @@ -17,10 +16,10 @@ struct SingleCoinPriceWidget: Widget { .containerBackground(.fill.tertiary, for: .widget) } else { SingleCoinPriceView(entry: entry) - .padding() .background() } } + .contentMarginsDisabled() .configurationDisplayName("Coin Price") .description("Displays price for certain coin.") .supportedFamilies([ diff --git a/UnstoppableWallet/Widget/TopCoinsWidget.swift b/UnstoppableWallet/Widget/TopCoinsWidget.swift new file mode 100644 index 0000000000..bb452e6003 --- /dev/null +++ b/UnstoppableWallet/Widget/TopCoinsWidget.swift @@ -0,0 +1,31 @@ +import Foundation +import SwiftUI +import WidgetKit + +struct TopCoinsWidget: Widget { + let kind: String = "io.horizontalsystems.unstoppable.TopCoinsWidget" + + var body: some WidgetConfiguration { + IntentConfiguration( + kind: kind, + intent: CoinPriceListIntent.self, + provider: CoinPriceListProvider() + ) { entry in + if #available(iOS 17.0, *) { + CoinPriceListView(entry: entry) + .containerBackground(.fill.tertiary, for: .widget) + } else { + CoinPriceListView(entry: entry) + .background() + } + } + .contentMarginsDisabled() + .configurationDisplayName("Top Coins") + .description("Displays price for top coins.") + .supportedFamilies([ + .systemSmall, + .systemMedium, + .systemLarge, + ]) + } +}