diff --git a/app/src/main/kotlin/com/bff/wespot/MainActivity.kt b/app/src/main/kotlin/com/bff/wespot/MainActivity.kt index 97426977..b4ac9026 100644 --- a/app/src/main/kotlin/com/bff/wespot/MainActivity.kt +++ b/app/src/main/kotlin/com/bff/wespot/MainActivity.kt @@ -30,6 +30,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.NavigationBar import androidx.compose.material3.Scaffold +import androidx.compose.material3.SheetValue import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable @@ -57,6 +58,7 @@ import androidx.navigation.compose.rememberNavController import com.bff.wespot.R.string import com.bff.wespot.analytic.AnalyticsHelper import com.bff.wespot.analytic.LocalAnalyticsHelper +import com.bff.wespot.data.remote.extensions.toLocalDateFromDashPattern import com.bff.wespot.designsystem.R import com.bff.wespot.designsystem.component.button.WSButton import com.bff.wespot.designsystem.component.button.WSButtonType @@ -67,15 +69,16 @@ import com.bff.wespot.designsystem.theme.WeSpotThemeManager import com.bff.wespot.entire.screen.destinations.SettingScreenDestination import com.bff.wespot.model.common.RestrictionType import com.bff.wespot.model.notification.NotificationType +import com.bff.wespot.model.serverDriven.OnBoardingCategory import com.bff.wespot.navigation.Navigator +import com.bff.wespot.navigation.util.EXTRA_DATE import com.bff.wespot.navigation.util.EXTRA_TARGET_ID import com.bff.wespot.navigation.util.EXTRA_TYPE import com.bff.wespot.navigation.util.EXTRA_USER_ID import com.bff.wespot.notification.screen.NotificationNavigator +import com.bff.wespot.server.driven.onboarding.OnBoardingBottomSheet import com.bff.wespot.state.MainAction import com.bff.wespot.state.MainUiState -import com.bff.wespot.data.remote.extensions.toLocalDateFromDashPattern -import com.bff.wespot.navigation.util.EXTRA_DATE import com.bff.wespot.ui.component.TopToast import com.bff.wespot.ui.component.WSBottomSheet import com.bff.wespot.ui.model.ToastState @@ -316,6 +319,12 @@ private fun MainScreen( ) } + OnBoardingSheet( + state = state, + navController = navController, + action = action, + ) + LaunchedEffect(Unit) { action(MainAction.OnMainScreenEntered) } @@ -351,6 +360,41 @@ private fun BottomNavigationTab( } } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun OnBoardingSheet( + state: MainUiState, + navController: NavController, + action: (MainAction) -> Unit, +) { + val current by navController.currentScreenAsState() + val category = when { + current == BottomBarDestinations.Vote.screen && state.showVoteOnBoarding -> { + OnBoardingCategory.VOTE + } + current == BottomBarDestinations.Message.screen && state.showMessageOnBoarding -> { + OnBoardingCategory.MESSAGE + } + else -> null + } + + category?.let { + WSBottomSheet( + closeSheet = {}, + sheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = true, + confirmValueChange = { it != SheetValue.Hidden }) + ) { + OnBoardingBottomSheet( + category = it, + closeOnBoarding = { + action(MainAction.CloseOnBoarding(it)) + } + ) + } + } +} + @Stable @Composable private fun NavController.currentScreenAsState(): State { diff --git a/app/src/main/kotlin/com/bff/wespot/state/MainAction.kt b/app/src/main/kotlin/com/bff/wespot/state/MainAction.kt index 98150be1..df8130f0 100644 --- a/app/src/main/kotlin/com/bff/wespot/state/MainAction.kt +++ b/app/src/main/kotlin/com/bff/wespot/state/MainAction.kt @@ -1,10 +1,12 @@ package com.bff.wespot.state import com.bff.wespot.MainScreenNavArgs +import com.bff.wespot.model.serverDriven.OnBoardingCategory sealed class MainAction { data object OnMainScreenEntered : MainAction() data object OnNavigateByPushNotification : MainAction() data class OnEnteredByPushNotification(val data: MainScreenNavArgs) : MainAction() data class OnNotificationSet(val isEnableNotification: Boolean) : MainAction() + data class CloseOnBoarding(val category: OnBoardingCategory) : MainAction() } diff --git a/app/src/main/kotlin/com/bff/wespot/state/MainUiState.kt b/app/src/main/kotlin/com/bff/wespot/state/MainUiState.kt index 62277c72..a9d53589 100644 --- a/app/src/main/kotlin/com/bff/wespot/state/MainUiState.kt +++ b/app/src/main/kotlin/com/bff/wespot/state/MainUiState.kt @@ -7,4 +7,6 @@ data class MainUiState ( val userId: String = "", val restriction: Restriction = Restriction.Empty, val kakaoChannel: String, + val showVoteOnBoarding: Boolean = true, + val showMessageOnBoarding: Boolean = true ) diff --git a/app/src/main/kotlin/com/bff/wespot/viewmodel/MainViewModel.kt b/app/src/main/kotlin/com/bff/wespot/viewmodel/MainViewModel.kt index dc64d1ef..f7a6582f 100644 --- a/app/src/main/kotlin/com/bff/wespot/viewmodel/MainViewModel.kt +++ b/app/src/main/kotlin/com/bff/wespot/viewmodel/MainViewModel.kt @@ -12,6 +12,7 @@ import com.bff.wespot.domain.repository.user.UserRepository import com.bff.wespot.domain.usecase.CacheProfileUseCase import com.bff.wespot.domain.util.DataStoreKey import com.bff.wespot.domain.util.RemoteConfigKey +import com.bff.wespot.model.serverDriven.OnBoardingCategory import com.bff.wespot.state.MainAction import com.bff.wespot.state.MainSideEffect import com.bff.wespot.state.MainUiState @@ -62,6 +63,7 @@ class MainViewModel @Inject constructor( trackPushNotificationClicked(action.data) } is MainAction.OnNotificationSet -> handleNotificationSet(action.isEnableNotification) + is MainAction.CloseOnBoarding -> handleOnBoarding(action.category) } } @@ -108,4 +110,10 @@ class MainViewModel @Inject constructor( ) } } + private fun handleOnBoarding(category: OnBoardingCategory) = intent { + when (category) { + OnBoardingCategory.VOTE -> reduce { state.copy(showVoteOnBoarding = false) } + OnBoardingCategory.MESSAGE -> reduce { state.copy(showMessageOnBoarding = false) } + } + } } diff --git a/feature/server-driven/src/main/java/com/bff/wespot/server/driven/onboarding/OnBoardingBottomSheet.kt b/feature/server-driven/src/main/java/com/bff/wespot/server/driven/onboarding/OnBoardingBottomSheet.kt index d1092458..da0b717d 100644 --- a/feature/server-driven/src/main/java/com/bff/wespot/server/driven/onboarding/OnBoardingBottomSheet.kt +++ b/feature/server-driven/src/main/java/com/bff/wespot/server/driven/onboarding/OnBoardingBottomSheet.kt @@ -31,7 +31,7 @@ import kotlinx.coroutines.launch fun OnBoardingBottomSheet( viewModel: OnBoardingViewModel = hiltViewModel(), category: OnBoardingCategory, - closeOnBoarding: () -> Unit + closeOnBoarding: () -> Unit, ) { val contents by viewModel.contents.collectAsStateWithLifecycle() val coroutineScope = rememberCoroutineScope()