Skip to content

Commit

Permalink
[feat] #61 MyBadgeCategory 서버 명세 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
beom84 committed Jan 23, 2025
1 parent 1fe3189 commit 4c05849
Show file tree
Hide file tree
Showing 4 changed files with 197 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,46 @@ class MyBadgeCategoryContract {
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
),
val badgeCategoryList3: List<BadgeCategory> = listOf(
BadgeCategory(
name = "Badge 4",
categoryName = "Category 2",
isLocked = true,
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
BadgeCategory(
name = "Badge 5",
categoryName = "Category 2",
isLocked = false,
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
BadgeCategory(
name = "Badge 6",
categoryName = "Category 2",
isLocked = true,
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
),
val badgeCategoryList4: List<BadgeCategory> = listOf(
BadgeCategory(
name = "Badge 4",
categoryName = "Category 2",
isLocked = true,
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
BadgeCategory(
name = "Badge 5",
categoryName = "Category 2",
isLocked = false,
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
BadgeCategory(
name = "Badge 6",
categoryName = "Category 2",
isLocked = true,
imageUrl = "https://www.chosun.com/resizer/v2/HRGER65PGPIW36FJOBRNAP2PJM.jpg?auth=9da0c167de2cfb03a5d344ce4098faa669a22d7a2b90cb6a21fdc518b0af3558&width=530&height=757&smart=true",
),
),
val badgeDetailBottomSheetState: Boolean = false,
val badgeDetail: BadgeDetail = BadgeDetail(),
) : BaseContract.State, Parcelable {
Expand All @@ -73,6 +113,8 @@ class MyBadgeCategoryContract {
data class UpdateBadgeCategoryList(
val badgeCategoryList1: List<BadgeCategory>,
val badgeCategoryList2: List<BadgeCategory>,
val badgeCategoryList3: List<BadgeCategory>,
val badgeCategoryList4: List<BadgeCategory>,
) : MyBadgeCategoryReduce

data class UpdateBadgeDetailBottomSheetState(val badgeDetailBottomSheetState: Boolean) : MyBadgeCategoryReduce
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,32 @@ fun MyBadgeCategoryScreen(

item {
BadgeCategoryGridList(
badgeCategoryList = badgeCategoryState.badgeCategoryList2,
badgeCategoryList = badgeCategoryState.badgeCategoryList2.reversed(),
categoryDescription = "지금 바로 시작하면 미룬이 탈출 가능!",
onBadgeCardClicked = onBadgeCardClicked,
)

Spacer(Modifier.height(64.dp))
}

item {
BadgeCategoryGridList(
badgeCategoryList = badgeCategoryState.badgeCategoryList3,
categoryDescription = "지금부터 시작해도 반은 한거에요!",
onBadgeCardClicked = onBadgeCardClicked,
)

Spacer(Modifier.height(64.dp))
}

item {
BadgeCategoryGridList(
badgeCategoryList = badgeCategoryState.badgeCategoryList4,
categoryDescription = "빵 한쪽도 나눠 먹는 사이!",
onBadgeCardClicked = onBadgeCardClicked,
)

Spacer(Modifier.height(16.dp))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,138 +15,149 @@ import javax.inject.Inject

@HiltViewModel
class MyBadgeCategoryViewModel
@Inject
constructor(
private val getBadgeCategoryListUseCase: GetBadgeCategoryListUseCase,
private val getBadgeDetailUseCase: GetBadgeDetailUseCase,
savedStateHandle: SavedStateHandle,
) : BaseViewModel<MyBadgeCategoryContract.MyBadgeCategoryEvent, MyBadgeCategoryContract.MyBadgeCategoryState, MyBadgeCategoryContract.MyBadgeCategoryReduce, MyBadgeCategoryContract.MyBadgeCategorySideEffect>(
savedStateHandle = savedStateHandle,
) {
override fun createInitialState(savedState: Parcelable?): MyBadgeCategoryContract.MyBadgeCategoryState {
return savedState as? MyBadgeCategoryContract.MyBadgeCategoryState
?: MyBadgeCategoryContract.MyBadgeCategoryState()
}
@Inject
constructor(
private val getBadgeCategoryListUseCase: GetBadgeCategoryListUseCase,
private val getBadgeDetailUseCase: GetBadgeDetailUseCase,
savedStateHandle: SavedStateHandle,
) : BaseViewModel<MyBadgeCategoryContract.MyBadgeCategoryEvent, MyBadgeCategoryContract.MyBadgeCategoryState, MyBadgeCategoryContract.MyBadgeCategoryReduce, MyBadgeCategoryContract.MyBadgeCategorySideEffect>(
savedStateHandle = savedStateHandle,
) {
override fun createInitialState(savedState: Parcelable?): MyBadgeCategoryContract.MyBadgeCategoryState {
return savedState as? MyBadgeCategoryContract.MyBadgeCategoryState
?: MyBadgeCategoryContract.MyBadgeCategoryState()
}

init {
setEvent(MyBadgeCategoryContract.MyBadgeCategoryEvent.Initialize)
}
init {
setEvent(MyBadgeCategoryContract.MyBadgeCategoryEvent.Initialize)
}

override fun handleEvent(event: MyBadgeCategoryContract.MyBadgeCategoryEvent) {
when (event) {
MyBadgeCategoryContract.MyBadgeCategoryEvent.Initialize -> launch { initData() }
MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBackIconClicked ->
setSideEffect(MyBadgeCategoryContract.MyBadgeCategorySideEffect.NavigateToBack)
override fun handleEvent(event: MyBadgeCategoryContract.MyBadgeCategoryEvent) {
when (event) {
MyBadgeCategoryContract.MyBadgeCategoryEvent.Initialize -> launch { initData() }
MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBackIconClicked ->
setSideEffect(MyBadgeCategoryContract.MyBadgeCategorySideEffect.NavigateToBack)

is MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBadgeCardClicked -> {
viewModelScope.launch { getBadgeDetail(event.badgeName) }
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = true,
),
)
}
is MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBadgeCardClicked -> {
viewModelScope.launch { getBadgeDetail(event.badgeName) }
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = true,
),
)
}

MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBadgeDetailBottomSheetDismissButtonClicked ->
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = false,
),
)
MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBadgeDetailBottomSheetDismissButtonClicked ->
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = false,
),
)

MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBadgeDetailBottomSheetDismissRequest ->
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = false,
),
)
}
MyBadgeCategoryContract.MyBadgeCategoryEvent.OnBadgeDetailBottomSheetDismissRequest ->
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = false,
),
)
}
}

override fun reduceState(
state: MyBadgeCategoryContract.MyBadgeCategoryState,
reduce: MyBadgeCategoryContract.MyBadgeCategoryReduce,
): MyBadgeCategoryContract.MyBadgeCategoryState {
return when (reduce) {
is MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeCategoryList ->
state.copy(
badgeCategoryList1 = reduce.badgeCategoryList1,
badgeCategoryList2 = reduce.badgeCategoryList2,
)
override fun reduceState(
state: MyBadgeCategoryContract.MyBadgeCategoryState,
reduce: MyBadgeCategoryContract.MyBadgeCategoryReduce,
): MyBadgeCategoryContract.MyBadgeCategoryState {
return when (reduce) {
is MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeCategoryList ->
state.copy(
badgeCategoryList1 = reduce.badgeCategoryList1,
badgeCategoryList2 = reduce.badgeCategoryList2,
badgeCategoryList3 = reduce.badgeCategoryList3,
badgeCategoryList4 = reduce.badgeCategoryList4,
)

is MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetail ->
state.copy(
badgeDetail = reduce.badgeDetail,
)
is MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetail ->
state.copy(
badgeDetail = reduce.badgeDetail,
)

is MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState ->
state.copy(
badgeDetailBottomSheetState = reduce.badgeDetailBottomSheetState,
)
}
is MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState ->
state.copy(
badgeDetailBottomSheetState = reduce.badgeDetailBottomSheetState,
)
}
}

private suspend fun initData() {
getBadgeCategoryList()
}
private suspend fun initData() {
getBadgeCategoryList()
}

private suspend fun getBadgeCategoryList() {
getBadgeCategoryListUseCase()
.onSuccess { data ->
val badgeLists =
data.badgeList.map { badge ->
BadgeCategory(
name = badge.badgeName,
categoryName = badge.badgeCategory,
isLocked = badge.badgeIsLocked,
imageUrl = badge.badgeImage,
)
}
val badgeCategory = badgeLists[0].categoryName
val badgeCategoryList1 =
badgeLists.filter { badge ->
badge.categoryName != badgeCategory
}
val badgeCategoryList2 =
badgeLists.filter { badge ->
badge.categoryName == badgeCategory
}
private suspend fun getBadgeCategoryList() {
getBadgeCategoryListUseCase()
.onSuccess { data ->
val badgeLists =
data.badgeList.map { badge ->
BadgeCategory(
name = badge.badgeName,
categoryName = badge.badgeCategory,
isLocked = badge.badgeIsLocked,
imageUrl = badge.badgeImage,
)
}
val badgeCategoryList1 =
badgeLists.filter { badge ->
badge.categoryName == "시작이 빵이다"
}
val badgeCategoryList2 =
badgeLists.filter { badge ->
badge.categoryName == "미룬이 탈출"
}
val badgeCategoryList3 =
badgeLists.filter { badge ->
badge.categoryName == "미룬이 겨우 탈출"
}
val badgeCategoryList4 =
badgeLists.filter { badge ->
badge.categoryName == "인싸 사장님"
}

updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeCategoryList(
badgeCategoryList1 = badgeCategoryList1,
badgeCategoryList2 = badgeCategoryList2,
),
)
}.onFailure { error ->
Timber.tag("badges").e(error)
}
}
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeCategoryList(
badgeCategoryList1 = badgeCategoryList1,
badgeCategoryList2 = badgeCategoryList2,
badgeCategoryList3 = badgeCategoryList3,
badgeCategoryList4 = badgeCategoryList4,
),
)
}.onFailure { error ->
Timber.tag("badges").e(error)
}
}

private suspend fun getBadgeDetail(badgeName: String) {
getBadgeDetailUseCase(badgeName)
.onSuccess { data ->
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetail(
badgeDetail =
BadgeDetail(
categoryName = data.badgeName,
imageUrl = data.badgeImage,
hashTags = data.hashTags,
achievementCondition = data.achievementCondition,
reward = data.reward,
isLocked = data.badgeIsLocked,
),
),
)
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = true,
private suspend fun getBadgeDetail(badgeName: String) {
getBadgeDetailUseCase(badgeName)
.onSuccess { data ->
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetail(
badgeDetail =
BadgeDetail(
categoryName = data.badgeName,
imageUrl = data.badgeImage,
hashTags = data.hashTags,
achievementCondition = data.achievementCondition,
reward = data.reward,
isLocked = data.badgeIsLocked,
),
)
}
.onFailure { error ->
Timber.tag("badges").e(error)
}
}
),
)
updateState(
MyBadgeCategoryContract.MyBadgeCategoryReduce.UpdateBadgeDetailBottomSheetState(
badgeDetailBottomSheetState = true,
),
)
}
.onFailure { error ->
Timber.tag("badges").e(error)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import org.android.bbangzip.presentation.type.BottomNavigationType
import org.android.bbangzip.presentation.ui.friend.navigation.navigateFriend
import org.android.bbangzip.presentation.ui.login.LoginRoute
import org.android.bbangzip.presentation.ui.login.navigateLogin
import org.android.bbangzip.presentation.ui.my.mybadgecategory.navigation.MyBadgeCategoryRoute
import org.android.bbangzip.presentation.ui.my.mybadgecategory.navigation.navigateToMyBadgeCategory
import org.android.bbangzip.presentation.ui.my.navigateMy
import org.android.bbangzip.presentation.ui.onboarding.navigation.navigateOnboarding
Expand All @@ -31,7 +32,7 @@ class MainNavigator(
private val currentDestination: NavDestination?
@Composable get() = navHostController.currentBackStackEntryAsState().value?.destination

val startDestination = LoginRoute
val startDestination = MyBadgeCategoryRoute

val currentBottomNavigationBarItem: BottomNavigationType?
@Composable get() =
Expand Down

0 comments on commit 4c05849

Please sign in to comment.