Skip to content

Commit 3611c3d

Browse files
committed
[NDGL-63] feature: 여행 시작 시간을 기본 시간 08:00로 설정
1 parent db71033 commit 3611c3d

6 files changed

Lines changed: 63 additions & 29 deletions

File tree

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ data class TravelDetailState(
2323
val showDeleteModal: Boolean = false,
2424
val showCancelEditModal: Boolean = false,
2525
val showTimelineBottomSheet: Boolean = false,
26-
val startTime: Duration = 0.hours,
27-
val endTime: Duration = 0.hours,
26+
val startTime: Duration? = null,
27+
val endTime: Duration? = null,
2828
val selectedPlace: TravelPlace? = null,
2929
val showPlaceBottomSheet: Boolean = false,
3030
val showTimeBottomSheet: Boolean = false,
@@ -87,7 +87,7 @@ data class TravelPlace(
8787
val googleMapsUri: String,
8888
val placeType: PlaceType,
8989
val userData: UserData = UserData(),
90-
val startTime: Duration? = null,
90+
val startTime: Duration,
9191
) {
9292
val duration: Duration
9393
get() = userData.estimatedDuration

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailScreen.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ private fun TravelDetailScreen(
434434
showDragHandle = false,
435435
) {
436436
TimelineContent(
437-
startTime = state.startTime,
437+
startTime = state.startTime ?: 8.hours,
438438
totalDuration = state.itineraries.getOrNull(state.selectedDay - 1)?.totalDuration ?: 0.hours,
439439
onDismissRequest = dismissTimelineBottomSheet,
440440
onConfirm = confirmTimelineSetting,
@@ -471,7 +471,7 @@ private fun TravelDetailScreen(
471471
}
472472

473473
if (state.showCostModal && state.selectedPlace != null) {
474-
var cost by remember { mutableStateOf(state.selectedPlace.userData?.cost?.toString() ?: "") }
474+
var cost by remember { mutableStateOf(state.selectedPlace.userData.cost?.toString() ?: "") }
475475

476476
NDGLInputModal(
477477
onDismissRequest = dismissCostModal,
@@ -501,7 +501,7 @@ private fun TravelDetailScreen(
501501
}
502502

503503
if (state.showMemoModal && state.selectedPlace != null) {
504-
var memo by remember { mutableStateOf(state.selectedPlace.userData?.memo ?: "") }
504+
var memo by remember { mutableStateOf(state.selectedPlace.userData.memo ?: "") }
505505

506506
NDGLInputModal(
507507
onDismissRequest = dismissMemoModal,
@@ -566,6 +566,7 @@ private fun TravelDetailScreenPreview() {
566566
googleMapsUri = "",
567567
placeType = PlaceType.ATTRACTION,
568568
userData = TravelPlace.UserData(estimatedDuration = 90.minutes),
569+
startTime = 0.hours,
569570
),
570571
TravelPlace(
571572
id = 2,
@@ -580,6 +581,7 @@ private fun TravelDetailScreenPreview() {
580581
googleMapsUri = "",
581582
placeType = PlaceType.RESTAURANT,
582583
userData = TravelPlace.UserData(estimatedDuration = 60.minutes),
584+
startTime = 0.hours,
583585
),
584586
),
585587
transportSegments = listOf(
@@ -668,6 +670,7 @@ private fun TravelDetailScreenEditModePreview() {
668670
googleMapsUri = "",
669671
placeType = PlaceType.ATTRACTION,
670672
userData = TravelPlace.UserData(estimatedDuration = 90.minutes),
673+
startTime = 0.hours,
671674
),
672675
TravelPlace(
673676
id = 2,
@@ -681,7 +684,7 @@ private fun TravelDetailScreenEditModePreview() {
681684
regularOpeningHours = "11:00~22:00",
682685
googleMapsUri = "",
683686
placeType = PlaceType.RESTAURANT,
684-
userData = TravelPlace.UserData(estimatedDuration = 60.minutes),
687+
userData = TravelPlace.UserData(estimatedDuration = 60.minutes), startTime = 0.hours,
685688
),
686689
),
687690
transportSegments = listOf(

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,24 @@ class TravelDetailViewModel @AssistedInject constructor(
2323
) {
2424
init {
2525
loadTravelData()
26+
applyDefaultStartTime()
27+
}
28+
29+
private fun applyDefaultStartTime() {
30+
reduce {
31+
val baseTime = startTime ?: DEFAULT_START_TIME.hours
32+
val updatedItineraries = itineraries.map { itinerary ->
33+
itinerary.copy(
34+
places = calculatePlaceStartTimes(itinerary.places, itinerary.transportSegments, baseTime),
35+
)
36+
}
37+
val totalDuration = updatedItineraries.getOrNull(selectedDay - 1)?.totalDuration ?: 0.hours
38+
copy(
39+
itineraries = updatedItineraries,
40+
tempItineraries = updatedItineraries,
41+
endTime = if (startTime != null) baseTime + totalDuration else endTime,
42+
)
43+
}
2644
}
2745

2846
private fun loadTravelData() {
@@ -44,6 +62,7 @@ class TravelDetailViewModel @AssistedInject constructor(
4462
googleMapsUri = "",
4563
placeType = PlaceType.ATTRACTION,
4664
userData = TravelPlace.UserData(estimatedDuration = 90.minutes),
65+
startTime = 0.hours,
4766
),
4867
TravelPlace(
4968
id = 2,
@@ -58,6 +77,7 @@ class TravelDetailViewModel @AssistedInject constructor(
5877
googleMapsUri = "",
5978
placeType = PlaceType.RESTAURANT,
6079
userData = TravelPlace.UserData(estimatedDuration = 60.minutes),
80+
startTime = 0.hours,
6181
),
6282
TravelPlace(
6383
id = 3,
@@ -72,6 +92,7 @@ class TravelDetailViewModel @AssistedInject constructor(
7292
googleMapsUri = "",
7393
placeType = PlaceType.ACCOMMODATION,
7494
userData = TravelPlace.UserData(estimatedDuration = 120.minutes),
95+
startTime = 0.hours,
7596
),
7697
TravelPlace(
7798
id = 4,
@@ -86,6 +107,7 @@ class TravelDetailViewModel @AssistedInject constructor(
86107
googleMapsUri = "",
87108
placeType = PlaceType.RESTAURANT,
88109
userData = TravelPlace.UserData(estimatedDuration = 90.minutes),
110+
startTime = 0.hours,
89111
),
90112
),
91113
transportSegments = listOf(
@@ -110,6 +132,7 @@ class TravelDetailViewModel @AssistedInject constructor(
110132
googleMapsUri = "",
111133
placeType = PlaceType.ATTRACTION,
112134
userData = TravelPlace.UserData(estimatedDuration = 90.minutes),
135+
startTime = 0.hours,
113136
),
114137
TravelPlace(
115138
id = 9,
@@ -124,6 +147,7 @@ class TravelDetailViewModel @AssistedInject constructor(
124147
googleMapsUri = "",
125148
placeType = PlaceType.CAFE,
126149
userData = TravelPlace.UserData(estimatedDuration = 45.minutes),
150+
startTime = 0.hours,
127151
),
128152
),
129153
transportSegments = listOf(
@@ -440,20 +464,17 @@ class TravelDetailViewModel @AssistedInject constructor(
440464
place
441465
}
442466
}
443-
val firstPlaceStartTime = durationUpdatedPlaces.firstOrNull()?.startTime
444-
val recalculatedPlaces = if (firstPlaceStartTime != null) {
467+
val firstPlaceStartTime = durationUpdatedPlaces.firstOrNull()?.startTime ?: DEFAULT_START_TIME.hours
468+
val recalculatedPlaces =
445469
calculatePlaceStartTimes(durationUpdatedPlaces, itinerary.transportSegments, firstPlaceStartTime)
446-
} else {
447-
durationUpdatedPlaces
448-
}
449470
updatedPlace = recalculatedPlaces.find { it.id == selectedPlace?.id }
450471
itinerary.copy(places = recalculatedPlaces)
451472
}
452473
val totalDuration = updatedItineraries.getOrNull(selectedDay - 1)?.totalDuration ?: 0.hours
453474
copy(
454475
itineraries = updatedItineraries,
455476
selectedPlace = updatedPlace,
456-
endTime = startTime + totalDuration,
477+
endTime = (startTime ?: DEFAULT_START_TIME.hours) + totalDuration,
457478
showTimeBottomSheet = false,
458479
)
459480
}
@@ -535,4 +556,8 @@ class TravelDetailViewModel @AssistedInject constructor(
535556
interface Factory {
536557
fun create(travelId: Int): TravelDetailViewModel
537558
}
559+
560+
companion object {
561+
private const val DEFAULT_START_TIME = 8
562+
}
538563
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/component/PlaceBottomSheet.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ private fun PlaceBottomSheetPreview() {
257257
cost = 20000,
258258
estimatedDuration = 1.hours,
259259
),
260+
startTime = 8.hours,
260261
)
261262

262263
NDGLTheme {

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/component/PlaceItem.kt

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import com.yapp.ndgl.feature.travel.traveldetail.TravelPlace
4646
import com.yapp.ndgl.feature.travel.traveldetail.getColor
4747
import java.util.Locale
4848
import kotlin.time.Duration
49+
import kotlin.time.Duration.Companion.hours
4950
import kotlin.time.Duration.Companion.minutes
5051

5152
@Composable
@@ -120,10 +121,14 @@ internal fun EditablePlaceItem(
120121
@Composable
121122
private fun PlaceNumber(
122123
number: Int,
123-
startTime: Duration? = null,
124+
startTime: Duration,
124125
placeType: PlaceType,
125126
) {
126-
Column(modifier = Modifier.wrapContentWidth(), verticalArrangement = Arrangement.spacedBy(4.dp)) {
127+
Column(
128+
modifier = Modifier.wrapContentWidth(),
129+
verticalArrangement = Arrangement.spacedBy(4.dp),
130+
horizontalAlignment = Alignment.CenterHorizontally,
131+
) {
127132
Box(
128133
contentAlignment = Alignment.Center,
129134
modifier = Modifier
@@ -138,16 +143,14 @@ private fun PlaceNumber(
138143
)
139144
}
140145

141-
if (startTime != null) {
142-
val totalMinutes = startTime.inWholeMinutes
143-
val hours = totalMinutes / 60
144-
val minutes = totalMinutes % 60
145-
Text(
146-
text = String.format(Locale.getDefault(), "%02d:%02d", hours, minutes),
147-
style = NDGLTheme.typography.bodySmSemiBold,
148-
color = NDGLTheme.colors.black500,
149-
)
150-
}
146+
val totalMinutes = startTime.inWholeMinutes
147+
val hours = totalMinutes / 60
148+
val minutes = totalMinutes % 60
149+
Text(
150+
text = String.format(Locale.getDefault(), "%02d:%02d", hours, minutes),
151+
style = NDGLTheme.typography.bodySmSemiBold,
152+
color = NDGLTheme.colors.black500,
153+
)
151154
}
152155
}
153156

@@ -231,6 +234,7 @@ private fun PlaceItemPreview() {
231234
googleMapsUri = "",
232235
placeType = PlaceType.ATTRACTION,
233236
userData = TravelPlace.UserData(estimatedDuration = 60.minutes),
237+
startTime = 10.hours,
234238
),
235239
onClick = {},
236240
onLongClick = {},
@@ -256,6 +260,7 @@ private fun EditablePlaceItemUncheckedPreview() {
256260
googleMapsUri = "",
257261
placeType = PlaceType.ATTRACTION,
258262
userData = TravelPlace.UserData(estimatedDuration = 60.minutes),
263+
startTime = 12.hours,
259264
),
260265
checked = false,
261266
onCheck = {},
@@ -281,6 +286,7 @@ private fun EditablePlaceItemCheckedPreview() {
281286
googleMapsUri = "",
282287
placeType = PlaceType.ATTRACTION,
283288
userData = TravelPlace.UserData(estimatedDuration = 60.minutes),
289+
startTime = 12.hours,
284290
),
285291
checked = true,
286292
onCheck = {},

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/component/TravelDetailToolBar.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@ import com.yapp.ndgl.core.ui.theme.NDGLTheme
2020
import com.yapp.ndgl.core.ui.util.noRippleClickable
2121
import com.yapp.ndgl.core.util.toAmPmTimeString
2222
import kotlin.time.Duration
23-
import kotlin.time.Duration.Companion.hours
2423

2524
@Composable
2625
internal fun TravelDetailToolBar(
27-
startTime: Duration,
26+
startTime: Duration? = null,
2827
clickStartTimeSetting: () -> Unit,
2928
clickEditTravel: () -> Unit,
3029
) {
@@ -41,10 +40,10 @@ internal fun TravelDetailToolBar(
4140

4241
@Composable
4342
private fun StartTimeSettingButton(
44-
startTime: Duration,
43+
startTime: Duration? = null,
4544
onClick: () -> Unit,
4645
) {
47-
val buttonText = if (startTime > 0.hours) {
46+
val buttonText = if (startTime != null) {
4847
"${startTime.toAmPmTimeString()} ${stringResource(R.string.schedule_start)}"
4948
} else {
5049
stringResource(R.string.start_time_setting)

0 commit comments

Comments
 (0)