Skip to content

Commit 07bb664

Browse files
committed
Merge remote-tracking branch 'origin/develop' into HEAD
* origin/develop: chore: rescope home VM to screen; reset no longer needed fix: only navigate to home once during QR login fix(api): use domain urlString as key for RelationshipBox#_domains mapping fix: reset home state when logging out
2 parents 067cb2a + 27511ec commit 07bb664

12 files changed

Lines changed: 145 additions & 140 deletions

File tree

api/src/main/java/com/getcode/model/RelationshipBox.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.getcode.model
33
import com.getcode.solana.keys.PublicKey
44
import com.getcode.solana.organizer.Relationship
55
import okhttp3.internal.toImmutableMap
6+
import timber.log.Timber
67
import java.util.Comparator
78
import javax.inject.Inject
89
import javax.inject.Singleton
@@ -13,7 +14,7 @@ class RelationshipBox @Inject constructor() {
1314
val publicKeys
1415
get() = _publicKeys.toImmutableMap()
1516

16-
private val _domains = mutableMapOf<Domain, Relationship>()
17+
private val _domains = mutableMapOf<String, Relationship>()
1718
val domains
1819
get() = _domains.toImmutableMap()
1920

@@ -25,10 +26,10 @@ class RelationshipBox @Inject constructor() {
2526
}
2627
}
2728
fun relationshipWith(publicKey: PublicKey) = _publicKeys[publicKey]
28-
fun relationshipWith(domain: Domain) = _domains[domain]
29+
fun relationshipWith(domain: Domain) = _domains[domain.urlString]
2930

3031
fun insert(relationship: Relationship) {
3132
_publicKeys[relationship.getCluster().timelockAccounts.vault.publicKey] = relationship
32-
_domains[relationship.domain] = relationship
33+
_domains[relationship.domain.urlString] = relationship
3334
}
3435
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import android.app.Activity
44
import com.getcode.manager.AuthManager
55
import com.getcode.util.resources.ResourceHelper
66
import com.getcode.view.BaseViewModel
7+
import com.getcode.view.BaseViewModel2
78
import dagger.hilt.android.lifecycle.HiltViewModel
9+
import kotlinx.coroutines.flow.MutableSharedFlow
10+
import kotlinx.coroutines.flow.SharedFlow
11+
import kotlinx.coroutines.flow.asSharedFlow
812
import javax.inject.Inject
913

1014
@HiltViewModel
@@ -13,7 +17,19 @@ class TopLevelViewModel @Inject constructor(
1317
resources: ResourceHelper,
1418
) : BaseViewModel(resources) {
1519

20+
private val _eventFlow: MutableSharedFlow<Event> = MutableSharedFlow()
21+
val eventFlow: SharedFlow<Event> = _eventFlow.asSharedFlow()
22+
23+
sealed interface Event {
24+
data object LogoutRequested: Event
25+
data object LogoutCompleted: Event
26+
}
27+
1628
fun logout(activity: Activity, onComplete: () -> Unit = {}) {
17-
authManager.logout(activity, onComplete)
29+
_eventFlow.tryEmit(Event.LogoutRequested)
30+
authManager.logout(activity) {
31+
_eventFlow.tryEmit(Event.LogoutCompleted)
32+
onComplete()
33+
}
1834
}
1935
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.getcode.navigation.core
2+
3+
import android.annotation.SuppressLint
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.ProvidableCompositionLocal
6+
import androidx.compose.runtime.derivedStateOf
7+
import androidx.compose.runtime.getValue
8+
import androidx.compose.runtime.remember
9+
import androidx.compose.runtime.staticCompositionLocalOf
10+
import cafe.adriel.voyager.core.screen.Screen
11+
import cafe.adriel.voyager.core.stack.StackEvent
12+
import cafe.adriel.voyager.navigator.Navigator
13+
import com.getcode.navigation.screens.AppScreen
14+
import timber.log.Timber
15+
16+
val LocalCodeNavigator: ProvidableCompositionLocal<CodeNavigator> =
17+
staticCompositionLocalOf { NavigatorNull() }
18+
19+
class NavigatorNull : CodeNavigator {
20+
override val lastItem: Screen? = null
21+
override val lastModalItem: Screen? = null
22+
override val sheetStackRoot: Screen? = null
23+
override val lastEvent: StackEvent = StackEvent.Idle
24+
override val isVisible: Boolean = false
25+
override val progress: Float = 0f
26+
27+
override var screensNavigator: Navigator? = null
28+
29+
override fun show(screen: Screen) = Unit
30+
31+
override fun hide() = Unit
32+
override fun <T> hideWithResult(result: T) = Unit
33+
34+
override fun push(item: Screen) = Unit
35+
36+
override fun push(items: List<Screen>) = Unit
37+
38+
override fun replace(item: Screen) = Unit
39+
40+
override fun replaceAll(item: Screen, inSheet: Boolean) = Unit
41+
42+
override fun replaceAll(items: List<Screen>, inSheet: Boolean) = Unit
43+
44+
override fun pop(): Boolean = false
45+
override fun <T> popWithResult(result: T) = false
46+
47+
override fun popAll() = Unit
48+
49+
override fun popUntil(predicate: (Screen) -> Boolean): Boolean = false
50+
51+
@Composable
52+
override fun saveableState(
53+
key: String,
54+
screen: Screen?,
55+
content: @Composable () -> Unit
56+
) {
57+
content()
58+
}
59+
60+
}
61+
62+
interface CodeNavigator {
63+
val lastItem: Screen?
64+
val lastModalItem: Screen?
65+
val sheetStackRoot: Screen?
66+
val lastEvent: StackEvent
67+
val isVisible: Boolean
68+
val progress: Float
69+
var screensNavigator: Navigator?
70+
fun show(screen: Screen)
71+
fun hide()
72+
fun <T> hideWithResult(result: T)
73+
infix fun push(item: Screen)
74+
75+
infix fun push(items: List<Screen>)
76+
77+
infix fun replace(item: Screen)
78+
79+
fun replaceAll(item: Screen, inSheet: Boolean = false)
80+
81+
fun replaceAll(items: List<Screen>, inSheet: Boolean = false)
82+
83+
fun pop(): Boolean
84+
fun <T> popWithResult(result: T): Boolean
85+
86+
fun popAll()
87+
88+
infix fun popUntil(predicate: (Screen) -> Boolean): Boolean
89+
90+
@SuppressLint("ComposableNaming")
91+
@Composable
92+
fun saveableState(
93+
key: String,
94+
screen: Screen?,
95+
content: @Composable () -> Unit
96+
)
97+
}

app/src/main/java/com/getcode/navigation/core/Navigator.kt renamed to app/src/main/java/com/getcode/navigation/core/CombinedNavigator.kt

Lines changed: 2 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,15 @@
11
package com.getcode.navigation.core
22

3-
import android.annotation.SuppressLint
43
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.ProvidableCompositionLocal
64
import androidx.compose.runtime.derivedStateOf
75
import androidx.compose.runtime.getValue
86
import androidx.compose.runtime.remember
9-
import androidx.compose.runtime.staticCompositionLocalOf
107
import cafe.adriel.voyager.core.screen.Screen
11-
import cafe.adriel.voyager.core.stack.Stack
128
import cafe.adriel.voyager.core.stack.StackEvent
139
import cafe.adriel.voyager.navigator.Navigator
1410
import com.getcode.navigation.screens.AppScreen
15-
import com.getcode.navigation.screens.ModalContent
1611
import timber.log.Timber
1712

18-
val LocalCodeNavigator: ProvidableCompositionLocal<CodeNavigator> =
19-
staticCompositionLocalOf { NavigatorNull() }
20-
21-
class NavigatorNull : CodeNavigator {
22-
override val lastItem: Screen? = null
23-
override val lastModalItem: Screen? = null
24-
override val sheetStackRoot: Screen? = null
25-
override val lastEvent: StackEvent = StackEvent.Idle
26-
override val isVisible: Boolean = false
27-
override val progress: Float = 0f
28-
29-
override var screensNavigator: Navigator? = null
30-
31-
override fun show(screen: Screen) = Unit
32-
33-
override fun hide() = Unit
34-
override fun <T> hideWithResult(result: T) = Unit
35-
36-
override fun push(item: Screen) = Unit
37-
38-
override fun push(items: List<Screen>) = Unit
39-
40-
override fun replace(item: Screen) = Unit
41-
42-
override fun replaceAll(item: Screen, inSheet: Boolean) = Unit
43-
44-
override fun replaceAll(items: List<Screen>, inSheet: Boolean) = Unit
45-
46-
override fun pop(): Boolean = false
47-
override fun <T> popWithResult(result: T) = false
48-
49-
override fun popAll() = Unit
50-
51-
override fun popUntil(predicate: (Screen) -> Boolean): Boolean = false
52-
53-
@Composable
54-
override fun saveableState(
55-
key: String,
56-
screen: Screen?,
57-
content: @Composable () -> Unit
58-
) {
59-
content()
60-
}
61-
62-
}
63-
64-
interface CodeNavigator {
65-
val lastItem: Screen?
66-
val lastModalItem: Screen?
67-
val sheetStackRoot: Screen?
68-
val lastEvent: StackEvent
69-
val isVisible: Boolean
70-
val progress: Float
71-
var screensNavigator: Navigator?
72-
fun show(screen: Screen)
73-
fun hide()
74-
fun <T> hideWithResult(result: T)
75-
infix fun push(item: Screen)
76-
77-
infix fun push(items: List<Screen>)
78-
79-
infix fun replace(item: Screen)
80-
81-
fun replaceAll(item: Screen, inSheet: Boolean = true)
82-
83-
fun replaceAll(items: List<Screen>, inSheet: Boolean = true)
84-
85-
fun pop(): Boolean
86-
fun <T> popWithResult(result: T): Boolean
87-
88-
fun popAll()
89-
90-
infix fun popUntil(predicate: (Screen) -> Boolean): Boolean
91-
92-
@SuppressLint("ComposableNaming")
93-
@Composable
94-
fun saveableState(
95-
key: String,
96-
screen: Screen?,
97-
content: @Composable () -> Unit
98-
)
99-
}
100-
10113
class CombinedNavigator(
10214
var sheetNavigator: BottomSheetNavigator
10315
) : CodeNavigator {
@@ -169,17 +81,10 @@ class CombinedNavigator(
16981
}
17082

17183
override fun replaceAll(item: Screen, inSheet: Boolean) {
172-
if (isVisible && inSheet) {
173-
sheetNavigator.replaceAll(item)
174-
} else {
175-
if (isVisible) {
176-
hide()
177-
}
178-
screensNavigator?.replaceAll(item)
179-
}
84+
replaceAll(listOf(item), inSheet)
18085
}
18186

182-
override fun replaceAll(items: List<Screen>, inSheet: Boolean) {
87+
override fun replaceAll(items: List<Screen>, inSheet: Boolean,) {
18388
if (isVisible && inSheet) {
18489
sheetNavigator.replaceAll(items)
18590
} else {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.getcode.navigation.screens
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.LaunchedEffect
45
import androidx.compose.ui.platform.LocalLifecycleOwner
56
import androidx.compose.ui.res.stringResource
67
import androidx.lifecycle.Lifecycle
78
import cafe.adriel.voyager.core.screen.ScreenKey
89
import cafe.adriel.voyager.core.screen.uniqueScreenKey
910
import cafe.adriel.voyager.hilt.getViewModel
1011
import com.getcode.R
12+
import com.getcode.TopLevelViewModel
1113
import com.getcode.analytics.AnalyticsManager
1214
import com.getcode.analytics.AnalyticsScreenWatcher
1315
import com.getcode.model.KinAmount
@@ -22,6 +24,7 @@ import com.getcode.view.main.getKin.GetKinSheet
2224
import com.getcode.view.main.giveKin.GiveKinSheet
2325
import com.getcode.view.main.home.HomeScreen
2426
import com.getcode.view.main.home.HomeViewModel
27+
import kotlinx.coroutines.flow.filterIsInstance
2528
import kotlinx.coroutines.flow.filterNotNull
2629
import kotlinx.coroutines.flow.launchIn
2730
import kotlinx.coroutines.flow.mapNotNull
@@ -47,6 +50,7 @@ data class HomeScreen(
4750
@Composable
4851
override fun Content() {
4952
val vm = getViewModel<HomeViewModel>()
53+
5054
startupLog("home rendered")
5155
HomeScreen(vm, cashLink, requestPayload)
5256

@@ -61,7 +65,6 @@ data class HomeScreen(
6165
vm.presentRequest(amount = result.amount, payload = null, request = null)
6266
}
6367
}
64-
6568
}
6669
}
6770
}

app/src/main/java/com/getcode/ui/components/AuthCheck.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ private fun Flow<DeeplinkResult>.showLogoutConfirmationIfNeeded(
151151
): Flow<DeeplinkResult> = onEach { (type, screens) ->
152152
if (type is DeeplinkHandler.Type.Login) {
153153
val entropy = (screens.first() as? HomeScreen)?.seed
154-
startupLog("showing logout confirm")
155154
if (entropy != null) {
155+
startupLog("showing logout confirm")
156156
showLogoutMessage(
157157
context = context,
158158
entropyB64 = entropy,

0 commit comments

Comments
 (0)