diff --git a/core/data/auth/src/main/java/com/goalpanzi/mission_mate/core/data/auth/AuthTokenExpirationHandler.kt b/core/data/auth/src/main/java/com/goalpanzi/mission_mate/core/data/auth/AuthTokenExpirationHandler.kt index 8afaab16..0dc90db8 100644 --- a/core/data/auth/src/main/java/com/goalpanzi/mission_mate/core/data/auth/AuthTokenExpirationHandler.kt +++ b/core/data/auth/src/main/java/com/goalpanzi/mission_mate/core/data/auth/AuthTokenExpirationHandler.kt @@ -4,7 +4,7 @@ import com.goalpanzi.mission_mate.core.datastore.datasource.AuthDataSource import com.goalpanzi.mission_mate.core.datastore.datasource.DefaultDataSource import com.goalpanzi.mission_mate.core.datastore.datasource.MissionDataSource import com.goalpanzi.mission_mate.core.navigation.NavigationEventHandler -import com.goalpanzi.mission_mate.core.navigation.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import com.goalpanzi.mission_mate.core.navigation.di.AuthNavigation import com.goalpanzi.mission_mate.core.network.TokenExpirationHandler import kotlinx.coroutines.flow.collect diff --git a/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/ext/TextUnit.kt b/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/ext/TextUnit.kt new file mode 100644 index 00000000..15ec8196 --- /dev/null +++ b/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/ext/TextUnit.kt @@ -0,0 +1,9 @@ +package com.goalpanzi.mission_mate.core.designsystem.ext + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.TextUnit + +@Composable +fun dpToSp(dp: Dp) : TextUnit = with(LocalDensity.current) { dp.toSp() } diff --git a/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/theme/Type.kt b/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/theme/Type.kt index 18f6b60a..2c27d2ab 100644 --- a/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/theme/Type.kt +++ b/core/designsystem/src/main/java/com/goalpanzi/mission_mate/core/designsystem/theme/Type.kt @@ -147,4 +147,12 @@ object MissionMateTypography { val body_sm_regular = body_sm.copy( fontWeight = FontWeight.Normal ) -} \ No newline at end of file + + private val tab = DefaultTextStyle.copy( + fontSize = 11.sp + ) + + val tab_regular = tab.copy( + fontWeight = FontWeight.Normal + ) +} diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index 68363ad9..45f58eb9 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -6,6 +6,7 @@ plugins { alias(libs.plugins.kotlin.plugin.serialization) alias(libs.plugins.kotlin.ksp) alias(libs.plugins.hilt.android) + alias(libs.plugins.kotlin.parcelize) } android { @@ -41,5 +42,6 @@ dependencies { implementation(libs.kotlin.serialization.json) implementation(libs.bundles.coroutines) implementation(libs.hilt.android) + implementation(libs.androidx.navigation.compose) ksp(libs.hilt.compiler) } diff --git a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/AuthNavigationEventHandler.kt b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/AuthNavigationEventHandler.kt index e50dcefb..e713c6b4 100644 --- a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/AuthNavigationEventHandler.kt +++ b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/AuthNavigationEventHandler.kt @@ -1,5 +1,6 @@ package com.goalpanzi.mission_mate.core.navigation +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow diff --git a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/NavigationEventHandler.kt b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/NavigationEventHandler.kt index 0118f02a..f9425e07 100644 --- a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/NavigationEventHandler.kt +++ b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/NavigationEventHandler.kt @@ -1,5 +1,6 @@ package com.goalpanzi.mission_mate.core.navigation +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import kotlinx.coroutines.flow.SharedFlow interface NavigationEventHandler { diff --git a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/MainTabDataModel.kt b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/MainTabDataModel.kt new file mode 100644 index 00000000..0a6e0dd5 --- /dev/null +++ b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/MainTabDataModel.kt @@ -0,0 +1,20 @@ +package com.goalpanzi.mission_mate.core.navigation.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import kotlinx.serialization.Serializable + +@Serializable +@Parcelize +sealed class MainTabDataModel : Parcelable { + @Serializable + data class Mission( + val isAfterProfileCreate: Boolean = false + ) : MainTabDataModel() + @Serializable + data object History : MainTabDataModel() + @Serializable + data object Setting : MainTabDataModel() + @Serializable + data object None : MainTabDataModel() +} diff --git a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/MainTabDataModelType.kt b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/MainTabDataModelType.kt new file mode 100644 index 00000000..7dc3440f --- /dev/null +++ b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/MainTabDataModelType.kt @@ -0,0 +1,32 @@ +package com.goalpanzi.mission_mate.core.navigation.model + +import android.os.Build +import android.os.Bundle +import androidx.navigation.NavType +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +val MainTabDataModelType = object : NavType( + isNullableAllowed = false +){ + override fun get(bundle: Bundle, key: String): MainTabDataModel? { + return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){ + bundle.getParcelable(key, MainTabDataModel::class.java) + } else { + @Suppress("DEPRECATION") + bundle.getParcelable(key) + } + } + + override fun parseValue(value: String): MainTabDataModel { + return Json.decodeFromString(value) + } + + override fun serializeAsValue(value: MainTabDataModel): String { + return Json.encodeToString(value) + } + + override fun put(bundle: Bundle, key: String, value: MainTabDataModel) { + bundle.putParcelable(key, value) + } +} diff --git a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/RouteModel.kt b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/RouteModel.kt similarity index 85% rename from core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/RouteModel.kt rename to core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/RouteModel.kt index 3d4dd9ab..304d043e 100644 --- a/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/RouteModel.kt +++ b/core/navigation/src/main/java/com/goalpanzi/mission_mate/core/navigation/model/RouteModel.kt @@ -1,12 +1,16 @@ -package com.goalpanzi.mission_mate.core.navigation +package com.goalpanzi.mission_mate.core.navigation.model import kotlinx.serialization.Serializable - sealed interface RouteModel { @Serializable data object Login : RouteModel + @Serializable + data class MainTab( + val mainTabDataModel : MainTabDataModel = MainTabDataModel.None + ) : RouteModel + @Serializable sealed interface Profile: RouteModel { @Serializable @@ -56,7 +60,10 @@ sealed interface RouteModel { } @Serializable - sealed interface HistoryRouteModel : MainTabRoute + sealed interface HistoryRouteModel : MainTabRoute { + @Serializable + data object History : HistoryRouteModel + } @Serializable sealed interface SettingRouteModel : MainTabRoute { diff --git a/core/ui/src/main/java/com/goalpanzi/mission_mate/core/ui/util/AnimatedUtil.kt b/core/ui/src/main/java/com/goalpanzi/mission_mate/core/ui/util/AnimatedUtil.kt new file mode 100644 index 00000000..600405aa --- /dev/null +++ b/core/ui/src/main/java/com/goalpanzi/mission_mate/core/ui/util/AnimatedUtil.kt @@ -0,0 +1,45 @@ +package com.goalpanzi.mission_mate.core.ui.util + +import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.AnimatedContentTransitionScope.SlideDirection +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.core.tween +import androidx.navigation.NavBackStackEntry + +fun AnimatedContentTransitionScope.slideInFromEnd( + durationMills: Int = 300 +): EnterTransition { + return slideIntoContainer( + towards = SlideDirection.Left, + animationSpec = tween(durationMills) + ) +} + +fun AnimatedContentTransitionScope.slideOutToEnd( + durationMills: Int = 300 +): ExitTransition { + return slideOutOfContainer( + towards = SlideDirection.End, + animationSpec = tween(durationMills) + ) +} + +fun AnimatedContentTransitionScope.slideInFromBottom( + durationMills: Int = 300 +): EnterTransition { + return slideIntoContainer( + towards = SlideDirection.Up, + animationSpec = tween(durationMills) + ) +} + +fun AnimatedContentTransitionScope.slideOutToBottom( + durationMills: Int = 300 +): ExitTransition { + return slideOutOfContainer( + towards = SlideDirection.Down, + animationSpec = tween(durationMills) + ) +} + diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt index 219f89ee..a47c0a8e 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt @@ -6,7 +6,11 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import androidx.navigation.toRoute -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.ui.util.slideInFromEnd +import com.goalpanzi.mission_mate.core.ui.util.slideInFromBottom +import com.goalpanzi.mission_mate.core.ui.util.slideOutToBottom +import com.goalpanzi.mission_mate.core.ui.util.slideOutToEnd import com.goalpanzi.mission_mate.feature.board.model.CharacterUiModel import com.goalpanzi.mission_mate.feature.board.model.UserStory import com.goalpanzi.mission_mate.feature.board.screen.BoardFinishRoute @@ -33,7 +37,6 @@ fun NavGraphBuilder.boardNavGraph( onNavigateDetail : (Long) -> Unit, onNavigateFinish : (Long) -> Unit, onNavigateStory: (UserStory) -> Unit, - onClickSetting: () -> Unit, onNavigateToPreview: (Long, Uri) -> Unit ) { composable { navBackStackEntry -> @@ -41,7 +44,6 @@ fun NavGraphBuilder.boardNavGraph( onNavigateOnboarding = onNavigateOnboarding, onNavigateDetail = onNavigateDetail, onNavigateFinish = onNavigateFinish, - onClickSetting = onClickSetting, onClickStory = onNavigateStory, onPreviewImage = onNavigateToPreview, ) @@ -58,7 +60,14 @@ fun NavGraphBuilder.boardDetailNavGraph( onNavigateOnboarding: () -> Unit, onBackClick: () -> Unit ) { - composable { + composable( + enterTransition = { + slideInFromEnd() + }, + popExitTransition = { + slideOutToEnd() + } + ) { BoardMissionDetailRoute( onNavigateOnboarding = onNavigateOnboarding, onBackClick = onBackClick @@ -73,12 +82,10 @@ fun NavController.navigateToBoardFinish( } fun NavGraphBuilder.boardFinishNavGraph( - onClickSetting: () -> Unit, onClickOk: () -> Unit, ) { composable { BoardFinishRoute( - onSettingClick = onClickSetting, onOkClick = onClickOk ) } @@ -102,7 +109,14 @@ fun NavController.navigateToUserStory( fun NavGraphBuilder.userStoryNavGraph( onClickClose: () -> Unit ) { - composable { backStackEntry -> + composable( + enterTransition = { + slideInFromBottom() + }, + exitTransition = { + slideOutToBottom() + } + ) { backStackEntry -> backStackEntry.toRoute().run { val characterUiModel = userCharacter.let { CharacterUiModel.valueOf(it) } UserStoryScreen( @@ -128,7 +142,14 @@ fun NavGraphBuilder.verificationPreviewNavGraph( onClickClose: () -> Unit, onUploadSuccess: () -> Unit ) { - composable { + composable( + enterTransition = { + slideInFromBottom() + }, + exitTransition = { + slideOutToBottom() + } + ) { VerificationPreviewRoute( onClickClose = onClickClose, onUploadSuccess = { onUploadSuccess() } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt index e9d3fb7a..ad296cbc 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardBottomView.kt @@ -40,7 +40,7 @@ fun BoardBottomView( .navigationBarsPadding() .clip(RoundedCornerShape(topEnd = 20.dp, topStart = 20.dp)) .background(ColorWhite_FFFFFFFF.copy(alpha = 0.7f)) - .padding(top = 16.dp, bottom = 36.dp, start = 24.dp, end = 24.dp), + .padding(top = 16.dp, bottom = 16.dp, start = 24.dp, end = 24.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(4.dp) ) { diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt index 20c74fe1..7aea12f2 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt @@ -28,7 +28,7 @@ import com.goalpanzi.mission_mate.feature.board.R import com.goalpanzi.mission_mate.feature.board.model.MissionState import com.goalpanzi.mission_mate.feature.board.model.UserStory import com.goalpanzi.mission_mate.core.designsystem.component.StableImage - +import com.goalpanzi.mission_mate.core.designsystem.ext.clickableWithoutRipple @SuppressLint("UnrememberedMutableInteractionSource") @Composable @@ -40,7 +40,6 @@ fun BoardTopView( missionState : MissionState, onClickFlag: () -> Unit, onClickAddUser: () -> Unit, - onClickSetting: () -> Unit, onClickTooltip : () -> Unit, onClickStory: (UserStory) -> Unit, modifier: Modifier = Modifier @@ -70,7 +69,6 @@ fun BoardTopView( BoardTopViewRightActionButtons( isAddingUserEnabled = isAddingUserEnabled, onClickAddUser = onClickAddUser, - onClickSetting = onClickSetting ) }, containerColor = Color.Transparent @@ -83,16 +81,11 @@ fun BoardTopView( ) if(!viewedTooltip){ if (isAddingUserEnabled) { - // datastore 조건 추가 StableImage( modifier = Modifier .align(Alignment.TopEnd) - .clickable( - interactionSource = MutableInteractionSource(), - indication = null, - onClick = onClickTooltip - ) - .padding(end = 43.dp,top = 56.dp) + .clickableWithoutRipple { onClickTooltip() } + .padding(top = 48.dp) .width(161.dp), drawableResId = R.drawable.img_tooltip_mission_invitation_code, contentScale = ContentScale.Crop @@ -101,20 +94,16 @@ fun BoardTopView( StableImage( modifier = Modifier .align(Alignment.TopStart) - .clickable( - interactionSource = MutableInteractionSource(), - indication = null, - onClick = onClickTooltip - ) - .padding(start = 8.dp, top = 56.dp) + .clickableWithoutRipple { + onClickTooltip() + } + .padding(start = 8.dp, top = 48.dp) .width(161.dp), drawableResId = R.drawable.img_tooltip_mission_detail, contentScale = ContentScale.Crop ) } } - - } } @@ -122,7 +111,6 @@ fun BoardTopView( fun BoardTopViewRightActionButtons( isAddingUserEnabled: Boolean, onClickAddUser: () -> Unit, - onClickSetting: () -> Unit, modifier: Modifier = Modifier ) { Row( @@ -141,15 +129,5 @@ fun BoardTopViewRightActionButtons( ) } } - IconButton( - onClick = onClickSetting, - modifier = Modifier.wrapContentSize() - ) { - Icon( - imageVector = ImageVector.vectorResource(id = com.goalpanzi.mission_mate.core.designsystem.R.drawable.ic_setting), - contentDescription = "", - tint = ColorGray1_FF404249 - ) - } } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardDetailViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardDetailViewModel.kt index eb5cc9bf..f7a310da 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardDetailViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardDetailViewModel.kt @@ -8,7 +8,7 @@ import com.goalpanzi.mission_mate.core.domain.common.DomainResult import com.goalpanzi.mission_mate.core.domain.mission.usecase.DeleteMissionUseCase import com.goalpanzi.mission_mate.core.domain.mission.usecase.GetMissionUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.GetCachedMemberIdUseCase -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel import com.goalpanzi.mission_mate.feature.board.model.MissionError import com.goalpanzi.mission_mate.feature.board.model.uimodel.MissionUiModel import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt index 062d74fa..d2f4b166 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt @@ -54,7 +54,6 @@ import kotlinx.coroutines.flow.collectLatest @Composable fun BoardFinishRoute( - onSettingClick: () -> Unit, onOkClick : () -> Unit, modifier: Modifier = Modifier, viewModel : BoardFinishViewModel = hiltViewModel() @@ -104,7 +103,6 @@ fun BoardFinishRoute( isLoading = isLoading, characterUiModel = userProfile?.characterType?.toCharacterUiModel(), onOkClick = viewModel::completeMission, - onSettingClick = onSettingClick ) } @@ -113,7 +111,6 @@ fun BoardFinishScreen( characterUiModel : CharacterUiModel?, rank : Int?, isLoading : Boolean, - onSettingClick: () -> Unit, onOkClick : () -> Unit, modifier: Modifier = Modifier ) { @@ -136,18 +133,6 @@ fun BoardFinishScreen( MissionMateTopAppBar( modifier = modifier, navigationType = NavigationType.NONE, - rightActionButtons = { - IconButton( - onClick = onSettingClick, - modifier = Modifier.wrapContentSize() - ) { - Icon( - imageVector = ImageVector.vectorResource(id = com.goalpanzi.mission_mate.core.designsystem.R.drawable.ic_setting), - contentDescription = "", - tint = ColorGray1_FF404249 - ) - } - }, containerColor = Color.Transparent ) BoardFinishCharacter( @@ -252,7 +237,6 @@ private fun PreviewBoardFinishScreen() { characterUiModel = null, rank = 10, isLoading = false, - onSettingClick = {}, onOkClick = {} ) diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt index 097dc60a..7e7fe575 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt @@ -10,7 +10,7 @@ import com.goalpanzi.mission_mate.core.domain.mission.usecase.CompleteMissionUse import com.goalpanzi.mission_mate.core.domain.mission.usecase.GetMissionRankUseCase import com.goalpanzi.mission_mate.core.domain.mission.usecase.SetMissionJoinedUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.ProfileUseCase -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt index 9b6ee2a8..c88b9c6c 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt @@ -62,7 +62,6 @@ fun BoardRoute( onNavigateOnboarding: () -> Unit, onNavigateDetail: (Long) -> Unit, onNavigateFinish : (Long) -> Unit, - onClickSetting: () -> Unit, onClickStory: (UserStory) -> Unit, onPreviewImage: (Long, Uri) -> Unit, modifier: Modifier = Modifier, @@ -206,7 +205,6 @@ fun BoardRoute( missionState = missionState, boardPieces = boardPieces, isHost = isHost, - onClickSetting = onClickSetting, onClickFlag = { viewModel.setViewedTooltip() onNavigateDetail(viewModel.missionId) @@ -249,7 +247,6 @@ fun BoardScreen( missionState: MissionState, boardPieces: List, isHost: Boolean, - onClickSetting: () -> Unit, onClickVerification: () -> Unit, onClickFlag: () -> Unit, onClickAddUser: () -> Unit, @@ -297,7 +294,6 @@ fun BoardScreen( missionState = missionState, onClickFlag = onClickFlag, onClickAddUser = onClickAddUser, - onClickSetting = onClickSetting, onClickTooltip = onClickTooltip, onClickStory = onClickStory ) diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt index dd2b7ff3..dcad510d 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt @@ -18,7 +18,7 @@ import com.goalpanzi.mission_mate.core.domain.setting.usecase.GetViewedTooltipUs import com.goalpanzi.mission_mate.core.domain.setting.usecase.SetViewedTooltipUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.GetCachedMemberIdUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.ProfileUseCase -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel import com.goalpanzi.mission_mate.feature.board.model.BoardPiece import com.goalpanzi.mission_mate.feature.board.model.MissionError import com.goalpanzi.mission_mate.feature.board.model.MissionState diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/VerificationPreviewViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/VerificationPreviewViewModel.kt index 47e1212b..21141480 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/VerificationPreviewViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/VerificationPreviewViewModel.kt @@ -8,7 +8,7 @@ import com.goalpanzi.mission_mate.core.domain.common.DomainResult import com.goalpanzi.mission_mate.core.domain.common.model.user.UserProfile import com.goalpanzi.mission_mate.core.domain.mission.usecase.VerifyMissionUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.ProfileUseCase -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel import com.goalpanzi.mission_mate.feature.board.model.CharacterUiModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow diff --git a/feature/history/.gitignore b/feature/history/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/feature/history/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/feature/history/build.gradle.kts b/feature/history/build.gradle.kts new file mode 100644 index 00000000..fdaa5885 --- /dev/null +++ b/feature/history/build.gradle.kts @@ -0,0 +1,21 @@ +import com.goalpanzi.mission_mate.convention.setNamespace + +plugins { + id("missionmate.android.feature") +} + +android { + setNamespace("feature.history") +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.bundles.lifecycle) + implementation(libs.bundles.coroutines) + testImplementation(libs.bundles.test) + androidTestImplementation(libs.bundles.android.test) + + implementation(libs.coil.compose) + +} diff --git a/feature/history/consumer-rules.pro b/feature/history/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/feature/history/proguard-rules.pro b/feature/history/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/feature/history/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/history/src/androidTest/java/com/goalpanzi/mission_mate/feature/history/ExampleInstrumentedTest.kt b/feature/history/src/androidTest/java/com/goalpanzi/mission_mate/feature/history/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..3ce524d0 --- /dev/null +++ b/feature/history/src/androidTest/java/com/goalpanzi/mission_mate/feature/history/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.goalpanzi.mission_mate.feature.history + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.goalpanzi.mission_mate.feature.history.test", appContext.packageName) + } +} diff --git a/feature/history/src/main/AndroidManifest.xml b/feature/history/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/feature/history/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/HistoryNavigation.kt b/feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/HistoryNavigation.kt new file mode 100644 index 00000000..5ee20309 --- /dev/null +++ b/feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/HistoryNavigation.kt @@ -0,0 +1,25 @@ +package com.goalpanzi.mission_mate.feature.history + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import androidx.navigation.navOptions +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.HistoryRouteModel +import com.goalpanzi.mission_mate.feature.history.screen.HistoryRoute + +fun NavController.navigateToHistory( + navOptions: NavOptions? = navOptions { + popUpTo(this@navigateToHistory.graph.id) { + inclusive = true + } + } +) { + this.navigate(HistoryRouteModel.History, navOptions = navOptions) +} + +fun NavGraphBuilder.historyNavGraph() { + composable { + HistoryRoute() + } +} diff --git a/feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/screen/HistoryScreen.kt b/feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/screen/HistoryScreen.kt new file mode 100644 index 00000000..56479c61 --- /dev/null +++ b/feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/screen/HistoryScreen.kt @@ -0,0 +1,33 @@ +package com.goalpanzi.mission_mate.feature.history.screen + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography + +@Composable +fun HistoryRoute( + modifier: Modifier = Modifier +) { + HistoryScreen( + modifier = modifier + ) +} + +@Composable +fun HistoryScreen( + modifier: Modifier = Modifier +) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ){ + Text( + text = "준비중입니다", + style = MissionMateTypography.body_md_bold + ) + } +} diff --git a/feature/history/src/test/java/com/goalpanzi/mission_mate/feature/history/ExampleUnitTest.kt b/feature/history/src/test/java/com/goalpanzi/mission_mate/feature/history/ExampleUnitTest.kt new file mode 100644 index 00000000..2197a1cb --- /dev/null +++ b/feature/history/src/test/java/com/goalpanzi/mission_mate/feature/history/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.goalpanzi.mission_mate.feature.history + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/feature/login/src/main/java/com/goalpanzi/mission_mate/feature/login/LoginNavigation.kt b/feature/login/src/main/java/com/goalpanzi/mission_mate/feature/login/LoginNavigation.kt index fd9d81cc..7984a7de 100644 --- a/feature/login/src/main/java/com/goalpanzi/mission_mate/feature/login/LoginNavigation.kt +++ b/feature/login/src/main/java/com/goalpanzi/mission_mate/feature/login/LoginNavigation.kt @@ -3,7 +3,7 @@ package com.goalpanzi.mission_mate.feature.login import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import com.goalpanzi.mission_mate.core.navigation.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel fun NavController.navigateToLogin() { this.navigate(RouteModel.Login) { diff --git a/feature/main/build.gradle.kts b/feature/main/build.gradle.kts index bf1dc338..4ed0c2f8 100644 --- a/feature/main/build.gradle.kts +++ b/feature/main/build.gradle.kts @@ -20,4 +20,5 @@ dependencies { implementation(project(":feature:profile")) implementation(project(":feature:board")) implementation(project(":feature:setting")) + implementation(project(":feature:history")) } diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainActivity.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainActivity.kt index 07873cba..e642256e 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainActivity.kt @@ -8,7 +8,7 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import com.goalpanzi.mission_mate.core.designsystem.theme.MissionmateTheme import com.goalpanzi.mission_mate.core.domain.auth.usecase.LoginUseCase -import com.goalpanzi.mission_mate.core.navigation.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import com.goalpanzi.mission_mate.feature.main.component.MainNavigator import com.goalpanzi.mission_mate.feature.main.component.rememberMainNavigator import dagger.hilt.android.AndroidEntryPoint @@ -23,7 +23,8 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge( - statusBarStyle = SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT) + statusBarStyle = SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT), + navigationBarStyle = SystemBarStyle.light(Color.WHITE, Color.WHITE) ) val isNewUser = loginUseCase.isNewUser() val user = loginUseCase.getCachedUserData() @@ -39,7 +40,7 @@ class MainActivity : ComponentActivity() { if (user == null) { RouteModel.Profile.Create } else { - RouteModel.MainTabRoute.MissionRouteModel.Onboarding() + RouteModel.MainTab() } } ) diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainScreen.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainScreen.kt index e1dd9436..66b71ff0 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainScreen.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel -import com.goalpanzi.mission_mate.core.navigation.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import com.goalpanzi.mission_mate.feature.main.component.MainNavHost import com.goalpanzi.mission_mate.feature.main.component.MainNavigator import com.goalpanzi.mission_mate.feature.main.component.rememberMainNavigator diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainViewModel.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainViewModel.kt index 6cccb655..6f78fe2a 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainViewModel.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/MainViewModel.kt @@ -1,13 +1,9 @@ package com.goalpanzi.mission_mate.feature.main import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import com.goalpanzi.mission_mate.core.navigation.NavigationEventHandler -import com.goalpanzi.mission_mate.core.navigation.RouteModel import com.goalpanzi.mission_mate.core.navigation.di.AuthNavigation import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainBottomNavigationBar.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainBottomNavigationBar.kt new file mode 100644 index 00000000..1dc70fcf --- /dev/null +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainBottomNavigationBar.kt @@ -0,0 +1,140 @@ +package com.goalpanzi.mission_mate.feature.main.component + +import android.app.Activity +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavDestination +import com.goalpanzi.mission_mate.core.designsystem.ext.clickableWithoutRipple +import com.goalpanzi.mission_mate.core.designsystem.ext.dpToSp +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray4_FFE5E5E5 +import com.goalpanzi.mission_mate.core.designsystem.theme.ColorOrange_FFFF5732 +import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute +import com.goalpanzi.mission_mate.feature.main.R + +internal const val MAIN_BOTTOM_NAVIGATION_BAR_HEIGHT = 48 + +enum class MainTab( + val routeModel: RouteModel, + @StringRes val labelRes: Int, + @DrawableRes val iconRes: Int +) { + MISSION( + routeModel = MainTabRoute.MissionRouteModel.Onboarding(), + labelRes = R.string.main_tab_onboarding, + iconRes = com.goalpanzi.mission_mate.core.designsystem.R.drawable.ic_flag + ), + HISTORY( + routeModel = MainTabRoute.HistoryRouteModel.History, + labelRes = R.string.main_tab_history, + iconRes = com.goalpanzi.mission_mate.core.designsystem.R.drawable.ic_time + ), + SETTING( + routeModel = MainTabRoute.SettingRouteModel.Setting, + labelRes = R.string.main_tab_setting, + iconRes = com.goalpanzi.mission_mate.core.designsystem.R.drawable.ic_setting + ); + + fun isSelected(destination: NavDestination?) : Boolean { + val currentDestinationRoute = destination?.route ?: return false + return containsWithRoute(currentDestinationRoute) + } + + private fun containsWithRoute(route: String) : Boolean { + val path = when(this){ + MISSION -> MainTabRoute.MissionRouteModel::class.qualifiedName + HISTORY -> MainTabRoute.HistoryRouteModel::class.qualifiedName + SETTING -> MainTabRoute.SettingRouteModel::class.qualifiedName + } ?: return false + return route.contains(path) + } +} + +@Composable +fun MainBottomNavigationBar( + currentDestination: NavDestination?, + onTabClick : (MainTab) -> Unit, + modifier: Modifier = Modifier +) { + val context = LocalContext.current + Surface( + modifier = modifier.height(MAIN_BOTTOM_NAVIGATION_BAR_HEIGHT.dp), + color = Color((context as Activity).window.navigationBarColor) + ) { + HorizontalDivider( + thickness = 0.5.dp, + color = ColorGray4_FFE5E5E5 + ) + Row { + MainTab.entries.forEach { mainTab -> + val selected = mainTab.isSelected(currentDestination) + MainBottomNavigationBarItem( + modifier = Modifier.weight(1f), + icon = { + Icon( + modifier = Modifier.height(24.dp), + imageVector = ImageVector.vectorResource(mainTab.iconRes), + contentDescription = mainTab.name, + tint = if(selected) ColorOrange_FFFF5732 else ColorGray1_FF404249 + ) + }, + label = { + Text( + text = stringResource(mainTab.labelRes), + style = MissionMateTypography.tab_regular.copy( + fontSize = dpToSp(11.dp) + ), + color = if(selected) ColorOrange_FFFF5732 else ColorGray1_FF404249 + ) + }, + onClick = { + onTabClick(mainTab) + } + ) + } + } + } +} + +@Composable +fun MainBottomNavigationBarItem( + icon: @Composable () -> Unit, + label : @Composable () -> Unit, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier + .fillMaxSize() + .clickableWithoutRipple { + onClick() + }, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + icon() + label() + } +} + diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavHost.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavHost.kt index 5895d885..d5eeda6c 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavHost.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavHost.kt @@ -11,26 +11,28 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.toRoute import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF import com.goalpanzi.mission_mate.core.designsystem.util.isLightStatusBars import com.goalpanzi.mission_mate.core.designsystem.util.setStatusBar -import com.goalpanzi.mission_mate.core.navigation.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.MainTabDataModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import com.goalpanzi.mission_mate.feature.board.boardDetailNavGraph import com.goalpanzi.mission_mate.feature.board.boardFinishNavGraph -import com.goalpanzi.mission_mate.feature.board.boardNavGraph import com.goalpanzi.mission_mate.feature.board.userStoryNavGraph import com.goalpanzi.mission_mate.feature.board.verificationPreviewNavGraph import com.goalpanzi.mission_mate.feature.login.loginNavGraph import com.goalpanzi.mission_mate.feature.main.ext.isDarkStatusBarScreen +import com.goalpanzi.mission_mate.core.navigation.model.MainTabDataModelType import com.goalpanzi.mission_mate.feature.onboarding.boardSetupNavGraph import com.goalpanzi.mission_mate.feature.onboarding.boardSetupSuccessNavGraph import com.goalpanzi.mission_mate.feature.onboarding.invitationCodeNavGraph -import com.goalpanzi.mission_mate.feature.onboarding.onboardingNavGraph import com.goalpanzi.mission_mate.feature.profile.profileNavGraph import com.goalpanzi.mission_mate.feature.setting.navigation.privacyPolicyNavGraph import com.goalpanzi.mission_mate.feature.setting.navigation.servicePolicyNavGraph -import com.goalpanzi.mission_mate.feature.setting.navigation.settingNavGraph +import kotlin.reflect.typeOf @Composable internal fun MainNavHost( @@ -46,7 +48,7 @@ internal fun MainNavHost( LaunchedEffect(currentRoute) { if (currentRoute.isDarkStatusBarScreen()) { setStatusBar(context, false) - } else if(!isLightStatusBars(context as Activity)){ + } else if (!isLightStatusBars(context as Activity)) { setStatusBar(context, true) } } @@ -61,15 +63,10 @@ internal fun MainNavHost( startDestination = startDestination ) { loginNavGraph( - onLoginSuccess = { if (it) navigator.navigationToOnboarding() else navigator.navigateToProfileCreate() } - ) - onboardingNavGraph( - onClickBoardSetup = { navigator.navigationToBoardSetup() }, - onClickInvitationCode = { navigator.navigationToInvitationCode() }, - onNavigateMissionBoard = { missionId -> - navigator.navigationToBoard(missionId) - }, - onClickSetting = { navigator.navigationToSetting() } + onLoginSuccess = { + if (it) navigator.navigationToMainTab(MainTabDataModel.Mission()) + else navigator.navigateToProfileCreate() + } ) boardSetupNavGraph( onSuccess = { @@ -81,7 +78,7 @@ internal fun MainNavHost( ) boardSetupSuccessNavGraph( onClickStart = { - navigator.navigationToOnboarding() + navigator.navigationToMainTab() } ) invitationCodeNavGraph( @@ -89,60 +86,32 @@ internal fun MainNavHost( navigator.popBackStack() }, onNavigateMissionBoard = { missionId -> - navigator.navigationToBoard(missionId) + navigator.navigationToMainTab() } ) profileNavGraph( - onSaveSuccess = { navigator.navigationToOnboarding(isAfterProfileCreate = true) }, + onSaveSuccess = { + navigator.navigationToMainTab(MainTabDataModel.Mission(true)) + }, onBackClick = { navigator.popBackStack() } ) - settingNavGraph( - onBackClick = { navigator.popBackStack() }, - onClickProfileSetting = { navigator.navigateToProfileSetting() }, - onClickServicePolicy = { navigator.navigationToServicePolicy() }, - onClickPrivacyPolicy = { navigator.navigationToPrivacyPolicy() }, - onClickLogout = { navigator.navigateToLogin() } - ) servicePolicyNavGraph( onBackClick = { navigator.popBackStack() } ) privacyPolicyNavGraph( onBackClick = { navigator.popBackStack() } ) - boardNavGraph( - onNavigateOnboarding = { - navigator.navigationToOnboarding() - }, - onNavigateDetail = { missionId -> - navigator.navigationToBoardDetail(missionId) - }, - onNavigateFinish = { missionId -> - navigator.navigateToBoardFinish(missionId) - }, - onClickSetting = { - navigator.navigationToSetting() - }, - onNavigateStory = { userStory -> - navigator.navigationToUserStory(userStory) - }, - onNavigateToPreview = { missionId, imageUrl -> - navigator.navigationToVerificationPreview(missionId, imageUrl) - } - ) boardDetailNavGraph( onNavigateOnboarding = { - navigator.navigationToOnboarding() + navigator.navigationToMainTab() }, onBackClick = { navigator.popBackStack() } ) boardFinishNavGraph( - onClickSetting = { - navigator.navigationToSetting() - }, onClickOk = { - navigator.navigationToOnboarding() + navigator.navigationToMainTab() } ) userStoryNavGraph( @@ -158,6 +127,15 @@ internal fun MainNavHost( navigator.popBackStack() } ) + + composable( + typeMap = mapOf(typeOf() to MainTabDataModelType) + ) { backStackEntry -> + MainTabContent( + navigator = navigator, + mainTabDataModel = backStackEntry.toRoute().mainTabDataModel + ) + } } } } diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavigator.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavigator.kt index c4a55691..d86c2531 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavigator.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainNavigator.kt @@ -6,8 +6,9 @@ import androidx.compose.runtime.remember import androidx.lifecycle.Lifecycle import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController +import com.goalpanzi.mission_mate.core.navigation.model.MainTabDataModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel import com.goalpanzi.mission_mate.feature.board.model.UserStory -import com.goalpanzi.mission_mate.feature.board.navigateToBoard import com.goalpanzi.mission_mate.feature.board.navigateToBoardDetail import com.goalpanzi.mission_mate.feature.board.navigateToBoardFinish import com.goalpanzi.mission_mate.feature.board.navigateToUserStory @@ -16,12 +17,10 @@ import com.goalpanzi.mission_mate.feature.login.navigateToLogin import com.goalpanzi.mission_mate.feature.onboarding.navigateToBoardSetup import com.goalpanzi.mission_mate.feature.onboarding.navigateToBoardSetupSuccess import com.goalpanzi.mission_mate.feature.onboarding.navigateToInvitationCode -import com.goalpanzi.mission_mate.feature.onboarding.navigateToOnboarding import com.goalpanzi.mission_mate.feature.profile.navigateToProfileCreate import com.goalpanzi.mission_mate.feature.profile.navigateToProfileSetting import com.goalpanzi.mission_mate.feature.setting.navigation.navigateToPrivacyPolicy import com.goalpanzi.mission_mate.feature.setting.navigation.navigateToServicePolicy -import com.goalpanzi.mission_mate.feature.setting.navigation.navigateToSetting class MainNavigator( val navController: NavHostController @@ -45,10 +44,19 @@ class MainNavigator( navController.navigateToProfileSetting() } - fun navigationToOnboarding(isAfterProfileCreate: Boolean = false) { - navController.navigateToOnboarding(isAfterProfileCreate) + fun navigationToMainTab( + mainTabDataModel: MainTabDataModel = MainTabDataModel.Mission() + ) { + navController.navigate( + route = RouteModel.MainTab(mainTabDataModel) + ){ + popUpTo(navController.graph.id) { + inclusive = true + } + } } + fun navigationToBoardSetup() { navController.navigateToBoardSetup() } @@ -61,10 +69,6 @@ class MainNavigator( navController.navigateToInvitationCode() } - fun navigationToSetting() { - navController.navigateToSetting() - } - fun navigationToServicePolicy() { navController.navigateToServicePolicy() } @@ -73,10 +77,6 @@ class MainNavigator( navController.navigateToPrivacyPolicy() } - fun navigationToBoard(missionId : Long) { - navController.navigateToBoard(missionId) - } - fun navigationToBoardDetail(missionId : Long) { navController.navigateToBoardDetail(missionId) } diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabContent.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabContent.kt new file mode 100644 index 00000000..0452b0e8 --- /dev/null +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabContent.kt @@ -0,0 +1,82 @@ +package com.goalpanzi.mission_mate.feature.main.component + +import android.util.Log +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.goalpanzi.mission_mate.core.navigation.model.MainTabDataModel + +@Composable +fun MainTabContent( + navigator: MainNavigator, + mainTabDataModel: MainTabDataModel, + modifier: Modifier = Modifier, + mainTabNavigator: MainTabNavigator = rememberMainTabNavigator() +) { + + val backStackEntryState = + mainTabNavigator.navController.currentBackStackEntryFlow.collectAsState(initial = null) + val navigationBottomPadding = + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + + LaunchedEffect(mainTabDataModel) { + when (mainTabDataModel) { + is MainTabDataModel.Mission -> { + mainTabNavigator.navigationToOnboarding( + mainTabDataModel.isAfterProfileCreate + ) + } + + MainTabDataModel.History -> { + mainTabNavigator.navigationToHistory() + } + + MainTabDataModel.Setting -> { + mainTabNavigator.navigationToSetting() + } + + MainTabDataModel.None -> { + return@LaunchedEffect + } + } + } + + Scaffold( + modifier = modifier.padding(bottom = navigationBottomPadding), + bottomBar = { + MainBottomNavigationBar( + modifier = Modifier.height(MAIN_BOTTOM_NAVIGATION_BAR_HEIGHT.dp), + currentDestination = backStackEntryState.value?.destination, + onTabClick = { mainTab -> + when (mainTab) { + MainTab.MISSION -> { + mainTabNavigator.navigationToOnboarding() + } + + MainTab.HISTORY -> { + mainTabNavigator.navigationToHistory() + } + + MainTab.SETTING -> { + mainTabNavigator.navigationToSetting() + } + } + } + ) + }, + content = { padding -> + MainTabNavHost( + mainNavigator = navigator, + mainTabNavigator = mainTabNavigator + ) + } + ) +} diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabNavHost.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabNavHost.kt new file mode 100644 index 00000000..7e083cdb --- /dev/null +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabNavHost.kt @@ -0,0 +1,57 @@ +package com.goalpanzi.mission_mate.feature.main.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.compose.NavHost +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.feature.board.boardNavGraph +import com.goalpanzi.mission_mate.feature.history.historyNavGraph +import com.goalpanzi.mission_mate.feature.onboarding.onboardingNavGraph +import com.goalpanzi.mission_mate.feature.setting.navigation.settingNavGraph + +@Composable +fun MainTabNavHost( + mainNavigator: MainNavigator, + mainTabNavigator : MainTabNavigator, + modifier: Modifier = Modifier +) { + + NavHost( + modifier = modifier, + navController = mainTabNavigator.navController, + startDestination = MissionRouteModel.Onboarding() + ){ + onboardingNavGraph( + onClickBoardSetup = { mainNavigator.navigationToBoardSetup() }, + onClickInvitationCode = { mainNavigator.navigationToInvitationCode() }, + onNavigateMissionBoard = { missionId -> + mainTabNavigator.navigationToBoard(missionId) + }, + ) + settingNavGraph( + onBackClick = { mainNavigator.popBackStack() }, + onClickProfileSetting = { mainNavigator.navigateToProfileSetting() }, + onClickServicePolicy = { mainNavigator.navigationToServicePolicy() }, + onClickPrivacyPolicy = { mainNavigator.navigationToPrivacyPolicy() }, + onClickLogout = { mainNavigator.navigateToLogin() } + ) + boardNavGraph( + onNavigateOnboarding = { + mainTabNavigator.navigationToOnboarding() + }, + onNavigateDetail = { missionId -> + mainNavigator.navigationToBoardDetail(missionId) + }, + onNavigateFinish = { missionId -> + mainNavigator.navigateToBoardFinish(missionId) + }, + onNavigateStory = { userStory -> + mainNavigator.navigationToUserStory(userStory) + }, + onNavigateToPreview = { missionId, imageUrl -> + mainNavigator.navigationToVerificationPreview(missionId, imageUrl) + } + ) + historyNavGraph() + } +} diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabNavigator.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabNavigator.kt new file mode 100644 index 00000000..77aa6de4 --- /dev/null +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/component/MainTabNavigator.kt @@ -0,0 +1,37 @@ +package com.goalpanzi.mission_mate.feature.main.component + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import com.goalpanzi.mission_mate.feature.board.navigateToBoard +import com.goalpanzi.mission_mate.feature.history.navigateToHistory +import com.goalpanzi.mission_mate.feature.onboarding.navigateToOnboarding +import com.goalpanzi.mission_mate.feature.setting.navigation.navigateToSetting + +class MainTabNavigator( + val navController: NavHostController +) { + fun navigationToOnboarding(isAfterProfileCreate: Boolean = false) { + navController.navigateToOnboarding(isAfterProfileCreate) + } + + fun navigationToHistory() { + navController.navigateToHistory() + } + + fun navigationToSetting() { + navController.navigateToSetting() + } + fun navigationToBoard(missionId : Long) { + navController.navigateToBoard(missionId) + } +} + +@Composable +internal fun rememberMainTabNavigator( + navController: NavHostController = rememberNavController() +) : MainTabNavigator = remember(navController) { + MainTabNavigator(navController) +} + diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/ext/NavDestination.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/ext/NavDestination.kt index 449e387a..6c7c0c78 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/ext/NavDestination.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/feature/main/ext/NavDestination.kt @@ -1,8 +1,8 @@ package com.goalpanzi.mission_mate.feature.main.ext import androidx.navigation.NavDestination -import com.goalpanzi.mission_mate.core.navigation.RouteModel -import com.goalpanzi.mission_mate.core.navigation.fullPathName +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.fullPathName fun NavDestination?.compareTo(routeModel: RouteModel) : Boolean { return this?.route == routeModel.fullPathName() diff --git a/feature/main/src/main/res/values/strings.xml b/feature/main/src/main/res/values/strings.xml new file mode 100644 index 00000000..a22ecc5b --- /dev/null +++ b/feature/main/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + + 진행미션 + 내기록 + 설정 + diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/OnboardingNavigation.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/OnboardingNavigation.kt index 5b643102..dd207871 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/OnboardingNavigation.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/OnboardingNavigation.kt @@ -4,7 +4,9 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.ui.util.slideInFromEnd +import com.goalpanzi.mission_mate.core.ui.util.slideOutToEnd import com.goalpanzi.mission_mate.feature.onboarding.screen.OnboardingRoute import com.goalpanzi.mission_mate.feature.onboarding.screen.boardsetup.BoardSetupRoute import com.goalpanzi.mission_mate.feature.onboarding.screen.boardsetup.BoardSetupSuccessScreen @@ -24,14 +26,12 @@ fun NavController.navigateToOnboarding( fun NavGraphBuilder.onboardingNavGraph( onClickBoardSetup: () -> Unit, onClickInvitationCode: () -> Unit, - onClickSetting: () -> Unit, onNavigateMissionBoard: (Long) -> Unit ) { composable { OnboardingRoute( onClickBoardSetup = onClickBoardSetup, onClickInvitationCode = onClickInvitationCode, - onClickSetting = onClickSetting, onNavigateMissionBoard = onNavigateMissionBoard ) } @@ -59,7 +59,14 @@ fun NavGraphBuilder.boardSetupNavGraph( onSuccess: () -> Unit, onBackClick: () -> Unit ) { - composable { + composable( + enterTransition = { + slideInFromEnd() + }, + popExitTransition = { + slideOutToEnd() + } + ) { BoardSetupRoute( onSuccess = onSuccess, onBackClick = onBackClick @@ -81,7 +88,14 @@ fun NavGraphBuilder.invitationCodeNavGraph( onBackClick: () -> Unit, onNavigateMissionBoard: (Long) -> Unit, ) { - composable { + composable( + enterTransition = { + slideInFromEnd() + }, + popExitTransition = { + slideOutToEnd() + } + ) { InvitationCodeRoute( onBackClick = onBackClick, onNavigateMissionBoard = onNavigateMissionBoard diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt index 653bd782..ce7672d2 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt @@ -66,7 +66,6 @@ fun OnboardingRoute( modifier: Modifier = Modifier, onClickBoardSetup: () -> Unit, onClickInvitationCode: () -> Unit, - onClickSetting: () -> Unit, onNavigateMissionBoard: (Long) -> Unit, viewModel: OnboardingViewModel = hiltViewModel() ) { @@ -112,7 +111,6 @@ fun OnboardingRoute( modifier = modifier.fillMaxSize(), onClickBoardSetup = onClickBoardSetup, onClickInvitationCode = onClickInvitationCode, - onClickSetting = onClickSetting ) profileCreateSuccessData?.let { @@ -131,7 +129,6 @@ fun OnboardingScreen( onboardingUiModel: OnboardingUiModel, onClickBoardSetup: () -> Unit, onClickInvitationCode: () -> Unit, - onClickSetting: () -> Unit, modifier: Modifier = Modifier, ) { Box( @@ -157,11 +154,6 @@ fun OnboardingScreen( modifier = modifier, navigationType = NavigationType.NONE, containerColor = Color.Transparent, - rightActionButtons = { - TopBarSetting( - onClick = { onClickSetting() } - ) - } ) Text( modifier = Modifier.padding(bottom = 52.dp), @@ -242,22 +234,6 @@ fun OnboardingScreen( } } -@Composable -fun TopBarSetting( - onClick: () -> Unit -) { - IconButton( - onClick = onClick, - modifier = Modifier.wrapContentSize() - ) { - Icon( - imageVector = ImageVector.vectorResource(id = designSystemResource.drawable.ic_setting), - contentDescription = "", - tint = ColorGray1_FF404249 - ) - } -} - @Composable fun ProfileCreateSuccessDialog( nickname: String, @@ -341,7 +317,6 @@ fun OnboardingScreenPreview() { ), onClickBoardSetup = {}, onClickInvitationCode = {}, - onClickSetting = {} ) } diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingViewModel.kt index 5d600fca..92ecf322 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingViewModel.kt @@ -12,7 +12,7 @@ import com.goalpanzi.mission_mate.core.domain.onboarding.usecase.GetJoinedMissio import com.goalpanzi.mission_mate.core.domain.user.usecase.GetFcmTokenUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.ProfileUseCase import com.goalpanzi.mission_mate.core.domain.user.usecase.UpdateFcmTokenUseCase -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.MissionRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.MissionRouteModel import com.goalpanzi.mission_mate.feature.onboarding.model.OnboardingResultEvent import com.goalpanzi.mission_mate.feature.onboarding.model.OnboardingUiModel import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/profile/src/main/java/com/goalpanzi/mission_mate/feature/profile/ProfileNavigation.kt b/feature/profile/src/main/java/com/goalpanzi/mission_mate/feature/profile/ProfileNavigation.kt index 71993395..824ae179 100644 --- a/feature/profile/src/main/java/com/goalpanzi/mission_mate/feature/profile/ProfileNavigation.kt +++ b/feature/profile/src/main/java/com/goalpanzi/mission_mate/feature/profile/ProfileNavigation.kt @@ -1,11 +1,11 @@ package com.goalpanzi.mission_mate.feature.profile -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.core.tween import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import com.goalpanzi.mission_mate.core.navigation.RouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel +import com.goalpanzi.mission_mate.core.ui.util.slideInFromEnd +import com.goalpanzi.mission_mate.core.ui.util.slideOutToEnd enum class ProfileSettingType { CREATE, SETTING @@ -25,10 +25,10 @@ fun NavGraphBuilder.profileNavGraph( ) { composable( enterTransition = { - slideIntoContainer( - towards = AnimatedContentTransitionScope.SlideDirection.Left, - animationSpec = tween(300) - ) + slideInFromEnd() + }, + popExitTransition = { + slideOutToEnd() } ) { ProfileRoute( @@ -36,7 +36,14 @@ fun NavGraphBuilder.profileNavGraph( onSaveSuccess = onSaveSuccess ) } - composable { + composable ( + enterTransition = { + slideInFromEnd() + }, + popExitTransition = { + slideOutToEnd() + } + ){ ProfileRoute( profileSettingType = ProfileSettingType.SETTING, onSaveSuccess = onBackClick, diff --git a/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/navigation/SettingNavigation.kt b/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/navigation/SettingNavigation.kt index c534dcf9..4bd76229 100644 --- a/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/navigation/SettingNavigation.kt +++ b/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/navigation/SettingNavigation.kt @@ -1,16 +1,22 @@ package com.goalpanzi.mission_mate.feature.setting.navigation -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.core.tween import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions import androidx.navigation.compose.composable -import com.goalpanzi.mission_mate.core.navigation.RouteModel.MainTabRoute.SettingRouteModel +import com.goalpanzi.mission_mate.core.navigation.model.RouteModel.MainTabRoute.SettingRouteModel +import com.goalpanzi.mission_mate.core.ui.util.slideInFromEnd import com.goalpanzi.mission_mate.feature.setting.screen.SettingRoute import com.goalpanzi.mission_mate.feature.setting.screen.WebViewScreen -fun NavController.navigateToSetting() { - this.navigate(SettingRouteModel.Setting) +fun NavController.navigateToSetting( + navOptions: NavOptions? = androidx.navigation.navOptions { + popUpTo(this@navigateToSetting.graph.id) { + inclusive = true + } + } +) { + this.navigate(SettingRouteModel.Setting,navOptions = navOptions) } fun NavController.navigateToServicePolicy() { @@ -28,15 +34,7 @@ fun NavGraphBuilder.settingNavGraph( onClickPrivacyPolicy: () -> Unit, onClickLogout: () -> Unit ) { - composable( - enterTransition = { - slideIntoContainer( - towards = AnimatedContentTransitionScope.SlideDirection.Start, - animationSpec = tween(300) - ) - }, - popEnterTransition = null, - ) { + composable { SettingRoute( onBackClick = onBackClick, onClickProfileSetting = onClickProfileSetting, @@ -51,7 +49,12 @@ fun NavGraphBuilder.settingNavGraph( fun NavGraphBuilder.servicePolicyNavGraph( onBackClick: () -> Unit ) { - composable { + composable( + enterTransition = { + slideInFromEnd() + }, + popEnterTransition = null, + ) { WebViewScreen( onBackClick = onBackClick, url = "https://missionmate.notion.site/f638866edeaf45b58ef63d1000f30c15?pvs=73" @@ -62,7 +65,12 @@ fun NavGraphBuilder.servicePolicyNavGraph( fun NavGraphBuilder.privacyPolicyNavGraph( onBackClick: () -> Unit ) { - composable { + composable( + enterTransition = { + slideInFromEnd() + }, + popEnterTransition = null, + ) { WebViewScreen( onBackClick = onBackClick, url = "https://missionmate.notion.site/c79e9e6990de466490c584f351b364b7?pvs=4" diff --git a/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/screen/SettingScreen.kt b/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/screen/SettingScreen.kt index 8eb93815..5884d3b1 100644 --- a/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/screen/SettingScreen.kt +++ b/feature/setting/src/main/java/com/goalpanzi/mission_mate/feature/setting/screen/SettingScreen.kt @@ -118,17 +118,11 @@ fun SettingScreen( .statusBarsPadding() .navigationBarsPadding() ) { - MissionMateTopAppBar( - navigationType = NavigationType.BACK, - onNavigationClick = { onBackClick() }, - containerColor = ColorWhite_FFFFFFFF - ) Text( text = stringResource(id = R.string.setting_title), modifier = Modifier .wrapContentWidth() - .wrapContentHeight() - .padding(start = 24.dp, bottom = 16.dp), + .padding(start = 24.dp,top = 20.dp, bottom = 10.dp), style = MissionMateTypography.heading_sm_bold, color = ColorGray1_FF404249 ) diff --git a/settings.gradle.kts b/settings.gradle.kts index f3e55deb..29508074 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -51,3 +51,4 @@ include(":core:domain:setting") include(":core:ui") include(":core:push") include(":core:notification") +include(":feature:history")