diff --git a/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt b/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt index d35071966e..02f1dd80c2 100644 --- a/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt +++ b/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt @@ -130,7 +130,7 @@ open class BaseAssetSelectViewModel( if (query.isNotEmpty() || !showRecents) { flow { emit(emptyList()) } } else { - getRecentAssets(RecentAssetsRequest(filters = assetFilters())) + getRecentAssets(RecentAssetsRequest(types = recentTypes, filters = assetFilters())) } } .map { items -> items.map { it.asset }.toImmutableList() } @@ -219,6 +219,8 @@ open class BaseAssetSelectViewModel( open val showRecents: Boolean get() = true + open val recentTypes: List get() = RecentType.entries + open fun assetFilters(): Set = emptySet() private companion object { diff --git a/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt b/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt index 21ec70863d..bb67a24279 100644 --- a/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt +++ b/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt @@ -16,6 +16,7 @@ import com.gemwallet.android.features.asset_select.presents.views.RecentsSheetHo import com.gemwallet.android.features.asset_select.viewmodels.RecentsSheetViewModel import com.gemwallet.android.features.swap.viewmodels.SwapSelectViewModel import com.gemwallet.android.domains.swap.SwapItemType +import com.gemwallet.android.model.RecentType import com.wallet.core.primitives.AssetId import com.wallet.core.primitives.AssetSubtype import kotlinx.collections.immutable.toImmutableList @@ -66,9 +67,9 @@ fun SwapSelectScreen( onChainFilter = viewModel::onChainFilter, onBalanceFilter = viewModel::onBalanceFilter, onClearFilters = viewModel::onClearFilters, - onSelect = onSelectAsset, + onSelect = { viewModel.updateRecent(it, RecentType.SwapSelect); onSelectAsset(it) }, onSelectRecent = onSelectAsset, - onOpenRecentsSheet = { recentsViewModel.show(filters = viewModel.assetFilters()) }, + onOpenRecentsSheet = { recentsViewModel.show(filters = viewModel.assetFilters(), types = viewModel.recentTypes) }, onCancel = onCancel, onAddAsset = null, itemTrailing = { getBalanceInfo(it)() }, diff --git a/android/features/swap/viewmodels/src/main/kotlin/com/gemwallet/android/features/swap/viewmodels/SwapSelectViewModel.kt b/android/features/swap/viewmodels/src/main/kotlin/com/gemwallet/android/features/swap/viewmodels/SwapSelectViewModel.kt index 32045695d8..20bcf5b5fe 100644 --- a/android/features/swap/viewmodels/src/main/kotlin/com/gemwallet/android/features/swap/viewmodels/SwapSelectViewModel.kt +++ b/android/features/swap/viewmodels/src/main/kotlin/com/gemwallet/android/features/swap/viewmodels/SwapSelectViewModel.kt @@ -17,6 +17,7 @@ import com.gemwallet.android.features.asset_select.viewmodels.models.SelectAsset import com.gemwallet.android.features.asset_select.viewmodels.models.SelectSearch import com.gemwallet.android.model.AssetFilter import com.gemwallet.android.model.AssetInfo +import com.gemwallet.android.model.RecentType import com.gemwallet.android.ui.models.navigation.RouteArgument import com.wallet.core.primitives.AssetId import dagger.hilt.android.lifecycle.HiltViewModel @@ -75,6 +76,8 @@ class SwapSelectViewModel @Inject constructor( } override fun assetFilters() = setOf(AssetFilter.Swappable) + + override val recentTypes: List get() = listOf(RecentType.SwapSelect, RecentType.Swap) } private fun SavedStateHandle.requireSwapItemType(): SwapItemType = diff --git a/android/gemcore/src/main/kotlin/com/gemwallet/android/model/RecentType.kt b/android/gemcore/src/main/kotlin/com/gemwallet/android/model/RecentType.kt index 0498e0bfa9..c2e1c37074 100644 --- a/android/gemcore/src/main/kotlin/com/gemwallet/android/model/RecentType.kt +++ b/android/gemcore/src/main/kotlin/com/gemwallet/android/model/RecentType.kt @@ -15,6 +15,8 @@ enum class RecentType { Buy, @SerialName("Swap") Swap, + @SerialName("SwapSelect") + SwapSelect, @SerialName("Perpetual") Perpetual, } \ No newline at end of file diff --git a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/RecentActivityType.kt b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/RecentActivityType.kt index 8d32ea9dd5..4e7eafe1cd 100644 --- a/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/RecentActivityType.kt +++ b/android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/RecentActivityType.kt @@ -21,6 +21,8 @@ enum class RecentActivityType(val string: String) { FiatSell("fiatSell"), @SerialName("swap") Swap("swap"), + @SerialName("swapSelect") + SwapSelect("swapSelect"), @SerialName("perpetual") Perpetual("perpetual"), } diff --git a/core/crates/primitives/src/recent_activity_type.rs b/core/crates/primitives/src/recent_activity_type.rs index 2d6bf46b4b..462b4a4a56 100644 --- a/core/crates/primitives/src/recent_activity_type.rs +++ b/core/crates/primitives/src/recent_activity_type.rs @@ -11,5 +11,6 @@ pub enum RecentActivityType { FiatBuy, FiatSell, Swap, + SwapSelect, Perpetual, } diff --git a/ios/Features/Assets/Sources/Scenes/SelectAssetScene.swift b/ios/Features/Assets/Sources/Scenes/SelectAssetScene.swift index 2b38d0da70..99aec55888 100644 --- a/ios/Features/Assets/Sources/Scenes/SelectAssetScene.swift +++ b/ios/Features/Assets/Sources/Scenes/SelectAssetScene.swift @@ -77,18 +77,12 @@ public struct SelectAssetScene: View { onSelectRecents: model.onSelectRecents, ) { assetModel in switch model.selectType { - case .send, .receive, .buy: + case .send, .receive, .buy, .swap: Button { model.onSelectRecent(assetModel.asset) } label: { AssetChipView(model: assetModel) } - case .swap: - Button { - model.selectAsset(asset: assetModel.asset) - } label: { - AssetChipView(model: assetModel) - } case .manage, .priceAlert, .deposit, .withdraw: EmptyView() } diff --git a/ios/Features/Assets/Sources/ViewModels/SelectAssetViewModel.swift b/ios/Features/Assets/Sources/ViewModels/SelectAssetViewModel.swift index 1fffe921e1..3b1fe1cdb7 100644 --- a/ios/Features/Assets/Sources/ViewModels/SelectAssetViewModel.swift +++ b/ios/Features/Assets/Sources/ViewModels/SelectAssetViewModel.swift @@ -84,7 +84,7 @@ public final class SelectAssetViewModel { RecentActivityRequest( walletId: wallet.id, limit: 10, - types: RecentActivityType.allCases, + types: selectType.recentActivityTypes, filters: filter.defaultFilters, ), initialValue: [], @@ -233,7 +233,10 @@ extension SelectAssetViewModel { Task { await setPriceAlert(assetId: asset.id, enabled: true) } - case .manage, .send, .receive, .buy, .swap, .deposit, .withdraw: break + case .swap: + updateRecent(assetId: asset.id) + case .manage, .send, .receive, .buy, .deposit, .withdraw: + break } onSelectAssetAction?(asset) } @@ -330,7 +333,7 @@ extension SelectAssetViewModel { case .send, .receive, .buy: assetSelection = .recent(SelectAssetInput(type: selectType, assetAddress: assetAddress(for: asset))) case .swap: - selectAsset(asset: asset) + onSelectAssetAction?(asset) case .manage, .priceAlert, .deposit, .withdraw: break } diff --git a/ios/Features/Recents/Sources/ViewModels/RecentsSceneViewModel.swift b/ios/Features/Recents/Sources/ViewModels/RecentsSceneViewModel.swift index 3ce80c8571..69ffb57c4c 100644 --- a/ios/Features/Recents/Sources/ViewModels/RecentsSceneViewModel.swift +++ b/ios/Features/Recents/Sources/ViewModels/RecentsSceneViewModel.swift @@ -77,7 +77,7 @@ public final class RecentsSceneViewModel { extension RecentsSceneViewModel { func onSelectClear() { do { - try activityService.clearRecent(walletId: walletId, types: RecentActivityType.allCases) + try activityService.clearRecent(walletId: walletId, types: query.request.types) } catch { debugLog("RecentsSceneViewModel clear error: \(error)") } diff --git a/ios/Packages/Primitives/Sources/Generated/RecentActivityType.swift b/ios/Packages/Primitives/Sources/Generated/RecentActivityType.swift index 1a8915e1fd..66246f3cf5 100644 --- a/ios/Packages/Primitives/Sources/Generated/RecentActivityType.swift +++ b/ios/Packages/Primitives/Sources/Generated/RecentActivityType.swift @@ -11,5 +11,6 @@ public enum RecentActivityType: String, Codable, CaseIterable, Equatable, Sendab case fiatBuy case fiatSell case swap + case swapSelect case perpetual } diff --git a/ios/Packages/Primitives/Sources/SelectAssetType.swift b/ios/Packages/Primitives/Sources/SelectAssetType.swift index 7243ef5165..8446701cb1 100644 --- a/ios/Packages/Primitives/Sources/SelectAssetType.swift +++ b/ios/Packages/Primitives/Sources/SelectAssetType.swift @@ -31,7 +31,15 @@ public extension SelectAssetType { switch self { case .receive: RecentActivityData(type: .receive, assetId: assetId, toAssetId: nil) case .buy: RecentActivityData(type: .fiatBuy, assetId: assetId, toAssetId: nil) - case .send, .swap, .manage, .priceAlert, .deposit, .withdraw: .none + case .swap: RecentActivityData(type: .swapSelect, assetId: assetId, toAssetId: nil) + case .send, .manage, .priceAlert, .deposit, .withdraw: .none + } + } + + var recentActivityTypes: [RecentActivityType] { + switch self { + case .swap: [.swapSelect, .swap] + case .send, .receive, .buy, .manage, .priceAlert, .deposit, .withdraw: RecentActivityType.allCases } } } diff --git a/ios/Packages/Primitives/Tests/PrimitivesTests/SelectAssetTypeTests.swift b/ios/Packages/Primitives/Tests/PrimitivesTests/SelectAssetTypeTests.swift new file mode 100644 index 0000000000..2a0517fe65 --- /dev/null +++ b/ios/Packages/Primitives/Tests/PrimitivesTests/SelectAssetTypeTests.swift @@ -0,0 +1,24 @@ +// Copyright (c). Gem Wallet. All rights reserved. + +import Primitives +import Testing + +struct SelectAssetTypeTests { + @Test + func recentActivityTypes() { + #expect(SelectAssetType.swap(.pay).recentActivityTypes == [.swapSelect, .swap]) + #expect(SelectAssetType.swap(.receive(chains: [], assetIds: [])).recentActivityTypes == [.swapSelect, .swap]) + #expect(SelectAssetType.receive(.asset).recentActivityTypes == RecentActivityType.allCases) + #expect(SelectAssetType.buy.recentActivityTypes == RecentActivityType.allCases) + } + + @Test + func recentActivityData() { + let assetId = AssetId(chain: .bitcoin) + #expect(SelectAssetType.swap(.pay).recentActivityData(assetId: assetId)?.type == .swapSelect) + #expect(SelectAssetType.swap(.receive(chains: [], assetIds: [])).recentActivityData(assetId: assetId)?.type == .swapSelect) + #expect(SelectAssetType.receive(.asset).recentActivityData(assetId: assetId)?.type == .receive) + #expect(SelectAssetType.buy.recentActivityData(assetId: assetId)?.type == .fiatBuy) + #expect(SelectAssetType.send.recentActivityData(assetId: assetId) == nil) + } +}