forked from melod1n/fast-messenger
172 lines
7.1 KiB
Kotlin
172 lines
7.1 KiB
Kotlin
package dev.meloda.fast.presentation
|
|
|
|
import android.content.Intent
|
|
import android.net.Uri
|
|
import android.provider.Settings
|
|
import androidx.compose.animation.core.tween
|
|
import androidx.compose.animation.fadeIn
|
|
import androidx.compose.animation.fadeOut
|
|
import androidx.compose.material3.AlertDialog
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.material3.TextButton
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.window.DialogProperties
|
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|
import androidx.navigation.NavController
|
|
import androidx.navigation.NavHostController
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.rememberNavController
|
|
import dev.meloda.fast.MainViewModel
|
|
import dev.meloda.fast.auth.authNavGraph
|
|
import dev.meloda.fast.auth.navigateToAuth
|
|
import dev.meloda.fast.chatmaterials.navigation.chatMaterialsScreen
|
|
import dev.meloda.fast.chatmaterials.navigation.navigateToChatMaterials
|
|
import dev.meloda.fast.conversations.navigation.createChatScreen
|
|
import dev.meloda.fast.conversations.navigation.navigateToCreateChat
|
|
import dev.meloda.fast.languagepicker.navigation.languagePickerScreen
|
|
import dev.meloda.fast.languagepicker.navigation.navigateToLanguagePicker
|
|
import dev.meloda.fast.messageshistory.navigation.messagesHistoryScreen
|
|
import dev.meloda.fast.messageshistory.navigation.navigateToMessagesHistory
|
|
import dev.meloda.fast.navigation.Main
|
|
import dev.meloda.fast.navigation.mainScreen
|
|
import dev.meloda.fast.photoviewer.navigation.navigateToPhotoView
|
|
import dev.meloda.fast.photoviewer.navigation.photoViewScreen
|
|
import dev.meloda.fast.settings.navigation.navigateToSettings
|
|
import dev.meloda.fast.settings.navigation.settingsScreen
|
|
import dev.meloda.fast.ui.R
|
|
|
|
@Composable
|
|
fun RootScreen(
|
|
navController: NavHostController = rememberNavController(),
|
|
viewModel: MainViewModel
|
|
) {
|
|
val context = LocalContext.current
|
|
val startDestination by viewModel.startDestination.collectAsStateWithLifecycle()
|
|
val isNeedToOpenAuth by viewModel.isNeedToReplaceWithAuth.collectAsStateWithLifecycle()
|
|
val isNeedToShowDeniedDialog by viewModel.isNeedToShowNotificationsDeniedDialog.collectAsStateWithLifecycle()
|
|
val isNeedToShowRationaleDialog by viewModel.isNeedToShowNotificationsRationaleDialog.collectAsStateWithLifecycle()
|
|
|
|
LaunchedEffect(isNeedToOpenAuth) {
|
|
if (isNeedToOpenAuth) {
|
|
viewModel.onNavigatedToAuth()
|
|
navController.navigateToAuth(clearBackStack = true)
|
|
}
|
|
}
|
|
|
|
if (isNeedToShowDeniedDialog) {
|
|
AlertDialog(
|
|
onDismissRequest = viewModel::onNotificationsDeniedDialogDismissed,
|
|
title = { Text(text = stringResource(id = R.string.warning)) },
|
|
text = { Text(text = stringResource(id = R.string.background_long_poll_denied_text)) },
|
|
confirmButton = {
|
|
TextButton(onClick = viewModel::onNotificationsDeniedDialogConfirmClicked) {
|
|
Text(text = stringResource(id = R.string.action_request))
|
|
}
|
|
},
|
|
dismissButton = {
|
|
TextButton(onClick = viewModel::onNotificationsDeniedDialogCancelClicked) {
|
|
Text(text = stringResource(id = R.string.action_disable))
|
|
}
|
|
},
|
|
properties = DialogProperties(
|
|
dismissOnBackPress = false,
|
|
dismissOnClickOutside = false
|
|
)
|
|
)
|
|
}
|
|
|
|
if (isNeedToShowRationaleDialog) {
|
|
AlertDialog(
|
|
onDismissRequest = viewModel::onNotificationsRationaleDialogDismissed,
|
|
title = { Text(text = stringResource(id = R.string.warning)) },
|
|
text = { Text(text = stringResource(id = R.string.background_long_poll_rationale_text)) },
|
|
confirmButton = {
|
|
TextButton(
|
|
onClick = {
|
|
context.startActivity(
|
|
Intent(
|
|
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
|
|
Uri.fromParts("package", context.packageName, null)
|
|
)
|
|
)
|
|
}
|
|
) {
|
|
Text(text = stringResource(id = R.string.title_settings))
|
|
}
|
|
},
|
|
dismissButton = {
|
|
TextButton(onClick = viewModel::onNotificationsRationaleDialogCancelClicked) {
|
|
Text(text = stringResource(id = R.string.action_disable))
|
|
}
|
|
},
|
|
properties = DialogProperties(
|
|
dismissOnBackPress = false,
|
|
dismissOnClickOutside = false
|
|
)
|
|
)
|
|
}
|
|
|
|
if (startDestination != null) {
|
|
NavHost(
|
|
navController = navController,
|
|
startDestination = requireNotNull(startDestination),
|
|
enterTransition = { fadeIn(animationSpec = tween(200)) },
|
|
exitTransition = { fadeOut(animationSpec = tween(200)) }
|
|
) {
|
|
authNavGraph(
|
|
onNavigateToMain = {
|
|
viewModel.onUserAuthenticated()
|
|
navController.navigateToMain()
|
|
},
|
|
navController = navController
|
|
)
|
|
mainScreen(
|
|
onError = viewModel::onError,
|
|
onSettingsButtonClicked = navController::navigateToSettings,
|
|
onConversationClicked = navController::navigateToMessagesHistory,
|
|
onPhotoClicked = { url -> navController.navigateToPhotoView(listOf(url)) },
|
|
onMessageClicked = navController::navigateToMessagesHistory,
|
|
onCreateChatClicked = navController::navigateToCreateChat
|
|
)
|
|
|
|
messagesHistoryScreen(
|
|
onError = viewModel::onError,
|
|
onBack = navController::navigateUp,
|
|
onChatMaterialsDropdownItemClicked = navController::navigateToChatMaterials
|
|
)
|
|
chatMaterialsScreen(
|
|
onBack = navController::navigateUp,
|
|
onPhotoClicked = { url -> navController.navigateToPhotoView(listOf(url)) }
|
|
)
|
|
createChatScreen(
|
|
onChatCreated = { conversationId ->
|
|
navController.popBackStack()
|
|
navController.navigateToMessagesHistory(conversationId)
|
|
},
|
|
navController = navController
|
|
)
|
|
|
|
settingsScreen(
|
|
onBack = navController::navigateUp,
|
|
onLogOutButtonClicked = { navController.navigateToAuth(true) },
|
|
onLanguageItemClicked = navController::navigateToLanguagePicker
|
|
)
|
|
languagePickerScreen(onBack = navController::navigateUp)
|
|
|
|
photoViewScreen(onBack = navController::navigateUp)
|
|
}
|
|
}
|
|
}
|
|
|
|
fun NavController.navigateToMain() {
|
|
this.navigate(Main) {
|
|
popUpTo(0) {
|
|
inclusive = true
|
|
}
|
|
}
|
|
}
|