From 2473156b1f077b1502cd425b9a8d8845a603a1b3 Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Thu, 17 Jul 2025 22:09:10 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[#154]=20=EB=B0=94=ED=85=80=EC=8B=9C?= =?UTF-8?q?=ED=8A=B8=20Intent=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/bottomsheet/TaskTitleBottomSheet.kt | 4 +++- .../team/noweekend/feature/home/mvi/HomeIntent.kt | 8 +++++++- .../noweekend/feature/home/mvi/HomeViewModel.kt | 13 ++++++++++--- .../team/noweekend/feature/home/screen/HomeRoute.kt | 5 +++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/component/common/bottomsheet/TaskTitleBottomSheet.kt b/feature/home/src/main/java/team/noweekend/feature/home/component/common/bottomsheet/TaskTitleBottomSheet.kt index 5ba43a83..3123eb38 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/component/common/bottomsheet/TaskTitleBottomSheet.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/component/common/bottomsheet/TaskTitleBottomSheet.kt @@ -20,6 +20,7 @@ import team.noweekend.core.design.system.foundation.theme.NWKTheme @Composable internal fun TaskTitleBottomSheet( onBottomSheetDismiss: () -> Unit, + onAddTaskClick: (String) -> Unit, modifier: Modifier = Modifier, ) { val focusManager: FocusManager = LocalFocusManager.current @@ -29,7 +30,7 @@ internal fun TaskTitleBottomSheet( bottomSheetType = BottomSheetType.UseButton( bottomSheetTitle = "연차 제목을 작성하면\n할 일에 추가돼요", bottomSheetButtonTitle = "추가하기", - onClickButton = {}, + onClickButton = { onAddTaskClick(titleTextFieldState.text.toString()) }, ), isDraggable = false, ) @@ -60,6 +61,7 @@ private fun TaskTitleBottomSheetPreview() { NWKScaffold { TaskTitleBottomSheet( onBottomSheetDismiss = {}, + onAddTaskClick = {}, ) } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt index 5e32de63..023756b6 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt @@ -10,5 +10,11 @@ sealed interface HomeIntent : Intent { data object ClickCreateVacation : HomeIntent data object ClickHolidayVacationCard : HomeIntent data object ClickRecommendationVacationCard : HomeIntent - data object ClickPopularVacationClick : HomeIntent + data object ClickPopularVacation : HomeIntent + sealed interface BottomSheet : HomeIntent { + data class ClickAddTaskButton( + val title: String, + ) : BottomSheet + data object DismissTaskTitleBottomSheet : BottomSheet + } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt index 53440549..3c6d049c 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt @@ -66,10 +66,17 @@ class HomeViewModel @Inject constructor( } is HomeIntent.ClickHolidayVacationCard, - is HomeIntent.ClickPopularVacationClick, + is HomeIntent.ClickPopularVacation, is HomeIntent.ClickRecommendationVacationCard, - -> { - updateTaskTitleBottomSheetVisibility(true) + -> updateTaskTitleBottomSheetVisibility(true) + + is HomeIntent.BottomSheet.ClickAddTaskButton -> { + val title = intent.title + Log.d("logtag", title) + } + + is HomeIntent.BottomSheet.DismissTaskTitleBottomSheet -> { + updateTaskTitleBottomSheetVisibility(false) } } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt index 0b83a25f..976dd71f 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt @@ -53,13 +53,14 @@ internal fun HomeRoute( onCreateVacationClick = { viewModel.intent(HomeIntent.ClickCreateVacation) }, onHolidayVacationClick = { viewModel.intent(HomeIntent.ClickHolidayVacationCard) }, onRecommendedVacationClick = { viewModel.intent(HomeIntent.ClickRecommendationVacationCard) }, - onPopularVacationClick = { viewModel.intent(HomeIntent.ClickPopularVacationClick) }, + onPopularVacationClick = { viewModel.intent(HomeIntent.ClickPopularVacation) }, modifier = modifier, ) if (uiState.showTaskTitleBottomSheet) { TaskTitleBottomSheet( - onBottomSheetDismiss = {}, + onAddTaskClick = { viewModel.intent(HomeIntent.BottomSheet.ClickAddTaskButton(it)) }, + onBottomSheetDismiss = { viewModel.intent(HomeIntent.BottomSheet.DismissTaskTitleBottomSheet) }, ) } } From a7531e80aa50ca8e553b6c584de071208045d4c8 Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Thu, 17 Jul 2025 23:40:28 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[#154]=20=ED=99=88=20=EC=9D=BC=EC=A0=95=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20API=20=EC=97=B0=EA=B2=B0=20+=20=EA=B3=B5?= =?UTF-8?q?=ED=9C=B4=EC=9D=BC=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../holiday/HolidayRecommendComponent.kt | 6 +- .../carousel/HolidayRecommendCarousel.kt | 4 +- .../feature/home/model/HolidayUiModel.kt | 5 + .../model/MonthlyVacationRecommendUiModel.kt | 12 +- .../home/model/PopularVacationUiModel.kt | 7 ++ .../noweekend/feature/home/mvi/HomeIntent.kt | 7 +- .../noweekend/feature/home/mvi/HomeUiState.kt | 27 ++++- .../feature/home/mvi/HomeViewModel.kt | 107 ++++++++++++++++-- .../feature/home/screen/HomeRoute.kt | 4 +- .../feature/home/screen/HomeScreen.kt | 5 +- 10 files changed, 160 insertions(+), 24 deletions(-) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/HolidayRecommendComponent.kt b/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/HolidayRecommendComponent.kt index 6c3b78ba..4ca109c9 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/HolidayRecommendComponent.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/HolidayRecommendComponent.kt @@ -19,18 +19,18 @@ import team.noweekend.feature.home.model.HolidayUiModel internal fun LazyListScope.holidayRecommend( holidays: ImmutableList, - onHolidayCardClick: () -> Unit, + onHolidayCardClick: (HolidayUiModel) -> Unit, ) = item { HolidayRecommendComponent( holidays = holidays, - onHolidayCardClick = onHolidayCardClick, + onHolidayCardClick = { onHolidayCardClick(it) }, ) } @Composable internal fun HolidayRecommendComponent( holidays: ImmutableList, - onHolidayCardClick: () -> Unit, + onHolidayCardClick: (HolidayUiModel) -> Unit, modifier: Modifier = Modifier, ) { Column( diff --git a/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/carousel/HolidayRecommendCarousel.kt b/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/carousel/HolidayRecommendCarousel.kt index c627f527..3a2c2da2 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/carousel/HolidayRecommendCarousel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/component/holiday/carousel/HolidayRecommendCarousel.kt @@ -13,7 +13,7 @@ import team.noweekend.feature.home.model.HolidayUiModel @Composable internal fun HolidayRecommendCarousel( holidays: ImmutableList, - onCardClick: () -> Unit, + onCardClick: (HolidayUiModel) -> Unit, modifier: Modifier = Modifier, ) { val pagerState = rememberPagerState(pageCount = { holidays.size }) @@ -27,7 +27,7 @@ internal fun HolidayRecommendCarousel( content = { index -> val holiday = holidays.getOrNull(index) ?: return@CarouselLayout HolidayCard( - onCardClick = onCardClick, + onCardClick = { onCardClick(holiday) }, date = holiday.date, holiday = holiday.holiday, ) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/model/HolidayUiModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/model/HolidayUiModel.kt index 44ccd96e..839b8130 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/model/HolidayUiModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/model/HolidayUiModel.kt @@ -14,6 +14,11 @@ data class HolidayUiModel( ) { companion object { val INITIAL_DATA: HolidayUiModel = HolidayUiModel( + date = LocalDate.now(), + holiday = "", + ) + + val DUMMY_DATA: HolidayUiModel = HolidayUiModel( date = LocalDate.now(), holiday = "현충일", ) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/model/MonthlyVacationRecommendUiModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/model/MonthlyVacationRecommendUiModel.kt index c3aba221..d9499fa8 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/model/MonthlyVacationRecommendUiModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/model/MonthlyVacationRecommendUiModel.kt @@ -2,16 +2,22 @@ package team.noweekend.feature.home.model import androidx.compose.runtime.Stable import kotlinx.datetime.LocalDate +import team.noweekend.core.common.kotlin.extension.now import team.noweekend.core.common.kotlin.extension.parseLocalDateString import team.noweekend.core.model.vacation.WeatherRecommendVacation -import java.util.UUID @Stable data class MonthlyVacationRecommendUiModel( - val id: String = UUID.randomUUID().toString(), val localDate: LocalDate, val recommendContent: String, -) +) { + companion object { + val INITIAL_DATA: MonthlyVacationRecommendUiModel = MonthlyVacationRecommendUiModel( + localDate = LocalDate.now(), + recommendContent = "", + ) + } +} internal fun WeatherRecommendVacation.toUiModel(): MonthlyVacationRecommendUiModel = MonthlyVacationRecommendUiModel( diff --git a/feature/home/src/main/java/team/noweekend/feature/home/model/PopularVacationUiModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/model/PopularVacationUiModel.kt index c66ddcaa..d939e422 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/model/PopularVacationUiModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/model/PopularVacationUiModel.kt @@ -9,6 +9,7 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.withStyle import kotlinx.datetime.LocalDate import team.noweekend.core.common.kotlin.extension.MONTH_DATE_WITH_DAY_OF_WEEK_PATTERN +import team.noweekend.core.common.kotlin.extension.now import team.noweekend.core.common.kotlin.extension.toFormattedString import team.noweekend.core.design.system.foundation.theme.NWKTheme import team.noweekend.core.model.vacation.SandwichRecommendVacation @@ -50,6 +51,12 @@ data class PopularVacationUiModel( } companion object { + val INITIAL_DATA: PopularVacationUiModel = PopularVacationUiModel( + vacationType = VacationType.HOLIDAY_EXIST, + startLocalDate = LocalDate.now(), + endLocalDate = null, + ) + @Composable fun VacationType.getStyledDescription(): AnnotatedString { return when (this) { diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt index 023756b6..aa108788 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt @@ -1,6 +1,7 @@ package team.noweekend.feature.home.mvi import team.noweekend.core.common.android.mvi.Intent +import team.noweekend.feature.home.model.HolidayUiModel sealed interface HomeIntent : Intent { data class CreateVacation( @@ -8,13 +9,17 @@ sealed interface HomeIntent : Intent { ) : HomeIntent data object ClickCreateVacation : HomeIntent - data object ClickHolidayVacationCard : HomeIntent + data class ClickHolidayVacationCard( + val holiday: HolidayUiModel, + ) : HomeIntent + data object ClickRecommendationVacationCard : HomeIntent data object ClickPopularVacation : HomeIntent sealed interface BottomSheet : HomeIntent { data class ClickAddTaskButton( val title: String, ) : BottomSheet + data object DismissTaskTitleBottomSheet : BottomSheet } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeUiState.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeUiState.kt index 93c230dc..33219684 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeUiState.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeUiState.kt @@ -18,7 +18,7 @@ import team.noweekend.feature.home.model.PopularVacationUiModel @Stable data class HomeUiState( val isLoading: Boolean, - val showTaskTitleBottomSheet: Boolean, + val taskTitleBottomSheetState: BottomSheetState, val averageTemperature: Float, val remainingAnnualLeave: Float, val createVacationStatus: CreateVacationStatus, @@ -27,12 +27,19 @@ data class HomeUiState( val popularVacations: ImmutableList, val calendarData: ImmutableMap, val selectedDate: LocalDate, + val selectedHoliday: HolidayUiModel, + val selectedWeatherRecommendVacation: MonthlyVacationRecommendUiModel, + val selectedPopularVacation: PopularVacationUiModel, + val taskTitle: String, ) : UiState { companion object { val INITIAL_STATE: HomeUiState = HomeUiState( isLoading = false, - showTaskTitleBottomSheet = false, + taskTitleBottomSheetState = BottomSheetState( + entryType = BottomSheetEntryType.NOTHING, + showTaskTitleBottomSheet = false, + ), averageTemperature = 0f, remainingAnnualLeave = 0f, createVacationStatus = CreateVacationStatus.Default, @@ -41,10 +48,26 @@ data class HomeUiState( popularVacations = persistentListOf(), calendarData = persistentMapOf(), selectedDate = LocalDate.now(), + selectedHoliday = HolidayUiModel.INITIAL_DATA, + selectedWeatherRecommendVacation = MonthlyVacationRecommendUiModel.INITIAL_DATA, + selectedPopularVacation = PopularVacationUiModel.INITIAL_DATA, + taskTitle = "", ) } } +data class BottomSheetState( + val entryType: BottomSheetEntryType, + val showTaskTitleBottomSheet: Boolean, +) + +enum class BottomSheetEntryType { + HOLIDAY, + WEATHER_RECOMMENDATION, + POPULAR_VACATION, + NOTHING, +} + /** * 휴가 굽기 UI 노출 상태 * - [CreateVacationStatus.Default] : 기본 상태 diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt index 3c6d049c..517baff5 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt @@ -8,17 +8,21 @@ import kotlinx.collections.immutable.toImmutableMap import kotlinx.coroutines.async import kotlinx.coroutines.delay import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalTime import team.noweekend.core.common.android.base.MVIViewModel import team.noweekend.core.common.kotlin.extension.parseLocalDateString +import team.noweekend.core.common.kotlin.extension.toDateTimeString import team.noweekend.core.common.ui.calendar.model.CalendarDateOfWeek import team.noweekend.core.common.ui.calendar.model.CalendarWeeksData import team.noweekend.core.common.ui.calendar.state.CalendarPagerState.Companion.initialPage import team.noweekend.core.domain.usecase.CalendarDataProviderUseCase +import team.noweekend.core.domain.usecase.CreateAddTaskUseCase import team.noweekend.core.domain.usecase.GetHolidayUseCase import team.noweekend.core.domain.usecase.GetSandwichRecommendVacationUseCase import team.noweekend.core.domain.usecase.GetUserProfileUseCase import team.noweekend.core.domain.usecase.GetWeatherRecommendVacationUseCase import team.noweekend.core.model.calendar.WeeksData +import team.noweekend.core.model.schedule.ScheduleCreateParam import team.noweekend.core.model.vacation.VacationType import team.noweekend.feature.home.mapper.toImageTypeWithId import team.noweekend.feature.home.model.HolidayUiModel @@ -36,6 +40,7 @@ class HomeViewModel @Inject constructor( private val getSandwichRecommendVacationUseCase: GetSandwichRecommendVacationUseCase, private val getUserProfileUseCase: GetUserProfileUseCase, private val calendarDataProviderUseCase: CalendarDataProviderUseCase, + private val createScheduleUseCase: CreateAddTaskUseCase, ) : MVIViewModel( savedStateHandle = savedStateHandle, ) { @@ -65,18 +70,35 @@ class HomeViewModel @Inject constructor( navigateToCreateVacation() } - is HomeIntent.ClickHolidayVacationCard, - is HomeIntent.ClickPopularVacation, - is HomeIntent.ClickRecommendationVacationCard, - -> updateTaskTitleBottomSheetVisibility(true) + is HomeIntent.ClickHolidayVacationCard -> { + reduce { copy(selectedHoliday = intent.holiday) } + updateTaskTitleBottomSheetVisibility(entryType = BottomSheetEntryType.HOLIDAY, showBottomSheet = true) + } + + is HomeIntent.ClickPopularVacation -> { +// reduce { copy(selectedPopularVacation = ) } + updateTaskTitleBottomSheetVisibility( + entryType = BottomSheetEntryType.POPULAR_VACATION, + showBottomSheet = true, + ) + } + + is HomeIntent.ClickRecommendationVacationCard -> { +// reduce { copy(selectedPopularVacation = ) } + updateTaskTitleBottomSheetVisibility( + entryType = BottomSheetEntryType.WEATHER_RECOMMENDATION, + showBottomSheet = true, + ) + } is HomeIntent.BottomSheet.ClickAddTaskButton -> { - val title = intent.title - Log.d("logtag", title) + updateTaskTitle(intent.title) + createSchedule(taskType = currentState.taskTitleBottomSheetState.entryType) + updateTaskTitleBottomSheetVisibility(entryType = BottomSheetEntryType.NOTHING, showBottomSheet = false) } is HomeIntent.BottomSheet.DismissTaskTitleBottomSheet -> { - updateTaskTitleBottomSheetVisibility(false) + updateTaskTitleBottomSheetVisibility(entryType = BottomSheetEntryType.NOTHING, showBottomSheet = false) } } } @@ -177,6 +199,59 @@ class HomeViewModel @Inject constructor( } } + private fun createSchedule(taskType: BottomSheetEntryType) = execute { + val param = when (taskType) { + BottomSheetEntryType.HOLIDAY -> { + ScheduleCreateParam( + title = currentState.taskTitle, + startDateTime = currentState.selectedHoliday.date + .toDateTimeString(LocalTime(9, 0, 0)), + endDateTime = currentState.selectedHoliday.date + .toDateTimeString(LocalTime(18, 0, 0)), + category = "LEAVE", + temperature = 30, + alarmOption = "NONE", + ) + } + + BottomSheetEntryType.WEATHER_RECOMMENDATION -> { + ScheduleCreateParam( + title = currentState.taskTitle, + startDateTime = currentState.selectedWeatherRecommendVacation.localDate + .toDateTimeString(LocalTime(9, 0, 0)), + endDateTime = currentState.selectedWeatherRecommendVacation.localDate + .toDateTimeString(LocalTime(18, 0, 0)), + category = "PERSONAL", + temperature = 30, + alarmOption = "NONE", + ) + } + + BottomSheetEntryType.POPULAR_VACATION -> ScheduleCreateParam( + title = currentState.taskTitle, + startDateTime = currentState.selectedPopularVacation.startLocalDate + .toDateTimeString(LocalTime(9, 0, 0)), + endDateTime = currentState.selectedPopularVacation.endLocalDate + ?.toDateTimeString(LocalTime(18, 0, 0)) + ?: currentState.selectedPopularVacation.startLocalDate + .toDateTimeString(LocalTime(18, 0, 0)), + category = "PERSONAL", + temperature = 30, + alarmOption = "NONE", + ) + + BottomSheetEntryType.NOTHING -> return@execute + } + + createScheduleUseCase.invoke(param) + .onSuccess { + + } + .onFailure { + Log.d("logtag", "$it") + } + } + private fun navigateToCreateVacation() = execute { postSideEffect( HomeSideEffect.NavigateToCreateVacation( @@ -191,7 +266,21 @@ class HomeViewModel @Inject constructor( reduce { copy(createVacationStatus = status) } } - private fun updateTaskTitleBottomSheetVisibility(showBottomSheet: Boolean) { - reduce { copy(showTaskTitleBottomSheet = showBottomSheet) } + private fun updateTaskTitleBottomSheetVisibility( + entryType: BottomSheetEntryType, + showBottomSheet: Boolean, + ) { + reduce { + copy( + taskTitleBottomSheetState = BottomSheetState( + entryType = entryType, + showTaskTitleBottomSheet = showBottomSheet, + ), + ) + } + } + + private fun updateTaskTitle(title: String) { + reduce { copy(taskTitle = title) } } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt index 976dd71f..12486d9d 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt @@ -51,13 +51,13 @@ internal fun HomeRoute( HomeScreen( uiState = uiState, onCreateVacationClick = { viewModel.intent(HomeIntent.ClickCreateVacation) }, - onHolidayVacationClick = { viewModel.intent(HomeIntent.ClickHolidayVacationCard) }, + onHolidayVacationClick = { viewModel.intent(HomeIntent.ClickHolidayVacationCard(it)) }, onRecommendedVacationClick = { viewModel.intent(HomeIntent.ClickRecommendationVacationCard) }, onPopularVacationClick = { viewModel.intent(HomeIntent.ClickPopularVacation) }, modifier = modifier, ) - if (uiState.showTaskTitleBottomSheet) { + if (uiState.taskTitleBottomSheetState.showTaskTitleBottomSheet) { TaskTitleBottomSheet( onAddTaskClick = { viewModel.intent(HomeIntent.BottomSheet.ClickAddTaskButton(it)) }, onBottomSheetDismiss = { viewModel.intent(HomeIntent.BottomSheet.DismissTaskTitleBottomSheet) }, diff --git a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt index 31173328..99709b7d 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt @@ -19,13 +19,14 @@ import team.noweekend.feature.home.component.holiday.holidayRecommend import team.noweekend.feature.home.component.popular.popularVacationRecommend import team.noweekend.feature.home.component.recommend.monthly.monthlyVacationRecommendComponent import team.noweekend.feature.home.component.vacation.createVacation +import team.noweekend.feature.home.model.HolidayUiModel import team.noweekend.feature.home.mvi.HomeUiState @Composable internal fun HomeScreen( uiState: HomeUiState, onCreateVacationClick: () -> Unit, - onHolidayVacationClick: () -> Unit, + onHolidayVacationClick: (HolidayUiModel) -> Unit, onRecommendedVacationClick: () -> Unit, onPopularVacationClick: () -> Unit, modifier: Modifier = Modifier, @@ -45,7 +46,7 @@ internal fun HomeScreen( ) holidayRecommend( holidays = uiState.remainedHolidays, - onHolidayCardClick = onHolidayVacationClick, + onHolidayCardClick = { onHolidayVacationClick(it) }, ) itemSpacer(40.dp) monthlyVacationRecommendComponent( From cfc280ce42d653204e3bdc170066038cbfb9c049 Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Thu, 17 Jul 2025 23:48:28 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[#154]=20API=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../popular/PopularVacationRecommendComponent.kt | 8 ++++---- .../monthly/MonthlyVacationRecommendComponent.kt | 6 +++--- .../team/noweekend/feature/home/mvi/HomeIntent.kt | 11 +++++++++-- .../team/noweekend/feature/home/mvi/HomeViewModel.kt | 6 +++--- .../team/noweekend/feature/home/screen/HomeRoute.kt | 4 ++-- .../team/noweekend/feature/home/screen/HomeScreen.kt | 8 +++++--- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/component/popular/PopularVacationRecommendComponent.kt b/feature/home/src/main/java/team/noweekend/feature/home/component/popular/PopularVacationRecommendComponent.kt index abbaa552..2942763e 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/component/popular/PopularVacationRecommendComponent.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/component/popular/PopularVacationRecommendComponent.kt @@ -24,7 +24,7 @@ import team.noweekend.feature.home.model.PopularVacationUiModel.Companion.getSty internal fun LazyListScope.popularVacationRecommend( popularVacations: ImmutableList, - onPopularVacationClick: () -> Unit, + onPopularVacationClick: (PopularVacationUiModel) -> Unit, modifier: Modifier = Modifier, ) = item { PopularVacationRecommendComponent( @@ -37,7 +37,7 @@ internal fun LazyListScope.popularVacationRecommend( @Composable internal fun PopularVacationRecommendComponent( popularVacations: ImmutableList, - onPopularVacationClick: () -> Unit, + onPopularVacationClick: (PopularVacationUiModel) -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -74,7 +74,7 @@ private fun PopularVacationRecommendHeader( @Composable private fun PopularVacationRecommendContent( popularVacations: ImmutableList, - onPopularVacationClick: () -> Unit, + onPopularVacationClick: (PopularVacationUiModel) -> Unit, modifier: Modifier = Modifier, ) { val height: Dp = if (popularVacations.size > 2) 500.dp else 250.dp @@ -93,7 +93,7 @@ private fun PopularVacationRecommendContent( date = it.displayDate, drawableResId = it.imageResourceId, description = it.vacationType.getStyledDescription(), - onCardClick = onPopularVacationClick, + onCardClick = { onPopularVacationClick(it) }, ) } }, diff --git a/feature/home/src/main/java/team/noweekend/feature/home/component/recommend/monthly/MonthlyVacationRecommendComponent.kt b/feature/home/src/main/java/team/noweekend/feature/home/component/recommend/monthly/MonthlyVacationRecommendComponent.kt index 38fc1a61..b6e6866c 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/component/recommend/monthly/MonthlyVacationRecommendComponent.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/component/recommend/monthly/MonthlyVacationRecommendComponent.kt @@ -35,7 +35,7 @@ internal fun LazyListScope.monthlyVacationRecommendComponent( recommends: ImmutableList, calendarData: ImmutableMap, selectedDate: LocalDate, - onRecommendedVacationClick: () -> Unit, + onRecommendedVacationClick: (MonthlyVacationRecommendUiModel) -> Unit, modifier: Modifier = Modifier, ) = item { MonthlyVacationRecommendComponent( @@ -55,7 +55,7 @@ internal fun MonthlyVacationRecommendComponent( recommends: ImmutableList, calendarData: ImmutableMap, selectedDate: LocalDate, - onRecommendedVacationClick: () -> Unit, + onRecommendedVacationClick: (MonthlyVacationRecommendUiModel) -> Unit, modifier: Modifier = Modifier, calendarPagerState: CalendarPagerState = rememberCalendarPagerState(), ) { @@ -87,7 +87,7 @@ internal fun MonthlyVacationRecommendComponent( MonthlyVacationCard( date = content.localDate, recommendContent = content.recommendContent, - onClickRecommendedVacation = onRecommendedVacationClick, + onClickRecommendedVacation = { onRecommendedVacationClick(content) }, ) if (isLastItem.not()) { NWKHorizontalDivider(thickness = 1.dp) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt index aa108788..ec5e0c2c 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeIntent.kt @@ -2,6 +2,8 @@ package team.noweekend.feature.home.mvi import team.noweekend.core.common.android.mvi.Intent import team.noweekend.feature.home.model.HolidayUiModel +import team.noweekend.feature.home.model.MonthlyVacationRecommendUiModel +import team.noweekend.feature.home.model.PopularVacationUiModel sealed interface HomeIntent : Intent { data class CreateVacation( @@ -13,8 +15,13 @@ sealed interface HomeIntent : Intent { val holiday: HolidayUiModel, ) : HomeIntent - data object ClickRecommendationVacationCard : HomeIntent - data object ClickPopularVacation : HomeIntent + data class ClickRecommendationVacationCard( + val recommendationVacation: MonthlyVacationRecommendUiModel, + ) : HomeIntent + + data class ClickPopularVacation( + val popularVacation: PopularVacationUiModel, + ) : HomeIntent sealed interface BottomSheet : HomeIntent { data class ClickAddTaskButton( val title: String, diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt index 517baff5..0c739d4c 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt @@ -76,7 +76,7 @@ class HomeViewModel @Inject constructor( } is HomeIntent.ClickPopularVacation -> { -// reduce { copy(selectedPopularVacation = ) } + reduce { copy(selectedPopularVacation = intent.popularVacation) } updateTaskTitleBottomSheetVisibility( entryType = BottomSheetEntryType.POPULAR_VACATION, showBottomSheet = true, @@ -84,7 +84,7 @@ class HomeViewModel @Inject constructor( } is HomeIntent.ClickRecommendationVacationCard -> { -// reduce { copy(selectedPopularVacation = ) } + reduce { copy(selectedWeatherRecommendVacation = intent.recommendationVacation) } updateTaskTitleBottomSheetVisibility( entryType = BottomSheetEntryType.WEATHER_RECOMMENDATION, showBottomSheet = true, @@ -245,7 +245,7 @@ class HomeViewModel @Inject constructor( createScheduleUseCase.invoke(param) .onSuccess { - + } .onFailure { Log.d("logtag", "$it") diff --git a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt index 12486d9d..b7a19d9e 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt @@ -52,8 +52,8 @@ internal fun HomeRoute( uiState = uiState, onCreateVacationClick = { viewModel.intent(HomeIntent.ClickCreateVacation) }, onHolidayVacationClick = { viewModel.intent(HomeIntent.ClickHolidayVacationCard(it)) }, - onRecommendedVacationClick = { viewModel.intent(HomeIntent.ClickRecommendationVacationCard) }, - onPopularVacationClick = { viewModel.intent(HomeIntent.ClickPopularVacation) }, + onRecommendedVacationClick = { viewModel.intent(HomeIntent.ClickRecommendationVacationCard(it)) }, + onPopularVacationClick = { viewModel.intent(HomeIntent.ClickPopularVacation(it)) }, modifier = modifier, ) diff --git a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt index 99709b7d..11f62f60 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeScreen.kt @@ -20,6 +20,8 @@ import team.noweekend.feature.home.component.popular.popularVacationRecommend import team.noweekend.feature.home.component.recommend.monthly.monthlyVacationRecommendComponent import team.noweekend.feature.home.component.vacation.createVacation import team.noweekend.feature.home.model.HolidayUiModel +import team.noweekend.feature.home.model.MonthlyVacationRecommendUiModel +import team.noweekend.feature.home.model.PopularVacationUiModel import team.noweekend.feature.home.mvi.HomeUiState @Composable @@ -27,8 +29,8 @@ internal fun HomeScreen( uiState: HomeUiState, onCreateVacationClick: () -> Unit, onHolidayVacationClick: (HolidayUiModel) -> Unit, - onRecommendedVacationClick: () -> Unit, - onPopularVacationClick: () -> Unit, + onRecommendedVacationClick: (MonthlyVacationRecommendUiModel) -> Unit, + onPopularVacationClick: (PopularVacationUiModel) -> Unit, modifier: Modifier = Modifier, ) { LazyColumn( @@ -55,7 +57,7 @@ internal fun HomeScreen( recommends = uiState.weatherRecommendVacations, calendarData = uiState.calendarData, selectedDate = uiState.selectedDate, - onRecommendedVacationClick = onRecommendedVacationClick, + onRecommendedVacationClick = { onRecommendedVacationClick(it) }, ) itemSpacer(40.dp) popularVacationRecommend( From efa544ea20f780b03849c00c51da399dfd67e83b Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Fri, 18 Jul 2025 00:16:38 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[#154]=20date=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/navigator/model/DestinationRoute.kt | 7 ++++++- .../calendar/navigation/CalendarNavigation.kt | 8 ++++++++ .../feature/detail/date/DetailDateActivity.kt | 2 ++ .../feature/detail/date/mvi/DetailDateViewModel.kt | 2 ++ .../detail/date/navigation/DetailDateNavHost.kt | 2 ++ .../noweekend/feature/home/mvi/HomeSideEffect.kt | 5 +++++ .../feature/home/mvi/HomeSideEffectHandler.kt | 4 ++++ .../noweekend/feature/home/mvi/HomeViewModel.kt | 6 +++++- .../feature/home/navigation/HomeNavigation.kt | 3 +++ .../team/noweekend/feature/home/screen/HomeRoute.kt | 2 ++ .../team/noweekend/feature/main/MainNavHost.kt | 13 +++++++++++-- .../kotlin/team/noweekend/feature/main/MainTab.kt | 5 ++++- .../feature/main/navigation/MainNavigator.kt | 2 ++ 13 files changed, 56 insertions(+), 5 deletions(-) diff --git a/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt b/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt index 5a104bf9..5f867c95 100644 --- a/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt +++ b/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt @@ -1,5 +1,6 @@ package team.noweekend.core.navigator.model +import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.Serializable import javax.annotation.concurrent.Immutable @@ -11,9 +12,13 @@ sealed interface DestinationRoute @Serializable data object Home : DestinationRoute +@InternalSerializationApi @Serializable -data object Calendar : DestinationRoute +data class Calendar( + val date: String = "", +) : DestinationRoute +@InternalSerializationApi @Immutable @Serializable data class DetailDate( diff --git a/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt b/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt index e18595f2..c1be2301 100644 --- a/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt +++ b/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt @@ -1,11 +1,19 @@ package team.noweekend.feature.calendar.navigation import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController import androidx.navigation.compose.composable +import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.common.ui.todo.model.Todo import team.noweekend.core.navigator.model.Calendar import team.noweekend.feature.calendar.screen.CalendarRoute +@OptIn(InternalSerializationApi::class) +fun NavHostController.navigateToCalendar(date: String) { + navigate(Calendar) +} + +@OptIn(InternalSerializationApi::class) fun NavGraphBuilder.calendarNavGraph( navigateToDetailDate: (String) -> Unit, navigateToAddTodo: (Todo) -> Unit, diff --git a/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/DetailDateActivity.kt b/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/DetailDateActivity.kt index 0ba000d3..2e4c6c23 100644 --- a/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/DetailDateActivity.kt +++ b/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/DetailDateActivity.kt @@ -7,6 +7,7 @@ import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.ui.Modifier import dagger.hilt.android.AndroidEntryPoint +import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.design.system.foundation.theme.NWKTheme import team.noweekend.core.navigator.model.DetailDate import team.noweekend.feature.detail.date.navigation.DetailDateNavHost @@ -14,6 +15,7 @@ import team.noweekend.feature.detail.date.navigation.DetailDateNavHost @AndroidEntryPoint class DetailDateActivity : ComponentActivity() { + @OptIn(InternalSerializationApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() diff --git a/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/mvi/DetailDateViewModel.kt b/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/mvi/DetailDateViewModel.kt index 699927cf..be962f93 100644 --- a/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/mvi/DetailDateViewModel.kt +++ b/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/mvi/DetailDateViewModel.kt @@ -6,6 +6,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.datetime.LocalDate +import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.common.android.base.MVIViewModel import team.noweekend.core.common.kotlin.extension.parseLocalDateString import team.noweekend.core.common.ui.todo.model.Todo @@ -29,6 +30,7 @@ class DetailDateViewModel @Inject constructor( ) : MVIViewModel( savedStateHandle = savedStateHandle, ) { + @OptIn(InternalSerializationApi::class) override fun createInitialState(savedStateHandle: SavedStateHandle): DetailDateUiState { val date = savedStateHandle.toRoute().date val localDate = LocalDate.parseLocalDateString(date) diff --git a/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/navigation/DetailDateNavHost.kt b/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/navigation/DetailDateNavHost.kt index 0940a93b..e4c73d17 100644 --- a/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/navigation/DetailDateNavHost.kt +++ b/feature/detail-date/src/main/java/team/noweekend/feature/detail/date/navigation/DetailDateNavHost.kt @@ -7,10 +7,12 @@ import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.design.system.core.component.scaffold.NWKScaffold import team.noweekend.core.navigator.model.DetailDate import team.noweekend.feature.detail.date.screen.DetailDateRoute +@OptIn(InternalSerializationApi::class) @Composable fun DetailDateNavHost( startDestination: DetailDate, diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt index 32c05cbe..6747575d 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt @@ -1,10 +1,15 @@ package team.noweekend.feature.home.mvi import android.content.Intent +import kotlinx.datetime.LocalDate import team.noweekend.core.common.android.mvi.SideEffect sealed interface HomeSideEffect : SideEffect { data class NavigateToCreateVacation( val intentBuilder: (Intent.() -> Intent)?, ) : HomeSideEffect + + data class NavigateToCalendar( + val startLocalDateTime: String, + ) : HomeSideEffect } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffectHandler.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffectHandler.kt index 4ab55c8d..12913bfe 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffectHandler.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffectHandler.kt @@ -10,20 +10,24 @@ import team.noweekend.core.common.android.mvi.SideEffectHandler @Composable internal fun rememberHomeSideEffectHandler( navigateToCreateVacation: ((Intent.() -> Intent)?, ActivityResultLauncher?) -> Unit, + navigateToCalendar: (String) -> Unit, ): HomeSideEffectHandler { return remember { HomeSideEffectHandler( navigateToCreateVacation = navigateToCreateVacation, + navigateToCalendar = navigateToCalendar, ) } } internal class HomeSideEffectHandler( private val navigateToCreateVacation: ((Intent.() -> Intent)?, ActivityResultLauncher?) -> Unit, + private val navigateToCalendar: (String) -> Unit, ) : SideEffectHandler { override fun handleSideEffect(sideEffect: SideEffect) { when (sideEffect) { is HomeSideEffect.NavigateToCreateVacation -> navigateToCreateVacation(sideEffect.intentBuilder, null) + is HomeSideEffect.NavigateToCalendar -> navigateToCalendar(sideEffect.startLocalDateTime) } } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt index 0c739d4c..eec0dfb0 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeViewModel.kt @@ -245,7 +245,7 @@ class HomeViewModel @Inject constructor( createScheduleUseCase.invoke(param) .onSuccess { - + navigateToCalendar(param.startDateTime) } .onFailure { Log.d("logtag", "$it") @@ -262,6 +262,10 @@ class HomeViewModel @Inject constructor( ) } + private fun navigateToCalendar(startLocalDate: String) = execute { + postSideEffect(HomeSideEffect.NavigateToCalendar(startLocalDate)) + } + private fun updateCreateVacationStatus(status: CreateVacationStatus) { reduce { copy(createVacationStatus = status) } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/navigation/HomeNavigation.kt b/feature/home/src/main/java/team/noweekend/feature/home/navigation/HomeNavigation.kt index 4b91b392..21585053 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/navigation/HomeNavigation.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/navigation/HomeNavigation.kt @@ -9,10 +9,13 @@ import team.noweekend.feature.home.screen.HomeRoute fun NavGraphBuilder.homeNavGraph( navigateToCreateVacation: ((Intent.() -> Intent)?, ActivityResultLauncher?) -> Unit, + navigateToCalendar: (String) -> Unit, + ) { composable { HomeRoute( navigateToCreateVacation = navigateToCreateVacation, + navigateToCalendar = navigateToCalendar, ) } } diff --git a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt index b7a19d9e..6ef7a6da 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/screen/HomeRoute.kt @@ -22,6 +22,7 @@ import team.noweekend.feature.home.mvi.rememberHomeSideEffectHandler @Composable internal fun HomeRoute( navigateToCreateVacation: ((Intent.() -> Intent)?, ActivityResultLauncher?) -> Unit, + navigateToCalendar: (String) -> Unit, modifier: Modifier = Modifier, viewModel: HomeViewModel = hiltViewModel(), ) { @@ -42,6 +43,7 @@ internal fun HomeRoute( navigateToCreateVacation = { intentBuilder, _ -> navigateToCreateVacation(intentBuilder, createVacationLauncher) }, + navigateToCalendar = navigateToCalendar, ) LaunchedEffect(key1 = Unit) { diff --git a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt index 4dc159dd..4ce88714 100644 --- a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt +++ b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt @@ -5,11 +5,15 @@ import androidx.activity.result.ActivityResultLauncher import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost +import androidx.navigation.compose.rememberNavController +import kotlinx.serialization.InternalSerializationApi +import team.noweekend.core.navigator.model.Calendar import team.noweekend.feature.calendar.navigation.calendarNavGraph import team.noweekend.feature.home.navigation.homeNavGraph import team.noweekend.feature.main.navigation.MainNavigator import team.noweekend.feature.profile.navigation.profileNavGraph +@OptIn(InternalSerializationApi::class) @Composable internal fun MainNavHost( navigateToExternalWebBrowser: (String) -> Unit, @@ -19,6 +23,8 @@ internal fun MainNavHost( navigator: MainNavigator, modifier: Modifier = Modifier, ) { + val navController = rememberNavController() + NavHost( navController = navigator.navController, startDestination = navigator.startDestination, @@ -26,6 +32,9 @@ internal fun MainNavHost( ) { homeNavGraph( navigateToCreateVacation = navigateToCreateVacation, + navigateToCalendar = { date -> + navigator.navController.navigate(Calendar(date)) + }, ) calendarNavGraph( navigateToDetailDate = { dateString -> @@ -39,9 +48,9 @@ internal fun MainNavHost( navigateToAddTodo( { putExtra("type", "") - } + }, ) - } + }, ) profileNavGraph( navigateToExternalWebBrowser = navigateToExternalWebBrowser, diff --git a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt index 0da7d9cf..f2dad618 100644 --- a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt +++ b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt @@ -3,6 +3,7 @@ package team.noweekend.feature.main import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.runtime.Composable +import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.navigator.model.Calendar import team.noweekend.core.navigator.model.DestinationRoute import team.noweekend.core.navigator.model.Home @@ -22,11 +23,13 @@ internal enum class MainTab( unselectedIconResId = NWKDrawableResource.HomeOff, route = Home, ), + + @OptIn(InternalSerializationApi::class) CALENDAR( labelId = NWKStringResource.LabelCalendar, selectedIconResId = NWKDrawableResource.CalendarOn, unselectedIconResId = NWKDrawableResource.CalendarOff, - route = Calendar, + route = Calendar(), ), PROFILE( labelId = NWKStringResource.LabelProfile, diff --git a/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt b/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt index c62e5363..e3b3fa84 100644 --- a/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt +++ b/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt @@ -12,6 +12,7 @@ import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList +import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.navigator.model.Calendar import team.noweekend.core.navigator.model.DestinationRoute import team.noweekend.core.navigator.model.Home @@ -42,6 +43,7 @@ internal class MainNavigator( @Composable get() = navController.currentBackStackEntryAsState().value?.destination + @OptIn(InternalSerializationApi::class) fun navigate(tab: MainTab) { val navOptions = navOptions { popUpTo(navController.graph.findStartDestination().id) { From dfdbb673539547f41315858b2544fdbb37eac2d0 Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Fri, 18 Jul 2025 00:28:02 +0900 Subject: [PATCH 5/7] ktlint check --- .../system/core/component/bottomSheet/BottomSheetState.kt | 1 - .../system/core/component/bottomSheet/NWKBottomSheet.kt | 5 ++++- .../java/team/noweekend/feature/home/mvi/HomeSideEffect.kt | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/BottomSheetState.kt b/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/BottomSheetState.kt index a20427f9..ed5d69b8 100644 --- a/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/BottomSheetState.kt +++ b/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/BottomSheetState.kt @@ -1,6 +1,5 @@ package team.noweekend.core.design.system.core.component.bottomSheet -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.remember diff --git a/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/NWKBottomSheet.kt b/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/NWKBottomSheet.kt index a7969830..4c5711e4 100644 --- a/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/NWKBottomSheet.kt +++ b/core/design-system/src/main/kotlin/team/noweekend/core/design/system/core/component/bottomSheet/NWKBottomSheet.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width @@ -54,7 +55,9 @@ fun NWKBottomSheet( ) { Surface( - modifier = modifier.navigationBarsPadding(), + modifier = modifier + .navigationBarsPadding() + .imePadding(), color = containerColor, contentColor = contentColor, shape = RoundedCornerShape( diff --git a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt index 6747575d..f19ed657 100644 --- a/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt +++ b/feature/home/src/main/java/team/noweekend/feature/home/mvi/HomeSideEffect.kt @@ -1,7 +1,6 @@ package team.noweekend.feature.home.mvi import android.content.Intent -import kotlinx.datetime.LocalDate import team.noweekend.core.common.android.mvi.SideEffect sealed interface HomeSideEffect : SideEffect { From 02551cf7f08ba6f06a1c5f148a8344195d016ae1 Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Fri, 18 Jul 2025 00:40:57 +0900 Subject: [PATCH 6/7] =?UTF-8?q?compose=20lint=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/calendar/navigation/CalendarNavigation.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt b/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt index c1be2301..73530db7 100644 --- a/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt +++ b/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt @@ -1,18 +1,12 @@ package team.noweekend.feature.calendar.navigation import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavHostController import androidx.navigation.compose.composable import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.common.ui.todo.model.Todo import team.noweekend.core.navigator.model.Calendar import team.noweekend.feature.calendar.screen.CalendarRoute -@OptIn(InternalSerializationApi::class) -fun NavHostController.navigateToCalendar(date: String) { - navigate(Calendar) -} - @OptIn(InternalSerializationApi::class) fun NavGraphBuilder.calendarNavGraph( navigateToDetailDate: (String) -> Unit, From 9141412261a203f070cd8d0fc8d6590a16af1e97 Mon Sep 17 00:00:00 2001 From: JaesungLeee Date: Fri, 18 Jul 2025 00:50:10 +0900 Subject: [PATCH 7/7] =?UTF-8?q?compose=20lint=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../noweekend/core/navigator/model/DestinationRoute.kt | 7 +------ .../feature/calendar/navigation/CalendarNavigation.kt | 2 -- .../main/kotlin/team/noweekend/feature/main/MainNavHost.kt | 2 +- .../src/main/kotlin/team/noweekend/feature/main/MainTab.kt | 2 +- .../noweekend/feature/main/navigation/MainNavigator.kt | 2 +- 5 files changed, 4 insertions(+), 11 deletions(-) diff --git a/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt b/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt index 5f867c95..5a104bf9 100644 --- a/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt +++ b/core/navigator/src/main/java/team/noweekend/core/navigator/model/DestinationRoute.kt @@ -1,6 +1,5 @@ package team.noweekend.core.navigator.model -import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.Serializable import javax.annotation.concurrent.Immutable @@ -12,13 +11,9 @@ sealed interface DestinationRoute @Serializable data object Home : DestinationRoute -@InternalSerializationApi @Serializable -data class Calendar( - val date: String = "", -) : DestinationRoute +data object Calendar : DestinationRoute -@InternalSerializationApi @Immutable @Serializable data class DetailDate( diff --git a/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt b/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt index 73530db7..e18595f2 100644 --- a/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt +++ b/feature/calendar/src/main/kotlin/team/noweekend/feature/calendar/navigation/CalendarNavigation.kt @@ -2,12 +2,10 @@ package team.noweekend.feature.calendar.navigation import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import kotlinx.serialization.InternalSerializationApi import team.noweekend.core.common.ui.todo.model.Todo import team.noweekend.core.navigator.model.Calendar import team.noweekend.feature.calendar.screen.CalendarRoute -@OptIn(InternalSerializationApi::class) fun NavGraphBuilder.calendarNavGraph( navigateToDetailDate: (String) -> Unit, navigateToAddTodo: (Todo) -> Unit, diff --git a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt index 4ce88714..bae003f3 100644 --- a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt +++ b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainNavHost.kt @@ -33,7 +33,7 @@ internal fun MainNavHost( homeNavGraph( navigateToCreateVacation = navigateToCreateVacation, navigateToCalendar = { date -> - navigator.navController.navigate(Calendar(date)) + navigator.navController.navigate(Calendar) }, ) calendarNavGraph( diff --git a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt index f2dad618..6909df41 100644 --- a/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt +++ b/feature/main/src/main/kotlin/team/noweekend/feature/main/MainTab.kt @@ -29,7 +29,7 @@ internal enum class MainTab( labelId = NWKStringResource.LabelCalendar, selectedIconResId = NWKDrawableResource.CalendarOn, unselectedIconResId = NWKDrawableResource.CalendarOff, - route = Calendar(), + route = Calendar, ), PROFILE( labelId = NWKStringResource.LabelProfile, diff --git a/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt b/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt index e3b3fa84..f205583d 100644 --- a/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt +++ b/feature/main/src/main/kotlin/team/noweekend/feature/main/navigation/MainNavigator.kt @@ -43,7 +43,7 @@ internal class MainNavigator( @Composable get() = navController.currentBackStackEntryAsState().value?.destination - @OptIn(InternalSerializationApi::class) + @Suppress("WrongNavigateRouteType") fun navigate(tab: MainTab) { val navOptions = navOptions { popUpTo(navController.graph.findStartDestination().id) {