Skip to content

Commit

Permalink
feat: bottomSheetScaffoldState hoist to appState
Browse files Browse the repository at this point in the history
  • Loading branch information
murjune committed Feb 11, 2025
1 parent 585203f commit b3c4a8f
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 10 deletions.
2 changes: 2 additions & 0 deletions app/src/main/kotlin/com/chipichipi/dobedobe/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
Expand All @@ -18,6 +19,7 @@ import kotlinx.coroutines.launch
import org.koin.androidx.compose.KoinAndroidContext
import org.koin.androidx.viewmodel.ext.android.viewModel

@OptIn(ExperimentalMaterial3Api::class)
class MainActivity : ComponentActivity() {
private val viewModel: MainViewModel by viewModel()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.chipichipi.dobedobe.navigation

import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
Expand All @@ -25,6 +26,7 @@ import com.chipichipi.dobedobe.feature.setting.navigation.navigateToSetting
import com.chipichipi.dobedobe.feature.setting.navigation.settingScreen
import com.chipichipi.dobedobe.ui.DobeDobeAppState

@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun DobeDobeNavHost(
appState: DobeDobeAppState,
Expand All @@ -33,6 +35,7 @@ internal fun DobeDobeNavHost(
) {
val navController = appState.navController
val backStackEntry by navController.currentBackStackEntryAsState()
val bottomSheetScaffoldState = appState.bottomSheetScaffoldState

NavHost(
navController = navController,
Expand All @@ -43,10 +46,14 @@ internal fun DobeDobeNavHost(
) {
dashboardScreen(
onShowSnackbar = onShowSnackbar,
bottomSheetScaffoldState = bottomSheetScaffoldState,
navigateToAddGoal = navController::navigateToAddGoal,
navigateToGoalDetail = navController::navigateToGoalDetail,
navigateToSetting = navController::navigateToSetting,
navigateToSearchGoal = navController::navigateToSearchGoal,
navigateToSearchGoal = {
navController.navigateToSearchGoal()
appState.partiallyExpand()
},
)

goalGraph(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.chipichipi.dobedobe.ui

import androidx.compose.material3.BottomSheetScaffoldState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetValue
import androidx.compose.material3.rememberBottomSheetScaffoldState
import androidx.compose.material3.rememberStandardBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.remember
Expand All @@ -9,10 +14,17 @@ import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun rememberDobeDobeAppState(
coroutineScope: CoroutineScope = rememberCoroutineScope(),
bottomSheetScaffoldState: BottomSheetScaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.PartiallyExpanded,
),
),
navController: NavHostController = rememberNavController(),
): DobeDobeAppState {
return remember(
Expand All @@ -21,21 +33,30 @@ internal fun rememberDobeDobeAppState(
) {
DobeDobeAppState(
coroutineScope = coroutineScope,
bottomSheetScaffoldState = bottomSheetScaffoldState,
navController = navController,
)
}
}

@OptIn(ExperimentalMaterial3Api::class)
@Stable
class DobeDobeAppState(
coroutineScope: CoroutineScope,
val coroutineScope: CoroutineScope,
val bottomSheetScaffoldState: BottomSheetScaffoldState,
val navController: NavHostController,
) {
fun navigateToBack(from: NavBackStackEntry) {
if (from.lifecycleIsResumed()) {
navController.popBackStack()
}
}

fun partiallyExpand() {
coroutineScope.launch {
bottomSheetScaffoldState.bottomSheetState.partialExpand()
}
}
}

private fun NavBackStackEntry.lifecycleIsResumed() =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,11 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.BottomSheetScaffoldState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.SheetValue
import androidx.compose.material3.rememberBottomSheetScaffoldState
import androidx.compose.material3.rememberStandardBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
Expand Down Expand Up @@ -57,9 +56,11 @@ import org.koin.androidx.compose.koinViewModel

private const val ANIMATION_DURATION = 500

@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun DashboardRoute(
onShowSnackbar: suspend (String, String?) -> Boolean,
bottomSheetScaffoldState: BottomSheetScaffoldState,
navigateToAddGoal: () -> Unit,
navigateToGoalDetail: (Long) -> Unit,
navigateToSetting: () -> Unit,
Expand All @@ -74,6 +75,7 @@ internal fun DashboardRoute(
modifier = modifier.fillMaxSize(),
onShowSnackbar = onShowSnackbar,
uiState = uiState,
bottomSheetScaffoldState = bottomSheetScaffoldState,
setGoalNotificationEnabled = viewModel::setGoalNotificationEnabled,
disableSystemNotificationDialog = viewModel::disableSystemNotificationDialog,
navigateToAddGoal = navigateToAddGoal,
Expand All @@ -90,10 +92,12 @@ internal fun DashboardRoute(
)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun DashboardScreen(
onShowSnackbar: suspend (String, String?) -> Boolean,
uiState: DashboardUiState,
bottomSheetScaffoldState: BottomSheetScaffoldState,
setGoalNotificationEnabled: (Boolean) -> Unit,
disableSystemNotificationDialog: () -> Unit,
navigateToAddGoal: () -> Unit,
Expand All @@ -116,7 +120,7 @@ private fun DashboardScreen(
when (uiState) {
is DashboardUiState.Error,
is DashboardUiState.Loading,
-> {
-> {
CircularProgressIndicator(
modifier = Modifier.size(24.dp),
)
Expand All @@ -126,6 +130,7 @@ private fun DashboardScreen(
DashboardBody(
modifier = modifier,
uiState = uiState,
bottomSheetScaffoldState = bottomSheetScaffoldState,
setGoalNotificationEnabled = setGoalNotificationEnabled,
disableSystemNotificationDialog = disableSystemNotificationDialog,
navigateToAddGoal = navigateToAddGoal,
Expand All @@ -150,6 +155,7 @@ private fun DashboardScreen(
@Composable
private fun DashboardBody(
uiState: DashboardUiState.Success,
bottomSheetScaffoldState: BottomSheetScaffoldState,
setGoalNotificationEnabled: (Boolean) -> Unit,
disableSystemNotificationDialog: () -> Unit,
navigateToAddGoal: () -> Unit,
Expand All @@ -170,11 +176,6 @@ private fun DashboardBody(
SharedTransitionLayout(
modifier = modifier,
) {
val bottomSheetScaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.PartiallyExpanded,
),
)
val photoFramesState = rememberDashboardPhotoFramesState(
photoState = uiState.photoState,
)
Expand All @@ -186,6 +187,7 @@ private fun DashboardBody(
}
}
val resources = CharacterResources.from(uiState.character)

DobeDobeBottomSheetScaffold(
modifier = Modifier
.fillMaxSize()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.chipichipi.dobedobe.feature.dashboard.navigation

import androidx.compose.material3.BottomSheetScaffoldState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
Expand All @@ -14,8 +16,10 @@ fun NavController.navigateToDashboard(
navOptions: NavOptions,
) = navigate(route = DashboardRoute, navOptions)

@OptIn(ExperimentalMaterial3Api::class)
fun NavGraphBuilder.dashboardScreen(
onShowSnackbar: suspend (String, String?) -> Boolean,
bottomSheetScaffoldState: BottomSheetScaffoldState,
navigateToAddGoal: () -> Unit,
navigateToGoalDetail: (Long) -> Unit,
navigateToSearchGoal: () -> Unit,
Expand All @@ -24,6 +28,7 @@ fun NavGraphBuilder.dashboardScreen(
composable<DashboardRoute> {
DashboardRoute(
onShowSnackbar = onShowSnackbar,
bottomSheetScaffoldState = bottomSheetScaffoldState,
navigateToAddGoal = navigateToAddGoal,
navigateToGoalDetail = navigateToGoalDetail,
navigateToSetting = navigateToSetting,
Expand Down

0 comments on commit b3c4a8f

Please sign in to comment.