Skip to content
Snippets Groups Projects
Commit 399970e3 authored by Fodor Patrik's avatar Fodor Patrik :ghost:
Browse files

Matches page

parent e646e8ff
No related branches found
No related tags found
No related merge requests found
package hu.bme.kszk.szobatarsch.composable
import androidx.compose.animation.Crossfade
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import hu.bme.kszk.szobatarsch.firebase.User
import hu.bme.kszk.szobatarsch.firebase.matchedUsersData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@Composable
fun Matches() {
var loaded by remember { mutableStateOf(false) }
val matchedList = remember { mutableStateListOf<User>() }
LaunchedEffect(Unit) {
launch(Dispatchers.IO) {
matchedUsersData.collect { newList ->
matchedList.removeAll { old ->
newList.none { old.id == it.id }
}
newList.forEach { new ->
val oldIdx = matchedList.indexOfFirst { it.id == new.id }
if (oldIdx == -1) return@forEach
val old = matchedList[oldIdx]
if (new != old) {
matchedList[oldIdx] = new
}
}
newList.forEach { new ->
if (matchedList.none { it.id == new.id }) {
matchedList += new
}
}
matchedList.sortBy { newList.indexOf(it) }
loaded = true
}
}
}
Crossfade(loaded) { load ->
if (load) {
LazyColumn(
modifier = Modifier
.fillMaxSize(),
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
this.items(
items = matchedList,
key = { user -> user.id },
itemContent = { user ->
UserCard(
user = user
)
}
)
}
} else {
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
CircularProgressIndicator()
}
}
}
}
@Composable
fun UserCard(user: User) {
Row(modifier = Modifier.padding(all = 8.dp)) {
Icon(Icons.Default.Person, contentDescription = null)
Spacer(modifier = Modifier.width(8.dp))
var isExpanded by remember { mutableStateOf(false) }
Column(modifier = Modifier.clickable { isExpanded = !isExpanded }) {
Text(
text = user.name,
)
Spacer(modifier = Modifier.height(4.dp))
Surface(
shape = MaterialTheme.shapes.medium,
tonalElevation = 1.dp,
modifier = Modifier
.animateContentSize()
.padding(1.dp)
) {
Text(
text = user.description,
modifier = Modifier.padding(all = 4.dp),
maxLines = if (isExpanded) Int.MAX_VALUE else 1,
)
}
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment