Skip to content

Commit e666182

Browse files
committed
chore(fc): move deep link handler to top level to support cross-room deeplinks
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent b6b9cb3 commit e666182

3 files changed

Lines changed: 70 additions & 36 deletions

File tree

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@ import androidx.compose.runtime.mutableStateOf
1212
import androidx.compose.runtime.remember
1313
import androidx.compose.runtime.setValue
1414
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.platform.LocalContext
1516
import androidx.lifecycle.Lifecycle
17+
import cafe.adriel.voyager.core.registry.ScreenRegistry
1618
import cafe.adriel.voyager.core.stack.StackEvent
19+
import cafe.adriel.voyager.hilt.getViewModel
1720
import cafe.adriel.voyager.navigator.CurrentScreen
1821
import cafe.adriel.voyager.navigator.Navigator
1922
import cafe.adriel.voyager.transitions.SlideTransition
23+
import com.getcode.navigation.NavScreenProvider
2024
import xyz.flipchat.app.features.payments.PaymentScaffold
2125
import com.getcode.navigation.core.BottomSheetNavigator
2226
import com.getcode.navigation.core.CombinedNavigator
@@ -33,17 +37,22 @@ import com.getcode.ui.components.bars.TopBarContainer
3337
import com.getcode.ui.components.bars.rememberBarManager
3438
import com.getcode.ui.decor.ScrimSupport
3539
import com.getcode.ui.theme.CodeScaffold
40+
import com.getcode.ui.utils.getActivity
3641
import dev.bmcreations.tipkit.TipScaffold
3742
import dev.bmcreations.tipkit.engines.TipsEngine
3843
import dev.theolm.rinku.DeepLink
3944
import dev.theolm.rinku.compose.ext.DeepLinkListener
4045
import xyz.flipchat.app.features.home.HomeViewModel
46+
import xyz.flipchat.app.util.DeeplinkType
4147

4248
@Composable
4349
fun App(
4450
tipsEngine: TipsEngine,
4551
) {
4652
val homeViewModel = getActivityScopedViewModel<HomeViewModel>()
53+
val router = homeViewModel.router
54+
val context = LocalContext.current
55+
4756
OnLifecycleEvent { _, event ->
4857
when (event) {
4958
Lifecycle.Event.ON_RESUME -> {
@@ -59,6 +68,20 @@ fun App(
5968
}
6069
}
6170

71+
//We are obtaining deep link here, in case we want to allow for some amount of deep linking when not
72+
//authenticated. Currently we will require authentication to see anything, but can be changed in future.
73+
var deepLink by remember { mutableStateOf<DeepLink?>(null) }
74+
var loginRequest by remember { mutableStateOf<String?>(null) }
75+
76+
DeepLinkListener {
77+
val type = router.processType(it)
78+
if (type is DeeplinkType.Login) {
79+
loginRequest = type.entropy
80+
return@DeepLinkListener
81+
}
82+
deepLink = it
83+
}
84+
6285
FlipchatTheme {
6386
val barManager = rememberBarManager()
6487
AppScreenContent {
@@ -83,6 +106,33 @@ fun App(
83106
) {
84107
SlideTransition(navigator)
85108
}
109+
110+
LaunchedEffect(deepLink) {
111+
if (deepLink != null) {
112+
val screenSet = router.processDestination(deepLink)
113+
codeNavigator.replaceAll(screenSet)
114+
}
115+
}
116+
117+
LaunchedEffect(loginRequest) {
118+
loginRequest?.let { entropy ->
119+
homeViewModel.handleLoginEntropy(
120+
entropy,
121+
onSwitchAccounts = {
122+
loginRequest = null
123+
context.getActivity()?.let {
124+
homeViewModel.logout(it) {
125+
codeNavigator.replaceAll(ScreenRegistry.get(NavScreenProvider.Login.Home(entropy)))
126+
}
127+
}
128+
},
129+
onCancel = {
130+
loginRequest = null
131+
}
132+
)
133+
}
134+
}
135+
86136
}
87137
}
88138
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package xyz.flipchat.app.features.home
22

3+
import android.app.Activity
34
import androidx.lifecycle.ViewModel
45
import androidx.lifecycle.viewModelScope
56
import com.getcode.manager.BottomBarManager
@@ -17,6 +18,7 @@ import kotlinx.coroutines.flow.onEach
1718
import kotlinx.coroutines.flow.stateIn
1819
import kotlinx.coroutines.launch
1920
import xyz.flipchat.app.R
21+
import xyz.flipchat.app.auth.AuthManager
2022
import xyz.flipchat.app.util.Router
2123
import xyz.flipchat.controllers.ChatsController
2224
import xyz.flipchat.controllers.CodeController
@@ -27,6 +29,7 @@ import javax.inject.Inject
2729

2830
@HiltViewModel
2931
class HomeViewModel @Inject constructor(
32+
private val authManager: AuthManager,
3033
private val codeController: CodeController,
3134
private val chatsController: ChatsController,
3235
private val profileController: ProfileController,
@@ -104,6 +107,22 @@ class HomeViewModel @Inject constructor(
104107
}
105108
}
106109

110+
fun logout(activity: Activity, onComplete: () -> Unit) = viewModelScope.launch {
111+
authManager.logout(activity)
112+
.onSuccess {
113+
chatsController.closeEventStream()
114+
onComplete()
115+
}
116+
}
117+
118+
fun deleteAccount(activity: Activity, onComplete: () -> Unit) = viewModelScope.launch {
119+
authManager.deleteAndLogout(activity)
120+
.onSuccess {
121+
chatsController.closeEventStream()
122+
onComplete()
123+
}
124+
}
125+
107126
override fun onCleared() {
108127
super.onCleared()
109128
closeStream()

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

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -59,54 +59,19 @@ import xyz.flipchat.app.util.DeeplinkType
5959
import kotlin.math.log
6060

6161
@Parcelize
62-
class TabbedHomeScreen(private val deeplink: @RawValue DeepLink?) : Screen, Parcelable {
62+
class TabbedHomeScreen(private val deepLink: @RawValue DeepLink?) : Screen, Parcelable {
6363
@IgnoredOnParcel
6464
override val key: ScreenKey = uniqueScreenKey
6565

6666
@Composable
6767
override fun Content() {
68-
val context = LocalContext.current
6968
val viewModel = getActivityScopedViewModel<HomeViewModel>()
70-
val settingsViewModel = getViewModel<SettingsViewModel>()
7169
val router = viewModel.router
7270

7371
val codeNavigator = LocalCodeNavigator.current
7472

7573
val isLoggedIn by viewModel.isLoggedIn.collectAsState()
7674

77-
//We are obtaining deep link here, in case we want to allow for some amount of deep linking when not
78-
//authenticated. Currently we will require authentication to see anything, but can be changed in future.
79-
var deepLink by remember(deeplink) { mutableStateOf(deeplink) }
80-
var loginRequest by remember { mutableStateOf<String?>(null) }
81-
82-
DeepLinkListener {
83-
val type = router.processType(it)
84-
if (type is DeeplinkType.Login) {
85-
loginRequest = type.entropy
86-
return@DeepLinkListener
87-
}
88-
deepLink = it
89-
}
90-
91-
LaunchedEffect(loginRequest) {
92-
loginRequest?.let { entropy ->
93-
viewModel.handleLoginEntropy(
94-
entropy,
95-
onSwitchAccounts = {
96-
loginRequest = null
97-
context.getActivity()?.let {
98-
settingsViewModel.logout(it) {
99-
codeNavigator.replaceAll(ScreenRegistry.get(NavScreenProvider.Login.Home(entropy)))
100-
}
101-
}
102-
},
103-
onCancel = {
104-
loginRequest = null
105-
}
106-
)
107-
}
108-
}
109-
11075
val initialTab = remember(deepLink) { router.getInitialTabIndex(deepLink) }
11176

11277
OnLifecycleEvent { _, event ->

0 commit comments

Comments
 (0)