Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions api/src/main/java/com/getcode/model/RelationshipBox.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.getcode.model
import com.getcode.solana.keys.PublicKey
import com.getcode.solana.organizer.Relationship
import okhttp3.internal.toImmutableMap
import timber.log.Timber
import java.util.Comparator
import javax.inject.Inject
import javax.inject.Singleton
Expand All @@ -13,7 +14,7 @@ class RelationshipBox @Inject constructor() {
val publicKeys
get() = _publicKeys.toImmutableMap()

private val _domains = mutableMapOf<Domain, Relationship>()
private val _domains = mutableMapOf<String, Relationship>()
val domains
get() = _domains.toImmutableMap()

Expand All @@ -25,10 +26,10 @@ class RelationshipBox @Inject constructor() {
}
}
fun relationshipWith(publicKey: PublicKey) = _publicKeys[publicKey]
fun relationshipWith(domain: Domain) = _domains[domain]
fun relationshipWith(domain: Domain) = _domains[domain.urlString]

fun insert(relationship: Relationship) {
_publicKeys[relationship.getCluster().timelockAccounts.vault.publicKey] = relationship
_domains[relationship.domain] = relationship
_domains[relationship.domain.urlString] = relationship
}
}
18 changes: 17 additions & 1 deletion app/src/main/java/com/getcode/TopLevelViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import android.app.Activity
import com.getcode.manager.AuthManager
import com.getcode.util.resources.ResourceHelper
import com.getcode.view.BaseViewModel
import com.getcode.view.BaseViewModel2
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import javax.inject.Inject

@HiltViewModel
Expand All @@ -13,7 +17,19 @@ class TopLevelViewModel @Inject constructor(
resources: ResourceHelper,
) : BaseViewModel(resources) {

private val _eventFlow: MutableSharedFlow<Event> = MutableSharedFlow()
val eventFlow: SharedFlow<Event> = _eventFlow.asSharedFlow()

sealed interface Event {
data object LogoutRequested: Event
data object LogoutCompleted: Event
}

fun logout(activity: Activity, onComplete: () -> Unit = {}) {
authManager.logout(activity, onComplete)
_eventFlow.tryEmit(Event.LogoutRequested)
authManager.logout(activity) {
_eventFlow.tryEmit(Event.LogoutCompleted)
onComplete()
}
}
}
97 changes: 97 additions & 0 deletions app/src/main/java/com/getcode/navigation/core/CodeNavigator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.getcode.navigation.core

import android.annotation.SuppressLint
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.staticCompositionLocalOf
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.core.stack.StackEvent
import cafe.adriel.voyager.navigator.Navigator
import com.getcode.navigation.screens.AppScreen
import timber.log.Timber

val LocalCodeNavigator: ProvidableCompositionLocal<CodeNavigator> =
staticCompositionLocalOf { NavigatorNull() }

class NavigatorNull : CodeNavigator {
override val lastItem: Screen? = null
override val lastModalItem: Screen? = null
override val sheetStackRoot: Screen? = null
override val lastEvent: StackEvent = StackEvent.Idle
override val isVisible: Boolean = false
override val progress: Float = 0f

override var screensNavigator: Navigator? = null

override fun show(screen: Screen) = Unit

override fun hide() = Unit
override fun <T> hideWithResult(result: T) = Unit

override fun push(item: Screen) = Unit

override fun push(items: List<Screen>) = Unit

override fun replace(item: Screen) = Unit

override fun replaceAll(item: Screen, inSheet: Boolean) = Unit

override fun replaceAll(items: List<Screen>, inSheet: Boolean) = Unit

override fun pop(): Boolean = false
override fun <T> popWithResult(result: T) = false

override fun popAll() = Unit

override fun popUntil(predicate: (Screen) -> Boolean): Boolean = false

@Composable
override fun saveableState(
key: String,
screen: Screen?,
content: @Composable () -> Unit
) {
content()
}

}

interface CodeNavigator {
val lastItem: Screen?
val lastModalItem: Screen?
val sheetStackRoot: Screen?
val lastEvent: StackEvent
val isVisible: Boolean
val progress: Float
var screensNavigator: Navigator?
fun show(screen: Screen)
fun hide()
fun <T> hideWithResult(result: T)
infix fun push(item: Screen)

infix fun push(items: List<Screen>)

infix fun replace(item: Screen)

fun replaceAll(item: Screen, inSheet: Boolean = false)

fun replaceAll(items: List<Screen>, inSheet: Boolean = false)

fun pop(): Boolean
fun <T> popWithResult(result: T): Boolean

fun popAll()

infix fun popUntil(predicate: (Screen) -> Boolean): Boolean

@SuppressLint("ComposableNaming")
@Composable
fun saveableState(
key: String,
screen: Screen?,
content: @Composable () -> Unit
)
}
Original file line number Diff line number Diff line change
@@ -1,103 +1,15 @@
package com.getcode.navigation.core

import android.annotation.SuppressLint
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.staticCompositionLocalOf
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.core.stack.Stack
import cafe.adriel.voyager.core.stack.StackEvent
import cafe.adriel.voyager.navigator.Navigator
import com.getcode.navigation.screens.AppScreen
import com.getcode.navigation.screens.ModalContent
import timber.log.Timber

val LocalCodeNavigator: ProvidableCompositionLocal<CodeNavigator> =
staticCompositionLocalOf { NavigatorNull() }

class NavigatorNull : CodeNavigator {
override val lastItem: Screen? = null
override val lastModalItem: Screen? = null
override val sheetStackRoot: Screen? = null
override val lastEvent: StackEvent = StackEvent.Idle
override val isVisible: Boolean = false
override val progress: Float = 0f

override var screensNavigator: Navigator? = null

override fun show(screen: Screen) = Unit

override fun hide() = Unit
override fun <T> hideWithResult(result: T) = Unit

override fun push(item: Screen) = Unit

override fun push(items: List<Screen>) = Unit

override fun replace(item: Screen) = Unit

override fun replaceAll(item: Screen, inSheet: Boolean) = Unit

override fun replaceAll(items: List<Screen>, inSheet: Boolean) = Unit

override fun pop(): Boolean = false
override fun <T> popWithResult(result: T) = false

override fun popAll() = Unit

override fun popUntil(predicate: (Screen) -> Boolean): Boolean = false

@Composable
override fun saveableState(
key: String,
screen: Screen?,
content: @Composable () -> Unit
) {
content()
}

}

interface CodeNavigator {
val lastItem: Screen?
val lastModalItem: Screen?
val sheetStackRoot: Screen?
val lastEvent: StackEvent
val isVisible: Boolean
val progress: Float
var screensNavigator: Navigator?
fun show(screen: Screen)
fun hide()
fun <T> hideWithResult(result: T)
infix fun push(item: Screen)

infix fun push(items: List<Screen>)

infix fun replace(item: Screen)

fun replaceAll(item: Screen, inSheet: Boolean = true)

fun replaceAll(items: List<Screen>, inSheet: Boolean = true)

fun pop(): Boolean
fun <T> popWithResult(result: T): Boolean

fun popAll()

infix fun popUntil(predicate: (Screen) -> Boolean): Boolean

@SuppressLint("ComposableNaming")
@Composable
fun saveableState(
key: String,
screen: Screen?,
content: @Composable () -> Unit
)
}

class CombinedNavigator(
var sheetNavigator: BottomSheetNavigator
) : CodeNavigator {
Expand Down Expand Up @@ -169,17 +81,10 @@ class CombinedNavigator(
}

override fun replaceAll(item: Screen, inSheet: Boolean) {
if (isVisible && inSheet) {
sheetNavigator.replaceAll(item)
} else {
if (isVisible) {
hide()
}
screensNavigator?.replaceAll(item)
}
replaceAll(listOf(item), inSheet)
}

override fun replaceAll(items: List<Screen>, inSheet: Boolean) {
override fun replaceAll(items: List<Screen>, inSheet: Boolean,) {
if (isVisible && inSheet) {
sheetNavigator.replaceAll(items)
} else {
Expand Down
13 changes: 12 additions & 1 deletion app/src/main/java/com/getcode/navigation/screens/MainScreens.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.getcode.navigation.screens

import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.Lifecycle
import cafe.adriel.voyager.core.screen.ScreenKey
import cafe.adriel.voyager.core.screen.uniqueScreenKey
import cafe.adriel.voyager.hilt.getViewModel
import com.getcode.R
import com.getcode.TopLevelViewModel
import com.getcode.analytics.AnalyticsManager
import com.getcode.analytics.AnalyticsScreenWatcher
import com.getcode.model.KinAmount
Expand All @@ -22,6 +24,7 @@ import com.getcode.view.main.getKin.GetKinSheet
import com.getcode.view.main.giveKin.GiveKinSheet
import com.getcode.view.main.home.HomeScreen
import com.getcode.view.main.home.HomeViewModel
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.mapNotNull
Expand All @@ -46,7 +49,9 @@ data class HomeScreen(

@Composable
override fun Content() {
val vm = getViewModel<HomeViewModel>()
val vm = getActivityScopedViewModel<HomeViewModel>()
val tlvm = getActivityScopedViewModel<TopLevelViewModel>()

startupLog("home rendered")
HomeScreen(vm, cashLink, requestPayload)

Expand All @@ -61,7 +66,13 @@ data class HomeScreen(
vm.presentRequest(amount = result.amount, payload = null, request = null)
}
}
}

LaunchedEffect(tlvm) {
tlvm.eventFlow
.filterIsInstance<TopLevelViewModel.Event.LogoutCompleted>()
.onEach { vm.reset() }
.launchIn(this)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/getcode/ui/components/AuthCheck.kt
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,8 @@ private fun Flow<DeeplinkResult>.showLogoutConfirmationIfNeeded(
): Flow<DeeplinkResult> = onEach { (type, screens) ->
if (type is DeeplinkHandler.Type.Login) {
val entropy = (screens.first() as? HomeScreen)?.seed
startupLog("showing logout confirm")
if (entropy != null) {
startupLog("showing logout confirm")
showLogoutMessage(
context = context,
entropyB64 = entropy,
Expand Down
Loading