Skip to content

Commit 41372da

Browse files
add home feature
1 parent 6a667fa commit 41372da

File tree

2 files changed

+95
-48
lines changed

2 files changed

+95
-48
lines changed

app/src/main/java/com/example/quizkit/ui/screen/home/Home.kt

Lines changed: 72 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.quizkit.ui.screen.home
22

33
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.clickable
45
import androidx.compose.foundation.layout.Arrangement
56
import androidx.compose.foundation.layout.Column
67
import androidx.compose.foundation.layout.PaddingValues
@@ -21,10 +22,12 @@ import androidx.compose.material3.Button
2122
import androidx.compose.material3.ButtonDefaults
2223
import androidx.compose.material3.Card
2324
import androidx.compose.material3.CardDefaults
25+
import androidx.compose.material3.ExperimentalMaterial3Api
2426
import androidx.compose.material3.Icon
2527
import androidx.compose.material3.Surface
2628
import androidx.compose.material3.Text
2729
import androidx.compose.runtime.Composable
30+
import androidx.compose.runtime.collectAsState
2831
import androidx.compose.ui.Alignment
2932
import androidx.compose.ui.Modifier
3033
import androidx.compose.ui.draw.clip
@@ -36,69 +39,84 @@ import androidx.compose.ui.unit.dp
3639
import androidx.compose.ui.unit.sp
3740
import com.example.quizkit.R
3841
import com.example.quizkit.ui.component.CardQuiz
42+
import org.koin.androidx.compose.koinViewModel
3943

4044
@Composable
41-
fun HomeScreen(innerPadding:PaddingValues = PaddingValues(20.dp)){
42-
Column(
43-
Modifier
44-
.padding(innerPadding)
45-
) {
45+
fun HomeScreen(
46+
navigateToQuiz: (String) -> Unit,
47+
navigateToCategory: () -> Unit,
48+
homeViewModel: HomeViewModel = koinViewModel()
49+
) {
50+
Column {
4651
Column(Modifier.padding(20.dp)) {
4752
Spacer(modifier = Modifier.height(16.dp))
48-
RecentBoard()
53+
RecentBoard(homeViewModel, navigateToQuiz, navigateToCategory)
4954
Spacer(modifier = Modifier.height(16.dp))
50-
PlayBoard()
55+
PlayBoard(navigateToCategory)
5156
}
52-
PopularList()
57+
PopularList(navigateToQuiz, navigateToCategory)
5358
}
5459
}
5560

61+
@OptIn(ExperimentalMaterial3Api::class)
5662
@Composable
57-
fun RecentBoard(){
58-
val recentList = listOf<String>("a")
63+
fun RecentBoard(
64+
homeViewModel: HomeViewModel,
65+
navigateToQuiz: (String) -> Unit,
66+
navigateToCategory: () -> Unit
67+
) {
5968

60-
Card(
61-
modifier = Modifier
62-
.fillMaxWidth()
63-
.height(90.dp),
64-
colors = CardDefaults.cardColors(
65-
containerColor = Color(0xFFE4EAFF),
66-
)
67-
) {
68-
Row(
69-
Modifier
69+
homeViewModel.getLatestHistory().collectAsState(initial = null).value.let { history ->
70+
Card(
71+
modifier = Modifier
7072
.fillMaxWidth()
71-
.padding(16.dp),
72-
horizontalArrangement = Arrangement.SpaceBetween,
73-
verticalAlignment = Alignment.CenterVertically) {
74-
Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Center) {
75-
Text(
76-
text = if(recentList.isNotEmpty())"Recent Quiz" else "Lets Play Quiz",
77-
fontWeight = FontWeight.Medium,
78-
fontSize = 24.sp
79-
)
80-
if(recentList.isNotEmpty()){
73+
.height(90.dp),
74+
colors = CardDefaults.cardColors(
75+
containerColor = Color(0xFFE4EAFF),
76+
),
77+
onClick = {
78+
if (history != null) navigateToQuiz(history.category) else
79+
navigateToCategory()
80+
}
81+
) {
82+
Row(
83+
Modifier
84+
.fillMaxWidth()
85+
.padding(16.dp),
86+
horizontalArrangement = Arrangement.SpaceBetween,
87+
verticalAlignment = Alignment.CenterVertically
88+
) {
89+
90+
Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Center) {
8191
Text(
82-
text = "History - Education",
92+
text = if (history != null) "Recent Quiz" else "Lets Play Quiz",
8393
fontWeight = FontWeight.Medium,
84-
fontSize = 18.sp,
85-
color = colorResource(id = R.color.text_purple)
94+
fontSize = 24.sp
8695
)
87-
}
96+
if (history != null) {
97+
Text(
98+
text = "${history.quiz} - ${history.category}",
99+
fontWeight = FontWeight.Medium,
100+
fontSize = 18.sp,
101+
color = colorResource(id = R.color.text_purple)
102+
)
103+
}
88104

89-
}
90-
Icon(
91-
imageVector = Icons.Default.KeyboardArrowRight,
92-
contentDescription = "recent-play",
93-
modifier = Modifier.size(30.dp),
94-
tint = colorResource(id = R.color.text_purple)
105+
}
106+
Icon(
107+
imageVector = Icons.Default.KeyboardArrowRight,
108+
contentDescription = "recent-play",
109+
modifier = Modifier.size(30.dp),
110+
tint = colorResource(id = R.color.text_purple)
95111
)
112+
}
113+
96114
}
97115
}
98116
}
99117

100118
@Composable
101-
fun PlayBoard(){
119+
fun PlayBoard(navigateToCategory: () -> Unit) {
102120
Surface(color = Color(0x4DF1F4FF), shape = RoundedCornerShape(12)) {
103121
Column(
104122
Modifier
@@ -116,7 +134,7 @@ fun PlayBoard(){
116134
)
117135
Spacer(modifier = Modifier.height(8.dp))
118136
Button(
119-
onClick = { /*TODO*/ },
137+
onClick = navigateToCategory,
120138
colors = ButtonDefaults.buttonColors(
121139
containerColor = Color.White,
122140
contentColor = colorResource(id = R.color.text_purple)
@@ -129,7 +147,7 @@ fun PlayBoard(){
129147
}
130148

131149
@Composable
132-
fun PopularList(){
150+
fun PopularList(navigateToQuiz: (String) -> Unit, navigateToCategory: () -> Unit) {
133151
Surface(
134152
Modifier
135153
.fillMaxSize(),
@@ -139,8 +157,13 @@ fun PopularList(){
139157
Column(
140158
Modifier
141159
.padding(20.dp)
142-
.padding(top = 16.dp)) {
143-
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.Bottom) {
160+
.padding(top = 16.dp)
161+
) {
162+
Row(
163+
Modifier.fillMaxWidth(),
164+
horizontalArrangement = Arrangement.SpaceBetween,
165+
verticalAlignment = Alignment.Bottom
166+
) {
144167
Text(
145168
text = "Popular Quiz",
146169
fontWeight = FontWeight.Medium,
@@ -150,13 +173,14 @@ fun PopularList(){
150173
text = "See All",
151174
fontWeight = FontWeight.Medium,
152175
fontSize = 18.sp,
153-
color = colorResource(id = R.color.text_purple)
176+
color = colorResource(id = R.color.text_purple),
177+
modifier = Modifier.clickable { navigateToCategory() }
154178
)
155179
}
156180
Column {
157181
Spacer(modifier = Modifier.height(12.dp))
158-
CardQuiz()
159-
CardQuiz()
182+
CardQuiz("Education", "Geography", navigateToQuiz)
183+
CardQuiz("Showbiz", "Video Games", navigateToQuiz)
160184
}
161185
}
162186
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.example.quizkit.ui.screen.home
2+
3+
import androidx.lifecycle.ViewModel
4+
import com.example.quizkit.data.network.local.room.HistoryEntity
5+
import com.example.quizkit.data.network.local.room.UserEntity
6+
import com.example.quizkit.repository.AuthRepository
7+
import com.example.quizkit.repository.QuizRepository
8+
import kotlinx.coroutines.flow.Flow
9+
import kotlinx.coroutines.flow.MutableStateFlow
10+
11+
class HomeViewModel(
12+
private val quizRepository: QuizRepository,
13+
private val authRepository: AuthRepository,
14+
) : ViewModel() {
15+
16+
fun getLatestHistory(): Flow<HistoryEntity> {
17+
return quizRepository.getLatestHistory()
18+
}
19+
20+
fun getUser(email:String): Flow<UserEntity> {
21+
return authRepository.getUser(email)
22+
}
23+
}

0 commit comments

Comments
 (0)