Skip to content

Commit 6386e4f

Browse files
committed
chore: handle timelock unlocked accounts in flipchat
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 7faf6ba commit 6386e4f

File tree

13 files changed

+589
-32
lines changed

13 files changed

+589
-32
lines changed

app/src/main/java/com/getcode/SessionController.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ import com.getcode.services.utils.catchSafely
8080
import com.getcode.services.utils.nonce
8181
import com.getcode.solana.organizer.GiftCardAccount
8282
import com.getcode.solana.organizer.Organizer
83+
import com.getcode.ui.components.restrictions.RestrictionType
8384
import com.getcode.util.permissions.PermissionChecker
8485
import com.getcode.util.permissions.PermissionResult
8586
import com.getcode.util.resources.ResourceHelper
@@ -173,12 +174,6 @@ sealed interface SessionEvent {
173174
data class OnChatPaidForSuccessfully(val intentId: com.getcode.model.ID, val user: SocialUser): SessionEvent
174175
}
175176

176-
enum class RestrictionType {
177-
ACCESS_EXPIRED,
178-
FORCE_UPGRADE,
179-
TIMELOCK_UNLOCKED
180-
}
181-
182177
@SuppressLint("CheckResult")
183178
@Singleton
184179
class SessionController @Inject constructor(
@@ -1704,8 +1699,8 @@ class SessionController @Inject constructor(
17041699
cancelRemoteSend(giftCard, amount)
17051700
cancelSend(style = PresentationStyle.Slide)
17061701
},
1707-
onClose = {
1708-
if (it == null) {
1702+
onClose = { fromAction ->
1703+
if (!fromAction) {
17091704
cancelSend(style = PresentationStyle.Pop)
17101705
vibrator.vibrate()
17111706
}

app/src/main/java/com/getcode/view/main/scanner/ScannerScreen.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ import com.getcode.SessionController
4646
import com.getcode.LocalBiometricsState
4747
import com.getcode.PresentationStyle
4848
import com.getcode.R
49-
import com.getcode.RestrictionType
5049
import com.getcode.manager.TopBarManager
5150
import com.getcode.models.Bill
5251
import com.getcode.models.DeepLinkRequest
@@ -72,7 +71,8 @@ import com.getcode.ui.modals.ReceivedKinConfirmation
7271
import com.getcode.util.permissions.PermissionResult
7372
import com.getcode.util.permissions.getPermissionLauncher
7473
import com.getcode.util.permissions.rememberPermissionHandler
75-
import com.getcode.view.main.scanner.views.HomeRestricted
74+
import com.getcode.ui.components.restrictions.ContentRestrictedView
75+
import com.getcode.ui.components.restrictions.RestrictionType
7676
import kotlinx.coroutines.delay
7777
import kotlinx.coroutines.flow.launchIn
7878
import kotlinx.coroutines.flow.onEach
@@ -105,7 +105,7 @@ fun ScanScreen(
105105
RestrictionType.ACCESS_EXPIRED,
106106
RestrictionType.FORCE_UPGRADE,
107107
RestrictionType.TIMELOCK_UNLOCKED -> {
108-
HomeRestricted(restrictionType) {
108+
ContentRestrictedView(restrictionType) {
109109
session.logout(it)
110110
}
111111
}

flipchatApp/src/main/kotlin/xyz/flipchat/app/App.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.material.ExperimentalMaterialApi
77
import androidx.compose.runtime.Composable
88
import androidx.compose.runtime.CompositionLocalProvider
99
import androidx.compose.runtime.LaunchedEffect
10+
import androidx.compose.runtime.collectAsState
1011
import androidx.compose.runtime.getValue
1112
import androidx.compose.runtime.mutableStateOf
1213
import androidx.compose.runtime.remember
@@ -16,6 +17,7 @@ import androidx.compose.ui.platform.LocalContext
1617
import androidx.lifecycle.Lifecycle
1718
import cafe.adriel.voyager.core.registry.ScreenRegistry
1819
import cafe.adriel.voyager.navigator.Navigator
20+
import cafe.adriel.voyager.navigator.currentOrThrow
1921
import cafe.adriel.voyager.transitions.SlideTransition
2022
import com.getcode.navigation.NavScreenProvider
2123
import com.getcode.navigation.core.BottomSheetNavigator
@@ -28,6 +30,7 @@ import com.getcode.ui.components.OnLifecycleEvent
2830
import com.getcode.ui.components.bars.BottomBarContainer
2931
import com.getcode.ui.components.bars.TopBarContainer
3032
import com.getcode.ui.components.bars.rememberBarManager
33+
import com.getcode.ui.components.restrictions.RestrictionType
3134
import com.getcode.ui.decor.ScrimSupport
3235
import com.getcode.ui.theme.CodeScaffold
3336
import com.getcode.ui.utils.getActivity
@@ -38,6 +41,7 @@ import dev.theolm.rinku.compose.ext.DeepLinkListener
3841
import xyz.flipchat.app.features.home.HomeViewModel
3942
import xyz.flipchat.app.features.payments.PaymentScaffold
4043
import xyz.flipchat.app.theme.FlipchatTheme
44+
import xyz.flipchat.app.ui.LocalUserManager
4145
import xyz.flipchat.app.ui.navigation.AppScreenContent
4246
import xyz.flipchat.app.ui.navigation.MainRoot
4347
import xyz.flipchat.app.util.DeeplinkType
@@ -64,6 +68,9 @@ fun App(
6468
deepLink = it
6569
}
6670

71+
val userManager = LocalUserManager.currentOrThrow
72+
val userState by userManager.state.collectAsState()
73+
6774
FlipchatTheme {
6875
val barManager = rememberBarManager()
6976
AppScreenContent {
@@ -119,6 +126,12 @@ fun App(
119126
}
120127
}
121128

129+
LaunchedEffect(userState.isTimelockUnlocked) {
130+
if (userState.isTimelockUnlocked) {
131+
codeNavigator.replaceAll(ScreenRegistry.get(NavScreenProvider.AppRestricted(RestrictionType.TIMELOCK_UNLOCKED)))
132+
}
133+
}
134+
122135
OnLifecycleEvent { _, event ->
123136
when (event) {
124137
Lifecycle.Event.ON_RESUME -> {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package xyz.flipchat.app.features.restricted
2+
3+
import android.os.Parcelable
4+
import androidx.compose.runtime.Composable
5+
import cafe.adriel.voyager.core.registry.ScreenRegistry
6+
import cafe.adriel.voyager.core.screen.Screen
7+
import com.getcode.navigation.NavScreenProvider
8+
import com.getcode.navigation.core.LocalCodeNavigator
9+
import com.getcode.navigation.extensions.getActivityScopedViewModel
10+
import com.getcode.ui.components.restrictions.ContentRestrictedView
11+
import com.getcode.ui.components.restrictions.RestrictionType
12+
import kotlinx.parcelize.Parcelize
13+
import xyz.flipchat.app.features.home.HomeViewModel
14+
15+
@Parcelize
16+
class AppRestrictedScreen(private val restrictionType: RestrictionType): Screen, Parcelable {
17+
@Composable
18+
override fun Content() {
19+
val homeViewModel = getActivityScopedViewModel<HomeViewModel>()
20+
val navigator = LocalCodeNavigator.current
21+
ContentRestrictedView(restrictionType) {
22+
homeViewModel.logout(it) {
23+
navigator.replaceAll(ScreenRegistry.get(NavScreenProvider.Login.Home()))
24+
}
25+
}
26+
}
27+
}

flipchatApp/src/main/kotlin/xyz/flipchat/app/ui/navigation/AppScreenContent.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@ import xyz.flipchat.app.features.login.register.PurchaseAccountScreen
2222
import xyz.flipchat.app.features.login.register.RegisterInfoScreen
2323
import xyz.flipchat.app.features.login.register.RegisterModalScreen
2424
import xyz.flipchat.app.features.login.register.RegisterScreen
25+
import xyz.flipchat.app.features.restricted.AppRestrictedScreen
2526

2627
@Composable
2728
fun AppScreenContent(content: @Composable () -> Unit) {
2829
ScreenRegistry {
30+
register<NavScreenProvider.AppRestricted> {
31+
AppRestrictedScreen(it.restrictionType)
32+
}
33+
2934
register<NavScreenProvider.Login.Home> {
3035
LoginScreen(it.seed)
3136
}

flipchatApp/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,4 +236,6 @@
236236

237237
<string name="subtitle_balance">Balance: ⬢ %1$s</string>
238238
<string name="subtitle_you">You</string>
239+
240+
<string name="subtitle_updateRequiredDescription">We\'ve made some changes to improve the experience. You\'ll need to update the app to keep using Flipchat.</string>
239241
</resources>

libs/messaging/src/main/kotlin/com/getcode/manager/BottomBarManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ object BottomBarManager {
1919
val subtitle: String = "",
2020
val actions: List<BottomBarAction> = emptyList(),
2121
val showCancel: Boolean = true,
22-
val onClose: () -> Unit = {},
22+
val onClose: (fromAction: Boolean) -> Unit = {},
2323
val type: BottomBarMessageType = BottomBarMessageType.DESTRUCTIVE,
2424
val isDismissible: Boolean = true,
2525
val showScrim: Boolean = false,
@@ -86,7 +86,7 @@ object BottomBarManager {
8686
onPositive: () -> Unit,
8787
onNegative: () -> Unit = {},
8888
onTertiary: () -> Unit = {},
89-
onClose: () -> Unit = {},
89+
onClose: (fromAction: Boolean) -> Unit = {},
9090
type: BottomBarMessageType = BottomBarMessageType.DESTRUCTIVE,
9191
isDismissible: Boolean = true,
9292
showScrim: Boolean = false,

services/flipchat/core/src/main/kotlin/xyz/flipchat/services/user/UserManager.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class UserManager @Inject constructor(
7171
val displayName: String? = null,
7272
val organizer: Organizer? = null,
7373
val flags: UserFlags? = null,
74+
val isTimelockUnlocked: Boolean = false,
7475
val openRoom: ID? = null,
7576
)
7677

@@ -132,6 +133,16 @@ class UserManager @Inject constructor(
132133
}
133134
}
134135

136+
fun didDetectUnlockedAccount() {
137+
_state.update {
138+
if (!it.isTimelockUnlocked) {
139+
it.copy(isTimelockUnlocked = true)
140+
} else {
141+
it
142+
}
143+
}
144+
}
145+
135146
fun isSelf(id: ID?) = userId == id
136147

137148
private fun associate() {

services/flipchat/payments/src/main/kotlin/com/getcode/network/BalanceController.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.getcode.network
22

3+
import com.codeinc.gen.user.v1.user
34
import com.getcode.model.Currency
45
import com.getcode.model.CurrencyCode
56
import com.getcode.model.Rate
@@ -171,6 +172,10 @@ open class BalanceController @Inject constructor(
171172

172173
organizer.setAccountInfo(accountInfo)
173174
userManager.set(organizer = organizer)
175+
if (organizer.isUnuseable) {
176+
userManager.didDetectUnlockedAccount()
177+
}
178+
174179
balanceRepository.setBalance(organizer.availableBalance.toKinValueDouble())
175180
transactionReceiver.receiveFromIncoming(organizer)
176181
scope.launch {

0 commit comments

Comments
 (0)