Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature][Fix] 타임 피커에서 미래시간을 선택하지 못하게 합니다. + AM, PM 하드코딩을 변경합니다. #60

Merged
merged 4 commits into from
Sep 4, 2024
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
Expand Up @@ -92,21 +92,34 @@ fun HY2TimePicker(
.wrapContentHeight()
.background(Gray800, RoundedCornerShape(DIALOG_CORNER_RADIUS.dp)),
) {
val hours: List<String> =
val meridiem: List<String> =
Copy link
Contributor

Choose a reason for hiding this comment

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

이게 정오라는 뜻이였군요!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

정오가 아니라 AM, PM 이런게 영어로 저겁니다!

Copy link
Contributor

@librarywon librarywon Sep 4, 2024

Choose a reason for hiding this comment

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

엥 번역기에서는 정오라는 뜻이던데 아니였군요.. 어쩐지 리스트더라

remember {
(1..12).map { String.format(Locale.KOREA, TIME_PICKER_NUMBER_FORMAT, it) }
if (localtime.hour < 12) listOf("AM") else listOf("AM", "PM")
}
val meridiemState: PickerState =
rememberPickerState(if (localtime.hour < 12) "AM" else "PM")

val hours: List<String> =
when {
// 12pm -> 12 pm O && 1 ~ 12 am O
localtime.hour == 12 && meridiemState.selectedItem == "AM" -> 1..12
localtime.hour == 12 && meridiemState.selectedItem == "PM" -> 12..12

// 오전
localtime.hour < 12 -> (1..localtime.hour) + 12

// 오후
localtime.hour > 12 && meridiemState.selectedItem == "AM" -> 1..12
localtime.hour > 12 && meridiemState.selectedItem == "PM" -> listOf(12) + (1..(localtime.hour % 12))
else -> 1..12
}.map { String.format(Locale.KOREA, TIME_PICKER_NUMBER_FORMAT, it) }

val hourState: PickerState = rememberPickerState()
val minutes: List<String> =
remember {
(0..59).map { String.format(Locale.KOREA, TIME_PICKER_NUMBER_FORMAT, it) }
}
val minuteState: PickerState = rememberPickerState()
val meridiem: List<String> =
remember {
listOf("AM", "PM")
}
val meridiemState: PickerState = rememberPickerState()

Spacer(modifier = Modifier.height(40.dp))
Text(
Expand All @@ -125,13 +138,13 @@ fun HY2TimePicker(
Picker(
state = hourState,
items = hours,
visibleItemsCount = 3,
visibleItemsCount = if (hours.size == 1) 1 else 3,
startIndex =
hours.indexOf(
String.format(
Locale.KOREA,
TIME_PICKER_NUMBER_FORMAT,
((localtime.hour) % 12),
if (localtime.hour % 12 == 0) 12 else localtime.hour % 12,
),
),
modifier = Modifier.weight(0.33f),
Expand All @@ -146,15 +159,22 @@ fun HY2TimePicker(
state = minuteState,
items = minutes,
visibleItemsCount = 3,
startIndex = minutes.indexOf(localtime.minute.toString()),
startIndex =
minutes.indexOf(
String.format(
Locale.KOREA,
TIME_PICKER_NUMBER_FORMAT,
localtime.minute,
),
),
modifier = Modifier.weight(0.33f),
textModifier = Modifier.padding(8.dp),
)
Picker(
state = meridiemState,
items = meridiem,
visibleItemsCount = 3,
startIndex = if (localtime.hour <= 12) 0 else 1,
visibleItemsCount = if (localtime.hour < 12) 1 else 3,
startIndex = if (localtime.hour < 12) 0 else 1,
modifier = Modifier.weight(0.33f),
textModifier = Modifier.padding(8.dp),
)
Expand All @@ -179,9 +199,14 @@ fun HY2TimePicker(
onClick = {
onSelected(
LocalTime.of(
hourState.selectedItem.toInt() % 12,
if (meridiemState.selectedItem == "AM" && hourState.selectedItem == "12") {
0
} else {
hourState.selectedItem.toInt()
},
minuteState.selectedItem.toInt(),
).plusHours(if (meridiemState.selectedItem == "AM") 0L else 12L),
)
.plusHours(if (meridiemState.selectedItem == "AM" || hourState.selectedItem == "12") 0L else 12L),
)
},
buttonColor = Blue100,
Expand Down Expand Up @@ -231,7 +256,9 @@ fun Picker(
snapshotFlow { listState.firstVisibleItemIndex }
.map { index -> getItem(index + visibleItemsMiddle) }
.distinctUntilChanged()
.collect { item -> state.selectedItem = item }
.collect { item ->
state.selectedItem = item
}
}

Box(modifier = modifier) {
Expand Down Expand Up @@ -270,10 +297,10 @@ private fun Modifier.fadingEdge(brush: Brush) =
}

@Composable
fun rememberPickerState() = remember { PickerState() }
fun rememberPickerState(initValue: String = "") = remember { PickerState(initValue) }

class PickerState {
var selectedItem by mutableStateOf("")
class PickerState(initValue: String) {
var selectedItem by mutableStateOf(initValue)
}

@Preview
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class DefaultStudyDayRepository
startTime: String,
) {
val now = LocalDateTime.now()
var startTimeParsed = LocalDateTime.of(now.toLocalDate(), LocalTime.parse(startTime))
var startTimeParsed = LocalDateTime.of(now.toLocalDate(), LocalTime.parse(startTime, dateTimeFormatter))

if (startTimeParsed.isAfter(now)) {
startTimeParsed = startTimeParsed.minusDays(1)
Expand Down Expand Up @@ -119,5 +119,6 @@ class DefaultStudyDayRepository
private const val STUDY_SECOND_DURATION_FIELD = "studySecondDuration"
private const val TOTAL_MONTH_STUDY_TIME_FIELD = "totalMonthStudyTime"
private const val TOTAL_STUDY_TIME_FIELD = "totalStudyTime"
private val dateTimeFormatter = DateTimeFormatter.ofPattern("H:mm")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,8 @@ private fun MainBody(
RunningTimerComponent(
startTime = uiState.startTime,
endTime = uiState.endTime,
startTimeMeridiem = uiState.startTimeMeridiem,
endTimeMeridiem = uiState.endTimeMeridiem,
leftTime = uiState.leftTime,
starCount = uiState.starCount,
onStudyRoomExtendClick = onStudyRoomExtendClick,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ class MainViewModel
startTime = timerState.startTime,
endTime = timerState.endTime,
leftTime = timerState.leftTime,
startTimeMeridiem = timerState.startTimeMeridiem,
endTimeMeridiem = timerState.endTimeMeridiem,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import com.teamhy2.hongikyeolgong2.timer.prsentation.HY2Timer
fun RunningTimerComponent(
startTime: String,
endTime: String,
startTimeMeridiem: String,
endTimeMeridiem: String,
leftTime: String,
starCount: Int,
onStudyRoomExtendClick: () -> Unit,
Expand All @@ -40,6 +42,8 @@ fun RunningTimerComponent(
leftTime = leftTime,
startTime = startTime,
endTime = endTime,
startTimeMeridiem = startTimeMeridiem,
endTimeMeridiem = endTimeMeridiem,
)
StarsComponent(
starCount = starCount,
Expand Down Expand Up @@ -72,6 +76,8 @@ fun TimerScreenPreview_LessThanExtendThreshold() {
RunningTimerComponent(
startTime = "11:30",
endTime = "12:00",
startTimeMeridiem = "AM",
endTimeMeridiem = "PM",
leftTime = "00:14:03",
starCount = 0,
onStudyRoomExtendClick = { },
Expand All @@ -88,6 +94,8 @@ fun TimerScreenPreview_MoreThanExtendThreshold() {
RunningTimerComponent(
startTime = "11:30",
endTime = "12:00",
startTimeMeridiem = "AM",
endTimeMeridiem = "PM",
leftTime = "00:45:00",
starCount = 0,
onStudyRoomExtendClick = { },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ data class MainUiState(
val selectedTime: LocalTime = LocalTime.now(),
val calendar: Calendar = Calendar(studyDays = emptyList()),
val startTime: String = "",
val startTimeMeridiem: String = "",
val endTime: String = "",
val endTimeMeridiem: String = "",
val leftTime: String = "",
val starCount: Int = 0,
)
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,32 @@ class Timer(
)

val formattedStartTime: String
get() = startTime.toString()
get() =
if (startTime.hour >= 12) {
startTime.toString().replace(
startTime.hour.toString(),
(startTime.hour - 12).toString(),
)
} else {
startTime.toString()
}

val formattedEndTime: String
get() = endTime.toString()
get() =
if (endTime.hour >= 12) {
endTime.toString().replace(
endTime.hour.toString(),
(endTime.hour - 12).toString(),
)
} else {
endTime.toString()
}

val formattedStartTimeMeridiem: String
get() = if (startTime.hour >= 12) "PM" else "AM"

val formattedEndTimeMeridiem: String
get() = if (endTime.hour >= 12) "PM" else "AM"

private val leftSeconds: Long
get() = leftTime.seconds
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,19 @@ fun HY2Timer(
leftTime: String,
startTime: String,
endTime: String,
startTimeMeridiem: String,
endTimeMeridiem: String,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier.fillMaxWidth(),
) {
StartEndSection(startTime = startTime, endTime = endTime)
StartEndSection(
startTime = startTime,
endTime = endTime,
startTimeMeridiem = startTimeMeridiem,
endTimeMeridiem = endTimeMeridiem,
)
Spacer(modifier = Modifier.height(32.dp))
TimeLeftSection(leftTime = leftTime)
}
Expand All @@ -46,6 +53,8 @@ fun HY2Timer(
fun StartEndSection(
startTime: String,
endTime: String,
startTimeMeridiem: String,
endTimeMeridiem: String,
modifier: Modifier = Modifier,
) {
Column(modifier = modifier) {
Expand Down Expand Up @@ -85,7 +94,7 @@ fun StartEndSection(
)
Spacer(modifier = Modifier.width(6.dp))
Text(
text = stringResource(id = R.string.timer_am),
text = stringResource(id = if (startTimeMeridiem == "AM") R.string.timer_am else R.string.timer_pm),
style = HY2Theme.typography.body03,
color = Gray100,
modifier =
Expand All @@ -101,7 +110,7 @@ fun StartEndSection(
)
Spacer(modifier = Modifier.width(4.dp))
Text(
text = stringResource(id = R.string.timer_pm),
text = stringResource(id = if (endTimeMeridiem == "AM") R.string.timer_am else R.string.timer_pm),
style = HY2Theme.typography.body03,
color = Gray100,
modifier =
Expand Down Expand Up @@ -160,6 +169,8 @@ private fun HY2TimerPreview() {
leftTime = leftTime,
startTime = startTime,
endTime = endTime,
startTimeMeridiem = "AM",
endTimeMeridiem = "PM",
modifier = Modifier.background(Black),
)
}
Expand All @@ -175,6 +186,8 @@ private fun StartEndSectionPreview() {
StartEndSection(
startTime = startTime,
endTime = endTime,
startTimeMeridiem = "AM",
endTimeMeridiem = "PM",
modifier =
Modifier
.background(Black)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ class TimerViewModel
_timerState.value =
TimerUiModel(
startTime = timer.formattedStartTime,
startTimeMeridiem = timer.formattedStartTimeMeridiem,
endTime = timer.formattedEndTime,
endTimeMeridiem = timer.formattedEndTimeMeridiem,
leftTime = timer.formattedLeftTime,
isRunning = true,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.teamhy2.hongikyeolgong2.timer.prsentation.model

data class TimerUiModel(
val startTime: String = "",
val startTimeMeridiem: String = "",
val endTime: String = "",
val endTimeMeridiem: String = "",
val leftTime: String = "",
val isRunning: Boolean = false,
)
Loading