Skip to content

Commit 1756d58

Browse files
committed
feat(flipcash): add interstital informational screens for transfers
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent ef017dc commit 1756d58

19 files changed

Lines changed: 393 additions & 46 deletions

File tree

apps/flipcash/app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ dependencies {
148148
implementation(project(":apps:flipcash:shared:notifications"))
149149
implementation(project(":apps:flipcash:shared:permissions"))
150150
implementation(project(":apps:flipcash:shared:shareable"))
151+
implementation(project(":apps:flipcash:shared:transfers"))
151152
implementation(project(":apps:flipcash:shared:workers"))
152153
implementation(project(":apps:flipcash:features:login"))
153154
implementation(project(":apps:flipcash:features:purchase"))

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.flipcash.app.permissions.NotificationPermissionScreen
2222
import com.flipcash.app.purchase.PurchaseAccountScreen
2323
import com.flipcash.app.scanner.ScannerScreen
2424
import com.flipcash.app.shareapp.ShareAppScreen
25+
import com.flipcash.app.transfers.TransferInformationalScreen
2526
import com.flipcash.app.withdrawal.WithdrawalConfirmationScreen
2627
import com.flipcash.app.withdrawal.WithdrawalDestinationScreen
2728
import com.flipcash.app.withdrawal.WithdrawalEntryScreen
@@ -99,20 +100,24 @@ internal fun AppScreenContent(content: @Composable () -> Unit) {
99100
LabsModal()
100101
}
101102

102-
register<NavScreenProvider.HomeScreen.Menu.Deposit> {
103+
register<NavScreenProvider.HomeScreen.Menu.Transfers.Learn> {
104+
TransferInformationalScreen(it.direction)
105+
}
106+
107+
register<NavScreenProvider.HomeScreen.Menu.Transfers.Deposit> {
103108
DepositScreen()
104109
}
105110

106-
register<NavScreenProvider.HomeScreen.Menu.Withdrawal.Amount> {
111+
register<NavScreenProvider.HomeScreen.Menu.Transfers.Withdrawal.Amount> {
107112
WithdrawalFlow.start()
108113
WithdrawalEntryScreen()
109114
}
110115

111-
register<NavScreenProvider.HomeScreen.Menu.Withdrawal.Destination> {
116+
register<NavScreenProvider.HomeScreen.Menu.Transfers.Withdrawal.Destination> {
112117
WithdrawalDestinationScreen()
113118
}
114119

115-
register<NavScreenProvider.HomeScreen.Menu.Withdrawal.Confirmation> {
120+
register<NavScreenProvider.HomeScreen.Menu.Transfers.Withdrawal.Confirmation> {
116121
WithdrawalConfirmationScreen()
117122
}
118123

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/NavScreenProvider.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.flipcash.app.core
33
import cafe.adriel.voyager.core.registry.ScreenProvider
44
import com.flipcash.app.core.money.CurrencySelectionKind
55
import com.flipcash.app.core.navigation.DeeplinkType
6+
import com.flipcash.app.core.transfers.TransferDirection
67
import com.getcode.opencode.model.financial.LocalFiat
78
import com.getcode.ui.core.RestrictionType
89

@@ -41,12 +42,16 @@ sealed class NavScreenProvider : ScreenProvider {
4142

4243
sealed class Menu {
4344
data object Root : NavScreenProvider()
44-
data object Deposit : NavScreenProvider()
4545

46-
sealed class Withdrawal {
47-
data object Amount : NavScreenProvider()
48-
data object Destination : NavScreenProvider()
49-
data object Confirmation : NavScreenProvider()
46+
data object Transfers {
47+
data class Learn(val direction: TransferDirection) : NavScreenProvider()
48+
data object Deposit : NavScreenProvider()
49+
50+
sealed class Withdrawal {
51+
data object Amount : NavScreenProvider()
52+
data object Destination : NavScreenProvider()
53+
data object Confirmation : NavScreenProvider()
54+
}
5055
}
5156

5257
sealed class MyAccount {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.flipcash.app.core.transfers
2+
3+
import android.os.Parcelable
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.ui.res.stringResource
6+
import com.flipcash.app.core.NavScreenProvider
7+
import com.flipcash.core.R
8+
import kotlinx.parcelize.IgnoredOnParcel
9+
import kotlinx.parcelize.Parcelize
10+
11+
@Parcelize
12+
sealed interface TransferDirection : Parcelable {
13+
14+
@get:Composable
15+
val title: String
16+
17+
val nextScreen: NavScreenProvider
18+
19+
@get:Composable
20+
val description: String
21+
22+
@get:Composable
23+
val learnMoreAction: String
24+
25+
@get:Composable
26+
val continueAction: String
27+
28+
data object Incoming : TransferDirection {
29+
@IgnoredOnParcel
30+
override val nextScreen: NavScreenProvider =
31+
NavScreenProvider.HomeScreen.Menu.Transfers.Deposit
32+
override val title: String
33+
@Composable get() = stringResource(R.string.title_depositUsdc)
34+
override val description: String
35+
@Composable get() = stringResource(R.string.title_learnToDeposit)
36+
override val learnMoreAction: String
37+
@Composable get() = stringResource(R.string.action_learnHowToDepositFunds)
38+
override val continueAction: String
39+
@Composable get() = stringResource(R.string.action_depositFundsNow)
40+
}
41+
42+
data object Outgoing : TransferDirection {
43+
@IgnoredOnParcel
44+
override val nextScreen: NavScreenProvider =
45+
NavScreenProvider.HomeScreen.Menu.Transfers.Withdrawal.Amount
46+
override val title: String
47+
@Composable get() = stringResource(R.string.title_withdrawUsdc)
48+
override val description: String
49+
@Composable get() = stringResource(R.string.title_learnToWithdraw)
50+
override val learnMoreAction: String
51+
@Composable get() = stringResource(R.string.action_learnHowToWithdrawFunds)
52+
override val continueAction: String
53+
@Composable get() = stringResource(R.string.action_withdrawFundsNow)
54+
}
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.flipcash.app.core.ui
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.foundation.layout.size
7+
import androidx.compose.foundation.shape.CircleShape
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.draw.drawBehind
11+
import androidx.compose.ui.geometry.Offset
12+
import androidx.compose.ui.graphics.Brush
13+
import androidx.compose.ui.graphics.Color
14+
import androidx.compose.ui.graphics.ColorFilter
15+
import androidx.compose.ui.graphics.painter.Painter
16+
import androidx.compose.ui.unit.dp
17+
import com.getcode.theme.CodeTheme
18+
19+
@Composable
20+
fun BrandedGradientIcon(
21+
painter: Painter,
22+
modifier: Modifier = Modifier,
23+
) {
24+
Image(
25+
modifier = Modifier
26+
.size(120.dp)
27+
.background(
28+
brush = Brush.linearGradient(
29+
colorStops = arrayOf(
30+
0.43f to Color(0xFF0B2D17),
31+
0.67f to Color(0xFF053209),
32+
),
33+
),
34+
shape = CircleShape
35+
)
36+
.drawBehind {
37+
drawCircle(
38+
brush = Brush.radialGradient(
39+
colors = listOf(
40+
Color(42,92,34),
41+
Color(0x00FFFFFF),
42+
),
43+
center = Offset(size.width * 0.25f, size.height * 0.25f),
44+
radius = size.width * 0.5f,
45+
),
46+
radius = size.width / 2,
47+
)
48+
}
49+
.padding(CodeTheme.dimens.grid.x6)
50+
.then(modifier),
51+
painter = painter,
52+
colorFilter = ColorFilter.tint(Color.White),
53+
contentDescription = null,
54+
)
55+
}

apps/flipcash/core/src/main/res/values/strings.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
<string name="prompt_description_deleteAccount">This will permanently delete your Flipcash account</string>
8989
<string name="action_deleteAccount">Delete Account</string>
9090

91-
<string name="error_title_failedToLogOut">Something went wrong</string>
91+
<string name="error_title_failedToLogOut">Something Went wrong</string>
9292
<string name="error_description_failedToLogOut">We were unable to log you out. Please try again</string>
9393

9494
<string name="error_title_failedToDeleteAccount">Something went wrong</string>
@@ -130,4 +130,15 @@
130130
<string name="prompt_description_didYouSendLink">Any cash that isn\'t collected within 24 hours will be automatically returned to your balance</string>
131131

132132
<string name="subtitle_startCameraToScan">You need to start your camera to grab cash</string>
133+
134+
<string name="title_learnToDeposit">You can deposit funds from your bank account into Flipcash</string>
135+
<string name="action_learnHowToDepositFunds">Learn How to Deposit Funds</string>
136+
<string name="action_depositFundsNow">Deposit Funds Now</string>
137+
138+
<string name="title_learnToWithdraw">You can withdraw your funds at any time, and move them into your bank account</string>
139+
<string name="action_learnHowToWithdrawFunds">Learn How to Withdraw Funds</string>
140+
<string name="action_withdrawFundsNow">Withdraw Funds Now</string>
141+
142+
<string name="error_title_failedToOpenExternalLink">Something Went Wrong</string>
143+
<string name="error_description_failedToOpenExternalLink">We were unable to open the link on this device. Please try again later</string>
133144
</resources>

apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/MenuScreen.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import android.os.Parcelable
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.LaunchedEffect
66
import cafe.adriel.voyager.core.registry.ScreenRegistry
7+
import cafe.adriel.voyager.core.screen.ScreenKey
8+
import cafe.adriel.voyager.core.screen.uniqueScreenKey
79
import cafe.adriel.voyager.hilt.getViewModel
810
import com.flipcash.app.core.NavScreenProvider
911
import com.flipcash.app.menu.internal.MenuScreenContent
@@ -15,10 +17,15 @@ import kotlinx.coroutines.flow.filterIsInstance
1517
import kotlinx.coroutines.flow.launchIn
1618
import kotlinx.coroutines.flow.map
1719
import kotlinx.coroutines.flow.onEach
20+
import kotlinx.parcelize.IgnoredOnParcel
1821
import kotlinx.parcelize.Parcelize
1922

2023
@Parcelize
2124
class MenuScreen : ModalScreen, Parcelable {
25+
26+
@IgnoredOnParcel
27+
override val key: ScreenKey = uniqueScreenKey
28+
2229
@Composable
2330
override fun ModalContent() {
2431
val viewModel = getViewModel<MenuScreenViewModel>()

apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuItems.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.ui.res.painterResource
1010
import androidx.compose.ui.res.stringResource
1111
import cafe.adriel.voyager.core.registry.ScreenRegistry
1212
import com.flipcash.app.core.NavScreenProvider
13+
import com.flipcash.app.core.transfers.TransferDirection
1314
import com.flipcash.app.featureflags.FeatureFlag
1415
import com.flipcash.app.menu.FullMenuItem
1516
import com.flipcash.app.menu.StaffMenuItem
@@ -22,7 +23,7 @@ internal data object Deposit : FullMenuItem<MenuScreenViewModel.Event>() {
2223
override val name: String
2324
@Composable get() = stringResource(R.string.title_depositUsdc)
2425
override val action: MenuScreenViewModel.Event = MenuScreenViewModel.Event.OpenScreen(
25-
NavScreenProvider.HomeScreen.Menu.Deposit
26+
NavScreenProvider.HomeScreen.Menu.Transfers.Learn(TransferDirection.Incoming)
2627
)
2728
}
2829

@@ -33,7 +34,7 @@ internal data object Withdraw : FullMenuItem<MenuScreenViewModel.Event>() {
3334
@Composable get() = stringResource(R.string.title_withdrawUsdc)
3435

3536
override val action: MenuScreenViewModel.Event = MenuScreenViewModel.Event.OpenScreen(
36-
NavScreenProvider.HomeScreen.Menu.Withdrawal.Amount
37+
NavScreenProvider.HomeScreen.Menu.Transfers.Learn(TransferDirection.Outgoing)
3738
)
3839
}
3940

apps/flipcash/features/menu/src/main/res/drawable/ic_menu_deposit.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,5 @@
88
android:fillColor="#ffffff"/>
99
<path
1010
android:pathData="M16.976,11.609L14.063,14.522L14.063,3.008L12.438,3.008L12.438,14.522L9.524,11.609L8.375,12.758L13.25,17.633L18.125,12.758L16.976,11.609Z"
11-
android:fillColor="#ffffff"
12-
android:transform="rotate(180 13.25 10.3205)"/>
13-
</vector>
11+
android:fillColor="#ffffff"/>
12+
</vector>

apps/flipcash/features/purchase/src/main/kotlin/com/flipcash/app/purchase/internal/PurchaseAccountScreenContent.kt

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ import androidx.compose.ui.geometry.Offset
2626
import androidx.compose.ui.graphics.Brush
2727
import androidx.compose.ui.graphics.Color
2828
import androidx.compose.ui.graphics.ColorFilter
29+
import androidx.compose.ui.graphics.vector.rememberVectorPainter
2930
import androidx.compose.ui.platform.LocalContext
3031
import androidx.compose.ui.res.stringResource
3132
import androidx.compose.ui.text.style.TextAlign
3233
import androidx.compose.ui.unit.dp
3334
import cafe.adriel.voyager.core.registry.ScreenRegistry
3435
import com.flipcash.app.core.NavScreenProvider
36+
import com.flipcash.app.core.ui.BrandedGradientIcon
3537
import com.flipcash.features.purchase.R
3638
import com.getcode.navigation.core.LocalCodeNavigator
3739
import com.getcode.theme.CodeTheme
@@ -113,35 +115,8 @@ internal fun PurchaseAccountScreenContent(viewModel: PurchaseAccountViewModel) {
113115
horizontalAlignment = Alignment.CenterHorizontally
114116
) {
115117

116-
Image(
117-
modifier = Modifier
118-
.size(120.dp)
119-
.background(
120-
brush = Brush.linearGradient(
121-
colorStops = arrayOf(
122-
0.43f to Color(0xFF0B2D17),
123-
0.67f to Color(0xFF053209),
124-
),
125-
),
126-
shape = CircleShape
127-
)
128-
.drawBehind {
129-
drawCircle(
130-
brush = Brush.radialGradient(
131-
colors = listOf(
132-
Color(42,92,34),
133-
Color(0x00FFFFFF),
134-
),
135-
center = Offset(size.width * 0.25f, size.height * 0.25f),
136-
radius = size.width * 0.5f,
137-
),
138-
radius = size.width / 2,
139-
)
140-
}
141-
.padding(CodeTheme.dimens.grid.x6),
142-
imageVector = Icons.Default.CheckCircleOutline,
143-
colorFilter = ColorFilter.tint(Color.White),
144-
contentDescription = null,
118+
BrandedGradientIcon(
119+
painter = rememberVectorPainter(Icons.Default.CheckCircleOutline)
145120
)
146121

147122
if (state.hasProduct) {

0 commit comments

Comments
 (0)