From 2e5b88cdcae4c66e411eb794917104ca803dc158 Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 9 Jul 2024 15:07:01 +0300 Subject: [PATCH 1/3] Updated place to login/logout to view vaulted domains --- .../PreviewWalletConnectServiceV2.swift | 2 + .../Entities/PreviewDomainItem.swift | 2 +- .../Extensions/Extension-String+Preview.swift | 3 +- .../QRScanner/QRScannerViewPresenter.swift | 16 ++-- .../Settings/SettingsProfilesView.swift | 71 +++++++++++--- .../Modules/Settings/SettingsView.swift | 96 ++++++------------- .../AnalyticsServiceEnvironment.swift | 2 +- .../Localization/en.lproj/Localizable.strings | 1 + 8 files changed, 103 insertions(+), 90 deletions(-) diff --git a/unstoppable-ios-app/domains-manager-ios-preview/AppContext/PreviewWalletConnectServiceV2.swift b/unstoppable-ios-app/domains-manager-ios-preview/AppContext/PreviewWalletConnectServiceV2.swift index f8e535601..063c520f6 100644 --- a/unstoppable-ios-app/domains-manager-ios-preview/AppContext/PreviewWalletConnectServiceV2.swift +++ b/unstoppable-ios-app/domains-manager-ios-preview/AppContext/PreviewWalletConnectServiceV2.swift @@ -11,6 +11,8 @@ typealias ResponseV2 = String typealias SessionV2Proxy = String final class WalletConnectServiceV2: WalletConnectServiceV2Protocol { + static let supportedNetworks: [BlockchainType] = [.Ethereum, .Matic] + func sendSignTx(sessions: [WCConnectedAppsStorageV2.SessionProxy], chainId: Int, tx: EthereumTransaction, address: HexAddress, in wallet: UDWallet) async throws -> ResponseV2 { throw NSError() } diff --git a/unstoppable-ios-app/domains-manager-ios-preview/Entities/PreviewDomainItem.swift b/unstoppable-ios-app/domains-manager-ios-preview/Entities/PreviewDomainItem.swift index 0d41c0002..5a7383f80 100644 --- a/unstoppable-ios-app/domains-manager-ios-preview/Entities/PreviewDomainItem.swift +++ b/unstoppable-ios-app/domains-manager-ios-preview/Entities/PreviewDomainItem.swift @@ -14,7 +14,7 @@ struct DomainItem: DomainEntity { func doesRequirePayment() -> Bool { switch self.getBlockchainType() { - case .Ethereum: return true + case .Ethereum, .Base: return true case .Matic: return false } } diff --git a/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift b/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift index 8fecfb9d2..a2717d680 100644 --- a/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift +++ b/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift @@ -459,7 +459,8 @@ extension String { static let settingsAppearanceChooseTheme = "SETTINGS_APPEARANCE_CHOOSE_THEME" static let youAreUnstoppable = "YOU_ARE_UNSTOPPABLE" static let feedbackEmailSubject = "FEEDBACK_EMAIL_SUBJECT" - + static let viewOrMoveVaultedDomains = "VIEW_OR_MOVE_VAULTED_DOMAINS" + // Wallets list static let manageICloudBackups = "MANAGE_ICLOUD_BACKUPS" static let restoreFromICloudBackup = "RESTORE_FROM_ICLOUD_BACKUP" diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/QRScanner/QRScannerViewPresenter.swift b/unstoppable-ios-app/domains-manager-ios/Modules/QRScanner/QRScannerViewPresenter.swift index 046de2706..c5fff4567 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/QRScanner/QRScannerViewPresenter.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/QRScanner/QRScannerViewPresenter.swift @@ -18,7 +18,6 @@ protocol QRScannerViewPresenterProtocol: BasePresenterProtocol { func didSelectBlockchainType(_ blockchainType: BlockchainType) } -@MainActor final class QRScannerViewPresenter: ViewAnalyticsLogger { internal weak var view: QRScannerViewProtocol? @@ -164,15 +163,18 @@ extension QRScannerViewPresenter: WalletConnectServiceConnectionListener { // MARK: - Private functions private extension QRScannerViewPresenter { func setBlockchainTypePicker() { - view?.setBlockchainTypeSelectionWith(availableTypes: WalletConnectServiceV2.supportedNetworks, selectedType: blockchainType) + Task { @MainActor in + view?.setBlockchainTypeSelectionWith(availableTypes: WalletConnectServiceV2.supportedNetworks, selectedType: blockchainType) + } } func setSelected(wallet: WalletEntity) { let wallets = walletsDataService.wallets self.selectedWallet = wallet - - view?.setWith(wallet: wallet, - isSelectable: wallets.count > 1) + Task { @MainActor in + view?.setWith(wallet: wallet, + isSelectable: wallets.count > 1) + } } func setSelectedWalletInfo() { @@ -183,7 +185,9 @@ private extension QRScannerViewPresenter { func showNumberOfAppsConnected() { let appsConnected = walletConnectServiceV2.getConnectedApps() - view?.setWith(appsConnected: appsConnected.count) + Task { @MainActor in + view?.setWith(appsConnected: appsConnected.count) + } } func getWCConnectionRequest(for code: QRCode) async throws -> WCRequest { diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfilesView.swift b/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfilesView.swift index 419c47aee..f27511f70 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfilesView.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfilesView.swift @@ -22,24 +22,69 @@ struct SettingsProfilesView: View, ViewAnalyticsLogger { var body: some View { LazyVGrid(columns: gridColumns, spacing: 16) { ForEach(profiles, id: \.id) { profile in - Button { - logButtonPressedAnalyticEvents(button: .walletInList) - UDVibration.buttonTap.vibrate() - switch profile { - case .wallet(let wallet): - tabRouter.walletViewNavPath.append(.walletDetails(wallet)) - case .webAccount: - return - } - } label: { - SettingsProfileTileView(profile: profile) - } - .buttonStyle(.plain) + tileViewForProfile(profile) } } } } +// MARK: - Private methods +private extension SettingsProfilesView { + @ViewBuilder + func tileViewForProfile(_ profile: UserProfile) -> some View { + switch profile { + case .wallet(let wallet): + titleViewForWalletProfile(profile, wallet: wallet) + case .webAccount(let firebaseUser): + titleViewForFirebaseUserProfile(profile, + firebaseUser: firebaseUser) + } + } + + @ViewBuilder + func titleViewForWalletProfile(_ profile: UserProfile, + wallet: WalletEntity) -> some View { + Button { + logButtonPressedAnalyticEvents(button: .walletInList) + UDVibration.buttonTap.vibrate() + tabRouter.walletViewNavPath.append(.walletDetails(wallet)) + } label: { + SettingsProfileTileView(profile: profile) + } + .buttonStyle(.plain) + } + + @ViewBuilder + func titleViewForFirebaseUserProfile(_ profile: UserProfile, + firebaseUser: FirebaseUser) -> some View { + Menu { + Button(role: .destructive) { + askToLogOut() + } label: { + Label(String.Constants.logOut.localized(), systemImage: "rectangle.portrait.and.arrow.right") + } + } label: { + SettingsProfileTileView(profile: profile) + } + .onButtonTap { + logButtonPressedAnalyticEvents(button: .logOut) + } + } + + func askToLogOut() { + Task { @MainActor in + guard let topVC = appContext.coreAppCoordinator.topVC else { return } + + do { + try await appContext.pullUpViewService.showLogoutConfirmationPullUp(in: topVC) + await topVC.dismissPullUpMenu() + try await appContext.authentificationService.verifyWith(uiHandler: topVC, purpose: .confirm) + appContext.firebaseParkedDomainsAuthenticationService.logOut() + appContext.toastMessageService.showToast(.userLoggedOut, isSticky: false) + } + } + } +} #Preview { SettingsProfilesView(profiles: [MockEntitiesFabric.Profile.createWalletProfile(), diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsView.swift b/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsView.swift index 0f8ba9ae1..02db0bd78 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsView.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsView.swift @@ -33,9 +33,6 @@ struct SettingsView: View, ViewAnalyticsLogger { .navigationTitle(String.Constants.settings.localized()) .navigationBarTitleDisplayMode(.large) .viewPullUp($pullUp) - .toolbar { - ToolbarItem(placement: .topBarTrailing, content: topBarButton) - } .onAppear(perform: onAppear) } @@ -78,69 +75,7 @@ private extension SettingsView { Spacer() } } - - var webUser: FirebaseUser? { - for profile in profiles { - if case .webAccount(let firebaseUser) = profile { - return firebaseUser - } - } - return nil - } - - @ViewBuilder - func topBarButton() -> some View { - if let webUser { - webUserActionButton(webUser) - } else { - loginButton() - } - } - - @ViewBuilder - func webUserActionButton(_ webUser: FirebaseUser) -> some View { - Menu { - Button(role: .destructive) { - askToLogOut() - } label: { - Label(String.Constants.logOut.localized(), systemImage: "rectangle.portrait.and.arrow.right") - } - } label: { - Image.peopleCircleIcon - .resizable() - .squareFrame(28) - .foregroundStyle(Color.foregroundDefault) - } - .onButtonTap { - logButtonPressedAnalyticEvents(button: .logOut) - } - } - - func askToLogOut() { - Task { @MainActor in - guard let topVC = appContext.coreAppCoordinator.topVC else { return } - - do { - try await appContext.pullUpViewService.showLogoutConfirmationPullUp(in: topVC) - await topVC.dismissPullUpMenu() - try await appContext.authentificationService.verifyWith(uiHandler: topVC, purpose: .confirm) - appContext.firebaseParkedDomainsAuthenticationService.logOut() - appContext.toastMessageService.showToast(.userLoggedOut, isSticky: false) - } - } - } - - @ViewBuilder - func loginButton() -> some View { - Button { - UDVibration.buttonTap.vibrate() - logButtonPressedAnalyticEvents(button: .logIn) - pullUp = .default(.loginOptionsSelectionPullUp(selectionCallback: didSelectToAuthWith)) - } label: { - topActinTextView(text: String.Constants.login.localized()) - } - } - + @ViewBuilder func topActinTextView(text: String) -> some View { Text(text) @@ -392,11 +327,28 @@ private extension SettingsView { otherItemsList() } + var settingsItemsToShow: [SettingsItems] { + var items = SettingsItems.allCases + if webUser != nil { + items.removeAll(where: { $0 == .viewVaulted }) + } + return items + } + + var webUser: FirebaseUser? { + for profile in profiles { + if case .webAccount(let firebaseUser) = profile { + return firebaseUser + } + } + return nil + } + @ViewBuilder func otherItemsList() -> some View { UDCollectionSectionBackgroundView { VStack(alignment: .center, spacing: 0) { - ForEach(SettingsItems.allCases, id: \.self) { moreItem in + ForEach(settingsItemsToShow, id: \.self) { moreItem in listViewFor(otherItem: moreItem) } } @@ -432,6 +384,8 @@ private extension SettingsView { openFeedbackMailForm() case .legal: pullUp = .default(.legalSelectionPullUp(selectionCallback: didSelectLegalType)) + case .viewVaulted: + pullUp = .default(.loginOptionsSelectionPullUp(selectionCallback: didSelectToAuthWith)) } } } @@ -707,7 +661,7 @@ private extension SettingsView { } enum SettingsItems: CaseIterable { - case rateUs, learn, twitter, support, legal + case rateUs, learn, viewVaulted, twitter, support, legal var title: String { switch self { @@ -721,6 +675,8 @@ private extension SettingsView { return String.Constants.settingsSupportNFeedback.localized() case .legal: return String.Constants.settingsLegal.localized() + case .viewVaulted: + return String.Constants.viewOrMoveVaultedDomains.localized() } } @@ -736,6 +692,8 @@ private extension SettingsView { return .settingsIconFeedback case .legal: return .settingsIconLegal + case .viewVaulted: + return .vaultSafeIcon } } @@ -751,6 +709,8 @@ private extension SettingsView { return .settingsSupport case .legal: return .settingsLegal + case .viewVaulted: + return .viewVaultedDomains } } } diff --git a/unstoppable-ios-app/domains-manager-ios/Services/AnalyticsService/AnalyticsServiceEnvironment.swift b/unstoppable-ios-app/domains-manager-ios/Services/AnalyticsService/AnalyticsServiceEnvironment.swift index b2323397f..c57b5bb4f 100644 --- a/unstoppable-ios-app/domains-manager-ios/Services/AnalyticsService/AnalyticsServiceEnvironment.swift +++ b/unstoppable-ios-app/domains-manager-ios/Services/AnalyticsService/AnalyticsServiceEnvironment.swift @@ -322,7 +322,7 @@ extension Analytics { case editProfile, manageDomain, shareLink, saveAsImage, createNFCTag // Settings - case settingsWallets, settingsSecurity, settingsTheme, settingsLearn, settingsTwitter, settingsSupport, settingsLegal, settingsTestnet, settingsHomeScreen, settingsRateUs, settingsWebsiteAccount + case settingsWallets, settingsSecurity, settingsTheme, settingsLearn, settingsTwitter, settingsSupport, settingsLegal, settingsTestnet, settingsHomeScreen, settingsRateUs, settingsWebsiteAccount, viewVaultedDomains // Security settings case securitySettingsPasscode, securitySettingsBiometric, securitySettingsRequireSAWhenOpen diff --git a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings index 45c2316a9..08eee8127 100644 --- a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings +++ b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings @@ -349,6 +349,7 @@ "SETTINGS_APPEARANCE_CHOOSE_THEME" = "Choose theme"; "YOU_ARE_UNSTOPPABLE" = "You are Unstoppable!"; "FEEDBACK_EMAIL_SUBJECT" = "Unstoppable Domains App Feedback - iOS (%@)"; +"VIEW_OR_MOVE_VAULTED_DOMAINS" = "View or move vaulted domains"; // Wallets list "MANAGE_ICLOUD_BACKUPS" = "Manage iCloud backups"; From d9fa4211bb04e349b180970791bfd07377cac8e3 Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 9 Jul 2024 16:10:31 +0300 Subject: [PATCH 2/3] Updated Vaulted domains found view UI --- .../Mock/MockEntitiesFabric+Domains.swift | 6 +- .../domains-manager-ios/Entities/Toast.swift | 11 +- .../Extensions/Extension-String+Preview.swift | 2 +- .../ParkedDomainsFoundViewController.swift | 154 +++--------------- .../ParkedDomainsFoundViewController.xib | 72 ++++---- .../ParkedDomainsFoundViewPresenter.swift | 43 +---- .../Settings/SettingsProfileTileView.swift | 2 +- .../Services/PullUp/PullUpViewService.swift | 63 +------ .../PullUp/PullUpViewServiceProtocol.swift | 6 - .../Contents.json | 15 ++ .../vaultedDomainsFoundIllustration.pdf | Bin 0 -> 73739 bytes .../Localization/en.lproj/Localizable.strings | 2 +- .../en.lproj/Localizable.stringsdict | 2 +- 13 files changed, 90 insertions(+), 288 deletions(-) create mode 100644 unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/Contents.json create mode 100644 unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/vaultedDomainsFoundIllustration.pdf diff --git a/unstoppable-ios-app/domains-manager-ios/Entities/Mock/MockEntitiesFabric+Domains.swift b/unstoppable-ios-app/domains-manager-ios/Entities/Mock/MockEntitiesFabric+Domains.swift index dd23d5bdc..c66290eca 100644 --- a/unstoppable-ios-app/domains-manager-ios/Entities/Mock/MockEntitiesFabric+Domains.swift +++ b/unstoppable-ios-app/domains-manager-ios/Entities/Mock/MockEntitiesFabric+Domains.swift @@ -39,7 +39,7 @@ extension MockEntitiesFabric { domains.append(domain) } } - + return domains } @@ -105,6 +105,10 @@ extension MockEntitiesFabric { ownerAddress: "123") ] } + + static func mockFirebaseDomainsDisplayInfo() -> [FirebaseDomainDisplayInfo] { + mockFirebaseDomains().map { FirebaseDomainDisplayInfo(firebaseDomain: $0) } + } } } diff --git a/unstoppable-ios-app/domains-manager-ios/Entities/Toast.swift b/unstoppable-ios-app/domains-manager-ios/Entities/Toast.swift index 5e447c066..2cd3515f0 100644 --- a/unstoppable-ios-app/domains-manager-ios/Entities/Toast.swift +++ b/unstoppable-ios-app/domains-manager-ios/Entities/Toast.swift @@ -21,7 +21,6 @@ enum Toast: Hashable { case failedToUpdateProfile case itemSaved(name: String) case itemCopied(name: String) - case parkedDomainsImported(_ domainsCount: Int) case userLoggedOut case communityProfileEnabled case purchaseDomainsDiscountApplied(Int) @@ -61,8 +60,6 @@ enum Toast: Hashable { return String.Constants.nSaved.localized(name) case .itemCopied(let name): return String.Constants.nCopied.localized(name) - case .parkedDomainsImported(let domainsCount): - return String.Constants.pluralNParkedDomainsImported.localized(domainsCount, domainsCount) case .userLoggedOut: return String.Constants.userLoggedOutToastMessage.localized() case .communityProfileEnabled: @@ -76,7 +73,7 @@ enum Toast: Hashable { var secondaryMessage: String? { switch self { - case .walletAddressCopied, .walletAdded, .iCloudBackupRestored, .walletRemoved, .walletDisconnected, .noInternetConnection, .changesConfirmed, .mintingSuccessful, .mintingUnavailable, .updatingRecords, .domainCopied, .failedToRefreshBadges, .itemSaved, .itemCopied, .parkedDomainsImported, .userLoggedOut, .communityProfileEnabled, .purchaseDomainsDiscountApplied, .followedProfileAs: + case .walletAddressCopied, .walletAdded, .iCloudBackupRestored, .walletRemoved, .walletDisconnected, .noInternetConnection, .changesConfirmed, .mintingSuccessful, .mintingUnavailable, .updatingRecords, .domainCopied, .failedToRefreshBadges, .itemSaved, .itemCopied, .userLoggedOut, .communityProfileEnabled, .purchaseDomainsDiscountApplied, .followedProfileAs: return nil case .failedToFetchDomainProfileData: return String.Constants.refresh.localized() @@ -87,7 +84,7 @@ enum Toast: Hashable { var style: Style { switch self { - case .walletAddressCopied, .walletAdded, .iCloudBackupRestored, .walletRemoved, .walletDisconnected, .changesConfirmed, .mintingSuccessful, .domainCopied, .itemSaved, .itemCopied, .parkedDomainsImported, .userLoggedOut, .communityProfileEnabled, .purchaseDomainsDiscountApplied, .followedProfileAs: + case .walletAddressCopied, .walletAdded, .iCloudBackupRestored, .walletRemoved, .walletDisconnected, .changesConfirmed, .mintingSuccessful, .domainCopied, .itemSaved, .itemCopied, .userLoggedOut, .communityProfileEnabled, .purchaseDomainsDiscountApplied, .followedProfileAs: return .success case .noInternetConnection, .updatingRecords, .mintingUnavailable, .failedToFetchDomainProfileData, .failedToUpdateProfile: return .dark @@ -98,7 +95,7 @@ enum Toast: Hashable { var image: UIImage { switch self { - case .walletAddressCopied, .walletAdded, .iCloudBackupRestored, .walletRemoved, .walletDisconnected, .changesConfirmed, .mintingSuccessful, .domainCopied, .itemSaved, .itemCopied, .parkedDomainsImported, .userLoggedOut, .communityProfileEnabled, .purchaseDomainsDiscountApplied, .followedProfileAs: + case .walletAddressCopied, .walletAdded, .iCloudBackupRestored, .walletRemoved, .walletDisconnected, .changesConfirmed, .mintingSuccessful, .domainCopied, .itemSaved, .itemCopied, .userLoggedOut, .communityProfileEnabled, .purchaseDomainsDiscountApplied, .followedProfileAs: return .checkCircleWhite case .noInternetConnection: return .connectionOffIcon @@ -147,8 +144,6 @@ enum Toast: Hashable { return lhsName == rhsName case (.itemCopied(let lhsName), .itemCopied(let rhsName)): return lhsName == rhsName - case (.parkedDomainsImported(let lhsCount), .parkedDomainsImported(let rhsCount)): - return lhsCount == rhsCount case (.userLoggedOut, .userLoggedOut): return true case (.communityProfileEnabled, .communityProfileEnabled): diff --git a/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift b/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift index a2717d680..3a7fc3474 100644 --- a/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift +++ b/unstoppable-ios-app/domains-manager-ios/Extensions/Extension-String+Preview.swift @@ -1272,7 +1272,7 @@ extension String { static let reviewTxAgain = "REVIEW_TX_AGAIN" static let confirmAndSend = "CONFIRM_AND_SEND" - static let parkedDomains = "PARKED_DOMAINS" + static let domainVault = "DOMAIN_VAULT" static let backedUp = "BACKED_UP" static let backUp = "BACK_UP" static let setAsPrimaryDomain = "SET_AS_PRIMARY_DOMAIN" diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.swift b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.swift index 84e558b2b..abaca57df 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.swift @@ -8,77 +8,37 @@ import UIKit @MainActor -protocol ParkedDomainsFoundViewProtocol: BaseCollectionViewControllerProtocol & ViewWithDashesProgress{ - func applySnapshot(_ snapshot: ParkedDomainsFoundSnapshot, animated: Bool) +protocol ParkedDomainsFoundViewProtocol: ViewWithDashesProgress{ + func setWith(email: String, numberOfDomainsFound: Int) } -typealias ParkedDomainsFoundDataSource = UICollectionViewDiffableDataSource -typealias ParkedDomainsFoundSnapshot = NSDiffableDataSourceSnapshot - @MainActor final class ParkedDomainsFoundViewController: BaseViewController { - @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet private weak var emailLabel: UILabel! + @IBOutlet private weak var titleLabel: UDTitleLabel! @IBOutlet private weak var importButton: MainButton! - var cellIdentifiers: [UICollectionViewCell.Type] { [ParkedDomainCell.self] } var presenter: ParkedDomainsFoundViewPresenterProtocol! - private var dataSource: ParkedDomainsFoundDataSource! - override var prefersLargeTitles: Bool { true } - override var largeTitleAlignment: NSTextAlignment { .center } - override var largeTitleIcon: UIImage? { .checkmark } - override var largeTitleIconTintColor: UIColor { .foregroundSuccess } - override var scrollableContentYOffset: CGFloat? { 10 } - override var adjustLargeTitleFontSizeForSmallerDevice: Bool { true } override var analyticsName: Analytics.ViewName { .parkedDomainsList } override func viewDidLoad() { super.viewDidLoad() - configureCollectionView() setup() presenter.viewDidLoad() } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - -// cNavigationBar?.setBackButton(hidden: true) - } } // MARK: - ParkedDomainsFoundViewProtocol extension ParkedDomainsFoundViewController: ParkedDomainsFoundViewProtocol { var progress: Double? { presenter.progress } - func applySnapshot(_ snapshot: ParkedDomainsFoundSnapshot, animated: Bool) { - dataSource.apply(snapshot, animatingDifferences: animated) - } -} - -// MARK: - UICollectionViewDelegate -extension ParkedDomainsFoundViewController: UICollectionViewDelegate { - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - guard let item = dataSource.itemIdentifier(for: indexPath) else { return } - switch item { - case .parkedDomain(let domain): - logAnalytic(event: .domainPressed, parameters: [.domainName: domain.name]) - } - presenter.didSelectItem(item) - } - - func scrollViewDidScroll(_ scrollView: UIScrollView) { - cNavigationController?.underlyingScrollViewDidScroll(scrollView) - } - - func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { - if !decelerate { - cNavigationController?.underlyingScrollViewDidFinishScroll(scrollView) - } - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - cNavigationController?.underlyingScrollViewDidFinishScroll(scrollView) + func setWith(email: String, numberOfDomainsFound: Int) { + emailLabel.setAttributedTextWith(text: email, + font: .currentFont(withSize: 16, weight: .medium), + textColor: .foregroundSuccess) + titleLabel.setTitle(String.Constants.pluralNParkedDomainsImported.localized(numberOfDomainsFound, numberOfDomainsFound)) } } @@ -94,93 +54,23 @@ private extension ParkedDomainsFoundViewController { private extension ParkedDomainsFoundViewController { func setup() { addProgressDashesView() - setupCollectionView() - title = presenter.title importButton.setTitle(String.Constants.viewVaultedDomains.localized(), image: nil) } - func setupCollectionView() { - collectionView.delegate = self - collectionView.collectionViewLayout = buildLayout() - collectionView.contentInset.top = 177 - collectionView.register(CollectionTextHeaderReusableView.self, - forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, - withReuseIdentifier: CollectionTextHeaderReusableView.reuseIdentifier) - - configureDataSource() - } - - func configureDataSource() { - dataSource = ParkedDomainsFoundDataSource.init(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in - switch item { - case .parkedDomain(let domain): - let cell = collectionView.dequeueCellOfType(ParkedDomainCell.self, forIndexPath: indexPath) - - cell.setWith(domain: domain) - return cell - } - }) - - dataSource.supplementaryViewProvider = { collectionView, elementKind, indexPath in - let view = collectionView.dequeueReusableSupplementaryView(ofKind: elementKind, - withReuseIdentifier: CollectionTextHeaderReusableView.reuseIdentifier, - for: indexPath) as! CollectionTextHeaderReusableView - - view.setHeader(String.Constants.parkedDomainsFound.localized()) - - return view - } - } - - func buildLayout() -> UICollectionViewLayout { - let spacing: CGFloat = UICollectionView.SideOffset - - let config = UICollectionViewCompositionalLayoutConfiguration() - config.interSectionSpacing = spacing - - let layout = UICollectionViewCompositionalLayout(sectionProvider: { - (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in - - let layoutSection: NSCollectionLayoutSection - let sectionHeaderHeight = CollectionTextHeaderReusableView.Height - - layoutSection = .flexibleListItemSection() - layoutSection.contentInsets = NSDirectionalEdgeInsets(top: 1, - leading: spacing + 1, - bottom: 1, - trailing: spacing + 1) - let background = NSCollectionLayoutDecorationItem.background(elementKind: CollectionReusableRoundedBackground.reuseIdentifier) - background.contentInsets.top = sectionHeaderHeight - layoutSection.decorationItems = [background] - - - let headerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), - heightDimension: .absolute(sectionHeaderHeight)) - let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, - elementKind: UICollectionView.elementKindSectionHeader, - alignment: .top) - layoutSection.boundarySupplementaryItems = [header] - - - - - return layoutSection - - }, configuration: config) - layout.register(CollectionReusableRoundedBackground.self, forDecorationViewOfKind: CollectionReusableRoundedBackground.reuseIdentifier) - - return layout - } } -// MARK: - Collection elements -extension ParkedDomainsFoundViewController { - enum Section: Int, Hashable { - case main - } - - enum Item: Hashable { - case parkedDomain(_ domain: FirebaseDomainDisplayInfo) - } +@available(iOS 17.0, *) +#Preview { + let vc = ParkedDomainsFoundViewController.nibInstance() + let manager = PreviewLoginManager() + let presenter = ParkedDomainsFoundInAppViewPresenter(view: vc, + domains: MockEntitiesFabric.Domains.mockFirebaseDomainsDisplayInfo(), + loginFlowManager: manager) + vc.presenter = presenter + return vc +} + +private final class PreviewLoginManager: LoginFlowManager { + func handle(action: LoginFlowNavigationController.Action) async throws { } } diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib index ae2f5cf37..905f45d73 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib +++ b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib @@ -1,10 +1,9 @@ - - + + - - + @@ -12,8 +11,9 @@ - + + @@ -22,27 +22,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -59,32 +38,45 @@ + + + + + + + + + + - - - - - - + - + + - - - - + + + - - - + diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewPresenter.swift b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewPresenter.swift index 631e8b278..acc0da49b 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewPresenter.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewPresenter.swift @@ -11,7 +11,6 @@ protocol ParkedDomainsFoundViewPresenterProtocol: BasePresenterProtocol { var title: String { get } var progress: Double? { get } - func didSelectItem(_ item: ParkedDomainsFoundViewController.Item) func importButtonPressed() } @@ -38,47 +37,21 @@ class ParkedDomainsFoundViewPresenter { // MARK: - ParkedDomainsFoundViewPresenterProtocol extension ParkedDomainsFoundViewPresenter: ParkedDomainsFoundViewPresenterProtocol { func viewDidLoad() { - showData() Task { @MainActor in + view?.setWith(email: webUser?.email ?? "", numberOfDomainsFound: domains.count) view?.setDashesProgress(progress) } } - - @MainActor - func didSelectItem(_ item: ParkedDomainsFoundViewController.Item) { - UDVibration.buttonTap.vibrate() - guard let view else { return } - - switch item { - case .parkedDomain(let domain): - switch domain.parkingStatus { - case .parkedButExpiresSoon(let expiresDate): - appContext.pullUpViewService.showParkedDomainExpiresSoonPullUp(in: view, expiresDate: expiresDate) - case .parkingTrial(let expiresDate): - appContext.pullUpViewService.showParkedDomainTrialExpiresPullUp(in: view, expiresDate: expiresDate) - case .parked, .freeParking: - appContext.pullUpViewService.showParkedDomainInfoPullUp(in: view) - case .parkingExpired: - appContext.pullUpViewService.showParkedDomainExpiredPullUp(in: view) - default: - return - } - } - } } -// MARK: - Private functions +// MARK: - Private methods private extension ParkedDomainsFoundViewPresenter { - func showData() { - Task { - var snapshot = ParkedDomainsFoundSnapshot() - - snapshot.appendSections([.main]) - snapshot.appendItems(domains.map({ ParkedDomainsFoundViewController.Item.parkedDomain($0) })) - - await view?.applySnapshot(snapshot, animated: true) + var webUser: FirebaseUser? { + for profile in appContext.userProfilesService.profiles { + if case .webAccount(let firebaseUser) = profile { + return firebaseUser + } } + return nil } } - - diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfileTileView.swift b/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfileTileView.swift index 5b0b7d739..32115d8f0 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfileTileView.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/Settings/SettingsProfileTileView.swift @@ -172,7 +172,7 @@ private extension SettingsProfileTileView { case .wallet(let wallet): return wallet.displayName case .webAccount: - return String.Constants.parkedDomains.localized() + return String.Constants.domainVault.localized() } } diff --git a/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewService.swift b/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewService.swift index af5955e72..5b58385a6 100644 --- a/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewService.swift +++ b/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewService.swift @@ -476,68 +476,7 @@ extension PullUpViewService: PullUpViewServiceProtocol { showOrUpdate(in: viewController, pullUp: .logOutConfirmation, contentView: selectionView, height: selectionViewHeight, closedCallback: { completion(.failure(PullUpError.dismissed)) }) } } - - func showParkedDomainInfoPullUp(in viewController: UIViewController) { - let selectionViewHeight: CGFloat = 304 - let selectionView = PullUpSelectionView(configuration: .init(title: .text(String.Constants.parkedDomainInfoPullUpTitle.localized()), - contentAlignment: .center, - icon: .init(icon: .parkingIcon24, - size: .small), - subtitle: .label(.text(String.Constants.parkedDomainInfoPullUpSubtitle.localized())), - cancelButton: .gotItButton()), - items: PullUpSelectionViewEmptyItem.allCases) - - presentPullUpView(in: viewController, pullUp: .parkedDomainInfo, contentView: selectionView, isDismissAble: true, height: selectionViewHeight) - } - - func showParkedDomainTrialExpiresPullUp(in viewController: UIViewController, - expiresDate: Date) { - let expiresDateString = DateFormattingService.shared.formatParkingExpiresDate(expiresDate) - - let selectionViewHeight: CGFloat = 380 - let selectionView = PullUpSelectionView(configuration: .init(title: .text(String.Constants.parkedDomainTrialExpiresInfoPullUpTitle.localized(expiresDateString)), - contentAlignment: .center, - icon: .init(icon: .warningIcon, - size: .small, - tintColor: .foregroundWarning), - subtitle: .label(.text(String.Constants.parkedDomainTrialExpiresInfoPullUpSubtitle.localized())), - cancelButton: .gotItButton()), - items: PullUpSelectionViewEmptyItem.allCases) - - presentPullUpView(in: viewController, pullUp: .parkedDomainTrialExpiresInfo, contentView: selectionView, isDismissAble: true, height: selectionViewHeight) - } - - func showParkedDomainExpiresSoonPullUp(in viewController: UIViewController, - expiresDate: Date) { - let expiresDateString = DateFormattingService.shared.formatParkingExpiresDate(expiresDate) - - let selectionViewHeight: CGFloat = 328 - let selectionView = PullUpSelectionView(configuration: .init(title: .text(String.Constants.parkedDomainExpiresSoonPullUpTitle.localized(expiresDateString)), - contentAlignment: .center, - icon: .init(icon: .warningIcon, - size: .small, - tintColor: .foregroundWarning), - subtitle: .label(.text(String.Constants.parkedDomainExpiresSoonPullUpSubtitle.localized())), - cancelButton: .gotItButton()), - items: PullUpSelectionViewEmptyItem.allCases) - - presentPullUpView(in: viewController, pullUp: .parkedDomainExpiresSoonInfo, contentView: selectionView, isDismissAble: true, height: selectionViewHeight) - } - - func showParkedDomainExpiredPullUp(in viewController: UIViewController) { - let selectionViewHeight: CGFloat = 328 - let selectionView = PullUpSelectionView(configuration: .init(title: .text(String.Constants.parkedDomainExpiredInfoPullUpTitle.localized()), - contentAlignment: .center, - icon: .init(icon: .warningIcon, - size: .small, - tintColor: .foregroundWarning), - subtitle: .label(.text(String.Constants.parkedDomainExpiredInfoPullUpSubtitle.localized())), - cancelButton: .gotItButton()), - items: PullUpSelectionViewEmptyItem.allCases) - - presentPullUpView(in: viewController, pullUp: .parkedDomainExpiredInfo, contentView: selectionView, isDismissAble: true, height: selectionViewHeight) - } - + func showApplePayRequiredPullUp(in viewController: UIViewController) { let selectionViewHeight: CGFloat = 304 let selectionView = PullUpSelectionView(configuration: .init(title: .text(String.Constants.applePayRequiredPullUpTitle.localized()), diff --git a/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewServiceProtocol.swift b/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewServiceProtocol.swift index 38d840774..e41d1ae59 100644 --- a/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewServiceProtocol.swift +++ b/unstoppable-ios-app/domains-manager-ios/Services/PullUp/PullUpViewServiceProtocol.swift @@ -40,12 +40,6 @@ protocol PullUpViewServiceProtocol { func showChooseCoinVersionPullUp(for coin: CoinRecord, in viewController: UIViewController) async throws -> CoinVersionSelectionResult func showLogoutConfirmationPullUp(in viewController: UIViewController) async throws - func showParkedDomainInfoPullUp(in viewController: UIViewController) - func showParkedDomainTrialExpiresPullUp(in viewController: UIViewController, - expiresDate: Date) - func showParkedDomainExpiresSoonPullUp(in viewController: UIViewController, - expiresDate: Date) - func showParkedDomainExpiredPullUp(in viewController: UIViewController) func showApplePayRequiredPullUp(in viewController: UIViewController) func showWalletsNumberLimitReachedPullUp(in viewController: UIViewController, maxNumberOfWallets: Int) async diff --git a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/Contents.json b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/Contents.json new file mode 100644 index 000000000..7e35bbe13 --- /dev/null +++ b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "vaultedDomainsFoundIllustration.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/vaultedDomainsFoundIllustration.pdf b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Assets.xcassets/Common/vaultedDomainsFoundIllustration.imageset/vaultedDomainsFoundIllustration.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0e0991e47fb9073468089695e4603e0a3ff7d9a GIT binary patch literal 73739 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 literal 0 HcmV?d00001 diff --git a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings index 08eee8127..e36fcc7d9 100644 --- a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings +++ b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.strings @@ -1166,7 +1166,7 @@ More tabs are coming in the next updates."; "REVIEW_TX_AGAIN" = "Review Transaction Again"; "CONFIRM_AND_SEND" = "Confirm & Send"; -"PARKED_DOMAINS" = "Parked domains"; +"DOMAIN_VAULT" = "Domain Vault"; "BACKED_UP" = "Backed up"; "BACK_UP" = "Back up"; "SET_AS_PRIMARY_DOMAIN" = "Set as primary domain"; diff --git a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.stringsdict b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.stringsdict index d37b19776..eb0bbf73e 100644 --- a/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.stringsdict +++ b/unstoppable-ios-app/domains-manager-ios/SupportingFiles/Localization/en.lproj/Localizable.stringsdict @@ -317,7 +317,7 @@ SDICT:N_PARKED_DOMAINS_IMPORTED NSStringLocalizedFormatKey - %d %#@domain@ from Unstoppable Vault imported + %d %#@domain@ found in your Domain Vault domain NSStringFormatSpecTypeKey From 45d7b2d098116190da849858dda48ff7dba50967 Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 9 Jul 2024 16:32:24 +0300 Subject: [PATCH 3/3] Finalise UI --- .../ParkedDomainsFoundInAppViewPresenter.swift | 2 +- .../ParkedDomainsFound/ParkedDomainsFoundViewController.xib | 4 ++-- .../Common/vaultSafeIcon.imageset/Contents.json | 1 + .../ViewPullUp/ViewPullUpDefaultConfiguration.swift | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundInAppViewPresenter.swift b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundInAppViewPresenter.swift index da291a1cf..ce007cb80 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundInAppViewPresenter.swift +++ b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundInAppViewPresenter.swift @@ -14,7 +14,7 @@ final class ParkedDomainsFoundInAppViewPresenter: ParkedDomainsFoundViewPresente override var title: String { String.Constants.pluralWeFoundNDomains.localized(domains.count, domains.count) } - override var progress: Double? { 1 } + override var progress: Double? { nil } init(view: ParkedDomainsFoundViewProtocol, domains: [FirebaseDomainDisplayInfo], diff --git a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib index 905f45d73..92ab931e1 100644 --- a/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib +++ b/unstoppable-ios-app/domains-manager-ios/Modules/ParkedDomains/ParkedDomainsFound/ParkedDomainsFoundViewController.xib @@ -53,7 +53,7 @@