Skip to content

Commit

Permalink
Merge pull request #98 from Team-Walkie/feat/go_to_challenge_complete…
Browse files Browse the repository at this point in the history
…_screen

달리기 후 완료한 챌린지가 있을 경우 챌린지 완료 화면으로 이동하도록 구현
  • Loading branch information
soopeach authored Jan 30, 2025
2 parents 87ab744 + 43a0b26 commit 5c73cfa
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 63 deletions.
2 changes: 2 additions & 0 deletions app/src/main/java/com/whyranoid/walkie/KoinModules.kt
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ import com.whyranoid.presentation.viewmodel.SplashViewModel
import com.whyranoid.presentation.viewmodel.TotalBadgeViewModel
import com.whyranoid.presentation.viewmodel.UserPageViewModel
import com.whyranoid.presentation.viewmodel.UserPostsViewModel
import com.whyranoid.presentation.viewmodel.challenge.ChallengeCompleteViewModel
import com.whyranoid.presentation.viewmodel.challenge.ChallengeDetailViewModel
import com.whyranoid.presentation.viewmodel.challenge.ChallengeExitViewModel
import com.whyranoid.presentation.viewmodel.challenge.ChallengeMainViewModel
Expand All @@ -123,6 +124,7 @@ val viewModelModule =
viewModel { ChallengeMainViewModel(get(), get(), get(), get(), get()) }
viewModel { ChallengeDetailViewModel(get(), get(), get()) }
viewModel { ChallengeExitViewModel(get(), get()) }
viewModel { ChallengeCompleteViewModel(get()) }
viewModel {
UserPageViewModel(
get(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.whyranoid.presentation.component.button

import androidx.compose.foundation.border
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
Expand All @@ -17,22 +16,20 @@ import androidx.compose.ui.unit.sp

@Composable
fun WalkieNegativeButton(
modifier: Modifier = Modifier,
text: String,
isEnabled: Boolean = true,
onClicked: () -> Unit = {}
) {
OutlinedButton(
modifier = Modifier
Button(
modifier = modifier
.fillMaxWidth()
.height(50.dp)
.clip(shape = RoundedCornerShape(15.dp))
.border(
width = 1.dp,
color = Color(0xFFFB8947),
shape = RoundedCornerShape(15.dp)
),
colors = ButtonDefaults.outlinedButtonColors(
backgroundColor = Color.White,
contentColor = Color(0xFFFB8947)
.clip(shape = RoundedCornerShape(15.dp)),
enabled = isEnabled,
colors = ButtonDefaults.buttonColors(
backgroundColor = if (isEnabled) Color(0xFFBDBDBD) else Color(0xFFBDBDBD),
contentColor = Color.White
),
onClick = { onClicked() }) {
Text(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,41 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import coil.compose.AsyncImage
import com.whyranoid.domain.util.BLANK
import com.whyranoid.domain.util.EMPTY
import com.whyranoid.presentation.component.button.WalkieNegativeButton
import com.whyranoid.presentation.component.button.WalkiePositiveButton
import com.whyranoid.presentation.theme.WalkieColor
import com.whyranoid.presentation.theme.WalkieTypography
import com.whyranoid.presentation.viewmodel.challenge.ChallengeCompleteViewModel
import org.koin.androidx.compose.koinViewModel
import org.orbitmvi.orbit.compose.collectAsState

@Composable
fun ChallengeCompleteScreen(
navController: NavController,
challengeId: Long,
) {

val viewModel = koinViewModel<ChallengeCompleteViewModel>()
val state by viewModel.collectAsState()

LaunchedEffect(challengeId) {
viewModel.getChallengeDetail(challengeId)
}

Column(
modifier = Modifier
.fillMaxWidth()
Expand All @@ -48,55 +57,49 @@ fun ChallengeCompleteScreen(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(
modifier = Modifier.padding(top = 20.dp),
modifier = Modifier.padding(top = 126.dp),
text = "챌린지 성공!",
style = WalkieTypography.Title
)

Text(
modifier = Modifier.padding(top = 24.dp),
text = "햄버거 세트 불태우기",
style = WalkieTypography.SubTitle
)
Spacer(modifier = Modifier.height(56.dp))

AsyncImage(
model = "https://picsum.photos/250/250 ", contentDescription = "",
model = state.challenge.getDataOrNull()?.badge?.imageUrl
?: "https://picsum.photos/250/250 ", contentDescription = "",
modifier = Modifier
.padding(top = 35.dp)
.size(180.dp),
// .size(180.dp)
,
contentScale = ContentScale.Crop
)

Spacer(modifier = Modifier.height(20.dp))

Text(
buildAnnotatedString {
withStyle(
style = SpanStyle(
fontSize = WalkieTypography.Title.fontSize,
fontWeight = WalkieTypography.Title.fontWeight,
fontFamily = WalkieTypography.Title.fontFamily,
color = WalkieColor.Primary
)
) {
append("햄버거 세트 뱃지")
}
append(String.BLANK)
withStyle(
style = SpanStyle(
fontSize = WalkieTypography.Title.fontSize,
fontWeight = WalkieTypography.Title.fontWeight,
fontFamily = WalkieTypography.Title.fontFamily,
)
) {
append("획득")
}
},
modifier = Modifier.padding(top = 24.dp),
modifier = Modifier.fillMaxWidth(),
text = state.challenge.getDataOrNull()?.name ?: String.EMPTY,
style = WalkieTypography.Title,
textAlign = androidx.compose.ui.text.style.TextAlign.Center
)

Spacer(modifier = Modifier.height(8.dp))

Text(
modifier = Modifier.padding(top = 11.dp),
modifier = Modifier.fillMaxWidth(),
text = "뱃지 획득!",
style = WalkieTypography.Title,
textAlign = androidx.compose.ui.text.style.TextAlign.Center
)

Spacer(modifier = Modifier.height(10.dp))

Text(
modifier = Modifier.fillMaxWidth(),
text = "마이페이지에서 확인해보세요",
style = WalkieTypography.Caption.copy(color = Color(0xFF989898))
style = WalkieTypography.Body1.copy(
color = Color(0xFF989898),
textAlign = androidx.compose.ui.text.style.TextAlign.Center
)
)
}

Expand All @@ -111,17 +114,18 @@ fun ChallengeCompleteScreen(
Row(
modifier = Modifier
.padding(top = 20.dp)
.padding(horizontal = 20.dp)
) {
Box(modifier = Modifier.weight(.5f)) {
WalkieNegativeButton(text = "아니오") {

navController.popBackStack()
}
}

Spacer(modifier = Modifier.size(10.dp))

Box(modifier = Modifier.weight(.5f)) {
WalkiePositiveButton(text = "") {
WalkiePositiveButton(text = "네 좋아요") {

}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ import com.whyranoid.presentation.model.running.SavingState
import com.whyranoid.presentation.model.running.TrackingMode
import com.whyranoid.presentation.reusable.CircleProgressWithText
import com.whyranoid.presentation.reusable.GalleryGrid
import com.whyranoid.presentation.screens.Screen
import com.whyranoid.presentation.theme.WalkieColor
import com.whyranoid.presentation.theme.WalkieTypography
import com.whyranoid.presentation.util.dpToPx
Expand All @@ -105,11 +106,18 @@ fun RunningScreen(
val viewModel = koinViewModel<RunningViewModel>()
val state by viewModel.collectAsState()

viewModel.collectSideEffect {
when (it) {
is RunningScreenSideEffect.CompleteChallenge -> { it
// todo: navigation elements
println("완료한 것 "+ it)
viewModel.collectSideEffect { event ->
when (event) {
is RunningScreenSideEffect.CompleteChallenge -> {
event.completedChallenges.forEach { completedChallenge ->
navController.navigate(
Screen.ChallengeCompleteScreen.route
.replace(
"{challengeId}",
completedChallenge.challengeId.toString()
)
)
}
}
}
}
Expand Down Expand Up @@ -388,9 +396,12 @@ fun RunningMapScreen(
)
Text("이미지", style = WalkieTypography.SubTitle)

Text("초기화", style = WalkieTypography.Body1_Normal, modifier = Modifier.clickable {
onRemoveImage()
})
Text(
"초기화",
style = WalkieTypography.Body1_Normal,
modifier = Modifier.clickable {
onRemoveImage()
})


// Icon(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,38 @@
package com.whyranoid.presentation.viewmodel.challenge

class ChallengeCompleteViewModel {
import androidx.lifecycle.ViewModel
import com.whyranoid.domain.model.challenge.Challenge
import com.whyranoid.domain.usecase.GetChallengeDetailUseCase
import com.whyranoid.presentation.model.UiState
import org.orbitmvi.orbit.ContainerHost
import org.orbitmvi.orbit.syntax.simple.intent
import org.orbitmvi.orbit.syntax.simple.reduce
import org.orbitmvi.orbit.viewmodel.container

sealed class ChallengeCompleteSideEffect {

}

data class ChallengeCompleteState(
val challenge: UiState<Challenge> = UiState.Idle,
)

class ChallengeCompleteViewModel(
private val getChallengeDetailUseCase: GetChallengeDetailUseCase
) : ViewModel(), ContainerHost<ChallengeCompleteState, ChallengeCompleteSideEffect> {

override val container =
container<ChallengeCompleteState, ChallengeCompleteSideEffect>(ChallengeCompleteState())

fun getChallengeDetail(challengeId: Long) = intent {
reduce {
state.copy(challenge = UiState.Loading)
}

val challenge = getChallengeDetailUseCase(challengeId)

reduce {
state.copy(challenge = UiState.Success(challenge))
}
}
}

0 comments on commit 5c73cfa

Please sign in to comment.