Skip to content

Commit 921bafe

Browse files
committed
feat: allow overring back/close buttons in modals
add an override for back to navigate to bucket debugger when enabled to allow changing balance currencies Signed-off-by: Brandon McAnsh <[email protected]>
1 parent b9dc442 commit 921bafe

File tree

7 files changed

+119
-219
lines changed

7 files changed

+119
-219
lines changed

app/src/main/java/com/getcode/navigation/screens/ChatScreens.kt

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import androidx.compose.foundation.layout.Row
66
import androidx.compose.foundation.layout.padding
77
import androidx.compose.foundation.layout.size
88
import androidx.compose.foundation.shape.CircleShape
9+
import androidx.compose.material.Icon
910
import androidx.compose.material.Text
11+
import androidx.compose.material.icons.Icons
12+
import androidx.compose.material.icons.rounded.BubbleChart
1013
import androidx.compose.runtime.Composable
1114
import androidx.compose.runtime.LaunchedEffect
1215
import androidx.compose.runtime.collectAsState
@@ -16,6 +19,7 @@ import androidx.compose.runtime.remember
1619
import androidx.compose.ui.Alignment
1720
import androidx.compose.ui.Modifier
1821
import androidx.compose.ui.draw.clip
22+
import androidx.compose.ui.graphics.Color
1923
import androidx.compose.ui.platform.LocalLifecycleOwner
2024
import androidx.compose.ui.res.stringResource
2125
import androidx.compose.ui.unit.dp
@@ -35,17 +39,17 @@ import com.getcode.model.ID
3539
import com.getcode.navigation.core.LocalCodeNavigator
3640
import com.getcode.theme.BrandLight
3741
import com.getcode.theme.CodeTheme
42+
import com.getcode.ui.components.SheetTitleDefaults
3843
import com.getcode.ui.components.SheetTitleText
39-
import com.getcode.ui.utils.getActivityScopedViewModel
4044
import com.getcode.ui.components.chat.localized
45+
import com.getcode.ui.utils.getActivityScopedViewModel
4146
import com.getcode.util.formatDateRelatively
4247
import com.getcode.view.main.balance.BalanceScreeen
4348
import com.getcode.view.main.balance.BalanceSheetViewModel
4449
import com.getcode.view.main.chat.ChatScreen
4550
import com.getcode.view.main.chat.ChatViewModel
4651
import com.getcode.view.main.chat.conversation.ChatConversationScreen
4752
import com.getcode.view.main.chat.conversation.ConversationViewModel
48-
import com.getcode.view.main.giveKin.GiveKinScreen
4953
import com.getcode.view.main.home.HomeViewModel
5054
import kotlinx.coroutines.flow.filterIsInstance
5155
import kotlinx.coroutines.flow.launchIn
@@ -73,18 +77,43 @@ data object BalanceModal : ChatGraph, ModalRoot {
7377
derivedStateOf { state.isBucketDebuggerVisible }
7478
}
7579

80+
val backButton = @Composable {
81+
when {
82+
isViewingBuckets -> SheetTitleDefaults.BackButton()
83+
!isViewingBuckets && state.isBucketDebuggerEnabled -> {
84+
Icon(
85+
imageVector = Icons.Rounded.BubbleChart,
86+
contentDescription = "",
87+
tint = Color.White,
88+
)
89+
}
90+
else -> Unit
91+
}
92+
}
93+
7694
ModalContainer(
7795
navigator = navigator,
7896
onLogoClicked = {},
79-
backButton = { isViewingBuckets },
80-
onBackClicked = isViewingBuckets.takeIf { it }?.let {
81-
{
82-
viewModel.dispatchEvent(
83-
BalanceSheetViewModel.Event.OnDebugBucketsVisible(false)
84-
)
97+
backButton = backButton,
98+
backButtonEnabled = { isViewingBuckets || state.isBucketDebuggerEnabled },
99+
onBackClicked = when {
100+
isViewingBuckets -> {
101+
{
102+
viewModel.dispatchEvent(
103+
BalanceSheetViewModel.Event.OnDebugBucketsVisible(false)
104+
)
105+
}
106+
}
107+
state.isBucketDebuggerEnabled -> {
108+
{
109+
viewModel.dispatchEvent(
110+
BalanceSheetViewModel.Event.OnDebugBucketsVisible(true)
111+
)
112+
}
85113
}
114+
else -> null
86115
},
87-
closeButton = close@{
116+
closeButtonEnabled = close@{
88117
if (viewModel.stateFlow.value.isBucketDebuggerVisible) return@close false
89118
if (navigator.isVisible) {
90119
it is BalanceModal
@@ -127,7 +156,7 @@ data class ChatScreen(val chatId: ID) : ChatGraph, ModalContent {
127156

128157
ModalContainer(
129158
titleString = { state.title.localized },
130-
backButton = { it is ChatScreen },
159+
backButtonEnabled = { it is ChatScreen },
131160
) {
132161
val messages = vm.chatMessages.collectAsLazyPagingItems()
133162
ChatScreen(state = state, messages = messages, dispatch = vm::dispatchEvent)
@@ -197,7 +226,7 @@ data class ChatMessageConversationScreen(val messageId: ID) : AppScreen(), ChatG
197226
}
198227
}
199228
},
200-
backButton = { it is ChatMessageConversationScreen },
229+
backButtonEnabled = { it is ChatMessageConversationScreen },
201230
) {
202231
val messages = vm.messages.collectAsLazyPagingItems()
203232
ChatConversationScreen(state, messages, vm::dispatchEvent)

app/src/main/java/com/getcode/navigation/screens/MainScreens.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ data object GiveKinModal : AppScreen(), MainGraph, ModalRoot {
8686
override fun Content() {
8787
val navigator = LocalCodeNavigator.current
8888
ModalContainer(
89-
closeButton = {
89+
closeButtonEnabled = {
9090
if (navigator.isVisible) {
9191
it is GiveKinModal
9292
} else {
@@ -125,7 +125,7 @@ data class RequestKinModal(
125125

126126
if (showClose) {
127127
ModalContainer(
128-
closeButton = {
128+
closeButtonEnabled = {
129129
if (navigator.isVisible) {
130130
it is RequestKinModal
131131
} else {
@@ -137,7 +137,7 @@ data class RequestKinModal(
137137
}
138138
} else {
139139
ModalContainer(
140-
backButton = {
140+
backButtonEnabled = {
141141
if (navigator.isVisible) {
142142
it is RequestKinModal
143143
} else {
@@ -168,7 +168,7 @@ data object AccountModal : MainGraph, ModalRoot {
168168
ModalContainer(
169169
displayLogo = true,
170170
onLogoClicked = { viewModel.dispatchEvent(AccountSheetViewModel.Event.LogoClicked) },
171-
closeButton = {
171+
closeButtonEnabled = {
172172
if (navigator.isVisible) {
173173
it is AccountModal
174174
} else {

app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.getcode.navigation.screens
22

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.LaunchedEffect
54
import androidx.compose.ui.platform.LocalLifecycleOwner
65
import androidx.compose.ui.res.stringResource
76
import cafe.adriel.voyager.core.screen.ScreenKey
@@ -32,15 +31,8 @@ import com.getcode.view.main.getKin.GetKinSheetViewModel
3231
import com.getcode.view.main.getKin.ReferFriend
3332
import com.getcode.view.main.tip.EnterTipScreen
3433
import com.getcode.view.main.tip.RequestTipScreen
35-
import kotlinx.coroutines.delay
36-
import kotlinx.coroutines.flow.delayFlow
37-
import kotlinx.coroutines.flow.filterIsInstance
38-
import kotlinx.coroutines.flow.launchIn
39-
import kotlinx.coroutines.flow.onEach
40-
import kotlinx.coroutines.flow.onStart
4134
import kotlinx.parcelize.IgnoredOnParcel
4235
import kotlinx.parcelize.Parcelize
43-
import timber.log.Timber
4436

4537

4638
@Parcelize
@@ -53,7 +45,7 @@ data object DepositKinScreen : MainGraph, ModalContent {
5345

5446
@Composable
5547
override fun Content() {
56-
ModalContainer(backButton = { it is DepositKinScreen }) {
48+
ModalContainer(backButtonEnabled = { it is DepositKinScreen }) {
5749
AccountDeposit()
5850
}
5951

@@ -74,7 +66,7 @@ data object FaqScreen : MainGraph, ModalContent {
7466

7567
@Composable
7668
override fun Content() {
77-
ModalContainer(backButton = { it is FaqScreen }) {
69+
ModalContainer(backButtonEnabled = { it is FaqScreen }) {
7870
AccountFaq(getViewModel())
7971
}
8072

@@ -95,7 +87,7 @@ data object AccountDebugOptionsScreen : MainGraph, ModalContent {
9587

9688
@Composable
9789
override fun Content() {
98-
ModalContainer(backButton = { it is AccountDebugOptionsScreen }) {
90+
ModalContainer(backButtonEnabled = { it is AccountDebugOptionsScreen }) {
9991
BetaFlagsScreen(getViewModel())
10092
}
10193

@@ -116,7 +108,7 @@ data object AccountDetailsScreen : MainGraph, ModalContent {
116108

117109
@Composable
118110
override fun Content() {
119-
ModalContainer(backButton = { it is AccountDetailsScreen }) {
111+
ModalContainer(backButtonEnabled = { it is AccountDetailsScreen }) {
120112
AccountDetails(getActivityScopedViewModel())
121113
}
122114
}
@@ -132,7 +124,7 @@ data object BackupScreen : MainGraph, ModalContent {
132124

133125
@Composable
134126
override fun Content() {
135-
ModalContainer(backButton = { it is BackupScreen }) {
127+
ModalContainer(backButtonEnabled = { it is BackupScreen }) {
136128
BackupKey(getViewModel())
137129
}
138130

@@ -154,7 +146,7 @@ data object PhoneNumberScreen : MainGraph, ModalContent {
154146

155147
@Composable
156148
override fun Content() {
157-
ModalContainer(backButton = { it is PhoneNumberScreen }) {
149+
ModalContainer(backButtonEnabled = { it is PhoneNumberScreen }) {
158150
AccountPhone(getViewModel())
159151
}
160152
}
@@ -181,7 +173,7 @@ data class PhoneVerificationScreen(
181173
override fun Content() {
182174
val navigator = LocalCodeNavigator.current
183175
val viewModel = getStackScopedViewModel<PhoneVerifyViewModel>(key)
184-
ModalContainer(backButton = { it is PhoneVerificationScreen }) {
176+
ModalContainer(backButtonEnabled = { it is PhoneVerificationScreen }) {
185177
PhoneVerify(viewModel, arguments) {
186178
navigator.show(PhoneAreaSelectionModal(key))
187179
}
@@ -202,7 +194,7 @@ data class PhoneAreaSelectionModal(val providedKey: String) : MainGraph, ModalCo
202194
val navigator = LocalCodeNavigator.current
203195
val vm = getStackScopedViewModel<PhoneVerifyViewModel>(providedKey)
204196

205-
ModalContainer(closeButton = { it is PhoneAreaSelectionModal }) {
197+
ModalContainer(closeButtonEnabled = { it is PhoneAreaSelectionModal }) {
206198
PhoneCountrySelection(viewModel = vm) {
207199
navigator.hide()
208200
}
@@ -229,7 +221,7 @@ data class PhoneConfirmationScreen(
229221

230222
@Composable
231223
override fun Content() {
232-
ModalContainer(backButton = { it is PhoneConfirmationScreen }) {
224+
ModalContainer(backButtonEnabled = { it is PhoneConfirmationScreen }) {
233225
PhoneConfirm(
234226
getViewModel(),
235227
arguments = arguments,
@@ -249,7 +241,7 @@ data object DeleteCodeScreen : MainGraph, ModalContent {
249241

250242
@Composable
251243
override fun Content() {
252-
ModalContainer(backButton = { it is DeleteCodeScreen }) {
244+
ModalContainer(backButtonEnabled = { it is DeleteCodeScreen }) {
253245
DeleteCodeAccount()
254246
}
255247
}
@@ -265,7 +257,7 @@ data object DeleteConfirmationScreen : MainGraph, ModalContent {
265257

266258
@Composable
267259
override fun Content() {
268-
ModalContainer(backButton = { it is DeleteConfirmationScreen }) {
260+
ModalContainer(backButtonEnabled = { it is DeleteConfirmationScreen }) {
269261
ConfirmDeleteAccount(getViewModel())
270262
}
271263
}
@@ -278,7 +270,7 @@ data object ReferFriendScreen : MainGraph, ModalContent {
278270

279271
@Composable
280272
override fun Content() {
281-
ModalContainer(backButton = { it is DeleteConfirmationScreen }) {
273+
ModalContainer(backButtonEnabled = { it is DeleteConfirmationScreen }) {
282274
ReferFriend()
283275
}
284276
}
@@ -297,7 +289,7 @@ data object CurrencySelectionModal : MainGraph, ModalContent {
297289
override fun Content() {
298290
val navigator = LocalCodeNavigator.current
299291
ModalContainer(
300-
backButton = {
292+
backButtonEnabled = {
301293
if (navigator.isVisible) {
302294
it is CurrencySelectionModal
303295
} else {
@@ -339,7 +331,7 @@ data class BuyMoreKinModal(
339331

340332
if (showClose) {
341333
ModalContainer(
342-
closeButton = {
334+
closeButtonEnabled = {
343335
if (navigator.isVisible) {
344336
it is BuyMoreKinModal
345337
} else {
@@ -351,7 +343,7 @@ data class BuyMoreKinModal(
351343
}
352344
} else {
353345
ModalContainer(
354-
backButton = {
346+
backButtonEnabled = {
355347
if (navigator.isVisible) {
356348
it is BuyMoreKinModal
357349
} else {
@@ -387,7 +379,7 @@ data class EnterTipModal(val isInChat: Boolean = false) : MainGraph, ModalRoot {
387379
val navigator = LocalCodeNavigator.current
388380
if (isInChat) {
389381
ModalContainer(
390-
backButton = {
382+
backButtonEnabled = {
391383
if (navigator.isVisible) {
392384
it is EnterTipModal
393385
} else {
@@ -401,7 +393,7 @@ data class EnterTipModal(val isInChat: Boolean = false) : MainGraph, ModalRoot {
401393
}
402394
} else {
403395
ModalContainer(
404-
closeButton = {
396+
closeButtonEnabled = {
405397
if (navigator.isVisible) {
406398
it is EnterTipModal
407399
} else {
@@ -427,7 +419,7 @@ data object RequestTip : MainGraph, ModalContent {
427419
override fun Content() {
428420
val navigator = LocalCodeNavigator.current
429421
ModalContainer(
430-
backButton = {
422+
backButtonEnabled = {
431423
if (navigator.isVisible) {
432424
it is RequestTip
433425
} else {
@@ -451,7 +443,7 @@ data object GetKinModal : MainGraph, ModalRoot {
451443

452444
val viewModel = getViewModel<GetKinSheetViewModel>()
453445
ModalContainer(
454-
closeButton = {
446+
closeButtonEnabled = {
455447
if (navigator.isVisible) {
456448
it is GetKinModal
457449
} else {
@@ -476,7 +468,7 @@ data object BuySellScreen : MainGraph, ModalContent {
476468

477469
@Composable
478470
override fun Content() {
479-
ModalContainer(backButton = { it is BuySellScreen }) {
471+
ModalContainer(backButtonEnabled = { it is BuySellScreen }) {
480472
BuyAndSellKin(getViewModel())
481473
}
482474

0 commit comments

Comments
 (0)