Skip to content

Commit

Permalink
Completely migrated to type safe navigation
Browse files Browse the repository at this point in the history
Handled multiple times screen navigation on tap of Home from drawer
  • Loading branch information
imrannextgeni021 committed Oct 14, 2024
1 parent 761869e commit 25d5a26
Show file tree
Hide file tree
Showing 14 changed files with 76 additions and 106 deletions.
12 changes: 6 additions & 6 deletions app/src/main/java/com/starry/greenstash/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import com.starry.greenstash.database.goal.GoalDao
import com.starry.greenstash.other.WelcomeDataStore
import com.starry.greenstash.reminder.ReminderManager
import com.starry.greenstash.ui.navigation.DrawerScreens
import com.starry.greenstash.ui.navigation.Screens
import com.starry.greenstash.ui.navigation.WelcomeScreen
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
Expand All @@ -66,9 +66,9 @@ class MainViewModel @Inject constructor(
private val _isLoading: MutableState<Boolean> = mutableStateOf(true)
val isLoading: State<Boolean> = _isLoading

private val _startDestination: MutableState<String> =
mutableStateOf(Screens.WelcomeScreen.route)
val startDestination: State<String> = _startDestination
private val _startDestination: MutableState<Any> =
mutableStateOf(WelcomeScreen)
val startDestination: State<Any> = _startDestination

companion object {
// Must be same as the one in AndroidManifest.xml
Expand All @@ -85,9 +85,9 @@ class MainViewModel @Inject constructor(
viewModelScope.launch {
welcomeDataStore.readOnBoardingState().collect { completed ->
if (completed) {
_startDestination.value = DrawerScreens.Home.route
_startDestination.value = DrawerScreens.Home
} else {
_startDestination.value = Screens.WelcomeScreen.route
_startDestination.value = WelcomeScreen
}

delay(120)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,29 @@
package com.starry.greenstash.ui.navigation

import com.starry.greenstash.R
import kotlinx.serialization.Serializable

sealed class DrawerScreens(val route: String, val nameResId: Int, val iconResId: Int) {
@Serializable
sealed class DrawerScreens( val nameResId: Int, val iconResId: Int) {

companion object {
fun getAllItems() = listOf(Home, Archive, Backups, Settings)
}

data object Home : DrawerScreens("home", R.string.drawer_home, R.drawable.ic_nav_home)
@Serializable
data object Home : DrawerScreens( R.string.drawer_home, R.drawable.ic_nav_home)

@Serializable
data object Archive :
DrawerScreens("archive", R.string.drawer_archive, R.drawable.ic_nav_archive)
DrawerScreens( R.string.drawer_archive, R.drawable.ic_nav_archive)

@Serializable
data object Backups :
DrawerScreens("backups", R.string.drawer_backup, R.drawable.ic_nav_backups)
DrawerScreens( R.string.drawer_backup, R.drawable.ic_nav_backups)

@Serializable
data object Settings :
DrawerScreens("settings", R.string.drawer_settings, R.drawable.ic_nav_settings)
DrawerScreens( R.string.drawer_settings, R.drawable.ic_nav_settings)
}


30 changes: 11 additions & 19 deletions app/src/main/java/com/starry/greenstash/ui/navigation/NavGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,26 +50,25 @@ import com.starry.greenstash.ui.screens.welcome.composables.WelcomeScreen
@Composable
fun NavGraph(
navController: NavHostController,
startDestination: String
startDestination: Any
) {

NavHost(
navController = navController,
startDestination = startDestination,
modifier = Modifier.background(MaterialTheme.colorScheme.background)

) {
/** Welcome Screen */
composable(
route = Screens.WelcomeScreen.route,
composable<WelcomeScreen>(
exitTransition = { exitTransition() },
popEnterTransition = { popEnterTransition() },
) {
WelcomeScreen(navController = navController)
}

/** Home Screen */
composable(
route = DrawerScreens.Home.route,
composable<DrawerScreens.Home>(
enterTransition = { enterTransition() },
exitTransition = { exitTransition() },
popEnterTransition = { popEnterTransition() },
Expand Down Expand Up @@ -116,8 +115,7 @@ fun NavGraph(
}

/** Goal Achieved Screen */
composable(
route = Screens.CongratsScreen.route,
composable<CongratsScreen>(
enterTransition = { enterTransition() },
exitTransition = { exitTransition() },
popEnterTransition = { popEnterTransition() },
Expand All @@ -127,8 +125,7 @@ fun NavGraph(
}

/** Archive Screen */
composable(
route = DrawerScreens.Archive.route,
composable<DrawerScreens.Archive>(
enterTransition = { enterTransition() },
exitTransition = { exitTransition() },
popEnterTransition = { popEnterTransition() },
Expand All @@ -138,8 +135,7 @@ fun NavGraph(
}

/** Backup Screen */
composable(
route = DrawerScreens.Backups.route,
composable<DrawerScreens.Backups>(
enterTransition = { enterTransition() },
exitTransition = { exitTransition() },
popEnterTransition = { popEnterTransition() },
Expand All @@ -149,8 +145,7 @@ fun NavGraph(
}

/** Settings Screen */
composable(
route = DrawerScreens.Settings.route,
composable<DrawerScreens.Settings>(
enterTransition = { enterTransition() },
exitTransition = { exitTransition() },
popEnterTransition = { popEnterTransition() },
Expand All @@ -160,26 +155,23 @@ fun NavGraph(
}

/** Goal Ui Settings Screen */
composable(
route = Screens.GoalCardStyle.route,
composable<GoalCardStyleScreen>(
enterTransition = { enterTransition() },
popExitTransition = { popExitTransition() },
) {
GoalCardStyle(navController = navController)
}

/** Open Source Licenses Screen */
composable(
route = Screens.OSLScreen.route,
composable<OSLScreen>(
enterTransition = { enterTransition() },
popExitTransition = { popExitTransition() },
) {
OSLScreen(navController = navController)
}

/** About Screen */
composable(
route = Screens.AboutScreen.route,
composable<AboutScreen>(
enterTransition = { enterTransition() },
popExitTransition = { popExitTransition() },
) {
Expand Down

This file was deleted.

59 changes: 25 additions & 34 deletions app/src/main/java/com/starry/greenstash/ui/navigation/Screens.kt
Original file line number Diff line number Diff line change
@@ -1,45 +1,36 @@
/**
* MIT License
*
* Copyright (c) [2022 - Present] Stɑrry Shivɑm
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.starry.greenstash.ui.navigation

import kotlinx.serialization.Serializable

package com.starry.greenstash.ui.navigation

sealed class Screens(val route: String) {
// Settings Screens
@Serializable
data class DWScreen(val goalId: String, val transactionType: String)


@Serializable
data class InputScreen(val goalId: String? = null)


@Serializable
data class GoalInfoScreen(val goalId: String)

@Serializable
object AboutScreen

data object GoalCardStyle : Screens("goal_card_style")
@Serializable
object OSLScreen

@Serializable
object GoalCardStyleScreen

data object AboutScreen : Screens("about_screen")

// Goal Achieved Screen
@Serializable
object CongratsScreen

data object OSLScreen : Screens("osl_screen")
// Welcome / Onboarding Screen
@Serializable
object WelcomeScreen

// Goal Achieved Screen

data object CongratsScreen : Screens("goal_achieved_screen")

// Welcome / Onboarding Screen
data object WelcomeScreen : Screens("welcome_screen")
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ import com.maxkeppeler.sheets.date_time.models.DateTimeSelection
import com.starry.greenstash.R
import com.starry.greenstash.database.transaction.TransactionType
import com.starry.greenstash.ui.common.DateTimeCard
import com.starry.greenstash.ui.navigation.CongratsScreen
import com.starry.greenstash.ui.navigation.DrawerScreens
import com.starry.greenstash.ui.navigation.Screens
import com.starry.greenstash.ui.screens.dwscreen.DWViewModel
import com.starry.greenstash.ui.theme.greenstashFont
import com.starry.greenstash.utils.NumberUtils
Expand Down Expand Up @@ -208,7 +208,7 @@ fun DWScreen(goalId: String, transactionTypeName: String, navController: NavCont
showTransactionAddedAnim.value = true
delay(1100)
withContext(Dispatchers.Main) {
navController.navigate(Screens.CongratsScreen.route)
navController.navigate(CongratsScreen)
}
}
}, onComplete = {
Expand Down Expand Up @@ -414,8 +414,8 @@ private fun navigateToHome(
showTransactionAddedAnim.value = true
delay(1100)
withContext(Dispatchers.Main) {
navController.popBackStack(DrawerScreens.Home.route, true)
navController.navigate(DrawerScreens.Home.route)
navController.popBackStack(DrawerScreens.Home, true)
navController.navigate(DrawerScreens.Home)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ import com.starry.greenstash.database.transaction.TransactionType
import com.starry.greenstash.ui.navigation.DWScreen
import com.starry.greenstash.ui.navigation.GoalInfoScreen
import com.starry.greenstash.ui.navigation.InputScreen
import com.starry.greenstash.ui.navigation.Screens
import com.starry.greenstash.ui.screens.home.GoalCardStyle
import com.starry.greenstash.ui.screens.home.HomeViewModel
import com.starry.greenstash.utils.Constants
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,14 @@ private fun DrawerItems(
selected = item == selectedItem.value,
onClick = {
view.weakHapticFeedback()
selectedItem.value = item
coroutineScope.launch {
drawerState.close()
withContext(Dispatchers.Main) {
navController.navigate(item.route)
if (item != selectedItem.value) {
withContext(Dispatchers.Main) {
navController.navigate(item)
}
}
selectedItem.value = item
}
},
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ import com.starry.greenstash.MainActivity
import com.starry.greenstash.R
import com.starry.greenstash.database.core.GoalWithTransactions
import com.starry.greenstash.ui.navigation.InputScreen
import com.starry.greenstash.ui.navigation.Screens
import com.starry.greenstash.ui.screens.home.FilterField
import com.starry.greenstash.ui.screens.home.FilterSortType
import com.starry.greenstash.ui.screens.home.HomeViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -474,10 +474,10 @@ fun InputScreen(editGoalId: String?, navController: NavController) {
delay(1050)
withContext(Dispatchers.Main) {
navController.popBackStack(
DrawerScreens.Home.route,
DrawerScreens.Home,
true
)
navController.navigate(DrawerScreens.Home.route)
navController.navigate(DrawerScreens.Home)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ import com.starry.greenstash.MainViewModel
import com.starry.greenstash.ui.navigation.GoalInfoScreen
import com.starry.greenstash.ui.navigation.InputScreen
import com.starry.greenstash.ui.navigation.NavGraph
import com.starry.greenstash.ui.navigation.Screens
import com.starry.greenstash.ui.screens.other.AppLockedScreen
import com.starry.greenstash.ui.screens.settings.ThemeMode
import com.starry.greenstash.ui.theme.AdjustEdgeToEdge
Expand All @@ -56,7 +55,7 @@ import com.starry.greenstash.ui.theme.AdjustEdgeToEdge
fun MainScreen(
activity: MainActivity,
showAppContents: Boolean,
startDestination: String,
startDestination: Any,
currentThemeMode: ThemeMode,
onAuthRequest: () -> Unit,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ fun CongratsScreen(navController: NavController) {
})

BackHandler {
navController.popBackStack(DrawerScreens.Home.route, true)
navController.navigate(DrawerScreens.Home.route)
navController.popBackStack(DrawerScreens.Home, true)
navController.navigate(DrawerScreens.Home)
}

Column(
Expand Down Expand Up @@ -148,8 +148,8 @@ fun CongratsScreen(navController: NavController) {
SlideInAnimatedContainer(initialDelay = 2000) {
FilledTonalButton(
onClick = {
navController.popBackStack(DrawerScreens.Home.route, true)
navController.navigate(DrawerScreens.Home.route)
navController.popBackStack(DrawerScreens.Home, true)
navController.navigate(DrawerScreens.Home)
},
shape = RoundedCornerShape(12.dp),
modifier = Modifier
Expand Down
Loading

0 comments on commit 25d5a26

Please sign in to comment.