Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude/agents/module-scaffolder.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,14 @@ fun <Name>Screen() {
package com.flipcash.app.<name>.internal

import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
internal class <Name>ViewModel @Inject constructor(
dispatchers: DispatcherProvider,
) : BaseViewModel2<<Name>ViewModel.State, <Name>ViewModel.Event>(
) : BaseViewModel<<Name>ViewModel.State, <Name>ViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
2 changes: 1 addition & 1 deletion .claude/agents/test-gap-finder.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class <Name>ViewModelTest {
@get:Rule val mainCoroutineRule = MainCoroutineRule()

// Dependencies as mockk(relaxed = true)
// VMs extend BaseViewModel2<State, Event> with a companion `updateStateForEvent` reducer
// VMs extend BaseViewModel<State, Event> with a companion `updateStateForEvent` reducer
// Test the pure updateStateForEvent reducer function directly when possible
// For integration: create VM, dispatch events, advanceUntilIdle(), assert stateFlow value
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.flipcash.app.featureflags.FeatureFlagController
import com.flipcash.app.menu.MenuItem
import com.flipcash.app.userflags.UserFlagsCoordinator
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
Expand All @@ -25,7 +25,7 @@ internal class AdvancedFeaturesScreenViewModel @Inject constructor(
featureFlagController: FeatureFlagController,
userFlags: UserFlagsCoordinator,
dispatchers: DispatcherProvider,
) : BaseViewModel2<AdvancedFeaturesScreenViewModel.State, AdvancedFeaturesScreenViewModel.Event>(
) : BaseViewModel<AdvancedFeaturesScreenViewModel.State, AdvancedFeaturesScreenViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.flipcash.services.internal.model.thirdparty.OnRampProvider
import com.flipcash.services.user.AuthState
import com.flipcash.services.user.UserManager
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterIsInstance
Expand All @@ -23,7 +23,7 @@ internal class BalanceViewModel @Inject constructor(
userManager: UserManager,
userFlags: UserFlagsCoordinator,
dispatchers: DispatcherProvider,
) : BaseViewModel2<BalanceViewModel.State, BalanceViewModel.Event>(
) : BaseViewModel<BalanceViewModel.State, BalanceViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import com.getcode.solana.keys.Mint
import com.getcode.ui.components.text.AmountAnimatedInputUiModel
import com.getcode.ui.components.text.NumberInputHelper
import com.getcode.util.resources.ResourceHelper
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CompletableDeferred
Expand Down Expand Up @@ -54,7 +54,7 @@ internal class CashScreenViewModel @Inject constructor(
tokenCoordinator: TokenCoordinator,
transactionController: TransactionOperations,
dispatchers: DispatcherProvider,
) : BaseViewModel2<CashScreenViewModel.State, CashScreenViewModel.Event>(
) : BaseViewModel<CashScreenViewModel.State, CashScreenViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.getcode.manager.BottomBarManager
import com.getcode.manager.BottomBarManager.BottomBarButtonStyle
import com.getcode.util.resources.ResourceHelper
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
Expand All @@ -45,7 +45,7 @@ class EmailVerificationViewModel @Inject constructor(
private val resources: ResourceHelper,
private val dispatchers: DispatcherProvider,
private val emailCodeChannel: EmailCodeChannel,
) : BaseViewModel2<EmailVerificationViewModel.State, EmailVerificationViewModel.Event>(
) : BaseViewModel<EmailVerificationViewModel.State, EmailVerificationViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.flipcash.services.models.ContactMethod
import com.flipcash.services.models.PhoneVerificationError
import com.getcode.manager.BottomBarManager
import com.getcode.util.resources.ResourceHelper
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
Expand All @@ -39,7 +39,7 @@ internal class PhoneVerificationViewModel @Inject constructor(
private val profileController: ProfileController,
private val resources: ResourceHelper,
private val dispatchers: DispatcherProvider,
) : BaseViewModel2<PhoneVerificationViewModel.State, PhoneVerificationViewModel.Event>(
) : BaseViewModel<PhoneVerificationViewModel.State, PhoneVerificationViewModel.Event>(
initialState = State(selectedLocale = phoneUtils.defaultCountryLocale),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ import com.getcode.opencode.model.ui.TokenBillCustomizations
import com.getcode.solana.keys.Mint
import com.getcode.util.resources.ContentReader
import com.getcode.util.resources.ResourceHelper
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.FlowPreview
Expand Down Expand Up @@ -98,7 +98,7 @@ internal class CurrencyCreatorViewModel @Inject constructor(
val contentReader: ContentReader,
val purchaseMethodController: PurchaseMethodController,
private val currencyCreatorCoordinator: CurrencyCreatorCoordinator,
) : BaseViewModel2<CurrencyCreatorViewModel.State, CurrencyCreatorViewModel.Event>(
) : BaseViewModel<CurrencyCreatorViewModel.State, CurrencyCreatorViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import com.flipcash.app.featureflags.FeatureFlag
import com.flipcash.app.featureflags.FeatureFlagController
import com.getcode.opencode.model.financial.Token
import com.getcode.opencode.model.financial.usdf
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.filterIsInstance
Expand All @@ -36,7 +36,7 @@ internal class DepositViewModel @Inject constructor(
resources: ResourceHelper,
dispatchers: DispatcherProvider,
featureFlags: FeatureFlagController,
) : BaseViewModel2<DepositViewModel.State, DepositViewModel.Event>(
) : BaseViewModel<DepositViewModel.State, DepositViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.flipcash.app.devicelogs.internal
import androidx.lifecycle.viewModelScope
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.utils.TraceManager
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.launchIn
Expand All @@ -13,7 +13,7 @@ import javax.inject.Inject
@HiltViewModel
internal class DeviceLogsScreenViewModel @Inject constructor(
dispatchers: DispatcherProvider,
) : BaseViewModel2<DeviceLogsScreenViewModel.State, DeviceLogsScreenViewModel.Event>(
) : BaseViewModel<DeviceLogsScreenViewModel.State, DeviceLogsScreenViewModel.Event>(
// Subscribing to the SharedFlow replay cache below seeds history naturally —
// new collectors receive the last N lines as emissions.
initialState = State(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.getcode.opencode.model.ui.DiscoverCategory
import com.getcode.solana.keys.Mint
import com.getcode.util.resources.ResourceHelper
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.filterIsInstance
Expand All @@ -28,7 +28,7 @@ internal class TokenDiscoveryViewModel @Inject constructor(
private val resources: ResourceHelper,
featureFlags: FeatureFlagController,
dispatchers: DispatcherProvider,
) : BaseViewModel2<TokenDiscoveryViewModel.State, TokenDiscoveryViewModel.Event>(
) : BaseViewModel<TokenDiscoveryViewModel.State, TokenDiscoveryViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.getcode.manager.BottomBarManager
import com.getcode.util.resources.ResourceHelper
import com.getcode.utils.encodeBase64
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.filter
Expand All @@ -30,7 +30,7 @@ class LoginViewModel @Inject constructor(
private val resources: ResourceHelper,
private val analytics: FlipcashAnalyticsService,
dispatchers: DispatcherProvider,
) : BaseViewModel2<LoginViewModel.State, LoginViewModel.Event>(
) : BaseViewModel<LoginViewModel.State, LoginViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import com.getcode.manager.BottomBarManager
import com.getcode.navigation.core.CodeNavigator
import com.getcode.opencode.managers.MnemonicManager
import com.getcode.util.resources.ResourceHelper
import com.getcode.view.BaseViewModel
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -47,7 +47,7 @@ class SeedInputViewModel @Inject constructor(
private val userFlags: UserFlagsCoordinator,
private val resources: ResourceHelper,
private val mnemonicManager: MnemonicManager,
) : BaseViewModel(resources) {
) : ViewModel() {
val uiFlow = MutableStateFlow(SeedInputUiModel())
private val mnemonicCode = mnemonicManager.mnemonicCode

Expand Down Expand Up @@ -99,8 +99,8 @@ class SeedInputViewModel @Inject constructor(
.onFailure {
if (it is AuthManager.AuthManagerException.TimelockUnlockedException) {
BottomBarManager.showAlert(
getString(R.string.error_title_timelockUnlocked),
getString(R.string.error_description_timelockUnlocked)
resources.getString(R.string.error_title_timelockUnlocked),
resources.getString(R.string.error_description_timelockUnlocked)
)
navigator.popAll()
} else {
Expand All @@ -118,8 +118,8 @@ class SeedInputViewModel @Inject constructor(
}.onFailure {
setState(isLoading = false, isSuccess = false, isContinueEnabled = false)
BottomBarManager.showError(
getString(R.string.error_title_loginFailed),
getString(R.string.error_description_loginFailed)
resources.getString(R.string.error_title_loginFailed),
resources.getString(R.string.error_description_loginFailed)
)
}
} else {
Expand Down Expand Up @@ -157,8 +157,8 @@ class SeedInputViewModel @Inject constructor(
is SelectCredentialError.UserCancelled -> { /* no op */ }
else -> {
BottomBarManager.showError(
getString(R.string.error_title_selectCredential),
getString(R.string.error_description_selectCredential)
resources.getString(R.string.error_title_selectCredential),
resources.getString(R.string.error_description_selectCredential)
)
}
}
Expand All @@ -175,15 +175,6 @@ class SeedInputViewModel @Inject constructor(
}
}

override fun setIsLoading(isLoading: Boolean) {
uiFlow.update {
it.copy(
isLoading = isLoading,
continueEnabled = false
)
}
}

private fun getValidCount(userWordList: List<String>, mnemonicWordList: List<String>): Int {
return userWordList.filter { it in mnemonicWordList }.size
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.getcode.opencode.managers.MnemonicManager
import com.getcode.util.resources.ResourceHelper
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.manager.BottomBarAction
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.delay
Expand Down Expand Up @@ -55,7 +55,7 @@ internal class MenuScreenViewModel @Inject constructor(
dispatchers: DispatcherProvider,
releaseStageProvider: ReleaseStageProvider,
) :
BaseViewModel2<MenuScreenViewModel.State, MenuScreenViewModel.Event>(
BaseViewModel<MenuScreenViewModel.State, MenuScreenViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.getcode.manager.BottomBarManager
import com.getcode.solana.keys.base58
import com.getcode.util.resources.ResourceHelper
import com.getcode.utils.base64
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.combine
Expand Down Expand Up @@ -43,7 +43,7 @@ internal class MyAccountScreenViewModel @Inject constructor(
authManager: AuthManager,
clipboardManager: ClipboardManager,
dispatchers: DispatcherProvider,
) : BaseViewModel2<MyAccountScreenViewModel.State, MyAccountScreenViewModel.Event>(
) : BaseViewModel<MyAccountScreenViewModel.State, MyAccountScreenViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import com.getcode.manager.BottomBarManager
import com.getcode.opencode.model.financial.Fiat
import com.getcode.util.resources.ResourceHelper
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
Expand All @@ -37,7 +37,7 @@ internal class PurchaseAccountViewModel @Inject constructor(
billingClient: BillingClient,
resources: ResourceHelper,
dispatchers: DispatcherProvider,
) : BaseViewModel2<PurchaseAccountViewModel.State, PurchaseAccountViewModel.Event>(
) : BaseViewModel<PurchaseAccountViewModel.State, PurchaseAccountViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.getcode.opencode.model.core.ID
import com.getcode.solana.keys.Mint
import com.getcode.solana.keys.PublicKey
import com.getcode.util.resources.ResourceHelper
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.flatMapLatest
Expand All @@ -39,7 +39,7 @@ class TransactionHistoryViewModel @Inject constructor(
userManager: UserManager,
resources: ResourceHelper,
dispatchers: DispatcherProvider,
): BaseViewModel2<TransactionHistoryViewModel.State, TransactionHistoryViewModel.Event>(
): BaseViewModel<TransactionHistoryViewModel.State, TransactionHistoryViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.flipcash.app.userflags.UserFlagsCoordinator
import com.flipcash.app.userflags.internal.components.FieldEditorSheet
import com.flipcash.features.userflags.R
import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.launchIn
Expand All @@ -22,7 +22,7 @@ import javax.inject.Inject
internal class UserFlagsViewModel @Inject constructor(
flagsCoordinator: UserFlagsCoordinator,
dispatchers: DispatcherProvider,
) : BaseViewModel2<UserFlagsViewModel.State, UserFlagsViewModel.Event>(
) : BaseViewModel<UserFlagsViewModel.State, UserFlagsViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import com.getcode.ui.components.text.NumberInputHelper
import com.getcode.util.resources.ResourceHelper
import com.getcode.utils.base58
import com.getcode.vendor.Base58
import com.getcode.view.BaseViewModel2
import com.getcode.view.BaseViewModel
import com.getcode.view.LoadingSuccessState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.coroutineScope
Expand Down Expand Up @@ -81,7 +81,7 @@ internal class WithdrawalViewModel @Inject constructor(
analytics: FlipcashAnalyticsService,
private val tokenCoordinator: TokenCoordinator,
dispatchers: DispatcherProvider,
) : BaseViewModel2<WithdrawalViewModel.State, WithdrawalViewModel.Event>(
) : BaseViewModel<WithdrawalViewModel.State, WithdrawalViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
Expand Down
Loading
Loading