mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-23 19:46:46 +00:00
Id/conditional nav on launch (#326)
* add initial conditional routing -- create user not working * only one nav controller * user check on launch works (kind of) * Apply suggestions from code review Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
@@ -8,18 +8,24 @@ import androidx.activity.viewModels
|
||||
import androidx.compose.runtime.Composable
|
||||
import chat.simplex.app.ui.theme.SimpleXTheme
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.navigation.NavType
|
||||
import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import androidx.navigation.navArgument
|
||||
import chat.simplex.app.views.DetailView
|
||||
import chat.simplex.app.views.TerminalView
|
||||
import chat.simplex.app.views.WelcomeView
|
||||
|
||||
|
||||
class MainActivity: ComponentActivity() {
|
||||
private val viewModel by viewModels<SimplexViewModel>()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContent {
|
||||
SimpleXTheme {
|
||||
Navigation(viewModel = viewModel)
|
||||
Navigation(viewModel=viewModel)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,11 +41,22 @@ fun Navigation(viewModel: SimplexViewModel) {
|
||||
|
||||
NavHost(navController=navController, startDestination=Pages.Home.route){
|
||||
composable(route=Pages.Home.route){
|
||||
MainPage(vm = viewModel)
|
||||
MainPage(vm = viewModel, navController = navController)
|
||||
}
|
||||
// composable(route=Pages.Welcome.route){
|
||||
// WelcomeView(vm.)
|
||||
// }
|
||||
composable(route = Pages.Welcome.route){
|
||||
WelcomeView(vm = viewModel) {navController.navigate(Pages.Home.route) { popUpTo(Pages.Home.route) { inclusive = true }}}
|
||||
}
|
||||
composable(route = Pages.Terminal.route) {
|
||||
TerminalView(chatModel = viewModel.chatModel, navController = navController)
|
||||
}
|
||||
composable(
|
||||
Pages.TerminalItemDetails.route + "/{identifier}",
|
||||
arguments = listOf(
|
||||
navArgument("identifier"){
|
||||
type = NavType.LongType
|
||||
}
|
||||
)
|
||||
) { entry -> DetailView( entry.arguments!!.getLong("identifier"), viewModel.chatModel.terminalItems, navController) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,4 +64,5 @@ sealed class Pages(val route: String) {
|
||||
object Home : Pages("home")
|
||||
object Terminal : Pages("terminal")
|
||||
object Welcome : Pages("welcome")
|
||||
object TerminalItemDetails : Pages("details")
|
||||
}
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
package chat.simplex.app
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import chat.simplex.app.views.TerminalPage
|
||||
import androidx.navigation.NavController
|
||||
import chat.simplex.app.views.TerminalView
|
||||
import chat.simplex.app.views.WelcomeView
|
||||
|
||||
@Composable
|
||||
fun MainPage(vm: SimplexViewModel) {
|
||||
TerminalPage(vm.chatModel)
|
||||
fun MainPage(vm: SimplexViewModel, navController: NavController) {
|
||||
if (vm.chatModel.currentUser.value == null) WelcomeView(vm=vm) {
|
||||
navController.navigate(Pages.Terminal.route)
|
||||
}
|
||||
else TerminalView(vm.chatModel, navController)
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ class SimplexApp: Application() {
|
||||
GlobalScope.launch {
|
||||
withContext(Dispatchers.Main) {
|
||||
var user = controller.apiGetActiveUser()
|
||||
controller.setCurrentUser(user)
|
||||
if (user == null) {
|
||||
// user = controller.apiCreateActiveUser(Profile("android", "Android test"))
|
||||
}
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
package chat.simplex.app.model
|
||||
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import kotlinx.serialization.Serializable
|
||||
import java.util.*
|
||||
|
||||
class ChatModel(val controller: ChatController) {
|
||||
val currentUser: User? = null
|
||||
var currentUser = mutableStateOf<User?>(null)
|
||||
var terminalItems = mutableStateListOf<TerminalItem>()
|
||||
|
||||
fun setCurrentUser(u: User?){
|
||||
currentUser = mutableStateOf<User?>(u)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val sampleData: ChatModel get() {
|
||||
val m = ChatModel(ChatController.Mock())
|
||||
|
||||
@@ -21,6 +21,9 @@ open class ChatController(val ctrl: ChatCtrl) {
|
||||
fun setModel(m: ChatModel) {
|
||||
chatModel = m
|
||||
}
|
||||
suspend fun setCurrentUser(u: User?){
|
||||
chatModel!!.setCurrentUser(u)
|
||||
}
|
||||
|
||||
fun startReceiver() {
|
||||
thread(name="receiver") {
|
||||
|
||||
@@ -27,22 +27,6 @@ import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
@Composable
|
||||
fun TerminalPage(chatModel: ChatModel) {
|
||||
val navController = rememberNavController()
|
||||
NavHost(navController = navController, startDestination = Pages.Terminal.route){
|
||||
composable(Pages.Terminal.route) { TerminalView(chatModel, navController) }
|
||||
composable(
|
||||
"details" + "/{identifier}",
|
||||
arguments=listOf(
|
||||
navArgument("identifier"){
|
||||
type = NavType.LongType
|
||||
}
|
||||
)
|
||||
) { entry -> DetailView( entry.arguments!!.getLong("identifier"), chatModel.terminalItems, navController) }
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun TerminalView(chatModel: ChatModel, navController: NavController) {
|
||||
Column {
|
||||
|
||||
@@ -2,6 +2,8 @@ package chat.simplex.app.views
|
||||
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -11,11 +13,18 @@ import androidx.compose.material.TextField
|
||||
import androidx.compose.material.Button
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.navigation.NavController
|
||||
import chat.simplex.app.SimplexViewModel
|
||||
import chat.simplex.app.model.Profile
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
@Composable
|
||||
fun WelcomeView(createUser: (data: String) -> String, navController: NavController) {
|
||||
Column {
|
||||
fun WelcomeView(vm: SimplexViewModel, routeHome: () -> Unit) {
|
||||
Column(
|
||||
modifier = Modifier.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
Image(
|
||||
painter=painterResource(R.drawable.logo), contentDescription = "Simplex Logo",
|
||||
)
|
||||
@@ -24,12 +33,12 @@ fun WelcomeView(createUser: (data: String) -> String, navController: NavControll
|
||||
Spacer(Modifier.height(8.dp))
|
||||
Text("We don't store any of your contacts or messages (once delivered) on the servers.")
|
||||
Spacer(Modifier.height(24.dp))
|
||||
CreateProfilePanel(createUser, navController)
|
||||
CreateProfilePanel(vm, routeHome)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun CreateProfilePanel(createUser: (data: String) -> String, navController: NavController) {
|
||||
fun CreateProfilePanel(vm: SimplexViewModel, routeHome: () -> Unit) {
|
||||
var displayName by remember { mutableStateOf("") }
|
||||
var fullName by remember { mutableStateOf("") }
|
||||
|
||||
@@ -37,12 +46,21 @@ fun CreateProfilePanel(createUser: (data: String) -> String, navController: NavC
|
||||
Text("Create profile")
|
||||
Text("Your profile is stored on your device and shared only with your contacts.")
|
||||
Text("Display Name")
|
||||
TextField(value = displayName, onValueChange = { displayName = it }, modifier = Modifier.height(30.dp))
|
||||
TextField(value = displayName, onValueChange = { value -> displayName = value })
|
||||
Text("Full Name (Optional)")
|
||||
TextField(value = fullName, onValueChange = { fullName = it }, modifier = Modifier.height(30.dp))
|
||||
TextField(value = fullName, onValueChange = { fullName = it })
|
||||
Button(onClick={
|
||||
createUser("{\"displayName\": $displayName, \"fullName\": $fullName}")
|
||||
navController.navigate("home") { popUpTo("home") { inclusive = true }}
|
||||
}) { Text("Create")}
|
||||
GlobalScope.launch {
|
||||
withContext(Dispatchers.Main) {
|
||||
val user = vm.chatModel.controller.apiCreateActiveUser(
|
||||
Profile(displayName, fullName)
|
||||
)
|
||||
vm.chatModel.setCurrentUser(user)
|
||||
routeHome()
|
||||
}
|
||||
}
|
||||
},
|
||||
enabled = displayName.isNotEmpty()
|
||||
) { Text("Create")}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user