diff --git a/app/src/main/java/hu/bme/kszk/szobatarsch/composable/FindPeople.kt b/app/src/main/java/hu/bme/kszk/szobatarsch/composable/FindPeople.kt index fd9785b98359652afae1816911b3c06b87f34065..11b9cd14c33950c476d722deb6822eff06393212 100644 --- a/app/src/main/java/hu/bme/kszk/szobatarsch/composable/FindPeople.kt +++ b/app/src/main/java/hu/bme/kszk/szobatarsch/composable/FindPeople.kt @@ -1,32 +1,54 @@ package hu.bme.kszk.szobatarsch.composable import androidx.compose.animation.core.animateDpAsState -import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.gestures.detectDragGestures -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.runtime.* -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.rotate import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import hu.bme.kszk.szobatarsch.firebase.* +import kotlinx.coroutines.launch -@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun FindPeople() { + val items = remember { mutableStateListOf<User>() } + val user = remember { mutableStateOf<User?>(null) } + val coroutineScope = rememberCoroutineScope() + LaunchedEffect(Unit) { + userData.collect { newUser -> + if (newUser != user.value) { + user.value = newUser + } + } + } - val items = remember { mutableStateListOf<Int>() } + LaunchedEffect(items.size, user.value) { + val limit = 3L - LaunchedEffect(Unit) { - (1..5).forEach { items += it } + if (user.value == null) return@LaunchedEffect + + if (items.size < 3) { + val list = + user.value!!.likedUsers + user.value!!.dismissedUsers + items.map { it.id } + user.value!!.id + geLimitedLikeableUsers( + userList = list, + limit = limit + ).forEach { + items += it + } + } } val width = LocalConfiguration.current.screenWidthDp.dp @@ -36,8 +58,10 @@ fun FindPeople() { val edge = width + 100.dp val sens = width / 2 - val degPerDp = 20 / width.value + val degPerDp = 15 / width.value + val alphaPerDp = 0.75f / width.value fun Dp.getRotation() = value * degPerDp + fun Dp.getAlpha() = if (value < 0) (-value) * alphaPerDp else value * alphaPerDp Box() { items.forEach { @@ -47,8 +71,20 @@ fun FindPeople() { targetValue = offset, finishedListener = { off -> if (off == edge) { + user.value!!.likedUsers += it.id + + coroutineScope.launch { + registerOrOverwriteUser(user.value!!) + } + items -= it } else if (off == -edge) { + user.value!!.dismissedUsers += it.id + + coroutineScope.launch { + registerOrOverwriteUser(user.value!!) + } + items -= it } }, @@ -75,11 +111,15 @@ fun FindPeople() { } .offset(x = animatedOffset) .rotate(animatedOffset.getRotation()) + .alpha(1f - animatedOffset.getAlpha()) .fillMaxSize() - .padding(8.dp), + .padding(8.dp) + .verticalScroll(rememberScrollState()), elevation = CardDefaults.cardElevation(defaultElevation = 10.dp) ) { - Text(it.toString()) + Column(Modifier.padding(8.dp)) { + UserDataCard(it, true) + } } } }