Skip to content

Commit

Permalink
Refactor mission state enum (#25)
Browse files Browse the repository at this point in the history
* chore: refactor Boolean to enum class MissionState

* chore: pass homeViewModel

* chore: MissionImageInfo 클래스 생성, uri, base64, contentUriRequestBody 통합

* chore: open resetMissionInfo to HomeScreen
  • Loading branch information
giovannijunseokim authored Apr 16, 2024
1 parent c511d6b commit 4f73114
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 50 deletions.
2 changes: 1 addition & 1 deletion app/src/main/java/univ/earthbreaker/namu/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class MainActivity : ComponentActivity() {
pickMedia.launch(
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly),
)
})
}, homeViewModel = homeViewModel)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,14 @@ data class GetMissionListResponse(
MissionListInfo.Mission(
missionNo = it.missionNo,
missionName = MissionActivity.valueOf(it.title).missionName,
isBeforeChallenge = when (MissionStatus.valueOf(it.status)) {
MissionStatus.READY -> {
true
}

else -> false
},
missionState = MissionListInfo.Mission.MissionState.valueOf(it.status),
)
},
additionalMissions = defaultMissions.map {
MissionListInfo.Mission(
missionNo = it.missionNo,
missionName = MissionActivity.valueOf(it.title).missionName,
isBeforeChallenge = when (MissionStatus.valueOf(it.status)) {
MissionStatus.READY -> {
true
}

else -> false
},
missionState = MissionListInfo.Mission.MissionState.valueOf(it.status),
)
},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ data class MissionListInfo(
data class Mission(
val missionNo: Int,
val missionName: String,
val isBeforeChallenge: Boolean,
)
val missionState: MissionState,
) {
enum class MissionState(val text: String) {
READY("도전"),
SUCCESS("성공"),
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import univ.earthbreaker.namu.util.extension.getActivity

@Composable
fun HomeRoute(
homeViewModel: HomeViewModel,
onClickCameraIcon: () -> Unit,
navigateToFinalCharacter: (
backgroundImageURL: String,
Expand All @@ -29,7 +30,6 @@ fun HomeRoute(
HomeBackHandler()

// declare ViewModels
val homeViewModel: HomeViewModel = viewModel()
val loadingViewModel: LoadingViewModel = viewModel()

// State observing and declarations
Expand Down Expand Up @@ -89,6 +89,7 @@ fun rememberHomeActions(
getHomeInfo = viewModel::getHomeInfo,
getMissionListInfo = viewModel::getMissionListInfo,
setSelectedMission = viewModel::setSelectedMission,
resetMissionInfo = viewModel::resetMissionInfo,
getBookInfo = viewModel::getBookInfo,
getCharacterDetail = viewModel::getCharacterDetail,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ fun HomeScreen(
if (state.homeDialogState.doesMissionCertificationDialogExist && state.selectedMission != null) {
MissionCertificationDialog(
onDismissRequest = {
actions.dismissDialog()
actions.resetMissionInfo()
actions.openDialog(
HomeDialogState(
doesMissionListDialogExist = true,
Expand Down Expand Up @@ -322,7 +322,11 @@ private fun HomeScreenPreview() {
missionImageUri = null,
missionDescription = "",
isMissionCertificationSuccessful = false,
selectedMission = MissionListInfo.Mission(0, "", false),
selectedMission = MissionListInfo.Mission(
0,
"",
MissionListInfo.Mission.MissionState.SUCCESS,
),
missionListInfo = MissionListInfo(emptyList(), emptyList()),
bookInfo = BookInfo(),
characterDetailDialogState = null,
Expand All @@ -338,6 +342,7 @@ private fun HomeScreenPreview() {
getHomeInfo = {},
getMissionListInfo = {},
setSelectedMission = {},
resetMissionInfo = {},
getBookInfo = {},
getCharacterDetail = {},
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import univ.earthbreaker.namu.domain.usecase.mission.GetMissionListUseCase
import univ.earthbreaker.namu.domain.usecase.mission.UploadMissionUseCase
import univ.earthbreaker.namu.feature.home.model.HomeDialogState
import univ.earthbreaker.namu.feature.home.model.HomeUiState
import univ.earthbreaker.namu.feature.home.model.MissionImageInfo
import univ.earthbreaker.namu.feature.mission.type.MissionCertificationType
import univ.earthbreaker.namu.util.ContentUriRequestBody

Expand All @@ -37,9 +38,7 @@ class HomeViewModel(
private val initializeCharacterUseCase: InitializeCharacterUseCase = InitializeCharacterUseCase(),
) : ViewModel() {
private var missionDescription: String = ""
private var missionImageUri: Uri? = null
private var missionImageBase64: String? = null
private var missionImageContentUriRequestBody: ContentUriRequestBody? = null
private var missionImageInfo: MissionImageInfo = MissionImageInfo()
private var selectedMission: MissionListInfo.Mission? = null
private var missionListInfo: MissionListInfo = MissionListInfo()
private var homeInfo: HomeInfo =
Expand All @@ -63,7 +62,7 @@ class HomeViewModel(
HomeUiState.Success(
homeInfo = homeInfo,
missionDescription = missionDescription,
missionImageUri = missionImageUri,
missionImageUri = missionImageInfo.missionImageUri,
isMissionCertificationSuccessful = missionCertificationState.isMissionCertificationSuccessful,
missionListInfo = missionListInfo,
selectedMission = selectedMission,
Expand All @@ -81,13 +80,15 @@ class HomeViewModel(
}

fun setMissionImage(
imageUri: Uri?,
imageUri: Uri,
base64: String?,
contentUriRequestBody: ContentUriRequestBody,
) {
missionImageUri = imageUri
missionImageBase64 = base64
missionImageContentUriRequestBody = contentUriRequestBody
missionImageInfo = MissionImageInfo(
missionImageUri = imageUri,
missionImageBase64 = base64,
missionImageContentUriRequestBody = contentUriRequestBody,
)
updateUiStateToSuccess(
homeDialogState = HomeDialogState(doesMissionCertificationDialogExist = true),
)
Expand Down Expand Up @@ -131,13 +132,13 @@ class HomeViewModel(
}

fun certifyMission() {
if (missionImageUri == null) return
if (missionImageInfo.missionImageUri == null) return
viewModelScope.launch {
_homeUiStateFlow.emit(HomeUiState.Loading)
runCatching {
certifyMissionUseCase(
text = "${selectedMission?.missionName} 미션 수행 완료. 사용자의 설명: $missionDescription",
imageBase64 = missionImageBase64 ?: throw Exception(),
imageBase64 = missionImageInfo.missionImageBase64 ?: throw Exception(),
)
}.fold(
onSuccess = { flow ->
Expand Down Expand Up @@ -176,7 +177,7 @@ class HomeViewModel(
missionNo = selectedMission?.missionNo
?: throw NullPointerException("missionNo is null"),
content = missionDescription,
imageRequestBody = missionImageContentUriRequestBody
imageRequestBody = missionImageInfo.missionImageContentUriRequestBody
?: throw NullPointerException("missionImageContentUriRequestBody is null"),
)
}.fold(onSuccess = {
Expand All @@ -200,11 +201,9 @@ class HomeViewModel(
}
}

private fun resetMissionInfo() {
fun resetMissionInfo() {
missionDescription = ""
missionImageUri = null
missionImageBase64 = null
missionImageContentUriRequestBody = null
missionImageInfo = MissionImageInfo()
selectedMission = null
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ data class HomeActions(
val getHomeInfo: () -> Unit,
val getMissionListInfo: () -> Unit,
val setSelectedMission: (selectedMission: MissionListInfo.Mission) -> Unit,
val resetMissionInfo: () -> Unit,
val getBookInfo: () -> Unit,
val getCharacterDetail: (characterNo: Int) -> Unit,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package univ.earthbreaker.namu.feature.home.model

import android.net.Uri
import univ.earthbreaker.namu.util.ContentUriRequestBody

data class MissionImageInfo(
var missionImageUri: Uri? = null,
var missionImageBase64: String? = null,
var missionImageContentUriRequestBody: ContentUriRequestBody? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ fun MissionCertificationDialog(
onMissionDescriptionChanged: (missionDescription: String) -> Unit,
onClickCameraImage: () -> Unit,
certifyMission: () -> Unit,
modifier:Modifier = Modifier
modifier: Modifier = Modifier,
) {
CommonDialogWithXIcon(onDismissRequest = onDismissRequest) {
Column(
Expand Down Expand Up @@ -160,7 +160,7 @@ private fun MissionCertificationDialogPreview() {
mission = MissionListInfo.Mission(
missionNo = 0,
missionName = "미션 이름",
isBeforeChallenge = false,
missionState = MissionListInfo.Mission.MissionState.SUCCESS,
),
onDismissRequest = {},
missionDescription = missionDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,14 @@ private fun MissionDialogPreview() {
onClickChallenge = {},
missionListInfo = MissionListInfo(
todayMissions = listOf(
MissionListInfo.Mission(0, "미션 이름", true),
MissionListInfo.Mission(0, "미션 이름", false),
MissionListInfo.Mission(0, "미션 이름", true),
MissionListInfo.Mission(0, "미션 이름", MissionListInfo.Mission.MissionState.SUCCESS),
MissionListInfo.Mission(0, "미션 이름", MissionListInfo.Mission.MissionState.READY),
MissionListInfo.Mission(0, "미션 이름", MissionListInfo.Mission.MissionState.SUCCESS),
),
additionalMissions = listOf(
MissionListInfo.Mission(0, "미션 이름", true),
MissionListInfo.Mission(0, "미션 이름", false),
MissionListInfo.Mission(0, "미션 이름", true),
MissionListInfo.Mission(0, "미션 이름", MissionListInfo.Mission.MissionState.SUCCESS),
MissionListInfo.Mission(0, "미션 이름", MissionListInfo.Mission.MissionState.READY),
MissionListInfo.Mission(0, "미션 이름", MissionListInfo.Mission.MissionState.SUCCESS),
),
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ fun MissionListBody(
modifier = Modifier
.padding(end = 18.dp)
.then(
if (mission.isBeforeChallenge) {
if (mission.missionState == MissionListInfo.Mission.MissionState.READY) {
Modifier.background(
color = GTTheme.colors.green1,
shape = RoundedCornerShape(5.dp),
Expand All @@ -81,8 +81,11 @@ fun MissionListBody(
.noRippleClickable {
onClickChallenge(mission)
},
text = if (mission.isBeforeChallenge) "도전" else "성공",
color = if (mission.isBeforeChallenge) GTTheme.colors.white else GTTheme.colors.green1,
text = mission.missionState.text,
color = when (mission.missionState) {
MissionListInfo.Mission.MissionState.READY -> GTTheme.colors.white
MissionListInfo.Mission.MissionState.SUCCESS -> GTTheme.colors.green1
},
)
}
}
Expand All @@ -95,15 +98,23 @@ private fun MissionListBodyPreview() {
modifier = Modifier
.padding(20.dp)
.fillMaxWidth(),
mission = MissionListInfo.Mission(0, "비건 카페 방문하기", false),
mission = MissionListInfo.Mission(
0,
"비건 카페 방문하기",
missionState = MissionListInfo.Mission.MissionState.READY,
),
onClickChallenge = {},
)

MissionListBody(
modifier = Modifier
.padding(20.dp)
.fillMaxWidth(),
mission = MissionListInfo.Mission(0, "비건 카페 방문하기", true),
mission = MissionListInfo.Mission(
0,
"비건 카페 방문하기",
missionState = MissionListInfo.Mission.MissionState.SUCCESS,
),
onClickChallenge = {},
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,33 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import univ.earthbreaker.namu.feature.character.growfinal.FinalCharacterRoute
import univ.earthbreaker.namu.feature.home.HomeRoute
import univ.earthbreaker.namu.feature.home.HomeViewModel
import univ.earthbreaker.namu.feature.login.LoginScreen
import univ.earthbreaker.namu.ui.theme.GTTheme
import java.net.URLEncoder
import java.nio.charset.StandardCharsets

@Composable
fun GrowTreeApp(onClickCameraIcon: () -> Unit) {
fun GrowTreeApp(onClickCameraIcon: () -> Unit, homeViewModel: HomeViewModel) {
GTTheme {
val navController = rememberNavController()
GrowTreeNavHost(
navController = navController,
onClickCameraIcon = onClickCameraIcon,
homeViewModel = homeViewModel,
)
}
}

@Composable
fun GrowTreeNavHost(navController: NavHostController, onClickCameraIcon: () -> Unit) {
fun GrowTreeNavHost(navController: NavHostController, onClickCameraIcon: () -> Unit, homeViewModel: HomeViewModel) {
NavHost(navController = navController, startDestination = Screen.Login.route) {
composable(route = Screen.Login.route) {
LoginScreen(onClickLoginButton = { navController.navigate(Screen.Home.createRoute()) })
}
composable(route = Screen.Home.route, arguments = Screen.Home.navArguments) {
HomeRoute(
homeViewModel = homeViewModel,
onClickCameraIcon = onClickCameraIcon,
navigateToFinalCharacter = {
backgroundImageURL: String,
Expand Down

0 comments on commit 4f73114

Please sign in to comment.