Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/implement board #39

Merged
merged 6 commits into from
Aug 17, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,6 @@ google-services.json
/.idea/kotlinc.xml

firebase_credentials.json
/.idea/inspectionProfiles/Project_Default.xml
/.idea/deploymentTargetSelector.xml
/.idea/other.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -26,4 +27,8 @@ class MissionRepositoryImpl @Inject constructor(
override suspend fun deleteMission(missionId: Long): NetworkResult<MissionDetailResponse> = handleResult {
missionService.deleteMission(missionId)
}

override suspend fun getMissionRank(missionId: Long): NetworkResult<MissionRankResponse> = handleResult {
missionService.getMissionRank(missionId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -14,4 +15,6 @@ interface MissionRepository : ResultHandler {
suspend fun getMissionVerifications(missionId: Long) : NetworkResult<MissionVerificationsResponse>

suspend fun deleteMission(missionId : Long) : NetworkResult<MissionDetailResponse>

suspend fun getMissionRank(missionId: Long) : NetworkResult<MissionRankResponse>
}
Original file line number Diff line number Diff line change
@@ -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<Long?> = defaultDataSource.getMemberId()
}
Original file line number Diff line number Diff line change
@@ -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<NetworkResult<MissionRankResponse>> = flow {
emit(missionRepository.getMissionRank(missionId))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.luckyoct.core.model.response

import kotlinx.serialization.Serializable

@Serializable
data class MissionRankResponse(
val rank: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ""
)
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -30,4 +32,9 @@ interface MissionService {
@Path("missionId") missionId: Long
) : Response<MissionDetailResponse>

@GET("/api/mission-members/rank")
suspend fun getMissionRank(
@Query("missionId") missionId : Long
) : Response<MissionRankResponse>

}
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -64,4 +65,25 @@ fun NavGraphBuilder.boardDetailNavGraph(
onBackClick = onBackClick
)
}
}
}

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
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}


) {
[email protected]()
}
Expand All @@ -111,31 +117,30 @@ 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())) {
[email protected]()
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())) {
[email protected]()
}
}
}
.blur(10.dp, 10.dp)
)
) {
BoardContent(
missionBoards,
missionDetail,
numberOfColumns,
profile,
missionState,
modifier
)
.blur(10.dp, 10.dp)
)
) {
BoardContent(
missionBoards,
missionDetail,
numberOfColumns,
profile,
missionState,
modifier
)
}
}


}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -27,14 +30,17 @@ 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,
viewedTooltip: Boolean,
isAddingUserEnabled: Boolean,
userList: List<UserStory>,
onClickFlag: () -> Unit,
onClickAddUser: () -> Unit,
onClickSetting: () -> Unit,
onClickTooltip : () -> Unit,
modifier: Modifier = Modifier
) {
Box(
Expand Down Expand Up @@ -71,28 +77,41 @@ 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)
.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,
contentScale = ContentScale.Crop
)
} else {
// datastore 조건 추가
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,
contentScale = ContentScale.Crop
)
}
}


}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
)
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand Down Expand Up @@ -162,7 +162,7 @@ enum class MissionState {
memberList : List<MissionVerificationResponse>
) : Boolean {
if(memberList.isEmpty()) return false
return memberList.first().image.isNotEmpty()
return memberList.first().imageUrl.isNotEmpty()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Loading
Loading