Talaria/app/src/main/java/dev/lonami/talaria/TalariaApp.kt

234 lines
6.9 KiB
Kotlin
Raw Normal View History

2022-10-12 09:44:38 +00:00
package dev.lonami.talaria
import androidx.annotation.StringRes
2022-10-24 11:58:47 +00:00
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
2022-10-12 09:44:38 +00:00
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
2022-10-24 11:58:47 +00:00
import androidx.compose.material.icons.filled.*
2022-10-12 19:26:51 +00:00
import androidx.compose.runtime.*
2022-10-12 09:44:38 +00:00
import androidx.compose.ui.Modifier
2022-10-24 11:58:47 +00:00
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
2022-10-12 09:44:38 +00:00
import androidx.compose.ui.res.stringResource
2022-10-24 11:58:47 +00:00
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
2022-10-12 09:44:38 +00:00
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import dev.lonami.talaria.ui.screens.ChatScreen
import dev.lonami.talaria.ui.screens.DialogScreen
import dev.lonami.talaria.ui.screens.LoginScreen
2022-10-29 11:06:38 +00:00
import dev.lonami.talaria.ui.state.ChatViewModel
2022-10-24 11:58:47 +00:00
import kotlinx.coroutines.launch
import uniffi.talaria.needLogin
2022-10-12 09:44:38 +00:00
enum class TalariaScreen(@StringRes val title: Int) {
Login(title = R.string.app_name),
Dialog(title = R.string.dialog),
Chat(title = R.string.chat),
}
2022-10-24 11:58:47 +00:00
enum class DrawerAction {
SelectAccount,
AddAccount,
SavedMessages,
Contacts,
NewChat,
Settings,
Help,
}
2022-10-12 09:44:38 +00:00
@Composable
2022-10-24 11:58:47 +00:00
fun DrawerAction(
icon: ImageVector,
text: String,
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Row(
modifier = modifier
.clickable(onClick = onClick)
.fillMaxWidth()
.padding(0.dp, 8.dp)
) {
Icon(imageVector = icon, contentDescription = null)
Spacer(modifier = Modifier.width(8.dp))
Text(text)
}
}
@Composable
fun Drawer(onSelect: (DrawerAction) -> Unit, modifier: Modifier = Modifier) {
2022-10-24 11:58:47 +00:00
Column(
modifier = modifier
.fillMaxSize()
.padding(24.dp, 48.dp)
) {
Image(
painter = painterResource(R.drawable.ic_launcher_foreground),
contentDescription = "App Icon"
)
DrawerAction(
icon = Icons.Filled.AccountBox,
text = "Main Account",
onClick = { onSelect(DrawerAction.SelectAccount) }
)
DrawerAction(
icon = Icons.Filled.Add,
text = "Add Account",
onClick = { onSelect(DrawerAction.AddAccount) }
)
Divider()
DrawerAction(
icon = Icons.Filled.Star,
text = "Saved Messages",
onClick = { onSelect(DrawerAction.SavedMessages) }
)
DrawerAction(
icon = Icons.Filled.Call,
text = "Contacts",
onClick = { onSelect(DrawerAction.Contacts) }
)
DrawerAction(
icon = Icons.Filled.Create,
text = "New Chat",
onClick = { onSelect(DrawerAction.NewChat) }
)
Divider()
DrawerAction(
icon = Icons.Filled.Settings,
text = "Settings",
onClick = { onSelect(DrawerAction.Settings) }
)
DrawerAction(
icon = Icons.Filled.Info,
text = "Help",
onClick = { onSelect(DrawerAction.Help) }
)
}
}
@Composable
fun TalariaAppBar(
currentScreen: TalariaScreen,
canNavigateBack: Boolean,
navigateUp: () -> Unit,
openDrawer: () -> Unit,
modifier: Modifier = Modifier,
2022-10-24 11:58:47 +00:00
) {
2022-10-12 09:44:38 +00:00
TopAppBar(
2022-10-24 13:51:03 +00:00
modifier = modifier,
2022-10-12 09:44:38 +00:00
title = { Text(stringResource(currentScreen.title)) },
navigationIcon = {
if (canNavigateBack) {
IconButton(onClick = navigateUp) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = stringResource(R.string.back_button)
)
}
2022-10-24 11:58:47 +00:00
} else {
IconButton(onClick = openDrawer) {
Icon(
imageVector = Icons.Filled.Menu,
contentDescription = stringResource(androidx.compose.ui.R.string.navigation_menu)
)
}
2022-10-12 09:44:38 +00:00
}
}
)
}
@Composable
fun TalariaApp(modifier: Modifier = Modifier) {
2022-10-12 09:44:38 +00:00
val navController = rememberNavController()
val backStackEntry by navController.currentBackStackEntryAsState()
val currentScreen =
TalariaScreen.valueOf(backStackEntry?.destination?.route ?: TalariaScreen.Login.name)
val loggedIn by remember { mutableStateOf(!needLogin()) }
2022-10-12 19:26:51 +00:00
var selectedDialog by remember { mutableStateOf("") }
2022-10-24 11:58:47 +00:00
val drawerState = rememberDrawerState(DrawerValue.Closed)
val scope = rememberCoroutineScope()
val toggleDrawer = { open: Boolean ->
scope.launch {
if (open) {
drawerState.open()
} else {
drawerState.close()
}
}
}
2022-10-29 11:06:38 +00:00
val chatViewModel = remember { ChatViewModel() }
2022-10-12 09:44:38 +00:00
Scaffold(
modifier = modifier,
2022-10-12 09:44:38 +00:00
topBar = {
TalariaAppBar(
currentScreen,
canNavigateBack = navController.previousBackStackEntry != null,
2022-10-24 11:58:47 +00:00
navigateUp = { navController.navigateUp() },
openDrawer = { toggleDrawer(drawerState.isClosed) }
2022-10-12 09:44:38 +00:00
)
}
) { innerPadding ->
2022-10-24 11:58:47 +00:00
ModalDrawer(
drawerState = drawerState,
gesturesEnabled = drawerState.isOpen,
drawerContent = {
Drawer(onSelect = {})
}) {
NavHost(
navController = navController,
startDestination = if (loggedIn) {
TalariaScreen.Login.name
} else {
TalariaScreen.Dialog.name
},
Modifier.padding(innerPadding)
) {
composable(route = TalariaScreen.Dialog.name) {
DialogScreen(onDialogSelected = {
selectedDialog = it
2022-10-29 11:06:38 +00:00
chatViewModel.loadMessages(it)
2022-10-24 11:58:47 +00:00
navController.navigate(TalariaScreen.Chat.name)
})
}
composable(route = TalariaScreen.Chat.name) {
2022-10-29 11:06:38 +00:00
ChatScreen(selectedDialog, chatViewModel = chatViewModel)
2022-10-24 11:58:47 +00:00
}
composable(route = TalariaScreen.Login.name) {
LoginScreen(onConfirmOtp = {
navController.navigate(TalariaScreen.Dialog.name)
})
}
2022-10-12 09:44:38 +00:00
}
}
}
}
2022-10-24 11:58:47 +00:00
@Preview
@Composable
fun TopBarPreview() {
TalariaAppBar(
currentScreen = TalariaScreen.Dialog,
canNavigateBack = false,
navigateUp = {},
openDrawer = {},
)
}
@Preview
@Composable
fun NavDrawerPreview() {
Surface {
Drawer(onSelect = {})
}
}