Skip to content

Commit 828c87c

Browse files
committed
refactor(onramp): consolidate Coinbase onramp into CoinbaseOnRampController
Merge CoinbaseOnRampManager into OnRampController and rename to CoinbaseOnRampController for consistency with ExternalWalletOnRampController. Provide via LocalCoinbaseOnRampController from MainActivity and remove ViewModel intermediary.
1 parent 12e3e45 commit 828c87c

File tree

9 files changed

+66
-74
lines changed

9 files changed

+66
-74
lines changed

apps/flipcash/app/src/main/kotlin/com/flipcash/app/MainActivity.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import com.flipcash.app.core.verification.email.EmailCodeChannel
2121
import com.flipcash.app.core.verification.email.LocalEmailCodeChannel
2222
import com.flipcash.app.onramp.ExternalWalletOnRampController
2323
import com.flipcash.app.onramp.LocalExternalWalletOnRampController
24+
import com.flipcash.app.onramp.LocalCoinbaseOnRampController
25+
import com.flipcash.app.onramp.CoinbaseOnRampController
2426
import com.flipcash.app.featureflags.FeatureFlagController
2527
import com.flipcash.app.featureflags.LocalFeatureFlags
2628
import com.flipcash.app.internal.ui.App
@@ -118,6 +120,9 @@ class MainActivity : FragmentActivity() {
118120
@Inject
119121
lateinit var externalWalletOnRampController: ExternalWalletOnRampController
120122

123+
@Inject
124+
lateinit var coinbaseOnRampController: CoinbaseOnRampController
125+
121126
override fun onCreate(savedInstanceState: Bundle?) {
122127
super.onCreate(savedInstanceState)
123128
handleUncaughtException()
@@ -142,6 +147,7 @@ class MainActivity : FragmentActivity() {
142147
LocalAppUpdater provides appUpdater,
143148
LocalEmailCodeChannel provides emailCodeChannel,
144149
LocalExternalWalletOnRampController provides externalWalletOnRampController,
150+
LocalCoinbaseOnRampController provides coinbaseOnRampController,
145151
LocalUiTesting provides intent.getBooleanExtra(UI_TEST, false),
146152
) {
147153
ProvidePermissionChecker(permissionChecker) {

apps/flipcash/app/src/main/kotlin/com/flipcash/app/internal/ui/App.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import com.flipcash.app.internal.ui.navigation.decorators.rememberNavMessagingEn
4242
import com.flipcash.app.onramp.CoinbaseOnRampHandler
4343
import com.flipcash.app.onramp.ExternalWalletOnRampHandler
4444
import com.flipcash.app.onramp.LocalExternalWalletOnRampController
45+
import com.flipcash.app.onramp.LocalCoinbaseOnRampController
4546
import com.flipcash.app.router.LocalRouter
4647
import com.flipcash.app.session.LocalSessionController
4748
import com.flipcash.app.theme.FlipcashTheme
@@ -145,8 +146,7 @@ internal fun App(
145146
navigator = codeNavigator,
146147
) {
147148
CoinbaseOnRampHandler(
148-
manager = viewModel.coinbaseOnRampManager,
149-
controller = viewModel.onRampController,
149+
controller = LocalCoinbaseOnRampController.current,
150150
navigator = codeNavigator,
151151
) {
152152
AppNavHost(

apps/flipcash/app/src/main/kotlin/com/flipcash/app/internal/ui/HomeViewModel.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import com.flipcash.app.android.R
66
import com.flipcash.app.appsettings.AppSettingValue
77
import com.flipcash.app.appsettings.AppSettingsCoordinator
88
import com.flipcash.app.auth.AuthManager
9-
import com.flipcash.app.onramp.CoinbaseOnRampManager
10-
import com.flipcash.app.onramp.OnRampController
119
import com.flipcash.app.shareable.ShareSheetController
1210
import com.flipcash.services.user.UserManager
1311
import com.getcode.manager.BottomBarAction
@@ -28,8 +26,6 @@ internal class HomeViewModel @Inject constructor(
2826
private val resources: ResourceHelper,
2927
private val appSettingsCoordinator: AppSettingsCoordinator,
3028
private val shareSheetController: ShareSheetController,
31-
val coinbaseOnRampManager: CoinbaseOnRampManager,
32-
val onRampController: OnRampController,
3329
) : ViewModel() {
3430

3531
private val _requireBiometrics = MutableStateFlow<Boolean?>(null)

apps/flipcash/features/onramp/src/main/kotlin/com/flipcash/app/onramp/internal/OnRampViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.flipcash.app.core.extensions.onResult
66
import com.flipcash.app.core.ui.CurrencyHolder
77
import com.flipcash.app.onramp.CoinbaseOnRampState
88
import com.flipcash.app.onramp.OnRampAuthError
9-
import com.flipcash.app.onramp.OnRampController
9+
import com.flipcash.app.onramp.CoinbaseOnRampController
1010
import com.flipcash.app.onramp.OnRampPaymentError
1111
import com.flipcash.features.onramp.R
1212
import com.flipcash.libs.coroutines.DispatcherProvider
@@ -72,7 +72,7 @@ internal data class AmountEntryState(
7272
internal class OnRampViewModel @Inject constructor(
7373
private val exchange: Exchange,
7474
private val resources: ResourceHelper,
75-
private val onRampController: OnRampController,
75+
private val onRampController: CoinbaseOnRampController,
7676
tokenController: TokenController,
7777
transactionController: TransactionOperations,
7878
dispatchers: DispatcherProvider,

apps/flipcash/shared/onramp/coinbase/src/main/kotlin/com/flipcash/app/onramp/OnRampController.kt renamed to apps/flipcash/shared/onramp/coinbase/src/main/kotlin/com/flipcash/app/onramp/CoinbaseOnRampController.kt

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ import com.getcode.opencode.model.transactions.SwapFundingSource
2727
import com.getcode.solana.keys.base58
2828
import com.getcode.utils.base64
2929
import com.getcode.vendor.Base58
30+
import com.flipcash.app.onramp.internal.CoinbaseOnRampWebError
31+
import dagger.hilt.android.scopes.ActivityRetainedScoped
32+
import kotlinx.coroutines.flow.MutableStateFlow
3033
import kotlinx.coroutines.flow.StateFlow
34+
import kotlinx.coroutines.flow.asStateFlow
35+
import kotlinx.coroutines.flow.update
3136
import kotlinx.serialization.Serializable
3237
import kotlinx.serialization.json.Json
3338
import retrofit2.HttpException
@@ -38,19 +43,45 @@ typealias OrderWithPaymentLink = Pair<String, OnRampPurchaseResponse.PaymentLink
3843

3944
private val json = Json { encodeDefaults = true }
4045

41-
class OnRampController @Inject constructor(
46+
@ActivityRetainedScoped
47+
class CoinbaseOnRampController @Inject constructor(
4248
private val jwtProvider: OnRampJwtProvider,
4349
private val onRampApiEndpoint: OnRampApiConfig,
4450
private val api: CoinbaseApi,
4551
private val userManager: UserManager,
4652
private val exchange: Exchange,
4753
private val featureFlags: FeatureFlagController,
48-
private val coinbaseOnRampManager: CoinbaseOnRampManager,
4954
private val transactionController: TransactionOperations,
5055
private val googlePayReadiness: GooglePayReadiness,
5156
) {
5257

53-
val state: StateFlow<CoinbaseOnRampState> get() = coinbaseOnRampManager.state
58+
private val _state = MutableStateFlow<CoinbaseOnRampState>(CoinbaseOnRampState.Idle)
59+
val state: StateFlow<CoinbaseOnRampState> = _state.asStateFlow()
60+
61+
fun startPayment(order: OnrampOrder, token: Token, amount: LocalFiat) {
62+
_state.value = CoinbaseOnRampState.Paying(order, token, amount)
63+
}
64+
65+
fun onPaymentSuccess(orderId: String) {
66+
val current = _state.value
67+
if (current is CoinbaseOnRampState.Paying) {
68+
_state.update {
69+
CoinbaseOnRampState.Processing(orderId, current.token, current.amount)
70+
}
71+
}
72+
}
73+
74+
fun onPaymentFailure(error: CoinbaseOnRampWebError) {
75+
_state.update { CoinbaseOnRampState.Failed(error) }
76+
}
77+
78+
fun onPaymentCancel() {
79+
_state.update { CoinbaseOnRampState.Idle }
80+
}
81+
82+
fun reset() {
83+
_state.update { CoinbaseOnRampState.Idle }
84+
}
5485

5586
suspend fun placeOrderAndStartPayment(
5687
amount: Fiat,
@@ -68,12 +99,12 @@ class OnRampController @Inject constructor(
6899
return placeOrderInclusiveOfFees(amount)
69100
.map { (orderId, paymentLink) ->
70101
val order = OnrampOrder(orderId, paymentLink.url)
71-
coinbaseOnRampManager.startPayment(order, token, localFiat)
102+
startPayment(order, token, localFiat)
72103
}
73104
}
74105

75106
suspend fun processPayment(): Result<SwapId> {
76-
val current = coinbaseOnRampManager.state.value
107+
val current = _state.value
77108
if (current !is CoinbaseOnRampState.Processing) {
78109
return Result.failure(IllegalStateException("Not in Processing state"))
79110
}
@@ -99,10 +130,10 @@ class OnRampController @Inject constructor(
99130
).getOrThrow()
100131
}
101132
.onSuccess { swapId ->
102-
coinbaseOnRampManager.onCompleted(swapId)
133+
_state.update { CoinbaseOnRampState.Completed(swapId) }
103134
}
104135
.onFailure {
105-
coinbaseOnRampManager.reset()
136+
reset()
106137
}
107138
}
108139

apps/flipcash/shared/onramp/coinbase/src/main/kotlin/com/flipcash/app/onramp/CoinbaseOnRampHandler.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ import kotlinx.coroutines.delay
1515

1616
@Composable
1717
fun CoinbaseOnRampHandler(
18-
manager: CoinbaseOnRampManager,
19-
controller: OnRampController,
18+
controller: CoinbaseOnRampController,
2019
navigator: CodeNavigator,
2120
content: @Composable () -> Unit,
2221
) {
23-
val state by manager.state.collectAsState()
22+
val state by controller.state.collectAsState()
2423
val context = LocalContext.current
2524

2625
when (val current = state) {
@@ -29,13 +28,13 @@ fun CoinbaseOnRampHandler(
2928
orderId = current.order.orderId,
3029
paymentLinkUrl = current.order.paymentLink,
3130
onPaymentSuccess = { orderId ->
32-
manager.onPaymentSuccess(orderId)
31+
controller.onPaymentSuccess(orderId)
3332
},
3433
onPaymentFailure = { error ->
35-
manager.onPaymentFailure(error)
34+
controller.onPaymentFailure(error)
3635
},
3736
onCancel = {
38-
manager.onPaymentCancel()
37+
controller.onPaymentCancel()
3938
},
4039
)
4140
}
@@ -56,15 +55,15 @@ fun CoinbaseOnRampHandler(
5655
is CoinbaseOnRampState.Completed -> {
5756
LaunchedEffect(current) {
5857
navigator.push(AppRoute.Token.TxProcessing(current.swapId))
59-
manager.reset()
58+
controller.reset()
6059
}
6160
}
6261

6362
is CoinbaseOnRampState.Failed -> {
6463
LaunchedEffect(current) {
6564
delay(400) // let the system payment sheet finish its dismiss animation
6665
showOnRampFailure(context, current.error)
67-
manager.reset()
66+
controller.reset()
6867
}
6968
}
7069

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.flipcash.app.onramp
2+
3+
import androidx.compose.runtime.compositionLocalOf
4+
5+
val LocalCoinbaseOnRampController =
6+
compositionLocalOf<CoinbaseOnRampController> { throw IllegalStateException() }

apps/flipcash/shared/onramp/coinbase/src/main/kotlin/com/flipcash/app/onramp/CoinbaseOnRampManager.kt

Lines changed: 0 additions & 48 deletions
This file was deleted.

apps/flipcash/shared/onramp/coinbase/src/test/kotlin/com/flipcash/app/onramp/OnRampControllerTest.kt renamed to apps/flipcash/shared/onramp/coinbase/src/test/kotlin/com/flipcash/app/onramp/CoinbaseOnRampControllerTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import kotlin.test.assertTrue
3131
@OptIn(ExperimentalCoroutinesApi::class)
3232
@RunWith(RobolectricTestRunner::class)
3333
@Config(manifest = Config.NONE)
34-
class OnRampControllerTest {
34+
class CoinbaseOnRampControllerTest {
3535

3636
private val jwtProvider = mockk<OnRampJwtProvider>(relaxed = true)
3737
private val api = mockk<CoinbaseApi>(relaxed = true)
@@ -46,7 +46,7 @@ class OnRampControllerTest {
4646
method = "POST",
4747
)
4848

49-
private lateinit var controller: OnRampController
49+
private lateinit var controller: CoinbaseOnRampController
5050

5151
@Before
5252
fun setUp() {
@@ -58,13 +58,15 @@ class OnRampControllerTest {
5858
every { Token.usdf } returns fakeToken
5959
every { fakeToken.timelockSwapAccounts(any()) } returns mockk(relaxed = true)
6060

61-
controller = OnRampController(
61+
controller = CoinbaseOnRampController(
6262
jwtProvider = jwtProvider,
6363
onRampApiEndpoint = onRampApiEndpoint,
6464
api = api,
6565
userManager = userManager,
6666
exchange = exchange,
6767
featureFlags = featureFlags,
68+
transactionController = mockk(relaxed = true),
69+
googlePayReadiness = mockk(relaxed = true),
6870
)
6971
}
7072

0 commit comments

Comments
 (0)