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")
{ bearerAuth(token) }
val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms")
return List<String>(
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")
var directWith = ""
direct?.let {
@@ -61,7 +70,7 @@ suspend fun getRoom(rid: String): Room {
null,
avatar,
null,
true, // TODO: insert actual value
joined ?: isJoined(rid),
if (directWith.isNotEmpty()) User.getById(directWith) else null
)
}
@@ -5,6 +5,7 @@
package ru.risdeveau.pixeldragon.repo
import ru.risdeveau.pixeldragon.api.getJoinedRooms
import ru.risdeveau.pixeldragon.api.getRoom
import ru.risdeveau.pixeldragon.db.cacheDb
import ru.risdeveau.pixeldragon.db.isExpired
@@ -34,5 +35,13 @@ class Room (
}
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(
Modifier
.fillMaxSize()
.then (
.then(
if (event.sender != ME!!.userId)
Modifier.padding(end = 16.dp)
else
@@ -106,8 +106,11 @@ fun EventItem(event: Event) {
when (val msgtype = event.content.optString("msgtype", null)) {
"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"))
}
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.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -29,17 +28,17 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import ru.risdeveau.pixeldragon.api.getRooms
import ru.risdeveau.pixeldragon.repo.Room
import ru.risdeveau.pixeldragon.ui.item.MXCImage
@Composable
fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
var list by remember { mutableStateOf(listOf<String>()) }
var list by remember { mutableStateOf(listOf<Room>()) }
val listState = rememberLazyListState()
// if (itemState.scrollToTop) {
@@ -50,12 +49,12 @@ fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
// }
LaunchedEffect(Unit) {
list = withContext(Dispatchers.IO) { getRooms() }
list = withContext(Dispatchers.IO) { Room.getJoined() }
}
LazyColumn(modifier = modifier, state = listState) {
items(list) { rid ->
RoomItem(rid = rid, navController = navController )
items(list) { room ->
RoomItem(room = room, navController = navController )
}
item {
@@ -67,16 +66,9 @@ fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
}
@Composable
fun RoomItem(modifier: Modifier = Modifier, rid: String, navController: NavController) {
var room by remember { mutableStateOf<Room?>(null) }
LaunchedEffect(Unit) {
room = withContext(Dispatchers.IO) { Room.getById(rid) }
}
if (room != null) {
val room = room!!
fun RoomItem(modifier: Modifier = Modifier, room: Room, navController: NavController) {
val avatarUrl = room.avatarUrl ?: (room.direct?.avatarUrl ?: "")
val name = room.name ?: (room.direct?.name ?: "Unnamed")
Row(
modifier
@@ -93,9 +85,9 @@ fun RoomItem(modifier: Modifier = Modifier, rid: String, navController: NavContr
.clip(RoundedCornerShape(12.dp))
.clickable {
if (room.type == "m.space")
navController.navigate("space/$rid")
navController.navigate("space/${room.id}")
else
navController.navigate("room/$rid")
navController.navigate("room/${room.id}")
}
.padding(8.dp)
) {
@@ -110,29 +102,17 @@ fun RoomItem(modifier: Modifier = Modifier, rid: String, navController: NavContr
it.clip(RoundedCornerShape(12.dp))
else
it.clip(CircleShape)
}
},
ContentScale.Crop
)
Column {
Text(room.type)
Text(
room.name ?: "Unnamed",
name,
maxLines = 1,
color = MaterialTheme.colorScheme.primary,
fontSize = MaterialTheme.typography.titleLarge.fontSize
)
}
}
} else {
Row(
modifier
.padding(8.dp)
.height(80.dp)
.fillMaxWidth()
.background(MaterialTheme.colorScheme.background)
.clip(RoundedCornerShape(16.dp))
.padding(8.dp)
) {
LinearProgressIndicator(Modifier.fillMaxWidth())
}
}
}