Skip to content

Commit e19aca6

Browse files
committed
Feat: 당일 모든 달성 시 완료 표시 기능 구현
1 parent 9ee1b7a commit e19aca6

File tree

3 files changed

+68
-5
lines changed

3 files changed

+68
-5
lines changed

presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ private fun HomeScreen(
119119
WeeklyDatePicker(
120120
selectedDate = uiState.selectedDate,
121121
weeklyDates = uiState.currentWeeks,
122+
routines = uiState.routines,
122123
onDateSelect = onDateSelect,
123124
onPreviousWeekClick = onPreviousWeekClick,
124125
onNextWeekClick = onNextWeekClick,

presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,18 @@ class HomeViewModel @Inject constructor(
331331
updateLogic: (MutableList<RoutineUiModel>) -> Boolean,
332332
): HomeState {
333333
val dateKey = state.selectedDate.toString()
334-
val routinesForDate = state.routines.routines[dateKey]?.routineList?.toMutableList() ?: return state
334+
val dayRoutines = state.routines.routines[dateKey] ?: return state
335+
val routinesForDate = dayRoutines.routineList.toMutableList()
335336

336337
if (!updateLogic(routinesForDate)) return state
337338

339+
val allCompleted = routinesForDate.all { it.routineCompleteYn }
340+
338341
val updatedRoutinesByDate = state.routines.routines.toMutableMap()
339-
val dayRoutines = updatedRoutinesByDate[dateKey] ?: return state
340-
updatedRoutinesByDate[dateKey] = dayRoutines.copy(routineList = routinesForDate)
342+
updatedRoutinesByDate[dateKey] = dayRoutines.copy(
343+
routineList = routinesForDate,
344+
allCompleted = allCompleted,
345+
)
341346

342347
return state.copy(routines = RoutinesUiModel(updatedRoutinesByDate))
343348
}

presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/WeeklyDatePicker.kt

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
package com.threegap.bitnagil.presentation.home.component.template
22

3+
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.core.EaseInOutBack
5+
import androidx.compose.animation.core.EaseOut
6+
import androidx.compose.animation.core.EaseOutBounce
7+
import androidx.compose.animation.core.EaseOutQuart
8+
import androidx.compose.animation.core.keyframes
9+
import androidx.compose.animation.core.tween
10+
import androidx.compose.animation.fadeIn
11+
import androidx.compose.animation.fadeOut
12+
import androidx.compose.animation.scaleIn
13+
import androidx.compose.animation.scaleOut
314
import androidx.compose.foundation.background
415
import androidx.compose.foundation.layout.Arrangement
516
import androidx.compose.foundation.layout.Box
@@ -12,6 +23,7 @@ import androidx.compose.foundation.layout.size
1223
import androidx.compose.foundation.shape.RoundedCornerShape
1324
import androidx.compose.material3.Text
1425
import androidx.compose.runtime.Composable
26+
import androidx.compose.runtime.derivedStateOf
1527
import androidx.compose.runtime.getValue
1628
import androidx.compose.runtime.mutableStateOf
1729
import androidx.compose.runtime.remember
@@ -23,8 +35,10 @@ import androidx.compose.ui.tooling.preview.Preview
2335
import androidx.compose.ui.unit.dp
2436
import com.threegap.bitnagil.designsystem.BitnagilTheme
2537
import com.threegap.bitnagil.designsystem.R
38+
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIcon
2639
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIconButton
2740
import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple
41+
import com.threegap.bitnagil.presentation.home.model.RoutinesUiModel
2842
import com.threegap.bitnagil.presentation.home.util.formatDayOfMonth
2943
import com.threegap.bitnagil.presentation.home.util.formatDayOfWeekShort
3044
import com.threegap.bitnagil.presentation.home.util.formatMonthYear
@@ -35,11 +49,21 @@ import java.time.LocalDate
3549
fun WeeklyDatePicker(
3650
selectedDate: LocalDate,
3751
weeklyDates: List<LocalDate>,
52+
routines: RoutinesUiModel,
3853
onDateSelect: (LocalDate) -> Unit,
3954
onPreviousWeekClick: () -> Unit,
4055
onNextWeekClick: () -> Unit,
4156
modifier: Modifier = Modifier,
4257
) {
58+
val today = remember { LocalDate.now() }
59+
val completionStates by remember(routines) {
60+
derivedStateOf {
61+
weeklyDates.associateWith { date ->
62+
routines.routines[date.toString()]?.allCompleted ?: false
63+
}
64+
}
65+
}
66+
4367
Column(
4468
modifier = modifier,
4569
) {
@@ -91,7 +115,8 @@ fun WeeklyDatePicker(
91115
DateItem(
92116
date = date,
93117
isSelected = selectedDate == date,
94-
isToday = date == LocalDate.now(),
118+
isToday = date == today,
119+
isCompleted = completionStates[date] ?: false,
95120
onDateClick = { onDateSelect(date) },
96121
)
97122
}
@@ -104,6 +129,7 @@ private fun DateItem(
104129
date: LocalDate,
105130
isSelected: Boolean,
106131
isToday: Boolean,
132+
isCompleted: Boolean,
107133
onDateClick: () -> Unit,
108134
modifier: Modifier = Modifier,
109135
) {
@@ -133,6 +159,36 @@ private fun DateItem(
133159
color = if (!isSelected) BitnagilTheme.colors.coolGray70 else BitnagilTheme.colors.white,
134160
)
135161
}
162+
163+
Column(
164+
modifier = Modifier.size(12.dp),
165+
) {
166+
AnimatedVisibility(
167+
visible = isCompleted,
168+
enter = scaleIn(
169+
initialScale = 0f,
170+
animationSpec = keyframes {
171+
durationMillis = 600
172+
0f at 0 using EaseOutQuart
173+
1.3f at 300 using EaseInOutBack
174+
1f at 600 using EaseOutBounce
175+
},
176+
) + fadeIn(
177+
animationSpec = tween(300, easing = EaseOut),
178+
),
179+
exit = scaleOut(
180+
targetScale = 0.8f,
181+
animationSpec = tween(200),
182+
) + fadeOut(
183+
animationSpec = tween(200),
184+
),
185+
) {
186+
BitnagilIcon(
187+
id = R.drawable.ic_routine_success,
188+
tint = null,
189+
)
190+
}
191+
}
136192
}
137193
}
138194

@@ -143,8 +199,9 @@ private fun WeeklyDatePickerPreview() {
143199

144200
WeeklyDatePicker(
145201
selectedDate = selectedDate,
146-
onDateSelect = { selectedDate = it },
147202
weeklyDates = selectedDate.getCurrentWeekDays(),
203+
routines = RoutinesUiModel(),
204+
onDateSelect = { selectedDate = it },
148205
onPreviousWeekClick = { selectedDate = selectedDate.minusWeeks(1) },
149206
onNextWeekClick = { selectedDate = selectedDate.plusWeeks(1) },
150207
)

0 commit comments

Comments
 (0)