Skip to content

Commit dabe9ae

Browse files
committed
fix(fc): handle possible race conditions handling deep links from cold boot
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent ed57879 commit dabe9ae

4 files changed

Lines changed: 24 additions & 29 deletions

File tree

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,14 @@ import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.platform.LocalContext
1616
import androidx.lifecycle.Lifecycle
1717
import cafe.adriel.voyager.core.registry.ScreenRegistry
18-
import cafe.adriel.voyager.core.stack.StackEvent
19-
import cafe.adriel.voyager.hilt.getViewModel
20-
import cafe.adriel.voyager.navigator.CurrentScreen
2118
import cafe.adriel.voyager.navigator.Navigator
2219
import cafe.adriel.voyager.transitions.SlideTransition
2320
import com.getcode.navigation.NavScreenProvider
24-
import xyz.flipchat.app.features.payments.PaymentScaffold
2521
import com.getcode.navigation.core.BottomSheetNavigator
2622
import com.getcode.navigation.core.CombinedNavigator
2723
import com.getcode.navigation.core.LocalCodeNavigator
2824
import com.getcode.navigation.extensions.getActivityScopedViewModel
2925
import com.getcode.navigation.transitions.SheetSlideTransition
30-
import xyz.flipchat.app.theme.FlipchatTheme
31-
import xyz.flipchat.app.ui.navigation.AppScreenContent
32-
import xyz.flipchat.app.ui.navigation.MainRoot
3326
import com.getcode.theme.LocalCodeColors
3427
import com.getcode.ui.components.OnLifecycleEvent
3528
import com.getcode.ui.components.bars.BottomBarContainer
@@ -43,6 +36,10 @@ import dev.bmcreations.tipkit.engines.TipsEngine
4336
import dev.theolm.rinku.DeepLink
4437
import dev.theolm.rinku.compose.ext.DeepLinkListener
4538
import xyz.flipchat.app.features.home.HomeViewModel
39+
import xyz.flipchat.app.features.payments.PaymentScaffold
40+
import xyz.flipchat.app.theme.FlipchatTheme
41+
import xyz.flipchat.app.ui.navigation.AppScreenContent
42+
import xyz.flipchat.app.ui.navigation.MainRoot
4643
import xyz.flipchat.app.util.DeeplinkType
4744

4845
@Composable
@@ -92,7 +89,7 @@ fun App(
9289
CodeScaffold { innerPaddingModifier ->
9390
PaymentScaffold {
9491
Navigator(
95-
screen = MainRoot,
92+
screen = MainRoot { deepLink },
9693
) { navigator ->
9794
LaunchedEffect(navigator.lastItem) {
9895
// update global navigator for platform access to support push/pop from a single
@@ -108,9 +105,11 @@ fun App(
108105
}
109106

110107
LaunchedEffect(deepLink) {
111-
if (deepLink != null) {
112-
val screenSet = router.processDestination(deepLink)
113-
codeNavigator.replaceAll(screenSet)
108+
if (codeNavigator.lastItem !is MainRoot) {
109+
if (deepLink != null) {
110+
val screenSet = router.processDestination(deepLink)
111+
codeNavigator.replaceAll(screenSet)
112+
}
114113
}
115114
}
116115

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/home/TabbedHomeScreen.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ class TabbedHomeScreen(private val deepLink: @RawValue DeepLink?) : Screen, Parc
6868
val viewModel = getActivityScopedViewModel<HomeViewModel>()
6969
val router = viewModel.router
7070

71-
val codeNavigator = LocalCodeNavigator.current
72-
7371
val isLoggedIn by viewModel.isLoggedIn.collectAsState()
7472

7573
val initialTab = remember(deepLink) { router.getInitialTabIndex(deepLink) }
@@ -93,13 +91,6 @@ class TabbedHomeScreen(private val deepLink: @RawValue DeepLink?) : Screen, Parc
9391
)
9492
}
9593
) { tabNavigator ->
96-
LaunchedEffect(deepLink) {
97-
if (deepLink != null) {
98-
val screenSet = router.processDestination(deepLink)
99-
tabNavigator.current = router.rootTabs[initialTab]
100-
codeNavigator.replaceAll(screenSet)
101-
}
102-
}
10394
Column(
10495
modifier = Modifier
10596
.statusBarsPadding()

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator
3333
import cafe.adriel.voyager.navigator.currentOrThrow
3434
import xyz.flipchat.app.R
3535
import com.getcode.navigation.NavScreenProvider
36+
import com.getcode.navigation.extensions.getActivityScopedViewModel
3637
import xyz.flipchat.app.ui.LocalUserManager
3738
import com.getcode.theme.CodeTheme
3839
import com.getcode.theme.White
@@ -45,9 +46,10 @@ import kotlinx.coroutines.flow.launchIn
4546
import kotlinx.coroutines.flow.map
4647
import kotlinx.coroutines.flow.onEach
4748
import timber.log.Timber
49+
import xyz.flipchat.app.features.home.HomeViewModel
4850
import xyz.flipchat.services.user.AuthState
4951

50-
internal object MainRoot : Screen {
52+
internal class MainRoot(private val deepLink: () -> DeepLink?) : Screen {
5153

5254
override val key: ScreenKey = uniqueScreenKey
5355

@@ -58,13 +60,8 @@ internal object MainRoot : Screen {
5860
val navigator = LocalNavigator.currentOrThrow
5961
val userManager = LocalUserManager.currentOrThrow
6062
var showLoading by remember { mutableStateOf(false) }
61-
62-
//We are obtaining deep link here, in case we want to allow for some amount of deep linking when not
63-
//authenticated. Currently we will require authentication to see anything, but can be changed in future.
64-
var deeplink by remember { mutableStateOf<DeepLink?>(null) }
65-
DeepLinkListener {
66-
deeplink = it
67-
}
63+
val homeViewModel = getActivityScopedViewModel<HomeViewModel>()
64+
val router = homeViewModel.router
6865

6966
Box(
7067
modifier = Modifier
@@ -98,6 +95,7 @@ internal object MainRoot : Screen {
9895
}
9996
}
10097

98+
10199
LaunchedEffect(userManager) {
102100
userManager.state
103101
.map { it.authState }
@@ -111,7 +109,13 @@ internal object MainRoot : Screen {
111109
}
112110
AuthState.Unregistered,
113111
AuthState.LoggedIn -> {
114-
navigator.replace(ScreenRegistry.get(NavScreenProvider.AppHomeScreen(deeplink)))
112+
val screens = router.processDestination(deepLink())
113+
114+
if (screens.isNotEmpty()) {
115+
navigator.replaceAll(screens)
116+
} else {
117+
navigator.replace(ScreenRegistry.get(NavScreenProvider.AppHomeScreen()))
118+
}
115119
}
116120
AuthState.LoggedOut -> {
117121
navigator.replace(ScreenRegistry.get(NavScreenProvider.Login.Home()))

flipchatApp/src/main/kotlin/xyz/flipchat/app/util/Router.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class RouterImpl(
8989
when {
9090
deeplink.pathSegments.isEmpty() -> tabIndexResolver(FcTab.Chat)
9191
chats.contains(deeplink.pathSegments[0]) -> tabIndexResolver(FcTab.Chat)
92+
room.contains(deeplink.pathSegments[0]) -> tabIndexResolver(FcTab.Chat)
9293
cash.contains(deeplink.pathSegments[0]) -> tabIndexResolver(FcTab.Cash)
9394
settings.contains(deeplink.pathSegments[0]) -> tabIndexResolver(FcTab.Settings)
9495
else -> 0

0 commit comments

Comments
 (0)