@@ -27,6 +27,7 @@ import androidx.compose.material3.Scaffold
27
27
import androidx.compose.material3.Text
28
28
import androidx.compose.material3.TopAppBarDefaults
29
29
import androidx.compose.runtime.Composable
30
+ import androidx.compose.runtime.LaunchedEffect
30
31
import androidx.compose.runtime.getValue
31
32
import androidx.compose.runtime.mutableStateOf
32
33
import androidx.compose.runtime.remember
@@ -43,6 +44,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel
43
44
import androidx.navigation.NavController
44
45
import com.ramcosta.composedestinations.annotation.Destination
45
46
import com.sunkensplashstudios.VRCRoboScout.ui.theme.*
47
+ import kotlinx.coroutines.CoroutineScope
48
+ import kotlinx.coroutines.Dispatchers
49
+ import kotlinx.coroutines.launch
50
+ import kotlinx.coroutines.withContext
46
51
47
52
class EventDivisionAwardsViewModel : ViewModel () {
48
53
var event by mutableStateOf(Event ())
@@ -52,7 +57,27 @@ class EventDivisionAwardsViewModel: ViewModel() {
52
57
@OptIn(ExperimentalMaterial3Api ::class )
53
58
@Destination
54
59
@Composable
55
- fun EventDivisionAwardsView (eventDivisionAwardsViewModel : EventDivisionAwardsViewModel = viewModel(), navController : NavController ) {
60
+ fun EventDivisionAwardsView (event : Event , division : Division , eventDivisionAwardsViewModel : EventDivisionAwardsViewModel = viewModel(), navController : NavController ) {
61
+
62
+ var loading by remember { mutableStateOf(event.awards[division] == null ) }
63
+
64
+ fun updateAwards () {
65
+ if (event.matches[division] == null ) {
66
+ loading = true
67
+ }
68
+ CoroutineScope (Dispatchers .Default ).launch {
69
+ event.fetchAwards(division)
70
+ withContext(Dispatchers .Main ) {
71
+ loading = false
72
+ }
73
+ }
74
+ }
75
+
76
+ LaunchedEffect (Unit ) {
77
+ eventDivisionAwardsViewModel.event = event
78
+ eventDivisionAwardsViewModel.division = division
79
+ }
80
+
56
81
Scaffold (
57
82
topBar = {
58
83
CenterAlignedTopAppBar (
@@ -61,7 +86,7 @@ fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsVie
61
86
titleContentColor = MaterialTheme .colorScheme.onTopContainer,
62
87
),
63
88
title = {
64
- Text (" Event Info " , fontWeight = FontWeight .Bold )
89
+ Text (" ${division.name} Awards " , fontWeight = FontWeight .Bold )
65
90
},
66
91
navigationIcon = {
67
92
Icon (
@@ -79,22 +104,29 @@ fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsVie
79
104
Column (
80
105
modifier = Modifier .fillMaxSize().padding(padding)
81
106
) {
82
- Text (
83
- eventDivisionAwardsViewModel.event.name,
84
- modifier = Modifier .padding(20 .dp),
85
- textAlign = TextAlign .Center ,
86
- fontSize = 20 .sp,
87
- )
88
- Column (
89
- modifier = Modifier .verticalScroll(rememberScrollState())
90
- ) {
107
+ var update by remember { mutableStateOf(true ) }
108
+
109
+ if (update) {
110
+ update = false
111
+ updateAwards()
112
+ }
113
+
114
+ if (loading) {
115
+ LoadingView ()
116
+ }
117
+ else if ((event.awards[division] ? : emptyList()).isEmpty()) {
118
+ NoDataView ()
119
+ }
120
+ else {
91
121
Column (
92
- modifier = Modifier .fillMaxSize().padding(padding )
122
+ modifier = Modifier .verticalScroll(rememberScrollState() )
93
123
) {
94
124
Card (
95
125
modifier = Modifier .padding(horizontal = 10 .dp, vertical = 2 .dp),
96
126
colors = CardColors (
97
- containerColor = MaterialTheme .colorScheme.surfaceContainer.copy(alpha = 0.5f ),
127
+ containerColor = MaterialTheme .colorScheme.surfaceContainer.copy(
128
+ alpha = 0.5f
129
+ ),
98
130
disabledContainerColor = Color .Unspecified .copy(alpha = 0.5f ),
99
131
contentColor = MaterialTheme .colorScheme.onSurface,
100
132
disabledContentColor = Color .Unspecified
@@ -104,159 +136,42 @@ fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsVie
104
136
verticalArrangement = Arrangement .spacedBy(0 .dp),
105
137
modifier = Modifier .padding(horizontal = 10 .dp)
106
138
) {
107
- Row (
108
- horizontalArrangement = Arrangement .SpaceBetween ,
109
- verticalAlignment = Alignment .CenterVertically ,
110
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
111
- ) {
112
- Text (
113
- " Teams" ,
114
- )
115
- Spacer (modifier = Modifier .size(10 .dp))
116
- Text (
117
- eventDivisionAwardsViewModel.event.teams.size.toString(),
118
- )
119
- }
120
- HorizontalDivider (
121
- thickness = 0.5 .dp,
122
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
123
- )
124
- Box {
125
- var expanded by remember { mutableStateOf(false ) }
139
+ event.awards[division]?.forEach { award ->
126
140
Row (
127
- horizontalArrangement = Arrangement .SpaceBetween ,
128
- verticalAlignment = Alignment .CenterVertically ,
129
141
modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
130
142
) {
131
- Text (
132
- " Divisions" ,
133
- color = MaterialTheme .colorScheme.button,
134
- modifier = Modifier .clickable {
135
- expanded = ! expanded
143
+ Column {
144
+ Text (award.title)
145
+ Column (
146
+ verticalArrangement = Arrangement .spacedBy(- 5 .dp),
147
+ ) {
148
+ award.teamWinners.forEach { teamWinner ->
149
+ val team =
150
+ event.getTeam(teamWinner.team.id) ? : Team ()
151
+ Row {
152
+ Text (
153
+ team.number,
154
+ fontSize = 14 .sp,
155
+ fontWeight = FontWeight .Bold ,
156
+ color = Color .Gray
157
+ )
158
+ Spacer (modifier = Modifier .size(5 .dp))
159
+ Text (
160
+ team.name,
161
+ fontSize = 14 .sp,
162
+ color = Color .Gray
163
+ )
164
+ }
165
+ }
136
166
}
137
- )
138
- Spacer (modifier = Modifier .size(10 .dp))
139
- Text (
140
- eventDivisionAwardsViewModel.event.divisions.size.toString(),
141
- )
142
- }
143
- DropdownMenu (
144
- expanded = expanded,
145
- onDismissRequest = { expanded = false }
146
- ) {
147
- eventDivisionAwardsViewModel.event.divisions.forEach { division ->
148
- DropdownMenuItem (
149
- text = {
150
- Text (
151
- division.name
152
- )
153
- },
154
- onClick = { }
155
- )
156
167
}
157
168
}
158
- }
159
- HorizontalDivider (
160
- thickness = 0.5 .dp,
161
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
162
- )
163
- Row (
164
- horizontalArrangement = Arrangement .SpaceBetween ,
165
- verticalAlignment = Alignment .CenterVertically ,
166
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
167
- ) {
168
- Text (
169
- " City" ,
170
- )
171
- Spacer (modifier = Modifier .size(10 .dp))
172
- Text (
173
- eventDivisionAwardsViewModel.event.location.city ? : " Unknown" ,
174
- )
175
- }
176
- HorizontalDivider (
177
- thickness = 0.5 .dp,
178
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
179
- )
180
- Row (
181
- horizontalArrangement = Arrangement .SpaceBetween ,
182
- verticalAlignment = Alignment .CenterVertically ,
183
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
184
- ) {
185
- Text (
186
- " Region" ,
187
- )
188
- Spacer (modifier = Modifier .size(10 .dp))
189
- Text (
190
- eventDivisionAwardsViewModel.event.location.region ? : " Unknown" ,
191
- )
192
- }
193
- HorizontalDivider (
194
- thickness = 0.5 .dp,
195
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
196
- )
197
- Row (
198
- horizontalArrangement = Arrangement .SpaceBetween ,
199
- verticalAlignment = Alignment .CenterVertically ,
200
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
201
- ) {
202
- Text (
203
- " Country" ,
204
- )
205
- Spacer (modifier = Modifier .size(10 .dp))
206
- Text (
207
- eventDivisionAwardsViewModel.event.location.country ? : " Unknown" ,
208
- )
209
- }
210
- HorizontalDivider (
211
- thickness = 0.5 .dp,
212
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
213
- )
214
- Row (
215
- horizontalArrangement = Arrangement .SpaceBetween ,
216
- verticalAlignment = Alignment .CenterVertically ,
217
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
218
- ) {
219
- Text (
220
- " Date" ,
221
- )
222
- Spacer (modifier = Modifier .size(10 .dp))
223
- Text (
224
- RoboScoutAPI .formatDate(eventDivisionAwardsViewModel.event.startDate)
225
- )
226
- }
227
- HorizontalDivider (
228
- thickness = 0.5 .dp,
229
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
230
- )
231
- Row (
232
- horizontalArrangement = Arrangement .SpaceBetween ,
233
- verticalAlignment = Alignment .CenterVertically ,
234
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
235
- ) {
236
- Text (
237
- " Season" ,
238
- )
239
- Spacer (modifier = Modifier .size(10 .dp))
240
- Text (
241
- eventDivisionAwardsViewModel.event.season.name
242
- )
243
- }
244
- HorizontalDivider (
245
- thickness = 0.5 .dp,
246
- color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
247
- )
248
- Row (
249
- horizontalArrangement = Arrangement .SpaceBetween ,
250
- verticalAlignment = Alignment .CenterVertically ,
251
- modifier = Modifier .fillMaxWidth().padding(vertical = 10 .dp)
252
- ) {
253
- Text (
254
- " Developer" ,
255
- )
256
- Spacer (modifier = Modifier .size(10 .dp))
257
- Text (
258
- eventDivisionAwardsViewModel.event.sku
259
- )
169
+ if (event.awards[division]?.last() != award) {
170
+ HorizontalDivider (
171
+ thickness = 0.5 .dp,
172
+ color = MaterialTheme .colorScheme.secondary.copy(alpha = 0.1f ),
173
+ )
174
+ }
260
175
}
261
176
}
262
177
}
0 commit comments