Skip to content

Commit f27ba0b

Browse files
authored
Merge pull request #60 from Team-MindWay/feature/54-main-network
πŸ”€ :: (#54) MainScreen 에 ν†΅μ‹ ν•œ 것을 μ μš©μœ„ν•œ λ¦¬νŽ™ν† λ§μ„ ν–ˆμŠ΅λ‹ˆλ‹€.
2 parents 531a710 + b95ee6f commit f27ba0b

File tree

8 files changed

+198
-42
lines changed

8 files changed

+198
-42
lines changed

β€Žpresentation/src/main/java/view/main/Screen/MainScreen.ktβ€Ž

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package view.main.Screen
22

3+
import androidx.activity.ComponentActivity
34
import androidx.compose.foundation.background
45
import androidx.compose.foundation.layout.Arrangement
56
import androidx.compose.foundation.layout.Column
@@ -10,46 +11,76 @@ import androidx.compose.foundation.layout.fillMaxWidth
1011
import androidx.compose.foundation.layout.height
1112
import androidx.compose.foundation.layout.padding
1213
import androidx.compose.foundation.layout.width
13-
import androidx.compose.foundation.lazy.LazyColumn
1414
import androidx.compose.foundation.shape.RoundedCornerShape
1515
import androidx.compose.material3.Text
1616
import androidx.compose.runtime.Composable
17+
import androidx.compose.runtime.LaunchedEffect
18+
import androidx.compose.runtime.getValue
1719
import androidx.compose.ui.Alignment
1820
import androidx.compose.ui.Modifier
1921
import androidx.compose.ui.graphics.Color
22+
import androidx.compose.ui.platform.LocalContext
2023
import androidx.compose.ui.text.TextStyle
2124
import androidx.compose.ui.text.font.FontWeight
2225
import androidx.compose.ui.tooling.preview.Preview
2326
import androidx.compose.ui.unit.dp
2427
import androidx.compose.ui.unit.sp
25-
import model.rank.response.RankResponseModel
26-
import view.main.component.MyRankingComponent
28+
import androidx.hilt.navigation.compose.hiltViewModel
29+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
2730
import view.main.component.MyPageButton
31+
import view.main.component.MyRanking
32+
import view.main.component.RankingList
2833
import view.main.component.TimeComponent
29-
import java.util.UUID
34+
import viewmodel.homes.HomesViewModel
35+
import viewmodel.homes.uistate.HomesMyRankUiState
36+
import viewmodel.homes.uistate.HomesUiState
37+
38+
@Composable
39+
internal fun MainRoute(
40+
navigateToBack: () -> Unit,
41+
onErrorToast: (throwable: Throwable?, message: Int?) -> Unit,
42+
viewModel: HomesViewModel = hiltViewModel(LocalContext.current as ComponentActivity)
43+
) {
44+
val homesUiState by viewModel.homesUiState.collectAsStateWithLifecycle()
45+
val homesMyRankUiState by viewModel.homesMyRankUiState.collectAsStateWithLifecycle()
46+
47+
48+
MainScreen(
49+
homesUiState = homesUiState,
50+
rankListCallBack = viewModel::getRank,
51+
homesMyRankUiState = homesMyRankUiState,
52+
onErrorToast = onErrorToast,
53+
navigateToBack = navigateToBack,
54+
myRankCallBack = viewModel::getMyRank,
55+
)
56+
57+
58+
}
3059

3160
@Composable
3261
fun MainScreen(
3362
modifier: Modifier = Modifier,
34-
rank: Int,
63+
homesUiState: HomesUiState,
64+
myRankCallBack: () -> Unit,
65+
rankListCallBack: () -> Unit,
66+
homesMyRankUiState: HomesMyRankUiState,
67+
onErrorToast: (throwable: Throwable?, message: Int?) -> Unit,
68+
navigateToBack: () -> Unit
69+
3570
) {
71+
LaunchedEffect(Unit) {
72+
myRankCallBack()
73+
rankListCallBack()
74+
}
75+
76+
3677
Column(
3778
modifier = modifier
3879
.fillMaxSize()
3980
.background(color = Color(0xFF1E1E1E)),
4081
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
4182
horizontalAlignment = Alignment.CenterHorizontally,
4283
) {
43-
Row(
44-
modifier = Modifier
45-
.fillMaxWidth()
46-
.padding(start = 316.dp, top = 4.dp, end = 10.dp, bottom = 4.dp),
47-
horizontalArrangement = Arrangement.spacedBy(10.dp, Alignment.Start),
48-
verticalAlignment = Alignment.CenterVertically,
49-
50-
) {
51-
MyPageButton() {}
52-
}
5384
Row(
5485
horizontalArrangement = Arrangement.SpaceBetween,
5586
verticalAlignment = Alignment.CenterVertically,
@@ -70,14 +101,15 @@ fun MainScreen(
70101
horizontalAlignment = Alignment.Start,
71102

72103
) {
73-
MyRankingComponent(
74-
rank = rank,
104+
MyRanking(
105+
homesMyRankUiState = homesMyRankUiState,
106+
onErrorToast = onErrorToast
75107
)
76108
}
77109
Row(
78110
modifier = Modifier
79111
.fillMaxWidth()
80-
.padding(horizontal = 20.dp,),
112+
.padding(horizontal = 20.dp),
81113
horizontalArrangement = Arrangement.spacedBy(10.dp, Alignment.Start),
82114
verticalAlignment = Alignment.CenterVertically,
83115

@@ -137,16 +169,10 @@ fun MainScreen(
137169
)
138170
)
139171
}
140-
LazyColumn(
141-
modifier = Modifier
142-
.fillMaxWidth()
143-
.padding(horizontal = 10.dp,),
144-
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
145-
horizontalAlignment = Alignment.Start,
146-
147-
) {
148-
//item viewmodel ν•œ ν›„ κ΅¬ν˜„ ν•˜κ² μŠ΅λ‹ˆλ‹€.
149-
}
172+
RankingList(
173+
homeUiState = homesUiState,
174+
onErrorToast = onErrorToast
175+
)
150176
}
151177
}
152178
}
@@ -157,6 +183,12 @@ fun MainScreen(
157183
@Preview
158184
fun PreviewMainScreen() {
159185
MainScreen(
160-
rank = 1,
186+
homesUiState = HomesUiState.Loading,
187+
rankListCallBack = {},
188+
homesMyRankUiState = HomesMyRankUiState.Loading,
189+
onErrorToast = { _, _ -> },
190+
navigateToBack = {},
191+
myRankCallBack = {},
192+
161193
)
162194
}

β€Žpresentation/src/main/java/view/main/component/MyRankingComponent.ktβ€Ž

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,46 @@ import androidx.compose.ui.tooling.preview.Preview
2020
import androidx.compose.ui.unit.dp
2121
import androidx.compose.ui.unit.sp
2222
import com.kim.presentation.R
23+
import model.myrank.response.MyRankResponseModel
2324
import model.rank.response.RankResponseModel
25+
import viewmodel.homes.uistate.HomesMyRankUiState
2426
import java.util.UUID
27+
@Composable
28+
internal fun MyRanking(
29+
modifier: Modifier = Modifier,
30+
homesMyRankUiState: HomesMyRankUiState,
31+
onErrorToast: (throwable: Throwable?, message: Int?) -> Unit,
32+
33+
){
34+
when(homesMyRankUiState){
35+
HomesMyRankUiState.Loading -> {
36+
Text(text = "λ‘œλ”©μ€‘")
37+
}
38+
is HomesMyRankUiState.Success -> {
39+
val data = homesMyRankUiState.data
40+
MyRankingComponent(
41+
modifier = modifier,
42+
data = data
43+
)
44+
}
45+
is HomesMyRankUiState.Fail -> {
46+
onErrorToast(homesMyRankUiState.throwable,R.string.error)
47+
48+
}
49+
is HomesMyRankUiState.Empty -> {
50+
51+
}
52+
}
53+
54+
}
55+
56+
57+
2558

2659
@Composable
2760
fun MyRankingComponent(
2861
modifier: Modifier = Modifier,
29-
rank: Int
62+
data: MyRankResponseModel
3063
) {
3164
Column(
3265
modifier = modifier
@@ -55,7 +88,7 @@ fun MyRankingComponent(
5588
Text(
5689
text = stringResource(
5790
R.string.Rank,
58-
rank
91+
data.rank
5992
),
6093
style = TextStyle(
6194
fontSize = 20.sp,
@@ -70,8 +103,5 @@ fun MyRankingComponent(
70103
@Composable
71104
@Preview
72105
fun PreviewMyRankingComponent() {
73-
MyRankingComponent(
74-
rank = 3
75106

76-
)
77107
}

β€Žpresentation/src/main/java/view/main/component/Rankingcomponent.ktβ€Ž

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import androidx.compose.foundation.layout.Row
99
import androidx.compose.foundation.layout.Spacer
1010
import androidx.compose.foundation.layout.fillMaxWidth
1111
import androidx.compose.foundation.layout.height
12+
import androidx.compose.foundation.layout.heightIn
1213
import androidx.compose.foundation.layout.width
14+
import androidx.compose.foundation.lazy.LazyColumn
15+
import androidx.compose.foundation.lazy.items
1316
import androidx.compose.foundation.shape.RoundedCornerShape
1417
import androidx.compose.material3.Text
1518
import androidx.compose.runtime.Composable
@@ -21,9 +24,43 @@ import androidx.compose.ui.text.font.FontWeight
2124
import androidx.compose.ui.tooling.preview.Preview
2225
import androidx.compose.ui.unit.dp
2326
import androidx.compose.ui.unit.sp
27+
import com.kim.presentation.R
28+
import kotlinx.collections.immutable.PersistentList
29+
import kotlinx.collections.immutable.toPersistentList
2430
import model.rank.response.RankResponseModel
31+
import viewmodel.homes.uistate.HomesMyRankUiState
32+
import viewmodel.homes.uistate.HomesUiState
2533
import java.util.UUID
2634

35+
@Composable
36+
internal fun RankingList(
37+
modifier: Modifier = Modifier,
38+
homeUiState: HomesUiState,
39+
onErrorToast: (throwable: Throwable?, message: Int?) -> Unit
40+
) {
41+
when (homeUiState) {
42+
HomesUiState.Loading -> {
43+
Text(text = "λ‘œλ”©μ€‘")
44+
}
45+
46+
is HomesUiState.Success -> {
47+
val list = homeUiState.data
48+
49+
RankingListItem(
50+
modifier = modifier,
51+
list = list.toPersistentList()
52+
)
53+
}
54+
55+
is HomesUiState.Fail -> {
56+
onErrorToast(homeUiState.exception, R.string.error)
57+
}
58+
59+
is HomesUiState.Empty -> {
60+
61+
}
62+
}
63+
}
2764

2865
@Composable
2966
fun RankingComponent(
@@ -50,12 +87,12 @@ fun RankingComponent(
5087
verticalAlignment = Alignment.CenterVertically,
5188
) {
5289
Text(
53-
text = data.rank.toString(),
90+
text = "${data.rank}μœ„",
5491
style = TextStyle(
5592
fontSize = 16.sp,
5693
fontWeight = FontWeight(700),
5794
color = Color(0xFFFFFFFF),
58-
)
95+
)
5996
)
6097
Spacer(modifier = Modifier.width(20.dp))
6198
Text(
@@ -64,11 +101,11 @@ fun RankingComponent(
64101
fontSize = 16.sp,
65102
fontWeight = FontWeight(600),
66103
color = Color(0xFFFFFFFF),
67-
)
104+
)
68105
)
69106
Spacer(modifier = Modifier.width(152.dp))
70107
Text(
71-
text = data.penaltyPoint.toString(),
108+
text = "${data.penaltyPoint}점",
72109
style = TextStyle(
73110
fontSize = 14.sp,
74111
fontWeight = FontWeight(600),
@@ -79,6 +116,35 @@ fun RankingComponent(
79116
}
80117
}
81118

119+
@Composable
120+
internal fun RankingListItem(
121+
modifier: Modifier = Modifier,
122+
list: PersistentList<RankResponseModel>,
123+
124+
) {
125+
Column(modifier = modifier.fillMaxWidth()) {
126+
LazyColumn(
127+
modifier = Modifier
128+
.fillMaxWidth()
129+
.heightIn(max = 10_000.dp)
130+
) {
131+
items(
132+
items = list,
133+
key = { data ->
134+
data.userId
135+
}
136+
) { data ->
137+
RankingComponent(
138+
modifier = Modifier.fillMaxWidth(),
139+
data = data
140+
)
141+
}
142+
143+
}
144+
145+
}
146+
}
147+
82148

83149
@Composable
84150
@Preview
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package view.main.navigation
2+
3+
import androidx.navigation.NavController
4+
import androidx.navigation.NavGraphBuilder
5+
import androidx.navigation.compose.composable
6+
import view.main.Screen.MainRoute
7+
import view.main.Screen.MainScreen
8+
9+
const val mainRoute = "main_route"
10+
11+
fun NavController.navigationToMain(){
12+
this.navigate(mainRoute)
13+
}
14+
fun NavGraphBuilder.mainScreen(
15+
navigateToBack: () -> Unit,
16+
onErrorToast: (throwable: Throwable?, message: Int?) -> Unit
17+
18+
){
19+
composable(mainRoute){
20+
MainRoute(
21+
navigateToBack = navigateToBack,
22+
onErrorToast = onErrorToast
23+
)
24+
}
25+
}

β€Žpresentation/src/main/java/viewModel/homes/HomesViewmodel.ktβ€Ž

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class HomesViewModel @Inject constructor(
3636
}
3737

3838
is Result.Error -> {
39-
_homesUiState.value = HomesUiState.Fail
39+
_homesUiState.value = HomesUiState.Fail(result.exception)
40+
4041
}
4142

4243
is Result.Success -> {
@@ -57,7 +58,7 @@ class HomesViewModel @Inject constructor(
5758
}
5859

5960
is Result.Error -> {
60-
_homesMyRankUiState.value = HomesMyRankUiState.Fail
61+
_homesMyRankUiState.value = HomesMyRankUiState.Fail(result.exception,null)
6162
}
6263

6364
is Result.Success -> {

β€Žpresentation/src/main/java/viewModel/homes/uistate/HomesMyRankUiState.ktβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ sealed interface HomesMyRankUiState {
66
object Loading : HomesMyRankUiState
77
object Empty : HomesMyRankUiState
88
data class Success(val data: MyRankResponseModel) : HomesMyRankUiState
9-
object Fail : HomesMyRankUiState
9+
data class Fail(val throwable: Throwable?, val message: Int?) : HomesMyRankUiState
1010
}

0 commit comments

Comments
Β (0)