From 52674e05c8e02f7024e118186737350d57eb3c6a Mon Sep 17 00:00:00 2001 From: eshc123 <> Date: Sat, 17 Aug 2024 22:26:40 +0900 Subject: [PATCH 1/5] =?UTF-8?q?add=20tooltip=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/board/component/BoardTopView.kt | 44 ++++++++++--------- .../feature/board/screen/BoardScreen.kt | 7 ++- .../feature/board/screen/BoardViewModel.kt | 18 +++++++- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt index 40576f83..998ba840 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt @@ -30,6 +30,7 @@ import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage @Composable fun BoardTopView( title: String, + viewedTooltip: Boolean, isAddingUserEnabled: Boolean, userList: List, onClickFlag: () -> Unit, @@ -71,28 +72,31 @@ fun BoardTopView( modifier = Modifier.padding(top = 56.dp), userList = userList ) - if (!isAddingUserEnabled) { - // datastore 조건 추가 - StableImage( - modifier = Modifier - .align(Alignment.TopEnd) - .padding(end = 43.dp,top = 48.dp) - .width(161.dp), - drawableResId = R.drawable.img_tooltip_mission_invitation_code, - contentScale = ContentScale.Crop - ) - } else { - // datastore 조건 추가 - StableImage( - modifier = Modifier - .align(Alignment.TopStart) - .padding(start = 8.dp, top = 48.dp) - .width(161.dp), - drawableResId = R.drawable.img_tooltip_mission_detail, - contentScale = ContentScale.Crop - ) + if(!viewedTooltip){ + if (isAddingUserEnabled) { + // datastore 조건 추가 + StableImage( + modifier = Modifier + .align(Alignment.TopEnd) + .padding(end = 43.dp,top = 48.dp) + .width(161.dp), + drawableResId = R.drawable.img_tooltip_mission_invitation_code, + contentScale = ContentScale.Crop + ) + } else { + // datastore 조건 추가 + StableImage( + modifier = Modifier + .align(Alignment.TopStart) + .padding(start = 8.dp, top = 48.dp) + .width(161.dp), + drawableResId = R.drawable.img_tooltip_mission_detail, + contentScale = ContentScale.Crop + ) + } } + } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt index 2421f352..94f4c262 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt @@ -58,7 +58,7 @@ fun BoardRoute( val missionUiModel by viewModel.missionUiModel.collectAsStateWithLifecycle() val missionVerificationUiModel by viewModel.missionVerificationUiModel.collectAsStateWithLifecycle() val missionState by viewModel.missionState.collectAsStateWithLifecycle() - + val viewedTooltip by viewModel.viewedToolTip.collectAsStateWithLifecycle() val scrollState = rememberScrollState() var isShownDeleteMissionDialog by remember { mutableStateOf(false) } var isShownBoardRewardDialog by remember { mutableStateOf(null) } @@ -125,6 +125,7 @@ fun BoardRoute( BoardScreen( modifier = modifier, + viewedTooltip = viewedTooltip, scrollState = scrollState, missionBoardUiModel = missionBoardUiModel, missionUiModel = missionUiModel, @@ -132,9 +133,11 @@ fun BoardRoute( missionState = missionState, onClickSetting = onClickSetting, onClickFlag = { + viewModel.setViewedTooltip() onNavigateDetail() }, onClickAddUser = { + viewModel.setViewedTooltip() isShownInvitationCodeDialog = !isShownInvitationCodeDialog }, onClickVerification = { @@ -146,6 +149,7 @@ fun BoardRoute( @Composable fun BoardScreen( scrollState: ScrollState, + viewedTooltip : Boolean, missionBoardUiModel: MissionBoardUiModel, missionUiModel: MissionUiModel, missionVerificationUiModel: MissionVerificationUiModel, @@ -182,6 +186,7 @@ fun BoardScreen( BoardTopView( title = missionUiModel.missionDetail.description, isAddingUserEnabled = true, + viewedTooltip = viewedTooltip, userList = missionVerificationUiModel.missionVerificationsResponse.missionVerifications.mapIndexed { i, item -> item.toUserStory( isMe = i == 0 diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt index 815407c4..9ce01004 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt @@ -48,8 +48,12 @@ class BoardViewModel @Inject constructor( private val missionId: Long = savedStateHandle.get("missionId")!! - private val _viewedTooltip = MutableStateFlow(true) - val viewedToolTip : StateFlow = _viewedTooltip.asStateFlow() + //private val _viewedTooltip = MutableStateFlow(true) + val viewedToolTip : StateFlow = getViewedTooltipUseCase().stateIn( + viewModelScope, + started = SharingStarted.WhileSubscribed(500), + initialValue = true + ) private val _deleteMissionResultEvent = MutableSharedFlow() val deleteMissionResultEvent: SharedFlow = _deleteMissionResultEvent.asSharedFlow() @@ -170,6 +174,16 @@ class BoardViewModel @Inject constructor( } } + fun setViewedTooltip(){ + viewModelScope.launch { + setViewedTooltipUseCase().catch { + + }.collect { + + } + } + } + fun verify() { } From 4909341e9859b92a98386c093efff5ce98d4315c Mon Sep 17 00:00:00 2001 From: eshc123 <> Date: Sat, 17 Aug 2024 23:32:22 +0900 Subject: [PATCH 2/5] =?UTF-8?q?add=20tooltip=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/board/component/Board.kt | 52 +++++++++++-------- .../feature/board/component/BoardTopView.kt | 15 ++++++ .../feature/board/model/BoardEventItem.kt | 4 +- .../feature/board/model/MissionState.kt | 2 +- .../feature/board/screen/BoardScreen.kt | 7 ++- .../onboarding/screen/OnboardingScreen.kt | 2 +- 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt index 5076c8c4..5769944a 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt @@ -95,7 +95,13 @@ fun Board( .drawWithContent { clipRect( top = statusBarHeight + 178.dp.toPx() - 1, - bottom = size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx() + bottom = if (missionState.isVisiblePiece()){ + size.height + }else { + size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx() + } + + ) { this@drawWithContent.drawContent() } @@ -111,31 +117,33 @@ fun Board( modifier ) } - - Column( - modifier = modifier.modifierWithClipRect( - scrollState = scrollState, - missionState = missionState, - innerModifier = Modifier - .drawWithContent { - clipRect(top = (size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx())) { - this@drawWithContent.drawContent() + if (missionState.isVisiblePiece()){ + Column( + modifier = modifier.modifierWithClipRect( + scrollState = scrollState, + missionState = missionState, + innerModifier = Modifier + .drawWithContent { + clipRect(top = (size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx())) { + this@drawWithContent.drawContent() + } } - } - .blur(10.dp, 10.dp) - ) - ) { - BoardContent( - missionBoards, - missionDetail, - numberOfColumns, - profile, - missionState, - modifier - ) + .blur(10.dp, 10.dp) + ) + ) { + BoardContent( + missionBoards, + missionDetail, + numberOfColumns, + profile, + missionState, + modifier + ) + } } + } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt index 998ba840..211328b1 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/BoardTopView.kt @@ -1,6 +1,9 @@ package com.goalpanzi.mission_mate.feature.board.component +import android.annotation.SuppressLint import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -27,6 +30,7 @@ import com.goalpanzi.mission_mate.feature.board.model.UserStory import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage +@SuppressLint("UnrememberedMutableInteractionSource") @Composable fun BoardTopView( title: String, @@ -36,6 +40,7 @@ fun BoardTopView( onClickFlag: () -> Unit, onClickAddUser: () -> Unit, onClickSetting: () -> Unit, + onClickTooltip : () -> Unit, modifier: Modifier = Modifier ) { Box( @@ -78,6 +83,11 @@ fun BoardTopView( StableImage( modifier = Modifier .align(Alignment.TopEnd) + .clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = onClickTooltip + ) .padding(end = 43.dp,top = 48.dp) .width(161.dp), drawableResId = R.drawable.img_tooltip_mission_invitation_code, @@ -88,6 +98,11 @@ fun BoardTopView( StableImage( modifier = Modifier .align(Alignment.TopStart) + .clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = onClickTooltip + ) .padding(start = 8.dp, top = 48.dp) .width(161.dp), drawableResId = R.drawable.img_tooltip_mission_detail, diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt index b423cbf7..a7f131e6 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/BoardEventItem.kt @@ -68,6 +68,6 @@ enum class EventType( } -fun BoardReward.toEventType(): EventType { - return EventType.entries.first { it.name == this.name } +fun BoardReward.toEventType(): EventType? { + return EventType.entries.find { it.name == this.name } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt index fbd17987..dc342137 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt @@ -134,7 +134,7 @@ enum class MissionState { if (isTodayMissionDay(todayLocalDate, daysOfWeek)) { when (verificationTimeType) { VerificationTimeType.AFTERNOON -> { - if(endTime.isAfter(VerificationTimeType.MORNING.getVerificationEndTime(todayLocalDateTime))){ + if(!endTime.isAfter(VerificationTimeType.MORNING.getVerificationEndTime(todayLocalDateTime))){ return IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt index 94f4c262..e90defae 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt @@ -142,6 +142,9 @@ fun BoardRoute( }, onClickVerification = { viewModel.verify() + }, + onClickTooltip = { + viewModel.setViewedTooltip() } ) } @@ -158,6 +161,7 @@ fun BoardScreen( onClickVerification : () -> Unit, onClickFlag: () -> Unit, onClickAddUser: () -> Unit, + onClickTooltip : () -> Unit, modifier: Modifier = Modifier ) { Box( @@ -195,9 +199,10 @@ fun BoardScreen( onClickFlag = onClickFlag, onClickAddUser = onClickAddUser, onClickSetting = onClickSetting, + onClickTooltip = onClickTooltip ) - if (!missionState.enabledVerification()) { + if (!missionState.isVisiblePiece()) { Box( modifier = Modifier .wrapContentSize() diff --git a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt index 4b253d9d..b1776f94 100644 --- a/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt +++ b/feature/onboarding/src/main/java/com/goalpanzi/mission_mate/feature/onboarding/screen/OnboardingScreen.kt @@ -124,7 +124,7 @@ fun OnboardingScreen( modifier = Modifier.padding(bottom = 52.dp), text = stringResource(id = R.string.onboarding_ready_title), textAlign = TextAlign.Center, - style = MissionMateTypography.heading_sm_regular, + style = MissionMateTypography.heading_sm_bold, color = ColorGray1_FF404249 ) OutlinedTextBox( From f1b3b41634f4e2b4ff8d5125f81b670b7d028047 Mon Sep 17 00:00:00 2001 From: eshc123 <> Date: Sun, 18 Aug 2024 00:36:32 +0900 Subject: [PATCH 3/5] =?UTF-8?q?add=20isHost=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ .../usecase/GetCachedMemberIdUseCase.kt | 11 ++++++++ .../feature/board/screen/BoardScreen.kt | 6 ++++- .../feature/board/screen/BoardViewModel.kt | 25 ++++++++++++++----- 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetCachedMemberIdUseCase.kt diff --git a/.gitignore b/.gitignore index 44cdea55..bfabf4d2 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,6 @@ google-services.json /.idea/kotlinc.xml firebase_credentials.json +/.idea/inspectionProfiles/Project_Default.xml +/.idea/deploymentTargetSelector.xml +/.idea/other.xml diff --git a/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetCachedMemberIdUseCase.kt b/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetCachedMemberIdUseCase.kt new file mode 100644 index 00000000..3d8d4599 --- /dev/null +++ b/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetCachedMemberIdUseCase.kt @@ -0,0 +1,11 @@ +package com.goalpanzi.mission_mate.core.domain.usecase + +import com.goalpanzi.mission_mate.core.datastore.datasource.DefaultDataSource +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetCachedMemberIdUseCase @Inject constructor( + private val defaultDataSource: DefaultDataSource +) { + operator fun invoke(): Flow = defaultDataSource.getMemberId() +} \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt index e90defae..b50c10dd 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardScreen.kt @@ -59,6 +59,8 @@ fun BoardRoute( val missionVerificationUiModel by viewModel.missionVerificationUiModel.collectAsStateWithLifecycle() val missionState by viewModel.missionState.collectAsStateWithLifecycle() val viewedTooltip by viewModel.viewedToolTip.collectAsStateWithLifecycle() + val isHost by viewModel.isHost.collectAsStateWithLifecycle() + val scrollState = rememberScrollState() var isShownDeleteMissionDialog by remember { mutableStateOf(false) } var isShownBoardRewardDialog by remember { mutableStateOf(null) } @@ -131,6 +133,7 @@ fun BoardRoute( missionUiModel = missionUiModel, missionVerificationUiModel = missionVerificationUiModel, missionState = missionState, + isHost = isHost, onClickSetting = onClickSetting, onClickFlag = { viewModel.setViewedTooltip() @@ -157,6 +160,7 @@ fun BoardScreen( missionUiModel: MissionUiModel, missionVerificationUiModel: MissionVerificationUiModel, missionState : MissionState, + isHost : Boolean, onClickSetting: () -> Unit, onClickVerification : () -> Unit, onClickFlag: () -> Unit, @@ -189,7 +193,7 @@ fun BoardScreen( ) BoardTopView( title = missionUiModel.missionDetail.description, - isAddingUserEnabled = true, + isAddingUserEnabled = isHost, viewedTooltip = viewedTooltip, userList = missionVerificationUiModel.missionVerificationsResponse.missionVerifications.mapIndexed { i, item -> item.toUserStory( diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt index 9ce01004..db30b4ef 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.goalpanzi.mission_mate.core.domain.usecase.DeleteMissionUseCase +import com.goalpanzi.mission_mate.core.domain.usecase.GetCachedMemberIdUseCase import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionBoardsUseCase import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionUseCase import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionVerificationsUseCase @@ -29,6 +30,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn @@ -41,14 +43,14 @@ class BoardViewModel @Inject constructor( private val getMissionBoardsUseCase: GetMissionBoardsUseCase, private val getMissionVerificationsUseCase: GetMissionVerificationsUseCase, private val deleteMissionUseCase: DeleteMissionUseCase, - private val getViewedTooltipUseCase: GetViewedTooltipUseCase, + getCachedMemberIdUseCase: GetCachedMemberIdUseCase, + getViewedTooltipUseCase: GetViewedTooltipUseCase, private val setViewedTooltipUseCase: SetViewedTooltipUseCase, savedStateHandle: SavedStateHandle ) : ViewModel() { private val missionId: Long = savedStateHandle.get("missionId")!! - //private val _viewedTooltip = MutableStateFlow(true) val viewedToolTip : StateFlow = getViewedTooltipUseCase().stateIn( viewModelScope, started = SharingStarted.WhileSubscribed(500), @@ -71,6 +73,19 @@ class BoardViewModel @Inject constructor( val missionVerificationUiModel: StateFlow = _missionVerificationUiModel.asStateFlow() + val isHost : StateFlow = + combine( + getCachedMemberIdUseCase(), + missionUiModel.filter { it is MissionUiModel.Success } + ){ memberId, mission -> + if(mission !is MissionUiModel.Success) return@combine false + memberId == mission.missionDetail.hostMemberId + }.stateIn( + viewModelScope, + started = SharingStarted.WhileSubscribed(500), + initialValue = false + ) + val missionState: StateFlow = combine( missionBoardUiModel.filter { it is MissionBoardUiModel.Success }, @@ -176,10 +191,8 @@ class BoardViewModel @Inject constructor( fun setViewedTooltip(){ viewModelScope.launch { - setViewedTooltipUseCase().catch { - - }.collect { - + setViewedTooltipUseCase().collect{ + /// } } } From 606819b00b755a2e5c95f7d0b0c8747ecd88d5b8 Mon Sep 17 00:00:00 2001 From: eshc123 <> Date: Sun, 18 Aug 2024 03:00:10 +0900 Subject: [PATCH 4/5] implement Board --- .../data/repository/MissionRepositoryImpl.kt | 5 ++ .../domain/repository/MissionRepository.kt | 3 + .../domain/usecase/GetMissionRankUseCase.kt | 19 +++++++ .../model/response/MissionRankResponse.kt | 8 +++ .../response/MissionVerificationResponse.kt | 2 +- .../core/network/service/MissionService.kt | 7 +++ .../feature/board/BoardNavigation.kt | 24 +++++++- .../feature/board/component/Board.kt | 3 - .../component/dialog/BoardEventDialog.kt | 4 +- .../feature/board/model/MissionState.kt | 2 +- .../feature/board/model/UserStory.kt | 2 +- .../feature/board/screen/BoardFinishScreen.kt | 50 +++++++++++++++-- .../board/screen/BoardFinishViewModel.kt | 55 +++++++++++++++++++ .../MissionStateAsInProgressTest.kt | 8 +-- .../util/boardmanager/MissionStateTest.kt | 12 ++-- .../MissionStateUtilityMethodTests.kt | 4 +- .../core/main/component/MainNavHost.kt | 9 +++ 17 files changed, 193 insertions(+), 24 deletions(-) create mode 100644 core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetMissionRankUseCase.kt create mode 100644 core/model/src/main/java/com/luckyoct/core/model/response/MissionRankResponse.kt create mode 100644 feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt diff --git a/core/data/src/main/java/com/goalpanzi/mission_mate/core/data/repository/MissionRepositoryImpl.kt b/core/data/src/main/java/com/goalpanzi/mission_mate/core/data/repository/MissionRepositoryImpl.kt index d913bf37..238c48dd 100644 --- a/core/data/src/main/java/com/goalpanzi/mission_mate/core/data/repository/MissionRepositoryImpl.kt +++ b/core/data/src/main/java/com/goalpanzi/mission_mate/core/data/repository/MissionRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.goalpanzi.mission_mate.core.network.service.MissionService import com.luckyoct.core.model.base.NetworkResult import com.luckyoct.core.model.response.MissionBoardsResponse import com.luckyoct.core.model.response.MissionDetailResponse +import com.luckyoct.core.model.response.MissionRankResponse import com.luckyoct.core.model.response.MissionVerificationsResponse import javax.inject.Inject @@ -26,4 +27,8 @@ class MissionRepositoryImpl @Inject constructor( override suspend fun deleteMission(missionId: Long): NetworkResult = handleResult { missionService.deleteMission(missionId) } + + override suspend fun getMissionRank(missionId: Long): NetworkResult = handleResult { + missionService.getMissionRank(missionId) + } } \ No newline at end of file diff --git a/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/repository/MissionRepository.kt b/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/repository/MissionRepository.kt index d45f56d8..27af4b1d 100644 --- a/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/repository/MissionRepository.kt +++ b/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/repository/MissionRepository.kt @@ -4,6 +4,7 @@ import com.goalpanzi.mission_mate.core.network.ResultHandler import com.luckyoct.core.model.base.NetworkResult import com.luckyoct.core.model.response.MissionBoardsResponse import com.luckyoct.core.model.response.MissionDetailResponse +import com.luckyoct.core.model.response.MissionRankResponse import com.luckyoct.core.model.response.MissionVerificationsResponse interface MissionRepository : ResultHandler { @@ -14,4 +15,6 @@ interface MissionRepository : ResultHandler { suspend fun getMissionVerifications(missionId: Long) : NetworkResult suspend fun deleteMission(missionId : Long) : NetworkResult + + suspend fun getMissionRank(missionId: Long) : NetworkResult } \ No newline at end of file diff --git a/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetMissionRankUseCase.kt b/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetMissionRankUseCase.kt new file mode 100644 index 00000000..e0ab929a --- /dev/null +++ b/core/domain/src/main/java/com/goalpanzi/mission_mate/core/domain/usecase/GetMissionRankUseCase.kt @@ -0,0 +1,19 @@ +package com.goalpanzi.mission_mate.core.domain.usecase + +import com.goalpanzi.mission_mate.core.domain.repository.MissionRepository +import com.luckyoct.core.model.base.NetworkResult +import com.luckyoct.core.model.response.MissionDetailResponse +import com.luckyoct.core.model.response.MissionRankResponse +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class GetMissionRankUseCase @Inject constructor( + private val missionRepository: MissionRepository +) { + operator fun invoke( + missionId: Long + ): Flow> = flow { + emit(missionRepository.getMissionRank(missionId)) + } +} \ No newline at end of file diff --git a/core/model/src/main/java/com/luckyoct/core/model/response/MissionRankResponse.kt b/core/model/src/main/java/com/luckyoct/core/model/response/MissionRankResponse.kt new file mode 100644 index 00000000..a7146c65 --- /dev/null +++ b/core/model/src/main/java/com/luckyoct/core/model/response/MissionRankResponse.kt @@ -0,0 +1,8 @@ +package com.luckyoct.core.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class MissionRankResponse( + val rank: Int +) \ No newline at end of file diff --git a/core/model/src/main/java/com/luckyoct/core/model/response/MissionVerificationResponse.kt b/core/model/src/main/java/com/luckyoct/core/model/response/MissionVerificationResponse.kt index b1f849c3..86d26da8 100644 --- a/core/model/src/main/java/com/luckyoct/core/model/response/MissionVerificationResponse.kt +++ b/core/model/src/main/java/com/luckyoct/core/model/response/MissionVerificationResponse.kt @@ -7,6 +7,6 @@ import kotlinx.serialization.Serializable data class MissionVerificationResponse( val nickname : String, val characterType : CharacterType = CharacterType.RABBIT, - val image : String = "", + val imageUrl : String = "", val verifiedAt : String = "" ) diff --git a/core/network/src/main/java/com/goalpanzi/mission_mate/core/network/service/MissionService.kt b/core/network/src/main/java/com/goalpanzi/mission_mate/core/network/service/MissionService.kt index 01f54398..e6351199 100644 --- a/core/network/src/main/java/com/goalpanzi/mission_mate/core/network/service/MissionService.kt +++ b/core/network/src/main/java/com/goalpanzi/mission_mate/core/network/service/MissionService.kt @@ -2,11 +2,13 @@ package com.goalpanzi.mission_mate.core.network.service import com.luckyoct.core.model.response.MissionBoardsResponse import com.luckyoct.core.model.response.MissionDetailResponse +import com.luckyoct.core.model.response.MissionRankResponse import com.luckyoct.core.model.response.MissionVerificationsResponse import retrofit2.Response import retrofit2.http.DELETE import retrofit2.http.GET import retrofit2.http.Path +import retrofit2.http.Query interface MissionService { @GET("/api/missions/{missionId}/board") @@ -30,4 +32,9 @@ interface MissionService { @Path("missionId") missionId: Long ) : Response + @GET("/api/mission-members/rank") + suspend fun getMissionRank( + @Query("missionId") missionId : Long + ) : Response + } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt index 2a111b68..ba09ce1a 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/BoardNavigation.kt @@ -6,6 +6,7 @@ import androidx.navigation.NavOptions import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.navArgument +import com.goalpanzi.mission_mate.feature.board.screen.BoardFinishRoute import com.goalpanzi.mission_mate.feature.board.screen.BoardMissionDetailRoute import com.goalpanzi.mission_mate.feature.board.screen.BoardRoute @@ -64,4 +65,25 @@ fun NavGraphBuilder.boardDetailNavGraph( onBackClick = onBackClick ) } -} \ No newline at end of file +} + +fun NavController.navigateToBoardFinish( + missionId: Long +) { + this.navigate("RouteModel.BoardFinish" + "/${missionId}") +} + +fun NavGraphBuilder.boardFinishNavGraph( + onClickSetting: () -> Unit, + onClickOk : () -> Unit, +) { + composable( + "RouteModel.BoardFinish/{$missionIdArg}", + arguments = listOf(navArgument(missionIdArg) { type = NavType.LongType }) + ) { + BoardFinishRoute( + onClickSetting = onClickSetting, + onClickOk = onClickOk + ) + } +} diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt index 5769944a..f058dcd6 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/Board.kt @@ -141,9 +141,6 @@ fun Board( ) } } - - - } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt index 4b275403..a302f312 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/component/dialog/BoardEventDialog.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -148,7 +149,8 @@ fun BoardEventDialog( } LottieImage( modifier = Modifier.align(Alignment.Center), - lottieRes = com.goalpanzi.mission_mate.core.designsystem.R.raw.animation_celebration) + lottieRes = com.goalpanzi.mission_mate.core.designsystem.R.raw.animation_celebration + ) } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt index dc342137..cf31faae 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt @@ -162,7 +162,7 @@ enum class MissionState { memberList : List ) : Boolean { if(memberList.isEmpty()) return false - return memberList.first().image.isNotEmpty() + return memberList.first().imageUrl.isNotEmpty() } } } diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/UserStory.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/UserStory.kt index 916f05ef..aeb7b1b8 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/UserStory.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/UserStory.kt @@ -14,7 +14,7 @@ fun MissionVerificationResponse.toUserStory(isMe: Boolean = false) : UserStory = UserStory( nickname = nickname, characterType = characterType.toCharacter(), - imageUrl = image, + imageUrl = imageUrl, isVerified = false, isMe = isMe ) \ No newline at end of file diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt index b72d5d77..975b91d7 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishScreen.kt @@ -12,10 +12,13 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.IconButton 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 @@ -26,6 +29,8 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.goalpanzi.mission_mate.core.designsystem.component.MissionMateButtonType import com.goalpanzi.mission_mate.core.designsystem.component.MissionMateTextButton import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249 @@ -38,9 +43,44 @@ import com.goalpanzi.mission_mate.feature.board.model.Character import com.goalpanzi.mission_mate.feature.board.model.toCharacter import com.goalpanzi.mission_mate.feature.onboarding.component.StableImage +@Composable +fun BoardFinishRoute( + onClickSetting: () -> Unit, + onClickOk : () -> Unit, + modifier: Modifier = Modifier, + viewModel : BoardFinishViewModel = hiltViewModel() +) { + val rank by viewModel.rank.collectAsStateWithLifecycle() + val userProfile by viewModel.profile.collectAsStateWithLifecycle() + + LaunchedEffect(key1 = Unit) { + viewModel.getRankByMissionId() + viewModel.getUserProfile() + } + + + if(rank != null && userProfile != null){ + BoardFinishScreen( + modifier = modifier, + rank = rank!!, + character = userProfile!!.characterType.toCharacter(), + onClickOk = onClickOk, + onClickSetting = onClickSetting + ) + }else { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ){ + CircularProgressIndicator() + } + } + +} + @Composable fun BoardFinishScreen( - character : String, + character : Character, rank : Int, onClickSetting: () -> Unit, onClickOk : () -> Unit, @@ -95,8 +135,10 @@ fun BoardFinishScreen( contentScale = ContentScale.Crop ) StableImage( - modifier = Modifier.fillMaxWidth(212f/390f).aspectRatio(1f), - drawableResId = Character.valueOf(character).imageId + modifier = Modifier + .fillMaxWidth(212f / 390f) + .aspectRatio(1f), + drawableResId = character.imageId ) } @@ -137,7 +179,7 @@ fun BoardFinishScreen( @Composable private fun PreviewBoardFinishScreen() { BoardFinishScreen( - character = "RABBIT", + character = Character.RABBIT, rank = 10, onClickSetting = {}, onClickOk = {} diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt new file mode 100644 index 00000000..91e65909 --- /dev/null +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/screen/BoardFinishViewModel.kt @@ -0,0 +1,55 @@ +package com.goalpanzi.mission_mate.feature.board.screen + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.goalpanzi.mission_mate.core.domain.usecase.GetMissionRankUseCase +import com.goalpanzi.mission_mate.core.domain.usecase.ProfileUseCase +import com.luckyoct.core.model.UserProfile +import com.luckyoct.core.model.base.NetworkResult +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.launch +import javax.inject.Inject + +class BoardFinishViewModel @Inject constructor( + private val getMissionRankUseCase : GetMissionRankUseCase, + private val profileUseCase : ProfileUseCase, + savedStateHandle: SavedStateHandle +) : ViewModel() { + + private val missionId: Long = savedStateHandle.get("missionId")!! + + private val _rank : MutableStateFlow = MutableStateFlow(null) + val rank : StateFlow = _rank.asStateFlow() + + private val _profile : MutableStateFlow = MutableStateFlow(null) + val profile : StateFlow = _profile.asStateFlow() + + fun getRankByMissionId() { + viewModelScope.launch { + getMissionRankUseCase(missionId) + .catch { + _rank.emit(null) + }.collect { + when(it){ + is NetworkResult.Success -> { + _rank.emit(it.data.rank) + } + else -> { + _rank.emit(null) + } + } + } + } + } + + fun getUserProfile() { + viewModelScope.launch { + _profile.emit(profileUseCase.getProfile()) + } + } + +} \ No newline at end of file diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt index debcdb94..8dc5edb1 100644 --- a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt @@ -21,7 +21,7 @@ class MissionStateAsInProgressTest { val memberList = listOf( MissionVerificationResponse( nickname = "", - image = "" + imageUrl = "" ) ) @@ -39,7 +39,7 @@ class MissionStateAsInProgressTest { val memberList = listOf( MissionVerificationResponse( nickname = "", - image = "" + imageUrl = "" ) ) @@ -57,7 +57,7 @@ class MissionStateAsInProgressTest { val memberList = listOf( MissionVerificationResponse( nickname = "", - image = "" + imageUrl = "" ) ) @@ -72,7 +72,7 @@ class MissionStateAsInProgressTest { val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) val verificationTimeType = VerificationTimeType.MORNING - val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val memberList = listOf(MissionVerificationResponse(nickname = "user", imageUrl = "image_url")) val result = getMissionStateAsInProgress(todayLocalDate, todayLocalDateTime, daysOfWeek, verificationTimeType, memberList) diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt index ad32454d..7efda8c9 100644 --- a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateTest.kt @@ -58,7 +58,7 @@ class MissionStateTest { val todayLocalDateTime = LocalDateTime.of(2024, 8, 14, 10, 0, 0) val startDate = LocalDate.of(2024, 8, 15) val endDateTime = LocalDateTime.of(2024, 8, 20, 23, 59, 59) - val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val memberList = listOf(MissionVerificationResponse(nickname = "user", imageUrl = "image_url")) val verificationTimeType = VerificationTimeType.MORNING val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) @@ -72,8 +72,8 @@ class MissionStateTest { val startDate = LocalDate.of(2024, 8, 15) val endDateTime = LocalDateTime.of(2024, 8, 20, 23, 59, 59) val memberList = listOf( - MissionVerificationResponse(nickname = "user1", image = "image_url"), - MissionVerificationResponse(nickname = "user2", image = "image_url") + MissionVerificationResponse(nickname = "user1", imageUrl = "image_url"), + MissionVerificationResponse(nickname = "user2", imageUrl = "image_url") ) val verificationTimeType = VerificationTimeType.MORNING val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) @@ -87,7 +87,7 @@ class MissionStateTest { val todayLocalDateTime = LocalDateTime.of(2024, 8, 16, 0, 0, 0) val startDate = LocalDate.of(2024, 8, 13) val endDateTime = LocalDateTime.of(2024, 8, 15, 23, 59, 59) - val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val memberList = listOf(MissionVerificationResponse(nickname = "user", imageUrl = "image_url")) val verificationTimeType = VerificationTimeType.MORNING val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) @@ -100,7 +100,7 @@ class MissionStateTest { val todayLocalDateTime = LocalDateTime.of(2024, 8, 15, 12, 0, 0) val startDate = LocalDate.of(2024, 8, 13) val endDateTime = LocalDateTime.of(2024, 8, 15, 0, 0, 0) - val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val memberList = listOf(MissionVerificationResponse(nickname = "user", imageUrl = "image_url")) val verificationTimeType = VerificationTimeType.MORNING val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) @@ -113,7 +113,7 @@ class MissionStateTest { val todayLocalDateTime = LocalDateTime.of(2024, 8, 15, 12, 0, 0) val startDate = LocalDate.of(2024, 8, 13) val endDateTime = LocalDateTime.of(2024, 8, 15, 0, 0, 0) - val memberList = listOf(MissionVerificationResponse(nickname = "user", image = "image_url")) + val memberList = listOf(MissionVerificationResponse(nickname = "user", imageUrl = "image_url")) val verificationTimeType = VerificationTimeType.AFTERNOON val daysOfWeek = listOf(DayOfWeek.WEDNESDAY, DayOfWeek.FRIDAY) diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt index 07a3cf9a..89a32408 100644 --- a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateUtilityMethodTests.kt @@ -133,7 +133,7 @@ class MissionStateUtilityMethodTests { @Test fun isVerifiedInMissionTime_FirstImageEmpty_ReturnsFalse() { val memberList = listOf( - MissionVerificationResponse(nickname = "", image = "") + MissionVerificationResponse(nickname = "", imageUrl = "") ) val result = isVerifiedInMissionTime(memberList) assertFalse(result) @@ -143,7 +143,7 @@ class MissionStateUtilityMethodTests { @Test fun isVerifiedInMissionTime_FirstImageNotEmpty_ReturnsTrue() { val memberList = listOf( - MissionVerificationResponse(nickname = "", image = "image_url") + MissionVerificationResponse(nickname = "", imageUrl = "image_url") ) val result = isVerifiedInMissionTime(memberList) assertTrue(result) diff --git a/feature/main/src/main/java/com/goalpanzi/mission_mate/core/main/component/MainNavHost.kt b/feature/main/src/main/java/com/goalpanzi/mission_mate/core/main/component/MainNavHost.kt index 9875abeb..0a0805a3 100644 --- a/feature/main/src/main/java/com/goalpanzi/mission_mate/core/main/component/MainNavHost.kt +++ b/feature/main/src/main/java/com/goalpanzi/mission_mate/core/main/component/MainNavHost.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost import com.goalpanzi.mission_mate.feature.board.boardDetailNavGraph +import com.goalpanzi.mission_mate.feature.board.boardFinishNavGraph import com.goalpanzi.mission_mate.feature.board.boardNavGraph import com.goalpanzi.mission_mate.feature.login.loginNavGraph import com.goalpanzi.mission_mate.feature.onboarding.boardSetupNavGraph @@ -104,6 +105,14 @@ internal fun MainNavHost( navigator.popBackStack() } ) + boardFinishNavGraph( + onClickSetting = { + navigator.navigationToSetting() + }, + onClickOk = { + navigator.navigationToOnboarding() + } + ) } } } \ No newline at end of file From beed36a57bce41c87af6675a3910dd3270b2d9a3 Mon Sep 17 00:00:00 2001 From: eshc123 <> Date: Sun, 18 Aug 2024 03:23:14 +0900 Subject: [PATCH 5/5] fix getMissionStateAsInProgress --- .../mission_mate/feature/board/model/MissionState.kt | 4 +++- .../board/util/boardmanager/MissionStateAsInProgressTest.kt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt index cf31faae..4a2bad47 100644 --- a/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt +++ b/feature/board/src/main/java/com/goalpanzi/mission_mate/feature/board/model/MissionState.kt @@ -134,7 +134,9 @@ enum class MissionState { if (isTodayMissionDay(todayLocalDate, daysOfWeek)) { when (verificationTimeType) { VerificationTimeType.AFTERNOON -> { - if(!endTime.isAfter(VerificationTimeType.MORNING.getVerificationEndTime(todayLocalDateTime))){ + val startTime = todayLocalDateTime.withHour(12).withMinute(0).withSecond(0).withNano(0) + val target = VerificationTimeType.MORNING.getVerificationEndTime(todayLocalDateTime) + if(target.isBefore(startTime)){ return IN_PROGRESS_MISSION_DAY_NON_MISSION_TIME } } diff --git a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt index 8dc5edb1..e65e0c36 100644 --- a/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt +++ b/feature/board/src/test/java/com/goalpanzi/mission_mate/feature/board/util/boardmanager/MissionStateAsInProgressTest.kt @@ -21,7 +21,7 @@ class MissionStateAsInProgressTest { val memberList = listOf( MissionVerificationResponse( nickname = "", - imageUrl = "" + imageUrl = "image" ) )