Skip to content

Commit 0fcd305

Browse files
Integrated confetti burst into CheckInViewModel and MainNavigationWrapper
1 parent c429468 commit 0fcd305

2 files changed

Lines changed: 46 additions & 22 deletions

File tree

app/src/main/java/com/cornellappdev/uplift/ui/MainNavigationWrapper.kt

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ import androidx.compose.material.Text
1313
import androidx.compose.runtime.Composable
1414
import androidx.compose.runtime.LaunchedEffect
1515
import androidx.compose.runtime.getValue
16+
import androidx.compose.runtime.mutableStateOf
17+
import androidx.compose.runtime.remember
18+
import androidx.compose.runtime.setValue
1619
import androidx.compose.ui.Alignment
1720
import androidx.compose.ui.Modifier
21+
import androidx.compose.ui.geometry.Rect
1822
import androidx.compose.ui.graphics.Color
19-
import androidx.compose.ui.platform.LocalContext
23+
import androidx.compose.ui.layout.boundsInRoot
24+
import androidx.compose.ui.layout.onGloballyPositioned
2025
import androidx.compose.ui.res.painterResource
2126
import androidx.compose.ui.text.font.FontWeight
2227
import androidx.compose.ui.text.style.TextAlign
@@ -31,6 +36,7 @@ import androidx.navigation.compose.composable
3136
import androidx.navigation.compose.currentBackStackEntryAsState
3237
import androidx.navigation.compose.rememberNavController
3338
import com.cornellappdev.uplift.ui.components.general.CheckInPopUp
39+
import com.cornellappdev.uplift.ui.components.general.ConfettiBurst
3440
import com.cornellappdev.uplift.ui.nav.BottomNavScreens
3541
import com.cornellappdev.uplift.ui.nav.popBackClass
3642
import com.cornellappdev.uplift.ui.nav.popBackGym
@@ -51,6 +57,7 @@ import com.cornellappdev.uplift.ui.viewmodels.gyms.GymDetailViewModel
5157
import com.cornellappdev.uplift.ui.viewmodels.nav.RootNavigationViewModel
5258
import com.cornellappdev.uplift.ui.viewmodels.profile.CheckInMode
5359
import com.cornellappdev.uplift.ui.viewmodels.profile.CheckInViewModel
60+
import com.cornellappdev.uplift.ui.viewmodels.profile.ConfettiViewModel
5461
import com.cornellappdev.uplift.util.PRIMARY_BLACK
5562
import com.cornellappdev.uplift.util.PRIMARY_YELLOW
5663
import com.cornellappdev.uplift.util.montserratFamily
@@ -74,6 +81,7 @@ fun MainNavigationWrapper(
7481

7582
) {
7683

84+
val confettiViewModel: ConfettiViewModel = hiltViewModel()
7785
val checkInViewModel: CheckInViewModel = hiltViewModel()
7886
val rootNavigationUiState = rootNavigationViewModel.collectUiStateValue()
7987
val startDestination = rootNavigationUiState.startDestination
@@ -82,6 +90,7 @@ fun MainNavigationWrapper(
8290
val systemUiController: SystemUiController = rememberSystemUiController()
8391

8492
val checkInUiState = checkInViewModel.collectUiStateValue()
93+
var confettiBounds by remember { mutableStateOf<Rect?>(null) }
8594

8695
val yourShimmerTheme = defaultShimmerTheme.copy(
8796
shaderColors = listOf(
@@ -252,24 +261,37 @@ fun MainNavigationWrapper(
252261
composable<UpliftRootRoute.Favorites> {}
253262
}
254263

255-
AnimatedVisibility(
256-
visible = checkInUiState.showPopUp && isMainScreen(),
257-
modifier = Modifier
258-
.align(Alignment.BottomCenter)
259-
.fillMaxWidth()
260-
.padding(
261-
start = 10.dp,
262-
end = 9.dp,
263-
bottom = it.calculateBottomPadding() + 13.dp
264-
)
265-
){
266-
CheckInPopUp(
267-
gymName = checkInUiState.gymName,
268-
currentTimeText = checkInUiState.timeText,
269-
onDismiss = { checkInViewModel.onDismiss() },
270-
onCheckIn = { checkInViewModel.onCheckIn() },
271-
onClosePopUp = { checkInViewModel.onClose() },
272-
mode = checkInUiState.mode,
264+
Box(modifier = Modifier.fillMaxSize()){
265+
AnimatedVisibility(
266+
visible = checkInUiState.showPopUp && isMainScreen(),
267+
modifier = Modifier
268+
.align(Alignment.BottomCenter)
269+
.fillMaxWidth()
270+
.padding(
271+
start = 10.dp,
272+
end = 9.dp,
273+
bottom = it.calculateBottomPadding() + 13.dp
274+
)
275+
){
276+
Box(
277+
modifier = Modifier.onGloballyPositioned { coords ->
278+
confettiBounds = coords.boundsInRoot()
279+
}
280+
){
281+
CheckInPopUp(
282+
gymName = checkInUiState.gymName,
283+
currentTimeText = checkInUiState.timeText,
284+
onDismiss = checkInViewModel::onDismiss,
285+
onCheckIn = checkInViewModel::onCheckIn,
286+
onClosePopUp = checkInViewModel::onClose,
287+
mode = checkInUiState.mode,
288+
)
289+
}
290+
}
291+
ConfettiBurst(
292+
confettiViewModel = confettiViewModel,
293+
originRectInRoot = confettiBounds,
294+
modifier = Modifier
273295
)
274296
}
275297

app/src/main/java/com/cornellappdev/uplift/ui/viewmodels/profile/CheckInViewModel.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import android.util.Log
55
import androidx.lifecycle.viewModelScope
66
import com.cornellappdev.uplift.data.repositories.CheckInRepository
7+
import com.cornellappdev.uplift.data.repositories.ConfettiRepository
78
import com.cornellappdev.uplift.data.repositories.LocationRepository
89
import com.cornellappdev.uplift.ui.viewmodels.UpliftViewModel
910
import com.cornellappdev.uplift.util.isOpen
@@ -37,14 +38,14 @@ data class CheckInUiState(
3738
val mode: CheckInMode = CheckInMode.Prompt,
3839
val gymId: String? = "",
3940
val gymName: String = "",
40-
val timeText: String = "",
41-
val showConfetti: Boolean = false
41+
val timeText: String = ""
4242
)
4343

4444
/** A [CheckInViewModel] manages state and actions for the Check-In pop-up on main screens. */
4545
@HiltViewModel
4646
class CheckInViewModel @Inject constructor(
4747
private val checkInRepository: CheckInRepository,
48+
private val confettiRepository: ConfettiRepository
4849
) : UpliftViewModel<CheckInUiState>(CheckInUiState()) {
4950

5051
private var locationJob: Job? = null
@@ -127,7 +128,7 @@ class CheckInViewModel @Inject constructor(
127128
/**
128129
* Marks the user as checked in for the day, triggering a cooldown til the end of day and a
129130
* logworkout mutation through [checkInRepository]. On a successful call, transitions UI into
130-
* [CheckInMode.Complete].
131+
* [CheckInMode.Complete] and bursts confetti from popup through a [confettiRepository].
131132
*
132133
* Note: Temporarily skips over failed backend log workout call to keep functionality while auth and
133134
* sign in are not working.
@@ -148,6 +149,7 @@ class CheckInViewModel @Inject constructor(
148149
mode = CheckInMode.Complete
149150
)
150151
}
152+
confettiRepository.showConfetti(ConfettiViewModel.ConfettiUiState())
151153
checkInRepository.logWorkoutFromCheckIn(gymIdInt)
152154
} catch (e: Exception) {
153155
Log.e(tag, "Error checking in", e)

0 commit comments

Comments
 (0)