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 #38

Merged
merged 9 commits into from
Aug 17, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.luckyoct.core.model.response.MissionVerificationsResponse
import javax.inject.Inject

class MissionRepositoryImpl @Inject constructor(
private val missionService: MissionService
private val missionService: MissionService,
) : MissionRepository {
override suspend fun getMissionBoards(missionId: Long): NetworkResult<MissionBoardsResponse> = handleResult {
missionService.getMissionBoards(missionId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ interface DefaultDataSource {
fun clearUserData() : Flow<Unit>
fun setUserProfile(data: UserProfile) : Flow<Unit>
fun getUserProfile() : Flow<UserProfile?>
fun getViewedTooltip() : Flow<Boolean>
fun setViewedTooltip() : Flow<Unit>
fun setMemberId(data: Long) : Flow<Unit>
fun getMemberId() : Flow<Long?>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.goalpanzi.mission_mate.core.datastore.datasource

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.longPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
Expand All @@ -19,6 +20,7 @@ class DefaultDataSourceImpl @Inject constructor(
object PreferencesKey {
val USER_NICKNAME = stringPreferencesKey("USER_NICKNAME")
val USER_CHARACTER = stringPreferencesKey("USER_CHARACTER")
val VIEWED_TOOLTIP = booleanPreferencesKey("VIEWED_TOOLTIP")
val MEMBER_ID = longPreferencesKey("MEMBER_ID")
}

Expand Down Expand Up @@ -47,6 +49,18 @@ class DefaultDataSourceImpl @Inject constructor(
}
}

override fun getViewedTooltip(): Flow<Boolean> = dataStore.data.map { preferences ->
val viewed = preferences[PreferencesKey.VIEWED_TOOLTIP]
viewed ?: false
}

override fun setViewedTooltip(): Flow<Unit> = flow {
dataStore.edit { preferences ->
preferences[PreferencesKey.VIEWED_TOOLTIP] = true
}
emit(Unit)
}

override fun setMemberId(data: Long): Flow<Unit> = flow {
dataStore.edit { preferences ->
preferences[PreferencesKey.MEMBER_ID] = data
Expand Down
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 GetViewedTooltipUseCase @Inject constructor(
private val defaultDataSource: DefaultDataSource
) {
operator fun invoke(): Flow<Boolean> = defaultDataSource.getViewedTooltip()
}
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 SetViewedTooltipUseCase @Inject constructor(
private val defaultDataSource: DefaultDataSource
) {
operator fun invoke(): Flow<Unit> = defaultDataSource.setViewedTooltip()
}
2 changes: 1 addition & 1 deletion core/model/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ android {
compileSdk = 34

defaultConfig {
minSdk = 24
minSdk = 26

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,4 @@ data class MissionBoardsResponse(
val missionBoards : List<MissionBoardResponse>,
val progressCount : Int,
val rank : Int
){
val boardRewardList : List<MissionBoardResponse> by lazy {
missionBoards.filter { it.reward != BoardReward.NONE }
}

val passedCountByMe : Int
get() {
return missionBoards.find { it.isMyPosition }?.number ?: 0
}
}
)
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ data class MissionDetailResponse(
val missionDays : List<String>,
val boardCount : Int,
val invitationCode : String
){
)
{
val missionStartLocalDate: LocalDate by lazy {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")
LocalDate.parse(missionStartDate, formatter)
Expand Down Expand Up @@ -53,19 +54,19 @@ data class MissionDetailResponse(
missionDays
}
}

val missionDaysOfWeek : List<DayOfWeek> by lazy {
try {
missionDays.map {
DayOfWeek.valueOf(it)
}
}catch (e: Exception){
emptyList()
}
}

fun isStartedMission() : Boolean {
val currentDate = LocalDate.now()
return currentDate.isEqual(missionStartLocalDate) || currentDate.isAfter(missionStartLocalDate)
}
//
// val missionDaysOfWeek : List<DayOfWeek> by lazy {
// try {
// missionDays.map {
// DayOfWeek.valueOf(it)
// }
// }catch (e: Exception){
// emptyList()
// }
// }
//
// fun isStartedMission() : Boolean {
// val currentDate = LocalDate.now()
// return currentDate.isEqual(missionStartLocalDate) || currentDate.isAfter(missionStartLocalDate)
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ import androidx.navigation.NavOptions
import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import com.goalpanzi.mission_mate.core.navigation.RouteModel
import com.goalpanzi.mission_mate.feature.board.screen.BoardMissionDetailRoute
import com.goalpanzi.mission_mate.feature.board.screen.BoardRoute
import com.goalpanzi.mission_mate.feature.onboarding.navigateToOnboarding

internal const val missionIdArg = "missionId"

Expand All @@ -26,16 +25,43 @@ fun NavController.navigateToBoard(

fun NavGraphBuilder.boardNavGraph(
onNavigateOnboarding: () -> Unit,
onNavigateDetail : (Long) -> Unit,
onClickSetting : () -> Unit
) {
composable(
"RouteModel.Board/{$missionIdArg}",
arguments = listOf(navArgument(missionIdArg) { type = NavType.LongType })
) { navBackStackEntry ->
// val missionId = navBackStackEntry.toRoute<RouteModel.Board>().missionId
val missionId = navBackStackEntry.arguments?.getLong(missionIdArg)
BoardRoute(
onNavigateOnboarding = onNavigateOnboarding,
onNavigateDetail = {
missionId?.let {
onNavigateDetail(missionId)
}
},
onClickSetting = onClickSetting
)
}
}

fun NavController.navigateToBoardDetail(
missionId: Long
) {
this.navigate("RouteModel.BoardDetail" + "/${missionId}")
}

fun NavGraphBuilder.boardDetailNavGraph(
onDelete: () -> Unit,
onBackClick : () -> Unit
) {
composable(
"RouteModel.BoardDetail/{$missionIdArg}",
arguments = listOf(navArgument(missionIdArg) { type = NavType.LongType })
) {
BoardMissionDetailRoute(
onDelete = onDelete,
onBackClick = onBackClick
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray2_FF4F505C
import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography
import com.goalpanzi.mission_mate.feature.board.R
import com.goalpanzi.mission_mate.feature.board.model.BoardEventItem
import com.goalpanzi.mission_mate.feature.board.model.MissionBoards
import com.goalpanzi.mission_mate.feature.board.model.MissionDetail
import com.goalpanzi.mission_mate.feature.board.model.MissionState
import com.goalpanzi.mission_mate.feature.board.model.toCharacter
import com.goalpanzi.mission_mate.feature.board.model.toEventType
Expand All @@ -43,10 +45,8 @@ import kotlin.math.absoluteValue
@Composable
fun Board(
scrollState: ScrollState,
boardCount: Int,
passedCount: Int,
startDateText: String,
missionBoards: MissionBoardsResponse,
missionBoards: MissionBoards,
missionDetail: MissionDetail,
numberOfColumns: Int,
profile: MissionVerificationResponse,
missionState: MissionState,
Expand All @@ -55,8 +55,12 @@ fun Board(
val statusBar = WindowInsets.statusBars
val navigationBar = WindowInsets.navigationBars
val localDensity = LocalDensity.current
val statusBarHeight = remember { (statusBar.getTop(localDensity) - statusBar.getBottom(localDensity)).absoluteValue }
val navigationBarHeight = remember { (navigationBar.getTop(localDensity) - navigationBar.getBottom(localDensity)).absoluteValue }
val statusBarHeight =
remember { (statusBar.getTop(localDensity) - statusBar.getBottom(localDensity)).absoluteValue }
val navigationBarHeight =
remember { (navigationBar.getTop(localDensity) - navigationBar.getBottom(localDensity)).absoluteValue }


Box(
modifier = modifier
.fillMaxSize()
Expand All @@ -75,10 +79,8 @@ fun Board(
)
) {
BoardContent(
boardCount,
passedCount,
startDateText,
missionBoards,
missionDetail,
numberOfColumns,
profile,
missionState,
Expand All @@ -101,10 +103,8 @@ fun Board(
)
) {
BoardContent(
boardCount,
passedCount,
startDateText,
missionBoards,
missionDetail,
numberOfColumns,
profile,
missionState,
Expand All @@ -121,14 +121,13 @@ fun Board(
clipRect(top = (size.height + navigationBarHeight - (if (missionState.isVisiblePiece()) 188.dp else 46.dp).toPx())) {
[email protected]()
}
}.blur(10.dp,10.dp)
}
.blur(10.dp, 10.dp)
)
) {
BoardContent(
boardCount,
passedCount,
startDateText,
missionBoards,
missionDetail,
numberOfColumns,
profile,
missionState,
Expand All @@ -143,24 +142,37 @@ fun Board(

@Composable
fun ColumnScope.BoardContent(
boardCount: Int,
passedCount: Int,
startDateText: String,
missionBoards: MissionBoardsResponse,
missionBoards: MissionBoards,
missionDetail: MissionDetail,
numberOfColumns: Int,
profile: MissionVerificationResponse,
missionState: MissionState,
modifier: Modifier = Modifier,
) {
val boardCount = missionBoards.missionBoardList.size
val passedCount = missionBoards.passedCountByMe
val startDateText = stringResource(
id = R.string.board_before_start_title,
missionDetail.missionStartLocalDate.monthValue,
missionDetail.missionStartLocalDate.dayOfMonth
)
Text(
modifier = Modifier.padding(top = 28.dp),
text = startDateText,
text = if (missionState.isRankBoardTitle()) stringResource(
id = R.string.board_rank_title,
missionBoards.progressCount,1
)
else if (missionState.isEncourageBoardTitle()) stringResource(id = R.string.board_encourage_title)
else startDateText,
style = MissionMateTypography.heading_md_bold,
color = ColorGray1_FF404249
)
Text(
modifier = Modifier.padding(top = 2.dp, bottom = 20.dp),
text = stringResource(id = R.string.board_before_start_description),
text = if (missionState.isRankBoardTitle() || missionState.isEncourageBoardTitle()) stringResource(
id = R.string.board_after_start_description,
missionBoards.rank
) else stringResource(id = R.string.board_before_start_description),
style = MissionMateTypography.body_lg_bold,
color = ColorGray2_FF4F505C
)
Expand All @@ -174,7 +186,7 @@ fun ColumnScope.BoardContent(
missionBoards.boardRewardList.map {
BoardEventItem(
index = it.number,
eventType = it.reward.toEventType()
eventType = it.boardReward.toEventType()
)
}
).chunked(numberOfColumns).forEach {
Expand All @@ -195,7 +207,7 @@ fun ColumnScope.BoardContent(
}
}
if (missionState.isVisiblePiece()) {
missionBoards.missionBoards.forEach { block ->
missionBoards.missionBoardList.forEach { block ->
if (block.missionBoardMembers.isNotEmpty()) {
Piece(
index = block.number,
Expand All @@ -204,8 +216,8 @@ fun ColumnScope.BoardContent(
sizePerBlock = width / numberOfColumns,
numberOfColumn = numberOfColumns,
isMe = block.isMyPosition,
imageId = if (block.isMyPosition) profile.characterType.toCharacter().imageId else block.missionBoardMembers.first().characterType.toCharacter().imageId,
imageIdForCount = if (block.isMyPosition) profile.characterType.toCharacter().imageId else block.missionBoardMembers.first().characterType.toCharacter().imageId
imageId = if (block.isMyPosition) profile.characterType.toCharacter().imageId else block.missionBoardMembers.first().character.imageId,
imageIdForCount = if (block.isMyPosition) profile.characterType.toCharacter().imageId else block.missionBoardMembers.first().character.imageId
)
}
}
Expand Down
Loading
Loading