Skip to content

Commit b909806

Browse files
authored
Merge pull request #516 from code-payments/feat/home-simplify
feat: simplify home bottom bar
2 parents 166dd4e + 87edfa6 commit b909806

8 files changed

Lines changed: 141 additions & 116 deletions

File tree

app/src/main/java/com/getcode/view/main/home/DecorView.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ internal fun DecorView(
5959
isCameraReady: Boolean,
6060
isPaused: Boolean,
6161
modifier: Modifier = Modifier,
62-
showBottomSheet: (HomeBottomSheet) -> Unit,
62+
onAction: (HomeAction) -> Unit,
6363
) {
6464
val tips = LocalTipsEngine.current!!.tips as DefinedTips
6565
val tipProvider = LocalTipProvider.current
@@ -74,7 +74,7 @@ internal fun DecorView(
7474

7575
val scope = rememberCoroutineScope()
7676
val openDownloadModal = {
77-
showBottomSheet(HomeBottomSheet.SHARE_DOWNLOAD)
77+
onAction(HomeAction.SHARE_DOWNLOAD)
7878
scope.launch {
7979
delay(300)
8080
tipProvider.dismiss()
@@ -113,7 +113,7 @@ internal fun DecorView(
113113
.align(Alignment.TopEnd)
114114
.clip(CircleShape)
115115
.rememberedClickable {
116-
showBottomSheet(HomeBottomSheet.ACCOUNT)
116+
onAction(HomeAction.ACCOUNT)
117117
},
118118
painter = painterResource(
119119
R.drawable.ic_home_options
@@ -186,7 +186,7 @@ internal fun DecorView(
186186
.padding(bottom = CodeTheme.dimens.grid.x3),
187187
state = dataState,
188188
onPress = {
189-
showBottomSheet(it)
189+
onAction(it)
190190
},
191191
)
192192
}

app/src/main/java/com/getcode/view/main/home/HomeScan.kt

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ import com.getcode.navigation.screens.ConnectAccount
5252
import com.getcode.navigation.screens.EnterTipModal
5353
import com.getcode.navigation.screens.GetKinModal
5454
import com.getcode.navigation.screens.GiveKinModal
55-
import com.getcode.navigation.screens.HomeResult
5655
import com.getcode.navigation.screens.ShareDownloadLinkModal
5756
import com.getcode.ui.components.OnLifecycleEvent
5857
import com.getcode.ui.components.PermissionCheck
@@ -77,7 +76,7 @@ import timber.log.Timber
7776
import kotlin.time.Duration.Companion.milliseconds
7877

7978

80-
enum class HomeBottomSheet {
79+
enum class HomeAction {
8180
NONE,
8281
ACCOUNT,
8382
GIVE_KIN,
@@ -186,22 +185,22 @@ private fun HomeScan(
186185
}
187186
}
188187

189-
fun showBottomSheet(bottomSheet: HomeBottomSheet) {
188+
fun handleAction(action: HomeAction) {
190189
scope.launch {
191-
when (bottomSheet) {
192-
HomeBottomSheet.GIVE_KIN -> navigator.show(GiveKinModal)
193-
HomeBottomSheet.ACCOUNT -> navigator.show(AccountModal)
194-
HomeBottomSheet.GET_KIN -> navigator.show(GetKinModal)
195-
HomeBottomSheet.BALANCE -> navigator.show(BalanceModal)
196-
HomeBottomSheet.SHARE_DOWNLOAD -> navigator.show(ShareDownloadLinkModal)
197-
HomeBottomSheet.TIP_CARD -> {
190+
when (action) {
191+
HomeAction.GIVE_KIN -> navigator.show(GiveKinModal)
192+
HomeAction.ACCOUNT -> navigator.show(AccountModal)
193+
HomeAction.GET_KIN -> navigator.show(GetKinModal)
194+
HomeAction.BALANCE -> navigator.show(BalanceModal)
195+
HomeAction.SHARE_DOWNLOAD -> navigator.show(ShareDownloadLinkModal)
196+
HomeAction.TIP_CARD -> {
198197
if (dataState.tipCardConnected) {
199198
homeViewModel.presentShareableTipCard()
200199
} else {
201200
navigator.show(ConnectAccount())
202201
}
203202
}
204-
HomeBottomSheet.NONE -> Unit
203+
HomeAction.NONE -> Unit
205204
}
206205
}
207206
}
@@ -225,7 +224,7 @@ private fun HomeScan(
225224
}
226225
)
227226
},
228-
showBottomSheet = { showBottomSheet(it) },
227+
onAction = { handleAction(it) },
229228
)
230229

231230
OnLifecycleEvent { _, event ->
@@ -291,7 +290,7 @@ private fun BillContainer(
291290
homeViewModel: HomeViewModel,
292291
scannerView: @Composable () -> Unit,
293292
onStartCamera: () -> Unit,
294-
showBottomSheet: (HomeBottomSheet) -> Unit,
293+
onAction: (HomeAction) -> Unit,
295294
) {
296295
val onPermissionResult =
297296
{ isGranted: Boolean ->
@@ -377,7 +376,7 @@ private fun BillContainer(
377376
exit = fadeOut(),
378377
modifier = Modifier.fillMaxSize()
379378
) {
380-
DecorView(updatedState, isCameraReady, isPaused) { showBottomSheet(it) }
379+
DecorView(updatedState, isCameraReady, isPaused) { onAction(it) }
381380
}
382381

383382
var managementHeight by remember {

app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ data class HomeUiModel(
150150
val buyModule: Feature = BuyModuleFeature(),
151151
val requestKin: Feature = RequestKinFeature(),
152152
val tips: Feature = TipCardFeature(),
153-
val tipCardOnHomeScreen: Feature = TipCardOnHomeScreenFeature(),
153+
val actions: List<HomeAction> = listOf(HomeAction.GIVE_KIN, HomeAction.TIP_CARD, HomeAction.BALANCE),
154154
val tipCardConnected: Boolean = false,
155155
)
156156

@@ -186,7 +186,6 @@ class HomeViewModel @Inject constructor(
186186
private val mnemonicManager: MnemonicManager,
187187
private val cashLinkManager: CashLinkManager,
188188
appSettings: AppSettingsRepository,
189-
betaFlags: BetaFlagsRepository,
190189
features: FeatureRepository,
191190
) : BaseViewModel(resources), ScreenModel {
192191
val uiFlow = MutableStateFlow(HomeUiModel())
@@ -208,20 +207,6 @@ class HomeViewModel @Inject constructor(
208207
}
209208
}.launchIn(viewModelScope)
210209

211-
// betaFlags.observe()
212-
// .distinctUntilChanged()
213-
// .onEach { beta ->
214-
// ErrorUtils.setDisplayErrors(beta.displayErrors)
215-
//
216-
// if (beta.establishCodeRelationship) {
217-
// val organizer = SessionManager.getOrganizer() ?: return@onEach
218-
// val domain = Domain.from("getcode.com") ?: return@onEach
219-
// if (organizer.relationshipFor(domain) == null) {
220-
// client.awaitEstablishRelationship(organizer, domain)
221-
// }
222-
// }
223-
// }.launchIn(viewModelScope)
224-
225210
features.buyModule
226211
.onEach { module ->
227212
uiFlow.update {
@@ -232,7 +217,7 @@ class HomeViewModel @Inject constructor(
232217
features.tipCardOnHomeScreen
233218
.onEach { module ->
234219
uiFlow.update {
235-
it.copy(tipCardOnHomeScreen = module)
220+
it.copy(actions = buildActions(module.enabled))
236221
}
237222
}.launchIn(viewModelScope)
238223

@@ -388,6 +373,20 @@ class HomeViewModel @Inject constructor(
388373
}
389374
}
390375

376+
private fun buildActions(
377+
tipCardOnHomeScreen: Boolean,
378+
): List<HomeAction> {
379+
return listOf(
380+
HomeAction.GIVE_KIN,
381+
if (tipCardOnHomeScreen) {
382+
HomeAction.TIP_CARD
383+
} else {
384+
HomeAction.GET_KIN
385+
},
386+
HomeAction.BALANCE
387+
)
388+
}
389+
391390
fun onCameraScanning(scanning: Boolean) {
392391
uiFlow.update { it.copy(isCameraScanEnabled = scanning) }
393392
}

app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt

Lines changed: 64 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.compose.animation.core.tween
44
import androidx.compose.animation.fadeIn
55
import androidx.compose.animation.scaleIn
66
import androidx.compose.foundation.Image
7+
import androidx.compose.foundation.layout.Arrangement
78
import androidx.compose.foundation.layout.Box
89
import androidx.compose.foundation.layout.Column
910
import androidx.compose.foundation.layout.PaddingValues
@@ -15,7 +16,6 @@ import androidx.compose.material.Text
1516
import androidx.compose.runtime.Composable
1617
import androidx.compose.ui.Alignment
1718
import androidx.compose.ui.Modifier
18-
import androidx.compose.ui.draw.clip
1919
import androidx.compose.ui.graphics.painter.Painter
2020
import androidx.compose.ui.layout.Layout
2121
import androidx.compose.ui.layout.layoutId
@@ -24,101 +24,99 @@ import androidx.compose.ui.res.stringResource
2424
import androidx.compose.ui.tooling.preview.Preview
2525
import androidx.compose.ui.unit.Dp
2626
import androidx.compose.ui.unit.dp
27+
import androidx.compose.ui.util.fastForEach
2728
import com.getcode.R
2829
import com.getcode.theme.CodeTheme
2930
import com.getcode.ui.components.Badge
3031
import com.getcode.ui.components.Row
3132
import com.getcode.ui.components.chat.ChatNodeDefaults
3233
import com.getcode.ui.utils.heightOrZero
33-
import com.getcode.ui.utils.rememberedClickable
34+
import com.getcode.ui.utils.unboundedClickable
3435
import com.getcode.ui.utils.widthOrZero
35-
import com.getcode.view.main.home.HomeBottomSheet
36+
import com.getcode.view.main.home.HomeAction
3637
import com.getcode.view.main.home.HomeUiModel
3738

3839
@Preview
3940
@Composable
4041
internal fun HomeBottom(
4142
modifier: Modifier = Modifier,
4243
state: HomeUiModel = HomeUiModel(),
43-
onPress: (homeBottomSheet: HomeBottomSheet) -> Unit = {},
44+
onPress: (homeBottomSheet: HomeAction) -> Unit = {},
4445
) {
4546
Row(
4647
modifier = Modifier
4748
.fillMaxWidth()
4849
.then(modifier),
4950
verticalAlignment = Alignment.Bottom,
50-
contentPadding = PaddingValues(horizontal = CodeTheme.dimens.grid.x3),
51+
horizontalArrangement = Arrangement.SpaceAround,
5152
) {
52-
BottomBarAction(
53-
label = if (state.tipCardOnHomeScreen.enabled) {
54-
stringResource(R.string.title_tipCard)
55-
} else {
56-
stringResource(R.string.title_getCash)
57-
},
58-
contentPadding = PaddingValues(
59-
start = CodeTheme.dimens.grid.x3,
60-
end = CodeTheme.dimens.grid.x3,
61-
top = CodeTheme.dimens.grid.x1,
62-
bottom = CodeTheme.dimens.grid.x2,
63-
),
64-
imageSize = CodeTheme.dimens.grid.x7,
65-
painter = if (state.tipCardOnHomeScreen.enabled) {
66-
painterResource(R.drawable.ic_tip_card)
67-
} else {
68-
painterResource(R.drawable.ic_wallet)
69-
},
70-
onClick = {
71-
if (state.tipCardOnHomeScreen.enabled) {
72-
onPress(HomeBottomSheet.TIP_CARD)
73-
} else {
74-
onPress(HomeBottomSheet.GET_KIN)
53+
state.actions.fastForEach { action ->
54+
when (action) {
55+
HomeAction.GIVE_KIN -> {
56+
BottomBarAction(
57+
modifier = Modifier.weight(1f),
58+
label = stringResource(R.string.action_give),
59+
painter = painterResource(R.drawable.ic_kin_white_small),
60+
onClick = { onPress(action) }
61+
)
7562
}
76-
},
77-
)
78-
Spacer(modifier = Modifier.weight(1f))
79-
BottomBarAction(
80-
label = stringResource(R.string.action_giveKin),
81-
contentPadding = PaddingValues(
82-
horizontal = CodeTheme.dimens.grid.x3,
83-
vertical = CodeTheme.dimens.grid.x2
84-
),
85-
imageSize = CodeTheme.dimens.grid.x10,
86-
painter = painterResource(R.drawable.ic_kin_white),
87-
onClick = { onPress(HomeBottomSheet.GIVE_KIN) }
88-
)
89-
Spacer(modifier = Modifier.weight(1f))
90-
BottomBarAction(
91-
label = stringResource(R.string.action_balance),
92-
contentPadding = PaddingValues(
93-
horizontal = CodeTheme.dimens.grid.x2,
94-
),
95-
imageSize = CodeTheme.dimens.grid.x9,
96-
painter = painterResource(R.drawable.ic_history),
97-
onClick = { onPress(HomeBottomSheet.BALANCE) },
98-
badge = {
99-
Badge(
100-
modifier = Modifier.padding(top = 2.dp, end = 2.dp),
101-
count = state.chatUnreadCount,
102-
color = ChatNodeDefaults.UnreadIndicator,
103-
enterTransition = scaleIn(
104-
animationSpec = tween(
105-
durationMillis = 300,
106-
delayMillis = 1000
107-
)
108-
) + fadeIn()
109-
)
63+
HomeAction.GET_KIN -> {
64+
BottomBarAction(
65+
modifier = Modifier.weight(1f),
66+
label = stringResource(R.string.action_receive),
67+
painter = painterResource(R.drawable.ic_wallet),
68+
onClick = { onPress(action) },
69+
)
70+
}
71+
HomeAction.BALANCE -> {
72+
BottomBarAction(
73+
modifier = Modifier.weight(1f),
74+
label = stringResource(R.string.action_balance),
75+
painter = painterResource(R.drawable.ic_balance),
76+
contentPadding = PaddingValues(
77+
top = CodeTheme.dimens.grid.x2,
78+
bottom = CodeTheme.dimens.grid.x3
79+
),
80+
imageSize = CodeTheme.dimens.staticGrid.x6,
81+
onClick = { onPress(HomeAction.BALANCE) },
82+
badge = {
83+
Badge(
84+
modifier = Modifier.padding(top = 2.dp, end = 2.dp),
85+
count = state.chatUnreadCount,
86+
color = ChatNodeDefaults.UnreadIndicator,
87+
enterTransition = scaleIn(
88+
animationSpec = tween(
89+
durationMillis = 300,
90+
delayMillis = 1000
91+
)
92+
) + fadeIn()
93+
)
94+
}
95+
)
96+
}
97+
HomeAction.TIP_CARD -> {
98+
BottomBarAction(
99+
modifier = Modifier.weight(1f),
100+
label = stringResource(R.string.action_receive),
101+
painter = painterResource(R.drawable.ic_tip_card),
102+
onClick = { onPress(action) },
103+
)
104+
}
105+
else -> Unit
110106
}
111-
)
107+
}
112108
}
113109
}
114110

115111
@Composable
116112
private fun BottomBarAction(
117113
modifier: Modifier = Modifier,
118114
label: String,
119-
contentPadding: PaddingValues = PaddingValues(),
115+
contentPadding: PaddingValues = PaddingValues(
116+
vertical = CodeTheme.dimens.grid.x2
117+
),
120118
painter: Painter,
121-
imageSize: Dp,
119+
imageSize: Dp = CodeTheme.dimens.staticGrid.x8,
122120
badge: @Composable () -> Unit = { },
123121
onClick: () -> Unit,
124122
) {
@@ -127,8 +125,7 @@ private fun BottomBarAction(
127125
content = {
128126
Column(
129127
modifier = Modifier
130-
.clip(CodeTheme.shapes.medium)
131-
.rememberedClickable { onClick() }
128+
.unboundedClickable { onClick() }
132129
.layoutId("action"),
133130
horizontalAlignment = Alignment.CenterHorizontally
134131
) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="28dp"
4+
android:viewportWidth="32"
5+
android:viewportHeight="28">
6+
<path
7+
android:pathData="M0,2H24"
8+
android:strokeWidth="4"
9+
android:fillColor="#00000000"
10+
android:strokeColor="#ffffff"/>
11+
<path
12+
android:pathData="M0,26H24"
13+
android:strokeWidth="4"
14+
android:fillColor="#00000000"
15+
android:strokeColor="#ffffff"/>
16+
<path
17+
android:pathData="M8,14H32"
18+
android:strokeWidth="4"
19+
android:fillColor="#00000000"
20+
android:strokeColor="#ffffff"/>
21+
</vector>

0 commit comments

Comments
 (0)