diff --git a/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/bottombar/BottomBar.kt b/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/bottombar/BottomBar.kt index 0f6aa61c..e8d5ebb1 100644 --- a/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/bottombar/BottomBar.kt +++ b/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/bottombar/BottomBar.kt @@ -1,5 +1,12 @@ package co.kr.tnt.designsystem.component.bottombar +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideIn +import androidx.compose.animation.slideOut +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -13,6 +20,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import co.kr.tnt.core.designsystem.R @@ -22,25 +30,32 @@ import co.kr.tnt.designsystem.theme.TnTTheme fun TnTBottomBar( bottomTabs: List, currentTab: Tab?, + isVisible: Boolean, onClickTab: (tab: Tab) -> Unit, modifier: Modifier = Modifier, ) { - Row(modifier = modifier) { - bottomTabs.forEach { tab -> - Button( - onClick = { onClickTab(tab) }, - modifier = Modifier.weight(1f), - colors = ButtonColors( - containerColor = TnTTheme.colors.commonColors.Common0, - contentColor = TnTTheme.colors.commonColors.Common0, - disabledContainerColor = TnTTheme.colors.commonColors.Common0, - disabledContentColor = TnTTheme.colors.commonColors.Common0, - ), - ) { - TnTBottomTab( - bottomTab = tab, - isSelected = currentTab == tab, - ) + AnimatedVisibility( + visible = isVisible, + enter = fadeIn(animationSpec = tween(700)) + slideIn { IntOffset(0, it.height) }, + exit = fadeOut(animationSpec = tween(700)) + slideOut { IntOffset(0, it.height) }, + ) { + Row(modifier = modifier.background(TnTTheme.colors.commonColors.Common0)) { + bottomTabs.forEach { tab -> + Button( + onClick = { onClickTab(tab) }, + modifier = Modifier.weight(1f), + colors = ButtonColors( + containerColor = TnTTheme.colors.commonColors.Common0, + contentColor = TnTTheme.colors.commonColors.Common0, + disabledContainerColor = TnTTheme.colors.commonColors.Common0, + disabledContentColor = TnTTheme.colors.commonColors.Common0, + ), + ) { + TnTBottomTab( + bottomTab = tab, + isSelected = currentTab == tab, + ) + } } } } @@ -103,6 +118,7 @@ private fun TnTBottomBarPreview() { TnTBottomBar( bottomTabs = tabs, currentTab = home, + isVisible = true, onClickTab = { }, ) } diff --git a/feature/roleselect/src/main/java/co/kr/tnt/roleselect/RoleSelectionScreen.kt b/feature/roleselect/src/main/java/co/kr/tnt/roleselect/RoleSelectionScreen.kt index 0eaec425..1f3d3856 100644 --- a/feature/roleselect/src/main/java/co/kr/tnt/roleselect/RoleSelectionScreen.kt +++ b/feature/roleselect/src/main/java/co/kr/tnt/roleselect/RoleSelectionScreen.kt @@ -1,7 +1,6 @@ package co.kr.tnt.roleselect import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -61,12 +60,14 @@ fun RoleSelectionScreen( ) { var selectedRole by remember { mutableStateOf(RoleState.fromDomain(UserType.TRAINER)) } - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Scaffold( + modifier = Modifier.fillMaxSize(), + containerColor = TnTTheme.colors.commonColors.Common0, + ) { innerPadding -> Column( modifier = Modifier .fillMaxSize() - .padding(innerPadding) - .background(TnTTheme.colors.commonColors.Common0), + .padding(innerPadding), verticalArrangement = Arrangement.SpaceBetween, ) { Column(modifier = Modifier.padding(start = 24.dp, top = 60.dp)) { diff --git a/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/TraineeHomeScreen.kt b/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/TraineeHomeScreen.kt index a1e5dcc4..a67072dc 100644 --- a/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/TraineeHomeScreen.kt +++ b/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/TraineeHomeScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -78,6 +79,7 @@ import java.time.YearMonth @Composable internal fun TraineeHomeRoute( viewModel: TraineeHomeViewModel = hiltViewModel(), + padding: PaddingValues, navigateToNotification: () -> Unit, navigateToExerciseRecord: () -> Unit, navigateToMealRecord: () -> Unit, @@ -92,6 +94,7 @@ internal fun TraineeHomeRoute( TraineeHomeScreen( state = uiState, + padding = padding, context = context, onClickNotification = navigateToNotification, onChangeVisibleMonth = { yearMonth -> @@ -147,6 +150,7 @@ internal fun TraineeHomeRoute( @Composable private fun TraineeHomeScreen( state: TraineeHomeUiState, + padding: PaddingValues, context: Context, onClickNotification: () -> Unit, onChangeVisibleMonth: (YearMonth) -> Unit, @@ -168,6 +172,7 @@ private fun TraineeHomeScreen( Box( modifier = Modifier + .padding(padding) .fillMaxSize() .background(TnTTheme.colors.neutralColors.Neutral100), ) { @@ -509,6 +514,7 @@ private fun TraineeHomeScreenPreview() { TnTTheme { TraineeHomeScreen( state = dummyUiState, + padding = PaddingValues(), context = LocalContext.current, onClickNotification = { }, onClickDay = { }, diff --git a/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/navigation/TraineeHomeNavigation.kt b/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/navigation/TraineeHomeNavigation.kt index 7c7fc8a1..cacd01fb 100644 --- a/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/navigation/TraineeHomeNavigation.kt +++ b/feature/trainee/home/src/main/java/co/kr/tnt/trainee/home/navigation/TraineeHomeNavigation.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainee.home.navigation +import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder @@ -16,6 +17,7 @@ fun NavController.navigateToTraineeHome( ) fun NavGraphBuilder.traineeHomeNavGraph( + padding: PaddingValues, navigateToNotification: () -> Unit, navigateToMealRecord: () -> Unit, navigateToMealDetail: (id: Long) -> Unit, @@ -24,6 +26,7 @@ fun NavGraphBuilder.traineeHomeNavGraph( navigation(startDestination = Route.TraineeHome) { composable { TraineeHomeRoute( + padding = padding, navigateToNotification = navigateToNotification, navigateToExerciseRecord = { /* TODO */ }, navigateToMealRecord = navigateToMealRecord, diff --git a/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainScreen.kt b/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainScreen.kt index 94a5fed5..22922454 100644 --- a/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainScreen.kt +++ b/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainScreen.kt @@ -50,25 +50,24 @@ private fun TraineeMainScreen( val navController = state.navController Scaffold( - containerColor = TnTTheme.colors.commonColors.Common0, + containerColor = state.currentMainTab?.containerColor?.invoke() ?: TnTTheme.colors.commonColors.Common0, modifier = Modifier.fillMaxSize(), bottomBar = { - if (state.shouldShowBottomBar) { - TnTBottomBar( - modifier = Modifier.navigationBarsPadding(), - bottomTabs = state.mainTabs, - currentTab = state.currentMainTab, - onClickTab = state::navigateMainTab, - ) - } + TnTBottomBar( + modifier = Modifier.navigationBarsPadding(), + bottomTabs = state.mainTabs, + isVisible = state.shouldShowBottomBar, + currentTab = state.currentMainTab, + onClickTab = state::navigateMainTab, + ) }, ) { innerPadding -> NavHost( - modifier = Modifier.padding(innerPadding), navController = navController, startDestination = state.startDestination, ) { traineeHomeNavGraph( + padding = innerPadding, navigateToNotification = navController::navigateToTraineeNotification, navigateToMealRecord = navigateToMealRecord, navigateToMealDetail = navigateToMealDetail, @@ -78,6 +77,7 @@ private fun TraineeMainScreen( ) } traineeMyPageNavGraph( + padding = innerPadding, navigateToLogin = navigateToLogin, navigateToWebView = navigateToWebView, navigateToTraineeConnect = navigateToConnect, diff --git a/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainTab.kt b/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainTab.kt index 9de50c3e..189a8354 100644 --- a/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainTab.kt +++ b/feature/trainee/main/src/main/java/co/kr/tnt/trainee/main/TraineeMainTab.kt @@ -1,24 +1,30 @@ package co.kr.tnt.trainee.main +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color import co.kr.tnt.core.designsystem.R import co.kr.tnt.designsystem.component.bottombar.BottomTab +import co.kr.tnt.designsystem.theme.TnTTheme import co.kr.tnt.navigation.Route internal enum class TraineeMainTab( override val contentDescription: String, override val icon: Int, + val containerColor: @Composable () -> Color, val baseRoute: Route.TraineeMainTab, val route: Route, ) : BottomTab { HOME( contentDescription = "홈", icon = R.drawable.ic_navbar_home, + containerColor = { TnTTheme.colors.commonColors.Common0 }, baseRoute = Route.TraineeMainTab.Home, route = Route.TraineeHome, ), MY_PAGE( contentDescription = "내 정보", icon = R.drawable.ic_navbar_mypage, + containerColor = { TnTTheme.colors.neutralColors.Neutral50 }, baseRoute = Route.TraineeMainTab.MyPage, route = Route.TraineeMyPage, ), diff --git a/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/TraineeMyPageScreen.kt b/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/TraineeMyPageScreen.kt index ec1fb903..5f8a3fff 100644 --- a/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/TraineeMyPageScreen.kt +++ b/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/TraineeMyPageScreen.kt @@ -4,6 +4,7 @@ import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -55,6 +56,7 @@ import co.kr.tnt.core.ui.R as coreR @OptIn(ExperimentalPermissionsApi::class) @Composable internal fun TraineeMyPageRoute( + padding: PaddingValues, navigateToConnect: (Boolean) -> Unit, navigateToLogin: () -> Unit, navigateToWebView: (url: String) -> Unit, @@ -68,6 +70,7 @@ internal fun TraineeMyPageRoute( TraineeMyPageScreen( state = uiState, + padding = padding, appVersion = context.getAppVersion(), onClickConnect = { viewModel.setEvent(TraineeMyPageUiEvent.OnClickConnect) }, onTogglePushNotification = { @@ -117,6 +120,7 @@ internal fun TraineeMyPageRoute( @Composable private fun TraineeMyPageScreen( state: TraineeMyPageUiState, + padding: PaddingValues, appVersion: String, onClickConnect: () -> Unit, onTogglePushNotification: () -> Unit, @@ -137,6 +141,7 @@ private fun TraineeMyPageScreen( Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier + .padding(padding) .fillMaxSize() .background(TnTTheme.colors.neutralColors.Neutral50) .verticalScroll(rememberScrollState()), @@ -321,6 +326,7 @@ private fun TraineeMyPageScreenPreview() { ), isEnablePushNotification = true, ), + padding = PaddingValues(), appVersion = "1.0", onClickConnect = { }, onTogglePushNotification = { }, diff --git a/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/navigation/TraineeMyPageNavigation.kt b/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/navigation/TraineeMyPageNavigation.kt index a450fd0d..4f277450 100644 --- a/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/navigation/TraineeMyPageNavigation.kt +++ b/feature/trainee/mypage/src/main/java/co/kr/tnt/trainee/mypage/navigation/TraineeMyPageNavigation.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainee.mypage.navigation +import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder @@ -16,6 +17,7 @@ fun NavController.navigateToTraineeMyPage( ) fun NavGraphBuilder.traineeMyPageNavGraph( + padding: PaddingValues, navigateToTraineeConnect: (Boolean) -> Unit, navigateToLogin: () -> Unit, navigateToWebView: (url: String) -> Unit, @@ -23,6 +25,7 @@ fun NavGraphBuilder.traineeMyPageNavGraph( navigation(startDestination = Route.TraineeMyPage) { composable { TraineeMyPageRoute( + padding = padding, navigateToConnect = navigateToTraineeConnect, navigateToLogin = navigateToLogin, navigateToWebView = navigateToWebView, diff --git a/feature/trainee/notification/src/main/java/co/kr/tnt/trainee/notification/TraineeNotificationScreen.kt b/feature/trainee/notification/src/main/java/co/kr/tnt/trainee/notification/TraineeNotificationScreen.kt index 5cb201cb..223259fc 100644 --- a/feature/trainee/notification/src/main/java/co/kr/tnt/trainee/notification/TraineeNotificationScreen.kt +++ b/feature/trainee/notification/src/main/java/co/kr/tnt/trainee/notification/TraineeNotificationScreen.kt @@ -1,6 +1,7 @@ package co.kr.tnt.trainee.notification import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -59,11 +60,12 @@ private fun TraineeNotificationScreen( TnTTopBarWithBackButton( title = stringResource(uiResource.string.notification), onBackClick = onBackClick, + showStoke = true, ) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> - Box(modifier = Modifier.fillMaxSize()) { + Column(modifier = Modifier.padding(innerPadding)) { if (state.notifications.isEmpty()) { Box( modifier = Modifier.fillMaxSize(), @@ -77,9 +79,7 @@ private fun TraineeNotificationScreen( } } else { LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(innerPadding), + modifier = Modifier.fillMaxSize(), ) { items(state.notifications) { notification -> TnTNotification( diff --git a/feature/trainer/addptsession/src/main/java/co/kr/tnt/trainer/addptsession/AddPtSessionScreen.kt b/feature/trainer/addptsession/src/main/java/co/kr/tnt/trainer/addptsession/AddPtSessionScreen.kt index 3b6fdd9b..2e5b4d37 100644 --- a/feature/trainer/addptsession/src/main/java/co/kr/tnt/trainer/addptsession/AddPtSessionScreen.kt +++ b/feature/trainer/addptsession/src/main/java/co/kr/tnt/trainer/addptsession/AddPtSessionScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -22,6 +21,7 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -189,84 +189,91 @@ private fun AddPtSessionScreen( ) { val dateFormatter = remember { DateFormatter() } - Box( - modifier = Modifier - .clearFocusOnTap() - .fillMaxSize(), - ) { - Column( - modifier = Modifier - .fillMaxSize() - .imePadding() - .verticalScroll(state = rememberScrollState()), - ) { + Scaffold( + topBar = { TnTTopBarWithBackButton( modifier = Modifier.fillMaxWidth(), title = "수업 추가하기", - windowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp), onBackClick = onClickBack, + showStoke = true, ) + }, + containerColor = TnTTheme.colors.commonColors.Common0, + ) { innerPadding -> + Box( + modifier = Modifier + .clearFocusOnTap() + .padding(innerPadding) + .fillMaxSize(), + ) { Column( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), + .fillMaxSize() + .imePadding() + .verticalScroll(state = rememberScrollState()), ) { - Spacer(modifier = Modifier.height(16.dp)) - Description() - Spacer(modifier = Modifier.height(48.dp)) - Selector( - title = "회원 선택", - value = state.selectedMember?.traineeName ?: "", - placeholder = "회원을 입력해주세요", - onClick = onClickMember, - ) - Spacer(modifier = Modifier.height(48.dp)) - Selector( - title = "PT 날짜", - value = state.selectedDate?.let { selectedDate -> - dateFormatter.format(selectedDate, "yyyy/MM/dd") - } ?: "", - placeholder = "날짜를 입력해주세요", - onClick = onClickDate, - ) - Spacer(modifier = Modifier.height(48.dp)) - TimeSelector( - startTime = state.selectedStartTime, - endTime = state.selectedEndTime, - dateFormatter = dateFormatter, - onClickStartTime = onClickStartTime, - onClickEndTime = onClickEndTime, - isWarning = state.isErrorTime, - ) - if (state.selectedStartTime != null && state.selectedEndTime == null) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + ) { + Spacer(modifier = Modifier.height(16.dp)) + Description() Spacer(modifier = Modifier.height(48.dp)) - MinuteChips( - selectedMinute = state.totalSessionMinute ?: 0, - onClickChip = onClickMinuteChip, + Selector( + title = "회원 선택", + value = state.selectedMember?.traineeName ?: "", + placeholder = "회원을 입력해주세요", + onClick = onClickMember, ) - } - state.totalSessionMinute?.let { totalSessionMinute -> - Spacer(modifier = Modifier.height(20.dp)) - TotalSessionMinute( - minute = totalSessionMinute, + Spacer(modifier = Modifier.height(48.dp)) + Selector( + title = "PT 날짜", + value = state.selectedDate?.let { selectedDate -> + dateFormatter.format(selectedDate, "yyyy/MM/dd") + } ?: "", + placeholder = "날짜를 입력해주세요", + onClick = onClickDate, ) + Spacer(modifier = Modifier.height(48.dp)) + TimeSelector( + startTime = state.selectedStartTime, + endTime = state.selectedEndTime, + dateFormatter = dateFormatter, + onClickStartTime = onClickStartTime, + onClickEndTime = onClickEndTime, + isWarning = state.isErrorTime, + ) + if (state.selectedStartTime != null && state.selectedEndTime == null) { + Spacer(modifier = Modifier.height(48.dp)) + MinuteChips( + selectedMinute = state.totalSessionMinute ?: 0, + onClickChip = onClickMinuteChip, + ) + } + state.totalSessionMinute?.let { totalSessionMinute -> + Spacer(modifier = Modifier.height(20.dp)) + TotalSessionMinute( + minute = totalSessionMinute, + ) + } + Spacer(modifier = Modifier.height(48.dp)) + Memo( + value = state.memo, + isWarning = state.isErrorMemo, + onValueChanged = onChangeMemo, + ) + Spacer(modifier = Modifier.height(70.dp)) } - Spacer(modifier = Modifier.height(48.dp)) - Memo( - value = state.memo, - isWarning = state.isErrorMemo, - onValueChanged = onChangeMemo, - ) - Spacer(modifier = Modifier.height(70.dp)) } - } - TnTBottomButton( - text = "완료", - enabled = state.isEnableComplete, - modifier = Modifier.align(Alignment.BottomCenter), - onClick = onClickComplete, - ) + TnTBottomButton( + text = "완료", + enabled = state.isEnableComplete, + modifier = Modifier.align(Alignment.BottomCenter), + onClick = onClickComplete, + ) + } } } diff --git a/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/TrainerFeedbackScreen.kt b/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/TrainerFeedbackScreen.kt index c848343b..b0eede23 100644 --- a/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/TrainerFeedbackScreen.kt +++ b/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/TrainerFeedbackScreen.kt @@ -1,11 +1,12 @@ package co.kr.tnt.trainer.feedback -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -18,17 +19,20 @@ import co.kr.tnt.ui.component.TnTCountTopBar @Composable @Suppress("UnusedParameter") internal fun TrainerFeedbackRoute( + padding: PaddingValues, viewModel: TrainerFeedbackViewModel = hiltViewModel(), ) { - TrainerFeedbackScreen() + TrainerFeedbackScreen(padding) } @Composable -private fun TrainerFeedbackScreen() { +private fun TrainerFeedbackScreen( + padding: PaddingValues, +) { Column( modifier = Modifier .fillMaxSize() - .background(TnTTheme.colors.neutralColors.Neutral100), + .padding(padding), ) { TnTCountTopBar( title = "피드백", diff --git a/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/navigation/TrainerFeedbackNavigation.kt b/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/navigation/TrainerFeedbackNavigation.kt index de5a98ca..7f1cb8e0 100644 --- a/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/navigation/TrainerFeedbackNavigation.kt +++ b/feature/trainer/feedback/src/main/java/co/kr/tnt/trainer/feedback/navigation/TrainerFeedbackNavigation.kt @@ -1,11 +1,11 @@ package co.kr.tnt.trainer.feedback.navigation +import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder import androidx.navigation.compose.composable import androidx.navigation.compose.navigation -import androidx.navigation.navOptions import co.kr.tnt.navigation.Route import co.kr.tnt.trainer.feedback.TrainerFeedbackRoute @@ -17,11 +17,12 @@ fun NavController.navigateToTrainerFeedback( ) fun NavGraphBuilder.trainerFeedbackNavGraph( + padding: PaddingValues, feedbackDestination: NavGraphBuilder.() -> Unit = { }, ) { navigation(startDestination = Route.TrainerFeedback) { composable { - TrainerFeedbackRoute() + TrainerFeedbackRoute(padding) } feedbackDestination() } diff --git a/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/TrainerHomeScreen.kt b/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/TrainerHomeScreen.kt index 9a3d1b22..3a41e324 100644 --- a/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/TrainerHomeScreen.kt +++ b/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/TrainerHomeScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -63,6 +64,7 @@ import java.time.YearMonth @Composable internal fun TrainerHomeRoute( viewModel: TrainerHomeViewModel = hiltViewModel(), + padding: PaddingValues, navigateToNotification: () -> Unit, navigateToAddPtSession: () -> Unit, ) { @@ -71,6 +73,7 @@ internal fun TrainerHomeRoute( TrainerHomeScreen( state = state, + padding = padding, onClickNotification = { viewModel.setEvent(TrainerHomeUiEvent.OnClickNotification) }, onChangeVisibleMonth = { viewModel.setEvent(TrainerHomeUiEvent.OnChangeVisibleMonth(it)) }, onClickDay = { viewModel.setEvent(TrainerHomeUiEvent.OnClickDay(it)) }, @@ -95,6 +98,7 @@ internal fun TrainerHomeRoute( @Composable private fun TrainerHomeScreen( state: TrainerHomeUiState, + padding: PaddingValues, onClickNotification: () -> Unit, onChangeVisibleMonth: (yearMonth: YearMonth) -> Unit, onClickDay: (date: LocalDate) -> Unit, @@ -112,7 +116,7 @@ private fun TrainerHomeScreen( val visibleMonth = rememberMostVisibleMonth(calendarState) val dateFormatter = remember { DateFormatter() } - Box { + Box(modifier = Modifier.padding(padding)) { LazyColumn( modifier = Modifier .fillMaxSize() @@ -355,6 +359,7 @@ private fun TrainerHomeScreenPreview() { TnTTheme { TrainerHomeScreen( state = TrainerHomeUiState(), + padding = PaddingValues(), onClickNotification = { }, onChangeVisibleMonth = { }, onClickDay = { }, diff --git a/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/navigation/TrainerHomeNavigation.kt b/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/navigation/TrainerHomeNavigation.kt index 0573c107..03aa564f 100644 --- a/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/navigation/TrainerHomeNavigation.kt +++ b/feature/trainer/home/src/main/java/co/kr/tnt/trainer/home/navigation/TrainerHomeNavigation.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainer.home.navigation +import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder @@ -23,6 +24,7 @@ fun NavController.navigateToTrainerHome( ) fun NavGraphBuilder.trainerHomeNavGraph( + padding: PaddingValues, navigateToNotification: () -> Unit, navigateToAddPtSession: () -> Unit, homeDestination: NavGraphBuilder.() -> Unit = { }, @@ -30,6 +32,7 @@ fun NavGraphBuilder.trainerHomeNavGraph( navigation(startDestination = Route.TrainerHome) { composable { TrainerHomeRoute( + padding = padding, navigateToNotification = navigateToNotification, navigateToAddPtSession = navigateToAddPtSession, ) diff --git a/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainScreen.kt b/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainScreen.kt index 13ec6ad8..d84e3f95 100644 --- a/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainScreen.kt +++ b/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainScreen.kt @@ -49,25 +49,24 @@ private fun TrainerMainScreen( val navController = state.navController Scaffold( - containerColor = TnTTheme.colors.commonColors.Common0, modifier = Modifier.fillMaxSize(), + containerColor = state.currentMainTab?.containerColor?.invoke() ?: TnTTheme.colors.commonColors.Common0, bottomBar = { - if (state.shouldShowBottomBar) { - TnTBottomBar( - modifier = Modifier.navigationBarsPadding(), - bottomTabs = state.mainTabs, - currentTab = state.currentMainTab, - onClickTab = state::navigateMainTab, - ) - } + TnTBottomBar( + modifier = Modifier.navigationBarsPadding(), + bottomTabs = state.mainTabs, + isVisible = state.shouldShowBottomBar, + currentTab = state.currentMainTab, + onClickTab = state::navigateMainTab, + ) }, ) { innerPadding -> NavHost( - modifier = Modifier.padding(innerPadding), navController = navController, startDestination = state.startDestination, ) { trainerHomeNavGraph( + padding = innerPadding, navigateToNotification = navController::navigateToTrainerNotification, navigateToAddPtSession = navController::navigateToAddPtSession, ) { @@ -79,11 +78,13 @@ private fun TrainerMainScreen( navigateToPrevious = navController::popBackStack, ) } - trainerFeedbackNavGraph() + trainerFeedbackNavGraph(padding = innerPadding) trainerMembersNavGraph( + padding = innerPadding, navigateToInvite = navigateToInvite, ) trainerMyPageNavGraph( + padding = innerPadding, navigateToLogin = navigateToLogin, navigateToWebView = navigateToWebView, ) diff --git a/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainTab.kt b/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainTab.kt index d7ef8311..ab04338f 100644 --- a/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainTab.kt +++ b/feature/trainer/main/src/main/java/co/kr/tnt/trainer/main/TrainerMainTab.kt @@ -1,36 +1,45 @@ package co.kr.tnt.trainer.main +import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color import co.kr.tnt.core.designsystem.R import co.kr.tnt.designsystem.component.bottombar.BottomTab +import co.kr.tnt.designsystem.theme.TnTTheme import co.kr.tnt.navigation.Route internal enum class TrainerMainTab( override val contentDescription: String, - override val icon: Int, + @DrawableRes override val icon: Int, + val containerColor: @Composable () -> Color, val baseRoute: Route.TrainerMainTab, val route: Route, ) : BottomTab { HOME( contentDescription = "홈", icon = R.drawable.ic_navbar_home, + containerColor = { TnTTheme.colors.commonColors.Common0 }, baseRoute = Route.TrainerMainTab.Home, route = Route.TrainerHome, ), FEEDBACK( contentDescription = "피드백", icon = R.drawable.ic_navbar_feedback, + containerColor = { TnTTheme.colors.neutralColors.Neutral100 }, baseRoute = Route.TrainerMainTab.Feedback, route = Route.TrainerFeedback, ), MEMBERS( contentDescription = "회원목록", icon = R.drawable.ic_navbar_members, + containerColor = { TnTTheme.colors.neutralColors.Neutral100 }, baseRoute = Route.TrainerMainTab.Members, route = Route.TrainerMembers, ), MY_PAGE( contentDescription = "내 정보", icon = R.drawable.ic_navbar_mypage, + containerColor = { TnTTheme.colors.neutralColors.Neutral50 }, baseRoute = Route.TrainerMainTab.MyPage, route = Route.TrainerMyPage, ), diff --git a/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/TrainerMembersScreen.kt b/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/TrainerMembersScreen.kt index c5d9715f..ad5ef625 100644 --- a/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/TrainerMembersScreen.kt +++ b/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/TrainerMembersScreen.kt @@ -1,6 +1,6 @@ package co.kr.tnt.trainer.members -import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -38,13 +38,15 @@ import coil.request.ImageRequest @Composable internal fun TrainerMembersRoute( - viewModel: TrainerMembersViewModel = hiltViewModel(), + padding: PaddingValues, navigateToInvite: (Boolean) -> Unit, + viewModel: TrainerMembersViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() TrainerMembersScreen( state = uiState, + padding = padding, onClickInviteButton = { navigateToInvite(false) }, ) } @@ -52,36 +54,32 @@ internal fun TrainerMembersRoute( @Composable private fun TrainerMembersScreen( state: TrainerMemberUiState, + padding: PaddingValues, onClickInviteButton: () -> Unit, ) { Box( modifier = Modifier .fillMaxSize() - .background(TnTTheme.colors.neutralColors.Neutral100), + .padding(padding), ) { - LazyColumn( - modifier = Modifier.fillMaxSize(), - ) { - item { - TnTCountTopBar( - title = "내 회원", - count = state.memberList.size, - trailingComponent = { - MemberInviteButton(onClickInviteButton) - }, - ) - } - if (state.memberList.isNotEmpty()) { - items(state.memberList) { member -> - MemberList(member) + Column(modifier = Modifier.fillMaxSize()) { + TnTCountTopBar( + title = "내 회원", + count = state.memberList.size, + trailingComponent = { + MemberInviteButton(onClickInviteButton) + }, + ) + if (state.memberList.isEmpty()) { + EmptyMemberList() + } else { + LazyColumn(modifier = Modifier.fillMaxSize()) { + items(state.memberList) { member -> + MemberList(member) + } } } } - if (state.memberList.isEmpty()) { - EmptyMemberList( - modifier = Modifier.align(Alignment.Center), - ) - } } } @@ -117,7 +115,8 @@ private fun MemberInviteButton( @Composable private fun EmptyMemberList(modifier: Modifier = Modifier) { Column( - modifier = modifier, + modifier = modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { Text( @@ -213,6 +212,7 @@ private fun TrainerMembersScreenPreview() { ), ), ), + padding = PaddingValues(), onClickInviteButton = { }, ) } diff --git a/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/navigation/TrainerMembersNavigation.kt b/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/navigation/TrainerMembersNavigation.kt index aa820ebc..03063e85 100644 --- a/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/navigation/TrainerMembersNavigation.kt +++ b/feature/trainer/members/src/main/java/co/kr/tnt/trainer/members/navigation/TrainerMembersNavigation.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainer.members.navigation +import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder @@ -16,12 +17,14 @@ fun NavController.navigateToTrainerMembers( ) fun NavGraphBuilder.trainerMembersNavGraph( + padding: PaddingValues, navigateToInvite: (Boolean) -> Unit, membersDestination: NavGraphBuilder.() -> Unit = { }, ) { navigation(startDestination = Route.TrainerMembers) { composable { TrainerMembersRoute( + padding = padding, navigateToInvite = navigateToInvite, ) } diff --git a/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/TrainerMyPageScreen.kt b/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/TrainerMyPageScreen.kt index c859ee92..c614b178 100644 --- a/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/TrainerMyPageScreen.kt +++ b/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/TrainerMyPageScreen.kt @@ -4,6 +4,7 @@ import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -61,6 +62,7 @@ import co.kr.tnt.core.ui.R as coreR @OptIn(ExperimentalPermissionsApi::class) @Composable internal fun TrainerMyPageRoute( + padding: PaddingValues, navigateToLogin: () -> Unit, navigateToWebView: (String) -> Unit, viewModel: TrainerMyPageViewModel = hiltViewModel(), @@ -72,6 +74,7 @@ internal fun TrainerMyPageRoute( TrainerMyPageScreen( state = state, + padding = padding, appVersion = context.getAppVersion(), onTogglePushNotification = { viewModel.setEvent( @@ -119,6 +122,7 @@ internal fun TrainerMyPageRoute( @Composable private fun TrainerMyPageScreen( state: TrainerMyPageUiState, + padding: PaddingValues, appVersion: String, onTogglePushNotification: () -> Unit, onClickTermsOfService: () -> Unit, @@ -139,6 +143,7 @@ private fun TrainerMyPageScreen( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .fillMaxSize() + .padding(padding) .background(TnTTheme.colors.neutralColors.Neutral50) .verticalScroll(rememberScrollState()), ) { @@ -369,6 +374,7 @@ private fun TrainerMyPageScreenPreview() { ), isEnablePushNotification = false, ), + padding = PaddingValues(), appVersion = "1.0.0", onTogglePushNotification = { }, onClickTermsOfService = { }, diff --git a/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/navigation/TrainerMyPageNavigation.kt b/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/navigation/TrainerMyPageNavigation.kt index 94f5b1fe..3e2bc093 100644 --- a/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/navigation/TrainerMyPageNavigation.kt +++ b/feature/trainer/mypage/src/main/java/co/kr/tnt/trainer/mypage/navigation/TrainerMyPageNavigation.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainer.mypage.navigation +import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder @@ -17,6 +18,7 @@ fun NavController.navigateToTrainerMyPage( ) fun NavGraphBuilder.trainerMyPageNavGraph( + padding: PaddingValues, navigateToLogin: () -> Unit, navigateToWebView: (String) -> Unit, myPageDestination: NavGraphBuilder.() -> Unit = { }, @@ -24,6 +26,7 @@ fun NavGraphBuilder.trainerMyPageNavGraph( navigation(startDestination = Route.TrainerMyPage) { composable { TrainerMyPageRoute( + padding = padding, navigateToLogin = navigateToLogin, navigateToWebView = navigateToWebView, ) diff --git a/feature/trainer/notification/src/main/java/co/kr/tnt/trainer/notification/TrainerNotificationScreen.kt b/feature/trainer/notification/src/main/java/co/kr/tnt/trainer/notification/TrainerNotificationScreen.kt index a0151d42..d446d6bd 100644 --- a/feature/trainer/notification/src/main/java/co/kr/tnt/trainer/notification/TrainerNotificationScreen.kt +++ b/feature/trainer/notification/src/main/java/co/kr/tnt/trainer/notification/TrainerNotificationScreen.kt @@ -1,6 +1,7 @@ package co.kr.tnt.trainer.notification import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -68,11 +69,16 @@ private fun TrainerNotificationScreen( TnTTopBarWithBackButton( title = stringResource(uiResource.string.notification), onBackClick = onBackClick, + showStoke = true, ) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> - Box(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize(), + ) { if (state.notifications.isEmpty()) { Box( modifier = Modifier.fillMaxSize(), @@ -86,9 +92,7 @@ private fun TrainerNotificationScreen( } } else { LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(innerPadding), + modifier = Modifier.fillMaxSize(), ) { items(state.notifications) { notification -> TnTNotification(