Skip to content

[Feat/#4] 홈 UI 구현#26

Open
yeonjeen wants to merge 14 commits intodevelopfrom
feat/#4
Open

[Feat/#4] 홈 UI 구현#26
yeonjeen wants to merge 14 commits intodevelopfrom
feat/#4

Conversation

@yeonjeen
Copy link
Member

@yeonjeen yeonjeen commented Feb 15, 2026

Related issue 🛠

Work Description ✏️

  • 홈 화면 네비게이션 구조 구현 (BeforeWork, Working, AfterWork)
  • 근무 전 화면: 자동 출근, 쉬는 날/휴가 출근 기능
  • 근무 중 화면: 실시간 급여 롤링 애니메이션, 코인 프로그레스, 근무 완료 UI
  • 퇴근 화면: 날짜 변경 시 자동 이동, Confetti 애니메이션
  • 공통 컴포넌트 추가 (MoaDateLocationBar, MoaTooltipBanner, MoaHomeTopBar)
  • 바텀시트 컴포넌트 추가 (MoaScheduleAdjustBottomSheet, MoaEndTimeBottomSheet)
  • MoaTimeBottomSheet에 endTimeOnly 모드 추가
  • MoaButton에 MoaSecondaryButton 추가

Screenshot 📸

1000000326.mp4

Uncompleted Tasks 😅

To Reviewers 📢

테스트 과정을 위해서 기존 30분 단위로 프로그레스바가 늘어나는 구조인데 1분으로 단축해놨습니다! 릴리즈 전에 해당 부분 수정하겠습니다!

@yeonjeen yeonjeen requested a review from koreatlwls February 15, 2026 14:01
@yeonjeen yeonjeen self-assigned this Feb 15, 2026
@yeonjeen yeonjeen changed the title Feat/#4 [Feat/#4] 홈 UI 구현 Feb 15, 2026
Comment on lines +30 to +40
fun MoaEndTimeBottomSheet(
title: String,
startHour: Int,
startMinute: Int,
initialEndHour: Int,
initialEndMinute: Int,
leftButtonText: String? = null,
onLeftButtonClick: (() -> Unit)? = null,
onDismissRequest: () -> Unit,
onConfirm: (hour: Int, minute: Int) -> Unit,
) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MoaTimeBottomSheet로 대체가 안되는 BottomSheet일려나?

horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(
text = stringResource(R.string.after_work_clock_out),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

string resource화 했네 귀찮아서 안하긴했는데 굿굿

Comment on lines +63 to +85
ScheduleOptionItem(
text = stringResource(R.string.schedule_adjust_option_vacation),
isSelected = selectedOption == ScheduleAdjustOption.VACATION,
onClick = { selectedOption = ScheduleAdjustOption.VACATION },
)

Spacer(Modifier.height(MoaTheme.spacing.spacing12))

// 옵션 2: 오늘 근무를 마칠 거예요
ScheduleOptionItem(
text = stringResource(R.string.schedule_adjust_option_end_work),
isSelected = selectedOption == ScheduleAdjustOption.END_WORK,
onClick = { selectedOption = ScheduleAdjustOption.END_WORK },
)

Spacer(Modifier.height(MoaTheme.spacing.spacing12))

// 옵션 3: 근무 시간 조정이 필요해요
ScheduleOptionItem(
text = stringResource(R.string.schedule_adjust_option_adjust_time),
isSelected = selectedOption == ScheduleAdjustOption.ADJUST_TIME,
onClick = { selectedOption = ScheduleAdjustOption.ADJUST_TIME },
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ScheduledAdjustOption.entries.forEach {}
이렇게 대체할 수 있을듯?

sealed interface MoaSideEffect {
@JvmInline
value class Navigate(val destination: RootNavigation) : MoaSideEffect
value class Navigate(val destination: NavKey) : MoaSideEffect
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 바꾼 이유가 있을까

Comment on lines +6 to +33
sealed interface HomeNavigation : NavKey {
@Serializable
data class BeforeWork(
val todayEarnedSalary: Long? = null,
) : HomeNavigation

@Serializable
data class Working(
val startHour: Int,
val startMinute: Int,
val endHour: Int,
val endMinute: Int,
val isOnVacation: Boolean = false,
val isWorkDay: Boolean = true,
) : HomeNavigation

@Serializable
data class AfterWork(
val todayEarnedSalary: Long,
val startHour: Int,
val startMinute: Int,
val endHour: Int,
val endMinute: Int,
val isOnVacation: Boolean = false,
) : HomeNavigation

data object Back : HomeNavigation
} No newline at end of file
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

나는 그냥 RootNavigation 상속으로 하긴했는데

Comment on lines +3 to +13
sealed interface AfterWorkIntent {
data object ClickCheckWorkHistory : AfterWorkIntent
data object ClickMoreWork : AfterWorkIntent
data object ClickComplete : AfterWorkIntent
data object DismissMoreWorkBottomSheet : AfterWorkIntent
data object DismissConfetti : AfterWorkIntent
data class ConfirmMoreWork(
val endHour: Int,
val endMinute: Int,
) : AfterWorkIntent
} No newline at end of file
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intent 그냥 Screen 밑에 넣어놨는데
나는 약간 파일 많아 지는거 같은 느낌

import java.util.Locale

@Stable
data class AfterWorkUiState(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이것도 viewmodel 최상단에 보통 선언하긴했는데 따로 파일 안놔두고

Comment on lines +30 to +33
@AssistedFactory
interface Factory {
fun create(args: HomeNavigation.AfterWork): AfterWorkViewModel
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이친구는 최하단으로 뺴도 될듯?

}

private fun onDismissConfetti() {
_uiState.update { it.copy(showConfetti = false) }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

value vs update
update가 필요한 상황인지 한번 생각해보면 좋을듯

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 홈 UI 구현

2 participants