From 62912c08318a8dab93ff5f17a10439428f80a1e1 Mon Sep 17 00:00:00 2001 From: web3d3v Date: Thu, 4 Jan 2024 14:48:37 -0300 Subject: [PATCH] adding void signer alerts --- .../Web3walletcore+Extensions.swift | 7 +++ iosApp/iosApp/Localizable.strings | 2 + .../iosApp/Modules/Account/AccountView.swift | 5 ++ .../Modules/Dashboard/DashboardView.swift | 9 ++++ iosApp/iosApp/Modules/Degen/DegenView.swift | 5 ++ .../iosApp/Modules/Degen/DegenWireframe.swift | 8 ++- .../Modules/Degen/DegenWireframeFactory.swift | 11 ++-- .../CultProposals/CultProposalsView.swift | 9 ++++ .../Modules/NFTDetail/NFTDetailView.swift | 5 ++ .../NFTDetail/NFTDetailWireframe.swift | 8 ++- .../NFTDetail/NFTDetailWireframeFactory.swift | 5 ++ .../currencyStore/CurrencyStoreService.kt | 5 +- .../web3lib/services/wallet/WalletService.kt | 6 +++ .../services/wallet/WalletServiceMulticall.kt | 4 ++ .../com/sonsofcrypto/web3lib/signer/Wallet.kt | 5 ++ .../modules/account/AccountInteractor.kt | 4 ++ .../modules/account/AccountPresenter.kt | 23 ++++++++- .../modules/account/AccountView.kt | 3 ++ .../modules/dashboard/DashboardInteractor.kt | 4 ++ .../modules/dashboard/DashboardPresenter.kt | 26 +++++++--- .../modules/dashboard/DashboardView.kt | 3 ++ .../modules/degen/DegenInteractor.kt | 6 +++ .../modules/degen/DegenPresenter.kt | 20 +++++++- .../web3walletcore/modules/degen/DegenView.kt | 5 ++ .../CultProposalPresenter.kt | 2 + .../CultProposalsInteractor.kt | 4 ++ .../CultProposalsPresenter.kt | 50 +++++++++++++------ .../degenCultProposals/CultProposalsView.kt | 5 ++ .../modules/nftDetail/NFTDetailInteractor.kt | 6 +++ .../modules/nftDetail/NFTDetailPresenter.kt | 16 +++++- .../modules/nftDetail/NFTDetailView.kt | 3 ++ 31 files changed, 239 insertions(+), 35 deletions(-) diff --git a/iosApp/iosApp/Common/Extensions/Web3walletcore+Extensions.swift b/iosApp/iosApp/Common/Extensions/Web3walletcore+Extensions.swift index 5e0d6a8eb..59ceefa4a 100644 --- a/iosApp/iosApp/Common/Extensions/Web3walletcore+Extensions.swift +++ b/iosApp/iosApp/Common/Extensions/Web3walletcore+Extensions.swift @@ -11,6 +11,7 @@ extension DefaultAccountWireframe: AccountWireframe { } extension AccountViewController: AccountView { func update(viewModel: AccountViewModel) { update(with: viewModel) } + func presentAlert(viewModel: AlertViewModel) { presentAlert(with: viewModel) } } extension AccountPresenter { func handleEvent(_ event: AccountPresenterEvent) { handle(event____: event) } @@ -110,6 +111,7 @@ extension DefaultDashboardWireframe: DashboardWireframe { } extension DashboardViewController: DashboardView { func update(viewModel__________ viewModel: DashboardViewModel) { update(with: viewModel) } + func presentAlert(viewModel: AlertViewModel) { presentAlert(with: viewModel) } } extension DashboardPresenter { func handleEvent(_ event: DashboardPresenterEvent) { handle(event________________: event) } @@ -133,6 +135,8 @@ extension DefaultCultProposalsWireframe: CultProposalsWireframe { } extension CultProposalsViewController: CultProposalsView { func update(viewModel_____________ viewModel: CultProposalsViewModel) { update(with: viewModel) } + func presentAlert(viewModel: AlertViewModel) { presentAlert(with: viewModel) } + func presentToast(viewModel: ToastViewModel) { presentToast(viewModel: viewModel) } } extension CultProposalsPresenter { func handleEvent(_ event: CultProposalsPresenterEvent) { handle(event___________________: event) } @@ -144,6 +148,8 @@ extension DefaultDegenWireframe: DegenWireframe { } extension DegenViewController: DegenView { func update(viewModel___________ viewModel: DegenViewModel) { update(with: viewModel) } + func presentAlert(viewModel: AlertViewModel) { presentAlert(with: viewModel) } + func presentToast(viewModel: ToastViewModel) { presentToast(viewModel: viewModel) } } extension DegenPresenter { func handleEvent(_ event: DegenPresenterEvent) { handle(event_________________: event) } @@ -271,6 +277,7 @@ extension DefaultNFTDetailWireframe: NFTDetailWireframe { } extension NFTDetailViewController: NFTDetailView { func update(viewModel__________________ viewModel: NFTDetailViewModel) { update(with: viewModel)} + func presentAlert(viewModel: AlertViewModel) { presentAlert(with: viewModel) } } extension NFTDetailPresenter { func handleEvent(_ event: NFTDetailPresenterEvent) { handle(event____________________________: event) } diff --git a/iosApp/iosApp/Localizable.strings b/iosApp/iosApp/Localizable.strings index ab89c417e..5059648ed 100644 --- a/iosApp/iosApp/Localizable.strings +++ b/iosApp/iosApp/Localizable.strings @@ -93,6 +93,8 @@ "dashboard.button.swap" = "Swap"; "dashboard.section.nfts" = "NFTs"; "dashboard.section.Notifications" = "Notifications"; +"voidSigner.alert.title" = "Void Signer Selected"; +"voidSigner.alert.body" = "Currently selected wallet is VIEW ONLY, can not sign or send transactions"; "degen.dappCategory.title.swap" = "Swap"; "degen.dappCategory.title.cult" = "Cult.DAO"; diff --git a/iosApp/iosApp/Modules/Account/AccountView.swift b/iosApp/iosApp/Modules/Account/AccountView.swift index b818542a4..bbf104227 100644 --- a/iosApp/iosApp/Modules/Account/AccountView.swift +++ b/iosApp/iosApp/Modules/Account/AccountView.swift @@ -48,6 +48,11 @@ extension AccountViewController { ? Theme.color.priceUp : Theme.color.priceDown } + + func presentAlert(with viewModel: AlertViewModel) { + let vc = AlertController(viewModel, handler: { _, _ in () }) + present(vc, animated: true) + } } extension AccountViewController: UICollectionViewDataSource { diff --git a/iosApp/iosApp/Modules/Dashboard/DashboardView.swift b/iosApp/iosApp/Modules/Dashboard/DashboardView.swift index 1b973ca14..58a051c31 100644 --- a/iosApp/iosApp/Modules/Dashboard/DashboardView.swift +++ b/iosApp/iosApp/Modules/Dashboard/DashboardView.swift @@ -140,6 +140,15 @@ extension DashboardViewController { (cell as? DashboardNFTCell)?.update(with: input.data[idx]) } } + + func presentAlert(with viewModel: AlertViewModel) { + let vc = AlertController(viewModel, handler: { _, _ in () }) + present(vc, animated: true) + } + + func presentToast(with viewModel: ToastViewModel) { + navigationController?.asNavVc?.toast(viewModel) + } } // MARK: - UICollectionViewDataSource diff --git a/iosApp/iosApp/Modules/Degen/DegenView.swift b/iosApp/iosApp/Modules/Degen/DegenView.swift index 78c8327ac..2b0f302d4 100644 --- a/iosApp/iosApp/Modules/Degen/DegenView.swift +++ b/iosApp/iosApp/Modules/Degen/DegenView.swift @@ -36,6 +36,11 @@ final class DegenViewController: BaseViewController { collectionView.contentInset.bottom = Theme.padding.twice } + func presentAlert(with viewModel: AlertViewModel) { + let vc = AlertController(viewModel, handler: { _, _ in () }) + present(vc, animated: true) + } + deinit { presenter.releaseResources() } diff --git a/iosApp/iosApp/Modules/Degen/DegenWireframe.swift b/iosApp/iosApp/Modules/Degen/DegenWireframe.swift index 3de394363..7f3a15ef5 100644 --- a/iosApp/iosApp/Modules/Degen/DegenWireframe.swift +++ b/iosApp/iosApp/Modules/Degen/DegenWireframe.swift @@ -12,6 +12,7 @@ final class DefaultDegenWireframe { private let alertWireframeFactory: AlertWireframeFactory private let degenService: DegenService private let networksService: NetworksService + private let walletService: WalletService private weak var vc: UIViewController? @@ -21,7 +22,8 @@ final class DefaultDegenWireframe { cultProposalsWireframeFactory: CultProposalsWireframeFactory, alertWireframeFactory: AlertWireframeFactory, degenService: DegenService, - networksService: NetworksService + networksService: NetworksService, + walletService: WalletService ) { self.parent = parent @@ -30,6 +32,7 @@ final class DefaultDegenWireframe { self.alertWireframeFactory = alertWireframeFactory self.degenService = degenService self.networksService = networksService + self.walletService = walletService } } @@ -67,7 +70,8 @@ private extension DefaultDegenWireframe { func wireUp() -> UIViewController { let interactor = DefaultDegenInteractor( degenService: degenService, - networksService: networksService + networksService: networksService, + walletService: walletService ) let vc: DegenViewController = UIStoryboard(.degen).instantiate() let presenter = DefaultDegenPresenter( diff --git a/iosApp/iosApp/Modules/Degen/DegenWireframeFactory.swift b/iosApp/iosApp/Modules/Degen/DegenWireframeFactory.swift index ec89d8bcc..9219b3c61 100644 --- a/iosApp/iosApp/Modules/Degen/DegenWireframeFactory.swift +++ b/iosApp/iosApp/Modules/Degen/DegenWireframeFactory.swift @@ -19,19 +19,22 @@ final class DefaultDegenWireframeFactory { private let alertWireframeFactory: AlertWireframeFactory private let degenService: DegenService private let networksService: NetworksService + private let walletService: WalletService init( currencySwapWireframeFactory: CurrencySwapWireframeFactory, cultProposalsWireframeFactory: CultProposalsWireframeFactory, alertWireframeFactory: AlertWireframeFactory, degenService: DegenService, - networksService: NetworksService + networksService: NetworksService, + walletService: WalletService ) { self.currencySwapWireframeFactory = currencySwapWireframeFactory self.cultProposalsWireframeFactory = cultProposalsWireframeFactory self.alertWireframeFactory = alertWireframeFactory self.degenService = degenService self.networksService = networksService + self.walletService = walletService } } @@ -44,7 +47,8 @@ extension DefaultDegenWireframeFactory: DegenWireframeFactory { cultProposalsWireframeFactory: cultProposalsWireframeFactory, alertWireframeFactory: alertWireframeFactory, degenService: degenService, - networksService: networksService + networksService: networksService, + walletService: walletService ) } } @@ -60,7 +64,8 @@ final class DegenWireframeFactoryAssembler: AssemblerComponent { cultProposalsWireframeFactory: resolver.resolve(), alertWireframeFactory: resolver.resolve(), degenService: resolver.resolve(), - networksService: resolver.resolve() + networksService: resolver.resolve(), + walletService: resolver.resolve() ) } } diff --git a/iosApp/iosApp/Modules/DegenCult/CultProposals/CultProposalsView.swift b/iosApp/iosApp/Modules/DegenCult/CultProposals/CultProposalsView.swift index 65edcc14c..fabd8dce8 100644 --- a/iosApp/iosApp/Modules/DegenCult/CultProposals/CultProposalsView.swift +++ b/iosApp/iosApp/Modules/DegenCult/CultProposals/CultProposalsView.swift @@ -38,6 +38,15 @@ extension CultProposalsViewController { refreshControl.endRefreshing() } } + + func presentAlert(with viewModel: AlertViewModel) { + let vc = AlertController(viewModel, handler: { _, _ in () }) + present(vc, animated: true) + } + + func presentToast(with viewModel: ToastViewModel) { + navigationController?.asNavVc?.toast(viewModel) + } } extension CultProposalsViewController: UICollectionViewDataSource { diff --git a/iosApp/iosApp/Modules/NFTDetail/NFTDetailView.swift b/iosApp/iosApp/Modules/NFTDetail/NFTDetailView.swift index b41dafe79..14e4a77ea 100644 --- a/iosApp/iosApp/Modules/NFTDetail/NFTDetailView.swift +++ b/iosApp/iosApp/Modules/NFTDetail/NFTDetailView.swift @@ -30,6 +30,11 @@ final class NFTDetailViewController: UICollectionViewController, ButtonSheetCont collectionView.reloadData() } + func presentAlert(with viewModel: AlertViewModel) { + let vc = AlertController(viewModel, handler: { _, _ in () }) + present(vc, animated: true) + } + // MARK: - UICollectionViewDataSource override func numberOfSections(in collectionView: UICollectionView) -> Int { diff --git a/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframe.swift b/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframe.swift index 48b673300..ee049916f 100644 --- a/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframe.swift +++ b/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframe.swift @@ -11,6 +11,7 @@ final class DefaultNFTDetailWireframe { private let nftSendWireframeFactory: NFTSendWireframeFactory private let alertWireframeFactory: AlertWireframeFactory private let nftsService: NFTsService + private let walletService: WalletService private let networksService: NetworksService private weak var vc: UIViewController? @@ -21,6 +22,7 @@ final class DefaultNFTDetailWireframe { nftSendWireframeFactory: NFTSendWireframeFactory, alertWireframeFactory: AlertWireframeFactory, nftsService: NFTsService, + walletService: WalletService, networksService: NetworksService ) { self.parent = parent @@ -28,6 +30,7 @@ final class DefaultNFTDetailWireframe { self.nftSendWireframeFactory = nftSendWireframeFactory self.alertWireframeFactory = alertWireframeFactory self.nftsService = nftsService + self.walletService = walletService self.networksService = networksService } } @@ -55,7 +58,10 @@ private extension DefaultNFTDetailWireframe { func wireUp() -> UIViewController { let vc: NFTDetailViewController = UIStoryboard(.main).instantiate() - let interactor = DefaultNFTDetailInteractor(nftService: nftsService) + let interactor = DefaultNFTDetailInteractor( + nftService: nftsService, + walletService: walletService + ) let presenter = DefaultNFTDetailPresenter( view: WeakRef(referred: vc), wireframe: self, diff --git a/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframeFactory.swift b/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframeFactory.swift index 4a1266697..e463d248e 100644 --- a/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframeFactory.swift +++ b/iosApp/iosApp/Modules/NFTDetail/NFTDetailWireframeFactory.swift @@ -16,17 +16,20 @@ final class DefaultNFTDetailWireframeFactory { private let nftSendWireframeFactory: NFTSendWireframeFactory private let alertWireframeFactory: AlertWireframeFactory private let nftsService: NFTsService + private let walletService: WalletService private let networksService: NetworksService init( nftSendWireframeFactory: NFTSendWireframeFactory, alertWireframeFactory: AlertWireframeFactory, nftsService: NFTsService, + walletService: WalletService, networksService: NetworksService ) { self.nftSendWireframeFactory = nftSendWireframeFactory self.alertWireframeFactory = alertWireframeFactory self.nftsService = nftsService + self.walletService = walletService self.networksService = networksService } } @@ -43,6 +46,7 @@ extension DefaultNFTDetailWireframeFactory: NFTDetailWireframeFactory { nftSendWireframeFactory: nftSendWireframeFactory, alertWireframeFactory: alertWireframeFactory, nftsService: nftsService, + walletService: walletService, networksService: networksService ) } @@ -58,6 +62,7 @@ final class NFTDetailWireframeFactoryAssembler: AssemblerComponent { nftSendWireframeFactory: resolver.resolve(), alertWireframeFactory: resolver.resolve(), nftsService: resolver.resolve(), + walletService: resolver.resolve(), networksService: resolver.resolve() ) } diff --git a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/currencyStore/CurrencyStoreService.kt b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/currencyStore/CurrencyStoreService.kt index 1480e43b1..fe95810e6 100644 --- a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/currencyStore/CurrencyStoreService.kt +++ b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/currencyStore/CurrencyStoreService.kt @@ -111,9 +111,7 @@ class DefaultCurrencyStoreService( coinGeckoService.market(ids, "usd", 0, "24h").forEach { resultMap.put(it.id, it.toCurrencyMarketData()) } - } catch (err: Throwable) { - println("[ERROR] $err") - } + } catch (err: Throwable) { } withContext(uiDispatcher) { resultMap.forEach { markets.put(it.key, it.value) @@ -137,7 +135,6 @@ class DefaultCurrencyStoreService( } return@withContext result } catch (err: Throwable) { - println("[ERROR] $err") return@withContext null } } diff --git a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletService.kt b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletService.kt index fa2c61c8d..7ad88cfe0 100644 --- a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletService.kt +++ b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletService.kt @@ -66,6 +66,8 @@ interface WalletService { /** Selected signer name */ fun selectedSignerName(): String? + /** Selected signer void signer (can sign transactions) */ + fun isSelectedVoidSigner(): Boolean /** Address for network */ fun address(network: Network): AddressHexString? /** Last known balance number for network connected to wallet */ @@ -171,6 +173,10 @@ class DefaultWalletService( override fun selectedSignerName(): String? = selectedNetwork()?.let { networkService.wallet(it)?.signerName() } + override fun isSelectedVoidSigner(): Boolean = + selectedNetwork()?.let { networkService.wallet(it)?.isVoidSigner() } + ?: true + override fun address(network: Network): AddressHexString? { return networkService.wallet(network)?.address()?.toHexString() } diff --git a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletServiceMulticall.kt b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletServiceMulticall.kt index c69ca2c98..6a1f86c84 100644 --- a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletServiceMulticall.kt +++ b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/services/wallet/WalletServiceMulticall.kt @@ -94,6 +94,10 @@ class DefaultWalletServiceMulticall( return networkService.wallet(network)?.address()?.toHexString() } + override fun isSelectedVoidSigner(): Boolean = + selectedNetwork()?.let { networkService.wallet(it)?.isVoidSigner() } + ?: true + override fun balance(network: Network, currency: Currency): BigInt { networksState[balanceKey(network, currency)]?.let { return it } networksStateCache.get(balanceKey(network, currency))?.let { diff --git a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/signer/Wallet.kt b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/signer/Wallet.kt index d575662aa..58e6e7618 100644 --- a/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/signer/Wallet.kt +++ b/web3lib/src/commonMain/kotlin/com/sonsofcrypto/web3lib/signer/Wallet.kt @@ -47,6 +47,8 @@ interface SignerIntf { fun address(): Address /** Name of the signer */ fun signerName(): String? + /** Is void signer (can sign transaction) */ + fun isVoidSigner(): Boolean /** Signed prefixed-message. Bytes or encoded string as a UTF8-message */ suspend fun signMessage(message: ByteArray): ByteArray @@ -154,6 +156,9 @@ class Wallet( override fun signerName(): String = signerStoreItem.name + override fun isVoidSigner(): Boolean = + signerStoreItem.type == SignerStoreItem.Type.VIEW_ONLY + override suspend fun signMessage(message: ByteArray): ByteArray { TODO("Not yet implemented") } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountInteractor.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountInteractor.kt index 600a6b6a9..19f77d310 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountInteractor.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountInteractor.kt @@ -38,6 +38,7 @@ interface AccountInteractor { fun transactions(network: Network, currency: Currency): List @Throws(Throwable::class) suspend fun fetchTransactions(network: Network, currency: Currency) + fun isVoidSigner(): Boolean } class DefaultAccountInteractor( @@ -96,6 +97,9 @@ class DefaultAccountInteractor( etherScanService.fetchTransactionHistory(address(network), network) } } + + override fun isVoidSigner(): Boolean = + walletService.isSelectedVoidSigner() } private val Network.isEthereum: Boolean get() = chainId == Network.ethereum().chainId diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountPresenter.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountPresenter.kt index 66da3646a..f26a8fcd4 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountPresenter.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountPresenter.kt @@ -7,7 +7,13 @@ import com.sonsofcrypto.web3lib.utils.BigDec import com.sonsofcrypto.web3lib.utils.WeakRef import com.sonsofcrypto.web3lib.utils.bgDispatcher import com.sonsofcrypto.web3lib.utils.uiDispatcher +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action.Kind.NORMAL +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.RegularAlertViewModel import com.sonsofcrypto.web3walletcore.common.viewModels.CandlesViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia.Tint.DESTRUCTIVE import com.sonsofcrypto.web3walletcore.common.viewModels.loaded import com.sonsofcrypto.web3walletcore.extensions.Localized import com.sonsofcrypto.web3walletcore.modules.account.AccountViewModel.Header.Button @@ -51,13 +57,26 @@ class DefaultAccountPresenter( override fun handle(event: AccountPresenterEvent) { when(event) { is AccountPresenterEvent.Receive -> wireframe.navigate(Receive) - is AccountPresenterEvent.Send -> wireframe.navigate(Send) - is AccountPresenterEvent.Swap -> wireframe.navigate(Swap) + is AccountPresenterEvent.Send -> + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else wireframe.navigate(Send) + is AccountPresenterEvent.Swap -> + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else wireframe.navigate(Swap) is AccountPresenterEvent.More -> wireframe.navigate(More) is AccountPresenterEvent.PullDownToRefresh -> refreshTransactions() } } + private fun presentVoidSignerAlert() = view.get()?.presentAlert( + RegularAlertViewModel( + Localized("voidSigner.alert.title"), + Localized("voidSigner.alert.body"), + listOf(Action(Localized("Done"), NORMAL)), + ImageMedia.SysName("xmark.circle.fill", DESTRUCTIVE) + ) + ) + private fun updateView() = view.get()?.update(viewModel()) private fun refreshTransactions() { diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountView.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountView.kt index 82eac1dbc..9b7ff4449 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountView.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/account/AccountView.kt @@ -1,5 +1,8 @@ package com.sonsofcrypto.web3walletcore.modules.account +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel + interface AccountView { fun update(viewModel: AccountViewModel) + fun presentAlert(viewModel: AlertViewModel) } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardInteractor.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardInteractor.kt index 21bb7b028..a88ecb987 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardInteractor.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardInteractor.kt @@ -63,6 +63,7 @@ interface DashboardInteractor { fun dismissAction(action: Action) fun totalFiatBalance(): Double fun reloadData() + fun isVoidSigner(): Boolean fun didEnterBackground() fun willEnterForeground() fun addListener(listener: DashboardInteractorLister) @@ -163,6 +164,9 @@ class DefaultDashboardInteractor( } } + override fun isVoidSigner(): Boolean = + walletService.isSelectedVoidSigner() + override fun didEnterBackground() = walletService.pausePolling() override fun willEnterForeground() = walletService.startPolling() diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardPresenter.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardPresenter.kt index 8bf592992..362b19d3a 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardPresenter.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardPresenter.kt @@ -8,7 +8,12 @@ import com.sonsofcrypto.web3lib.utils.BigDec import com.sonsofcrypto.web3lib.utils.WeakRef import com.sonsofcrypto.web3lib.utils.bgDispatcher import com.sonsofcrypto.web3lib.utils.uiDispatcher +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action.Kind.NORMAL +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.RegularAlertViewModel import com.sonsofcrypto.web3walletcore.common.viewModels.CandlesViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia.Tint.DESTRUCTIVE import com.sonsofcrypto.web3walletcore.extensions.Localized import com.sonsofcrypto.web3walletcore.modules.dashboard.DashboardViewModel.Section import com.sonsofcrypto.web3walletcore.modules.dashboard.DashboardViewModel.Section.Header.Balance @@ -91,12 +96,12 @@ class DefaultDashboardPresenter( is DashboardPresenterEvent.ReceiveAction -> { wireframe.navigate(DashboardWireframeDestination.Receive) } - is DashboardPresenterEvent.SendAction -> { - wireframe.navigate(DashboardWireframeDestination.Send(null)) - } - is DashboardPresenterEvent.SwapAction -> { - wireframe.navigate(DashboardWireframeDestination.Swap) - } + is DashboardPresenterEvent.SendAction -> + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else wireframe.navigate(DashboardWireframeDestination.Send(null)) + is DashboardPresenterEvent.SwapAction -> + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else wireframe.navigate(DashboardWireframeDestination.Swap) is DashboardPresenterEvent.DidTapAction -> { didTapAction(event.idx) } @@ -141,6 +146,15 @@ class DefaultDashboardPresenter( view.get()?.update(viewModel()) } + private fun presentVoidSignerAlert() = view.get()?.presentAlert( + RegularAlertViewModel( + Localized("voidSigner.alert.title"), + Localized("voidSigner.alert.body"), + listOf(AlertViewModel.Action(Localized("Done"), NORMAL)), + ImageMedia.SysName("xmark.circle.fill", DESTRUCTIVE) + ) + ) + private fun viewModel(): DashboardViewModel = DashboardViewModel( interactor.selectedSignerName()?.uppercase() ?: "WEB3WALLET", sections() diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardView.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardView.kt index 7e52c71a9..8e59b1561 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardView.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/dashboard/DashboardView.kt @@ -1,5 +1,8 @@ package com.sonsofcrypto.web3walletcore.modules.dashboard +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel + interface DashboardView { fun update(viewModel: DashboardViewModel) + fun presentAlert(viewModel: AlertViewModel) } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenInteractor.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenInteractor.kt index 01b15d769..f42de4c1d 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenInteractor.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenInteractor.kt @@ -3,6 +3,7 @@ package com.sonsofcrypto.web3walletcore.modules.degen import com.sonsofcrypto.web3lib.services.networks.NetworksEvent import com.sonsofcrypto.web3lib.services.networks.NetworksListener import com.sonsofcrypto.web3lib.services.networks.NetworksService +import com.sonsofcrypto.web3lib.services.wallet.WalletService import com.sonsofcrypto.web3walletcore.services.degen.DAppCategory import com.sonsofcrypto.web3walletcore.services.degen.DegenService @@ -13,6 +14,7 @@ interface DegenInteractorLister { interface DegenInteractor { val categoriesActive: List val categoriesInactive: List + fun isVoidSigner(): Boolean fun add(listener: DegenInteractorLister) fun remove(listener: DegenInteractorLister) } @@ -20,6 +22,7 @@ interface DegenInteractor { class DefaultDegenInteractor( private val degenService: DegenService, private val networksService: NetworksService, + private val walletService: WalletService, ): DegenInteractor, NetworksListener { private var listener: DegenInteractorLister? = null @@ -27,6 +30,9 @@ class DefaultDegenInteractor( override val categoriesInactive: List get() = degenService.categoriesInactive() + override fun isVoidSigner(): Boolean = + walletService.isSelectedVoidSigner() + override fun add(listener: DegenInteractorLister) { if (this.listener != null) { networksService.remove(this) } this.listener = listener diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenPresenter.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenPresenter.kt index 6819bbc74..5f84dddf0 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenPresenter.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenPresenter.kt @@ -3,6 +3,12 @@ package com.sonsofcrypto.web3walletcore.modules.degen import com.sonsofcrypto.web3lib.services.networks.NetworksEvent import com.sonsofcrypto.web3lib.utils.WeakRef import com.sonsofcrypto.web3lib.utils.uiDispatcher +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action.Kind.NORMAL +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.RegularAlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia.Tint.DESTRUCTIVE import com.sonsofcrypto.web3walletcore.extensions.Localized import com.sonsofcrypto.web3walletcore.modules.degen.DegenViewModel.Section.Group import com.sonsofcrypto.web3walletcore.modules.degen.DegenViewModel.Section.Header @@ -61,7 +67,10 @@ class DefaultDegenPresenter( when (event) { is DegenPresenterEvent.DidSelectCategory -> { val category = activeCategories[event.idx] - if (category == SWAP) { wireframe.navigate(Swap) } + if (category == SWAP) { + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else wireframe.navigate(Swap) + } if (category == CULT) { wireframe.navigate(Cult) } } is DegenPresenterEvent.ComingSoon -> wireframe.navigate(ComingSoon) @@ -70,6 +79,15 @@ class DefaultDegenPresenter( private fun updateView() { view.get()?.update(viewModel()) } + private fun presentVoidSignerAlert() = view.get()?.presentAlert( + RegularAlertViewModel( + Localized("voidSigner.alert.title"), + Localized("voidSigner.alert.body"), + listOf(Action(Localized("Done"), NORMAL)), + ImageMedia.SysName("xmark.circle.fill", DESTRUCTIVE) + ) + ) + private fun viewModel(): DegenViewModel = DegenViewModel( listOf( diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenView.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenView.kt index 9c70378a9..92c108693 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenView.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degen/DegenView.kt @@ -1,6 +1,11 @@ package com.sonsofcrypto.web3walletcore.modules.degen +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ToastViewModel + interface DegenView { fun update(viewModel: DegenViewModel) + fun presentAlert(viewModel: AlertViewModel) + fun presentToast(viewModel: ToastViewModel) fun popToRootAndRefresh() } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposal/CultProposalPresenter.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposal/CultProposalPresenter.kt index 060096323..74375b504 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposal/CultProposalPresenter.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposal/CultProposalPresenter.kt @@ -1,6 +1,8 @@ package com.sonsofcrypto.web3walletcore.modules.degenCultProposal import com.sonsofcrypto.web3lib.utils.WeakRef +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia import com.sonsofcrypto.web3walletcore.extensions.Localized import com.sonsofcrypto.web3walletcore.modules.degenCultProposal.CultProposalPresenterEvent.Dismiss import com.sonsofcrypto.web3walletcore.modules.degenCultProposal.CultProposalViewModel.ProposalDetails.DocumentsInfo diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsInteractor.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsInteractor.kt index 1c681198b..936ee0080 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsInteractor.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsInteractor.kt @@ -11,6 +11,7 @@ interface CultProposalsInteractor { @Throws(Throwable::class) suspend fun fetch(): CultServiceResponse val hasCultBalance: Boolean + fun isVoidSigner(): Boolean } class DefaultCultProposalsInteractor( @@ -24,4 +25,7 @@ class DefaultCultProposalsInteractor( val balance = walletService.balance(Network.ethereum(), Currency.cult()) return balance.isGreaterThan(BigInt.zero) } + + override fun isVoidSigner(): Boolean = + walletService.isSelectedVoidSigner() } \ No newline at end of file diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsPresenter.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsPresenter.kt index dd1891116..c002b8035 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsPresenter.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsPresenter.kt @@ -3,7 +3,12 @@ package com.sonsofcrypto.web3walletcore.modules.degenCultProposals import com.sonsofcrypto.web3lib.utils.WeakRef import com.sonsofcrypto.web3lib.utils.bgDispatcher import com.sonsofcrypto.web3lib.utils.uiDispatcher +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action.Kind.NORMAL +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.RegularAlertViewModel import com.sonsofcrypto.web3walletcore.common.viewModels.ErrorViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia.Tint.DESTRUCTIVE import com.sonsofcrypto.web3walletcore.extensions.Localized import com.sonsofcrypto.web3walletcore.modules.alert.AlertWireframeContext import com.sonsofcrypto.web3walletcore.modules.alert.AlertWireframeContext.Action.Type.PRIMARY @@ -29,7 +34,7 @@ sealed class CultProposalsPresenterEvent { interface CultProposalsPresenter { fun present() - fun handle(event: CultProposalsPresenterEvent) + fun handle(event: CultProposalsPresenterEvent): Unit } class DefaultCultProposalsPresenter( @@ -62,25 +67,40 @@ class DefaultCultProposalsPresenter( } } - override fun handle(event: CultProposalsPresenterEvent) = when (event) { - is CultProposalsPresenterEvent.SelectPendingProposals -> { - sectionType = PENDING - updateView() - } - is CultProposalsPresenterEvent.SelectClosedProposals -> { - sectionType = CLOSED - updateView() - } - is CultProposalsPresenterEvent.SelectProposal -> { - val proposals = if (sectionType == PENDING) pending else closed - wireframe.navigate(Proposal(proposals[event.idx], proposals)) + override fun handle(event: CultProposalsPresenterEvent) { + when (event) { + is CultProposalsPresenterEvent.SelectPendingProposals -> { + sectionType = PENDING + updateView() + } + is CultProposalsPresenterEvent.SelectClosedProposals -> { + sectionType = CLOSED + updateView() + } + is CultProposalsPresenterEvent.SelectProposal -> { + val proposals = if (sectionType == PENDING) pending else closed + wireframe.navigate(Proposal(proposals[event.idx], proposals)) + } + is CultProposalsPresenterEvent.ApproveProposal -> + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else castVote(event.idx, true) + is CultProposalsPresenterEvent.RejectProposal -> + if (interactor.isVoidSigner()) presentVoidSignerAlert() + else castVote(event.idx, false) } - is CultProposalsPresenterEvent.ApproveProposal -> castVote(event.idx, true) - is CultProposalsPresenterEvent.RejectProposal -> castVote(event.idx, false) } private fun updateView() { view.get()?.update(viewModel()) } + private fun presentVoidSignerAlert() = view.get()?.presentAlert( + RegularAlertViewModel( + Localized("voidSigner.alert.title"), + Localized("voidSigner.alert.body"), + listOf(AlertViewModel.Action(Localized("Done"), NORMAL)), + ImageMedia.SysName("xmark.circle.fill", DESTRUCTIVE) + ) + ) + private fun viewModel(): CultProposalsViewModel { if (err != null) { return CultProposalsViewModel.Error(errorViewModel(err!!)) } return CultProposalsViewModel.Loaded(sectionsViewModel()) diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsView.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsView.kt index 41bdab107..d975a3594 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsView.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/degenCultProposals/CultProposalsView.kt @@ -1,5 +1,10 @@ package com.sonsofcrypto.web3walletcore.modules.degenCultProposals +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ToastViewModel + interface CultProposalsView { fun update(viewModel: CultProposalsViewModel) + fun presentAlert(viewModel: AlertViewModel) + fun presentToast(viewModel: ToastViewModel) } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailInteractor.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailInteractor.kt index 4e88c8a15..c7e8c2338 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailInteractor.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailInteractor.kt @@ -1,5 +1,6 @@ package com.sonsofcrypto.web3walletcore.modules.nftDetail +import com.sonsofcrypto.web3lib.services.wallet.WalletService import com.sonsofcrypto.web3walletcore.services.nfts.NFTCollection import com.sonsofcrypto.web3walletcore.services.nfts.NFTItem import com.sonsofcrypto.web3walletcore.services.nfts.NFTsService @@ -7,10 +8,12 @@ import com.sonsofcrypto.web3walletcore.services.nfts.NFTsService interface NFTDetailInteractor { fun fetchNFT(collectionId: String, tokenId: String): NFTItem fun fetchCollection(id: String): NFTCollection + fun isVoidSigner(): Boolean } class DefaultNFTDetailInteractor( private val nftService: NFTsService, + private val walletService: WalletService ): NFTDetailInteractor { override fun fetchNFT(collectionId: String, tokenId: String): NFTItem = @@ -18,4 +21,7 @@ class DefaultNFTDetailInteractor( override fun fetchCollection(id: String): NFTCollection = nftService.collection(id) + + override fun isVoidSigner(): Boolean = + walletService.isSelectedVoidSigner() } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailPresenter.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailPresenter.kt index b19ffe212..d0c26e724 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailPresenter.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailPresenter.kt @@ -2,6 +2,12 @@ package com.sonsofcrypto.web3walletcore.modules.nftDetail import com.sonsofcrypto.web3lib.types.Network import com.sonsofcrypto.web3lib.utils.WeakRef +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.Action.Kind.NORMAL +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel.RegularAlertViewModel +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia +import com.sonsofcrypto.web3walletcore.common.viewModels.ImageMedia.Tint.DESTRUCTIVE import com.sonsofcrypto.web3walletcore.extensions.Localized import com.sonsofcrypto.web3walletcore.modules.nftDetail.NFTDetailWireframeDestination.Dismiss import com.sonsofcrypto.web3walletcore.modules.nftDetail.NFTDetailWireframeDestination.Send @@ -29,7 +35,15 @@ class DefaultNFTDetailPresenter( override fun handle(event: NFTDetailPresenterEvent) { when(event) { - is NFTDetailPresenterEvent.Send -> wireframe.navigate(Send(nft)) + is NFTDetailPresenterEvent.Send -> + if (interactor.isVoidSigner()) view.get()?.presentAlert( + RegularAlertViewModel( + Localized("voidSigner.alert.title"), + Localized("voidSigner.alert.body"), + listOf(Action(Localized("Done"), NORMAL)), + ImageMedia.SysName("xmark.circle.fill", DESTRUCTIVE) + ) + ) else wireframe.navigate(Send(nft)) is NFTDetailPresenterEvent.Dismiss -> wireframe.navigate(Dismiss) } } diff --git a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailView.kt b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailView.kt index 575a21dd8..cea7216c9 100644 --- a/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailView.kt +++ b/web3walletcore/src/commonMain/kotlin/com/sonsofcrypto/web3walletcore/modules/nftDetail/NFTDetailView.kt @@ -1,5 +1,8 @@ package com.sonsofcrypto.web3walletcore.modules.nftDetail +import com.sonsofcrypto.web3walletcore.common.viewModels.AlertViewModel + interface NFTDetailView { fun update(viewModel: NFTDetailViewModel) + fun presentAlert(viewModel: AlertViewModel) }