Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -54,7 +55,9 @@ fun NWKBottomSheet(
) {

Surface(
modifier = modifier.navigationBarsPadding(),
modifier = modifier
.navigationBarsPadding()
.imePadding(),
color = containerColor,
contentColor = contentColor,
shape = RoundedCornerShape(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ 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

@AndroidEntryPoint
class DetailDateActivity : ComponentActivity() {

@OptIn(InternalSerializationApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -29,6 +30,7 @@ class DetailDateViewModel @Inject constructor(
) : MVIViewModel<DetailDateIntent, DetailDateSideEffect, DetailDateUiState>(
savedStateHandle = savedStateHandle,
) {
@OptIn(InternalSerializationApi::class)
override fun createInitialState(savedStateHandle: SavedStateHandle): DetailDateUiState {
val date = savedStateHandle.toRoute<DetailDate>().date
val localDate = LocalDate.parseLocalDateString(date)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -29,7 +30,7 @@ internal fun TaskTitleBottomSheet(
bottomSheetType = BottomSheetType.UseButton(
bottomSheetTitle = "연차 제목을 작성하면\n할 일에 추가돼요",
bottomSheetButtonTitle = "추가하기",
onClickButton = {},
onClickButton = { onAddTaskClick(titleTextFieldState.text.toString()) },
),
isDraggable = false,
)
Expand Down Expand Up @@ -60,6 +61,7 @@ private fun TaskTitleBottomSheetPreview() {
NWKScaffold {
TaskTitleBottomSheet(
onBottomSheetDismiss = {},
onAddTaskClick = {},
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,18 @@ import team.noweekend.feature.home.model.HolidayUiModel

internal fun LazyListScope.holidayRecommend(
holidays: ImmutableList<HolidayUiModel>,
onHolidayCardClick: () -> Unit,
onHolidayCardClick: (HolidayUiModel) -> Unit,
) = item {
HolidayRecommendComponent(
holidays = holidays,
onHolidayCardClick = onHolidayCardClick,
onHolidayCardClick = { onHolidayCardClick(it) },
)
}

@Composable
internal fun HolidayRecommendComponent(
holidays: ImmutableList<HolidayUiModel>,
onHolidayCardClick: () -> Unit,
onHolidayCardClick: (HolidayUiModel) -> Unit,
modifier: Modifier = Modifier,
) {
Column(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import team.noweekend.feature.home.model.HolidayUiModel
@Composable
internal fun HolidayRecommendCarousel(
holidays: ImmutableList<HolidayUiModel>,
onCardClick: () -> Unit,
onCardClick: (HolidayUiModel) -> Unit,
modifier: Modifier = Modifier,
) {
val pagerState = rememberPagerState(pageCount = { holidays.size })
Expand All @@ -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,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import team.noweekend.feature.home.model.PopularVacationUiModel.Companion.getSty

internal fun LazyListScope.popularVacationRecommend(
popularVacations: ImmutableList<PopularVacationUiModel>,
onPopularVacationClick: () -> Unit,
onPopularVacationClick: (PopularVacationUiModel) -> Unit,
modifier: Modifier = Modifier,
) = item {
PopularVacationRecommendComponent(
Expand All @@ -37,7 +37,7 @@ internal fun LazyListScope.popularVacationRecommend(
@Composable
internal fun PopularVacationRecommendComponent(
popularVacations: ImmutableList<PopularVacationUiModel>,
onPopularVacationClick: () -> Unit,
onPopularVacationClick: (PopularVacationUiModel) -> Unit,
modifier: Modifier = Modifier,
) {
Column(
Expand Down Expand Up @@ -74,7 +74,7 @@ private fun PopularVacationRecommendHeader(
@Composable
private fun PopularVacationRecommendContent(
popularVacations: ImmutableList<PopularVacationUiModel>,
onPopularVacationClick: () -> Unit,
onPopularVacationClick: (PopularVacationUiModel) -> Unit,
modifier: Modifier = Modifier,
) {
val height: Dp = if (popularVacations.size > 2) 500.dp else 250.dp
Expand All @@ -93,7 +93,7 @@ private fun PopularVacationRecommendContent(
date = it.displayDate,
drawableResId = it.imageResourceId,
description = it.vacationType.getStyledDescription(),
onCardClick = onPopularVacationClick,
onCardClick = { onPopularVacationClick(it) },
)
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ internal fun LazyListScope.monthlyVacationRecommendComponent(
recommends: ImmutableList<MonthlyVacationRecommendUiModel>,
calendarData: ImmutableMap<Int, CalendarWeeksData>,
selectedDate: LocalDate,
onRecommendedVacationClick: () -> Unit,
onRecommendedVacationClick: (MonthlyVacationRecommendUiModel) -> Unit,
modifier: Modifier = Modifier,
) = item {
MonthlyVacationRecommendComponent(
Expand All @@ -55,7 +55,7 @@ internal fun MonthlyVacationRecommendComponent(
recommends: ImmutableList<MonthlyVacationRecommendUiModel>,
calendarData: ImmutableMap<Int, CalendarWeeksData>,
selectedDate: LocalDate,
onRecommendedVacationClick: () -> Unit,
onRecommendedVacationClick: (MonthlyVacationRecommendUiModel) -> Unit,
modifier: Modifier = Modifier,
calendarPagerState: CalendarPagerState = rememberCalendarPagerState(),
) {
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "현충일",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,32 @@
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(
val a: String,
) : HomeIntent

data object ClickCreateVacation : HomeIntent
data object ClickHolidayVacationCard : HomeIntent
data object ClickRecommendationVacationCard : HomeIntent
data object ClickPopularVacationClick : HomeIntent
data class ClickHolidayVacationCard(
val holiday: HolidayUiModel,
) : 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,
) : BottomSheet

data object DismissTaskTitleBottomSheet : BottomSheet
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@ sealed interface HomeSideEffect : SideEffect {
data class NavigateToCreateVacation(
val intentBuilder: (Intent.() -> Intent)?,
) : HomeSideEffect

data class NavigateToCalendar(
val startLocalDateTime: String,
) : HomeSideEffect
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,24 @@ import team.noweekend.core.common.android.mvi.SideEffectHandler
@Composable
internal fun rememberHomeSideEffectHandler(
navigateToCreateVacation: ((Intent.() -> Intent)?, ActivityResultLauncher<Intent>?) -> Unit,
navigateToCalendar: (String) -> Unit,
): HomeSideEffectHandler {
return remember {
HomeSideEffectHandler(
navigateToCreateVacation = navigateToCreateVacation,
navigateToCalendar = navigateToCalendar,
)
}
}

internal class HomeSideEffectHandler(
private val navigateToCreateVacation: ((Intent.() -> Intent)?, ActivityResultLauncher<Intent>?) -> Unit,
private val navigateToCalendar: (String) -> Unit,
) : SideEffectHandler<SideEffect> {
override fun handleSideEffect(sideEffect: SideEffect) {
when (sideEffect) {
is HomeSideEffect.NavigateToCreateVacation -> navigateToCreateVacation(sideEffect.intentBuilder, null)
is HomeSideEffect.NavigateToCalendar -> navigateToCalendar(sideEffect.startLocalDateTime)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -27,12 +27,19 @@ data class HomeUiState(
val popularVacations: ImmutableList<PopularVacationUiModel>,
val calendarData: ImmutableMap<Int, CalendarWeeksData>,
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,
Expand All @@ -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] : 기본 상태
Expand Down
Loading