ref: caching joined rooms

This commit is contained in:
2025-11-04 23:24:20 +03:00
parent 7026acc229
commit 70d9db6cbf
4 changed files with 74 additions and 73 deletions
@@ -24,16 +24,25 @@ import ru.risdeveau.pixeldragon.token
// //
//} //}
suspend fun getRooms(): List<String> { suspend fun getJoinedRooms(): List<Room> {
val r = client.get("$baseUrl/joined_rooms")
{ bearerAuth(token) }
val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms")
return List(
rooms.length()
) { i -> getRoom(rooms.getString(i), true) }
}
suspend fun isJoined(id: String): Boolean {
val r = client.get("$baseUrl/joined_rooms") val r = client.get("$baseUrl/joined_rooms")
{ bearerAuth(token) } { bearerAuth(token) }
val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms") val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms")
return List<String>( return List<String>(
rooms.length() rooms.length()
) { i -> rooms.getString(i) } ) { i -> rooms.getString(i) }.contains(id)
} }
suspend fun getRoom(rid: String): Room { suspend fun getRoom(rid: String, joined: Boolean? = null): Room {
val direct = getAccountData(getMe()!!.userId, "m.direct") val direct = getAccountData(getMe()!!.userId, "m.direct")
var directWith = "" var directWith = ""
direct?.let { direct?.let {
@@ -61,7 +70,7 @@ suspend fun getRoom(rid: String): Room {
null, null,
avatar, avatar,
null, null,
true, // TODO: insert actual value joined ?: isJoined(rid),
if (directWith.isNotEmpty()) User.getById(directWith) else null if (directWith.isNotEmpty()) User.getById(directWith) else null
) )
} }
@@ -5,6 +5,7 @@
package ru.risdeveau.pixeldragon.repo package ru.risdeveau.pixeldragon.repo
import ru.risdeveau.pixeldragon.api.getJoinedRooms
import ru.risdeveau.pixeldragon.api.getRoom import ru.risdeveau.pixeldragon.api.getRoom
import ru.risdeveau.pixeldragon.db.cacheDb import ru.risdeveau.pixeldragon.db.cacheDb
import ru.risdeveau.pixeldragon.db.isExpired import ru.risdeveau.pixeldragon.db.isExpired
@@ -34,5 +35,13 @@ class Room (
} }
return cachedRoom!!.toDomain() return cachedRoom!!.toDomain()
} }
suspend fun getJoined(cached: Boolean = true): List<Room> {
val cacheJoined = cacheDb.roomDoa().getAllJoined()
if (cacheJoined.isEmpty()) {
return getJoinedRooms()
}
return List(cacheJoined.size) { i -> cacheJoined[i].toDomain() }
}
} }
} }
@@ -86,7 +86,7 @@ fun EventItem(event: Event) {
"m.room.message" -> Column( "m.room.message" -> Column(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.then ( .then(
if (event.sender != ME!!.userId) if (event.sender != ME!!.userId)
Modifier.padding(end = 16.dp) Modifier.padding(end = 16.dp)
else else
@@ -106,8 +106,11 @@ fun EventItem(event: Event) {
when (val msgtype = event.content.optString("msgtype", null)) { when (val msgtype = event.content.optString("msgtype", null)) {
"m.text" -> when (event.content.optString("format")) { "m.text" -> when (event.content.optString("format")) {
"org.matrix.custom.html" -> "org.matrix.custom.html" -> {
if (event.content.getString("body") == event.content.getString("formatted_body"))
Text(event.content.getString("body"))
HtmlRenderer(event.content.getString("formatted_body")) HtmlRenderer(event.content.getString("formatted_body"))
}
else -> Text(event.content.getString("body")) else -> Text(event.content.getString("body"))
} }
@@ -18,7 +18,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -29,17 +28,17 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import ru.risdeveau.pixeldragon.api.getRooms
import ru.risdeveau.pixeldragon.repo.Room import ru.risdeveau.pixeldragon.repo.Room
import ru.risdeveau.pixeldragon.ui.item.MXCImage import ru.risdeveau.pixeldragon.ui.item.MXCImage
@Composable @Composable
fun RoomList(modifier: Modifier = Modifier, navController: NavController) { fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
var list by remember { mutableStateOf(listOf<String>()) } var list by remember { mutableStateOf(listOf<Room>()) }
val listState = rememberLazyListState() val listState = rememberLazyListState()
// if (itemState.scrollToTop) { // if (itemState.scrollToTop) {
@@ -50,12 +49,12 @@ fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
// } // }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
list = withContext(Dispatchers.IO) { getRooms() } list = withContext(Dispatchers.IO) { Room.getJoined() }
} }
LazyColumn(modifier = modifier, state = listState) { LazyColumn(modifier = modifier, state = listState) {
items(list) { rid -> items(list) { room ->
RoomItem(rid = rid, navController = navController ) RoomItem(room = room, navController = navController )
} }
item { item {
@@ -67,72 +66,53 @@ fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
} }
@Composable @Composable
fun RoomItem(modifier: Modifier = Modifier, rid: String, navController: NavController) { fun RoomItem(modifier: Modifier = Modifier, room: Room, navController: NavController) {
var room by remember { mutableStateOf<Room?>(null) } val avatarUrl = room.avatarUrl ?: (room.direct?.avatarUrl ?: "")
val name = room.name ?: (room.direct?.name ?: "Unnamed")
LaunchedEffect(Unit) { Row(
room = withContext(Dispatchers.IO) { Room.getById(rid) } modifier
} .padding(8.dp)
.height((52 + 8 * 2).dp)
if (room != null) { .fillMaxWidth()
val room = room!! .background(
val avatarUrl = room.avatarUrl ?: (room.direct?.avatarUrl ?: "") color =
Row(
modifier
.padding(8.dp)
.height((52 + 8 * 2).dp)
.fillMaxWidth()
.background(
color =
if (room.type == "m.space")
MaterialTheme.colorScheme.tertiary
else
MaterialTheme.colorScheme.background
)
.clip(RoundedCornerShape(12.dp))
.clickable {
if (room.type == "m.space") if (room.type == "m.space")
navController.navigate("space/$rid") MaterialTheme.colorScheme.tertiary
else else
navController.navigate("room/$rid") MaterialTheme.colorScheme.background
}
.padding(8.dp)
) {
MXCImage(
avatarUrl,
modifier = Modifier
.padding(end = 4.dp)
.height(52.dp)
.width(52.dp)
.let {
if (room.type == "m.space")
it.clip(RoundedCornerShape(12.dp))
else
it.clip(CircleShape)
}
) )
Column { .clip(RoundedCornerShape(12.dp))
Text(room.type) .clickable {
Text( if (room.type == "m.space")
room.name ?: "Unnamed", navController.navigate("space/${room.id}")
maxLines = 1, else
color = MaterialTheme.colorScheme.primary, navController.navigate("room/${room.id}")
fontSize = MaterialTheme.typography.titleLarge.fontSize
)
} }
} .padding(8.dp)
} else { ) {
Row( MXCImage(
modifier avatarUrl,
.padding(8.dp) modifier = Modifier
.height(80.dp) .padding(end = 4.dp)
.fillMaxWidth() .height(52.dp)
.background(MaterialTheme.colorScheme.background) .width(52.dp)
.clip(RoundedCornerShape(16.dp)) .let {
.padding(8.dp) if (room.type == "m.space")
) { it.clip(RoundedCornerShape(12.dp))
LinearProgressIndicator(Modifier.fillMaxWidth()) else
it.clip(CircleShape)
},
ContentScale.Crop
)
Column {
Text(room.type)
Text(
name,
maxLines = 1,
color = MaterialTheme.colorScheme.primary,
fontSize = MaterialTheme.typography.titleLarge.fontSize
)
} }
} }
} }