11package 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
314import androidx.compose.foundation.background
415import androidx.compose.foundation.layout.Arrangement
516import androidx.compose.foundation.layout.Box
@@ -12,6 +23,7 @@ import androidx.compose.foundation.layout.size
1223import androidx.compose.foundation.shape.RoundedCornerShape
1324import androidx.compose.material3.Text
1425import androidx.compose.runtime.Composable
26+ import androidx.compose.runtime.derivedStateOf
1527import androidx.compose.runtime.getValue
1628import androidx.compose.runtime.mutableStateOf
1729import androidx.compose.runtime.remember
@@ -23,8 +35,10 @@ import androidx.compose.ui.tooling.preview.Preview
2335import androidx.compose.ui.unit.dp
2436import com.threegap.bitnagil.designsystem.BitnagilTheme
2537import com.threegap.bitnagil.designsystem.R
38+ import com.threegap.bitnagil.designsystem.component.atom.BitnagilIcon
2639import com.threegap.bitnagil.designsystem.component.atom.BitnagilIconButton
2740import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple
41+ import com.threegap.bitnagil.presentation.home.model.RoutinesUiModel
2842import com.threegap.bitnagil.presentation.home.util.formatDayOfMonth
2943import com.threegap.bitnagil.presentation.home.util.formatDayOfWeekShort
3044import com.threegap.bitnagil.presentation.home.util.formatMonthYear
@@ -35,11 +49,21 @@ import java.time.LocalDate
3549fun 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