Skip to content

Commit

Permalink
Merge pull request #367 from 6QuizOnTheBlock/and/feat#362-ranking
Browse files Browse the repository at this point in the history
And/feat#362 ๋žญํ‚น ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • Loading branch information
SteelZoo authored May 19, 2024
2 parents c490096 + 4cca5aa commit 3cf2d99
Show file tree
Hide file tree
Showing 21 changed files with 699 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sixkids.model

data class MemberRankItem (
val name: String,
val exp: Int,
val rank: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.sixkids.data.model.response.OrganizationInviteCodeResponse
import com.sixkids.data.model.response.OrganizationNameResponse
import com.sixkids.data.model.response.OrganizationMemberResponse
import com.sixkids.data.model.response.OrganizationResponse
import com.sixkids.data.model.response.RankResponse
import com.sixkids.data.network.ApiResult
import retrofit2.http.Body
import retrofit2.http.GET
Expand Down Expand Up @@ -48,4 +49,9 @@ interface OrganizationService {
suspend fun getOrganizationMembers(
@Path(value = "id") orgId: Int
): ApiResult<ApiResponse<List<OrganizationMemberResponse>>>

@GET("organizations/{id}/rank")
suspend fun getOrganizationRank(
@Path(value = "id") orgId: Int
): ApiResult<ApiResponse<List<RankResponse>>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sixkids.data.model.response

import com.sixkids.model.MemberRankItem

data class RankResponse(
val name: String,
val point: Int,
)

fun List<RankResponse>.toModel(): List<MemberRankItem> {
return this.mapIndexed { index, rankResponse ->
MemberRankItem(
rank = index + 1,
name = rankResponse.name,
exp = rankResponse.point,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.sixkids.data.repository.organization.remote.OrganizationRemoteDataSou
import com.sixkids.domain.repository.OrganizationRepository
import com.sixkids.model.MemberDetail
import com.sixkids.model.ClassSummary
import com.sixkids.model.MemberRankItem
import com.sixkids.model.MemberSimple
import com.sixkids.model.MemberSimpleWithScore
import com.sixkids.model.Organization
Expand Down Expand Up @@ -86,6 +87,10 @@ class OrganizationRepositoryImpl @Inject constructor(
return organizationRemoteDataSource.getStudentRelationDetail(orgId, sourceStudentId, targetStudentId)
}

override suspend fun getOrganizationRank(orgId: Int): List<MemberRankItem> {
return organizationRemoteDataSource.getOrganizationRank(orgId).toModel()
}

override suspend fun tagGreeting(orgId: Long, memberId: Long): Int {
return organizationRemoteDataSource.tagGreeting(orgId, memberId)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.sixkids.data.repository.organization.remote

import com.sixkids.data.model.response.ClassSummaryResponse
import com.sixkids.data.model.response.RankResponse
import com.sixkids.model.MemberDetail
import com.sixkids.model.MemberSimple
import com.sixkids.model.MemberSimpleWithScore
Expand Down Expand Up @@ -28,5 +29,7 @@ interface OrganizationRemoteDataSource {

suspend fun getStudentRelationDetail(orgId: Long, sourceStudentId: Long, targetStudentId: Long): StudentRelation

suspend fun getOrganizationRank(orgId: Int): List<RankResponse>

suspend fun tagGreeting(orgId: Long, memberId: Long): Int
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.sixkids.data.model.request.GreetingRequest
import com.sixkids.data.model.request.JoinOrganizationRequest
import com.sixkids.data.model.request.NewOrganizationRequest
import com.sixkids.data.model.response.ClassSummaryResponse
import com.sixkids.data.model.response.RankResponse
import com.sixkids.data.model.response.toModel
import com.sixkids.model.MemberDetail
import com.sixkids.model.MemberSimple
Expand Down Expand Up @@ -68,6 +69,10 @@ class OrganizationRemoteDataSourceImpl @Inject constructor(
return memberOrgService.getRelationDetail(orgId, sourceStudentId.toInt(), targetStudentId.toInt()).getOrThrow().data.toModel()
}

override suspend fun getOrganizationRank(orgId: Int): List<RankResponse> {
return organizationService.getOrganizationRank(orgId).getOrThrow().data
}

override suspend fun tagGreeting(orgId: Long, memberId: Long): Int {
return memberOrgService.tagGreeting(GreetingRequest(orgId, memberId)).getOrThrow().data
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.sixkids.domain.repository

import com.sixkids.model.MemberDetail
import com.sixkids.model.ClassSummary
import com.sixkids.model.MemberRankItem
import com.sixkids.model.MemberSimple
import com.sixkids.model.MemberSimpleWithScore
import com.sixkids.model.Organization
Expand Down Expand Up @@ -35,5 +36,7 @@ interface OrganizationRepository {

suspend fun getStudentRelationDetail(orgId: Long, sourceStudentId: Long, targetStudentId: Long): StudentRelation

suspend fun getOrganizationRank(orgId: Int): List<MemberRankItem>

suspend fun tagGreeting(orgId: Long, memberId: Long): Int
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sixkids.domain.usecase.organization

import com.sixkids.domain.repository.OrganizationRepository
import javax.inject.Inject

class GetClassRankUseCase @Inject constructor(
private val organizationRepository: OrganizationRepository
) {
suspend operator fun invoke(organizationId: Int) = runCatching {
organizationRepository.getOrganizationRank(organizationId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@ class MainNavigator(
navController.navigateStudentAnnounceDetail(announceId)
}

fun navigateStudentRank() {
navController.navigateRank()
}

fun navigateGreetingSender(){
navController.navigateStudentGreetingSender()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ fun MainScreen(
navigateToChallenge = navigator::navigateChallengeHistory,
navigateToRelay = navigator::navigateTeacherRelayHistory,
navigateToQuiz = { } ,
onShowSnackBar = viewModel::onShowSnackbar,
)

boardNavGraph(
Expand Down Expand Up @@ -161,8 +162,8 @@ fun MainScreen(
onShowSnackbar = viewModel::onShowSnackbar,
navigateToStudentAnnounceList = navigator::navigateStudentAnnounceList,
navigateToStudentAnnounceDetail = navigator::navigateStudentAnnounceDetail,
navigateToTagHello = { } ,
navigateToRank = { },
navigateToTagHello = { },
navigateToRank = navigator::navigateRank,
navigateToChatting = navigator::navigateChatting,
navigateBack = navigator::popBackStack,
navigateToGreetingSender = navigator::navigateGreetingSender,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.sixkids.student.home.chatting.StudentChattingRoute
import com.sixkids.student.home.greeting.receiver.GreetingReceiverRoute
import com.sixkids.student.home.greeting.sender.GreetingSenderRoute
import com.sixkids.student.home.main.StudentHomeMainRoute
import com.sixkids.student.home.rank.StudentRankRoute
import com.sixkids.ui.SnackbarToken

fun NavController.navigateStudentHome(navOptions: NavOptions) {
Expand All @@ -31,6 +32,10 @@ fun NavController.navigateStudentChatting() {
navigate(StudentHomeRoute.chattingRoute)
}

fun NavController.navigateStudentRank() {
navigate(StudentHomeRoute.rankRoute)
}

fun NavController.navigateStudentGreetingSender() {
navigate(StudentHomeRoute.greetingSenderRoute)
}
Expand Down Expand Up @@ -90,6 +95,13 @@ fun NavGraphBuilder.studentHomeNavGraph(
)
}

composable(route = StudentHomeRoute.rankRoute) {
StudentRankRoute(
padding = padding,
onShowSnackBar = onShowSnackbar
)
}

composable(route = StudentHomeRoute.greetingSenderRoute) {
GreetingSenderRoute(
onBackClick = navigateBack,
Expand All @@ -99,7 +111,6 @@ fun NavGraphBuilder.studentHomeNavGraph(
composable(route = StudentHomeRoute.greetingReceiverRoute) {
GreetingReceiverRoute(
onBackClick = navigateBack,
onShowSnackBar = onShowSnackbar
)
}
}
Expand All @@ -114,6 +125,8 @@ object StudentHomeRoute {

const val chattingRoute = "student_chatting"

const val rankRoute = "student_rank"

const val greetingSenderRoute = "student_greeting_sender"
const val greetingReceiverRoute = "student_greeting_receiver"

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sixkids.student.home.rank

import com.sixkids.model.MemberRankItem
import com.sixkids.ui.base.SideEffect
import com.sixkids.ui.base.UiState

sealed interface StudentRankEffect : SideEffect {
data class onShowSnackBar(val message: String): StudentRankEffect
}

data class StudentRankState(
val isLoading: Boolean = false,
val classString: String = "",
val rankList: List<MemberRankItem> = emptyList(),
): UiState
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
package com.sixkids.student.home.rank

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
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.sixkids.designsystem.component.appbar.UlbanDetailAppBar
import com.sixkids.designsystem.component.screen.LoadingScreen
import com.sixkids.designsystem.theme.Yellow
import com.sixkids.model.MemberRankItem
import com.sixkids.student.home.R
import com.sixkids.student.home.rank.component.RankItem
import com.sixkids.student.home.rank.component.StudentRankViewModel
import com.sixkids.ui.SnackbarToken
import com.sixkids.ui.extension.collectWithLifecycle
import com.sixkids.designsystem.R as UlbanRes

@Composable
fun StudentRankRoute(
viewModel: StudentRankViewModel = hiltViewModel(),
padding: PaddingValues,
onShowSnackBar: (SnackbarToken) -> Unit
) {

val uiState by viewModel.uiState.collectAsStateWithLifecycle()

viewModel.sideEffect.collectWithLifecycle {
when (it) {
is StudentRankEffect.onShowSnackBar -> onShowSnackBar(SnackbarToken(it.message))
}
}

LaunchedEffect(Unit) {
viewModel.getOrganizationName()
viewModel.getClassRank()
}

Box(
modifier = Modifier
.padding(padding)
.fillMaxSize()
) {
StudentRankScreen(
studentRankState = uiState
)
if (uiState.isLoading) {
LoadingScreen()
}
}

}

@Composable
fun StudentRankScreen(
modifier: Modifier = Modifier,
studentRankState: StudentRankState = StudentRankState()
) {
Column(
modifier = modifier
.fillMaxSize()
) {
UlbanDetailAppBar(
leftIcon = UlbanRes.drawable.rank,
title = stringResource(id = R.string.student_home_main_rank),
content = stringResource(id = R.string.student_home_main_rank),
topDescription = "",
bottomDescription = studentRankState.classString,
color = Yellow
)
LazyColumn(
modifier = Modifier
.padding(16.dp)
) {
items(studentRankState.rankList.size) { index ->
RankItem(
rank = studentRankState.rankList[index].rank,
name = studentRankState.rankList[index].name,
exp = studentRankState.rankList[index].exp
)
if (index != studentRankState.rankList.size - 1) {
HorizontalDivider(
modifier = Modifier.padding(vertical = 4.dp),
color = Color.Black,
thickness = 2.dp
)
}
}
}
}
}


@Preview(showBackground = true)
@Composable
fun RankScreenPreview() {
StudentRankScreen(
studentRankState = StudentRankState(
classString = "๊ตฌ๋ฏธ ์ดˆ๋“ฑํ•™๊ต 1ํ•™๋…„ 1๋ฐ˜",
rankList = listOf(
MemberRankItem(
rank = 1,
name = "๊น€์ฒ ์ˆ˜",
exp = 100
),
MemberRankItem(
rank = 2,
name = "๋ฐ•์˜ํฌ",
exp = 90
),
MemberRankItem(
rank = 3,
name = "์ด์˜์ˆ˜",
exp = 80
),
MemberRankItem(
rank = 4,
name = "์ตœ์˜ํฌ",
exp = 70
),
MemberRankItem(
rank = 5,
name = "ํ™๊ธธ๋™",
exp = 60
),
MemberRankItem(
rank = 6,
name = "๊น€์ฒ ์ˆ˜",
exp = 50
),
MemberRankItem(
rank = 7,
name = "๋ฐ•์˜ํฌ",
exp = 40
),
MemberRankItem(
rank = 8,
name = "์ด์˜์ˆ˜",
exp = 30
),
MemberRankItem(
rank = 9,
name = "์ตœ์˜ํฌ",
exp = 20
),
MemberRankItem(
rank = 10,
name = "ํ™๊ธธ๋™",
exp = 10
)
)
)
)
}
Loading

0 comments on commit 3cf2d99

Please sign in to comment.