wip: Get room info serially

This commit is contained in:
Sweetbread 2025-02-22 20:56:15 +03:00
parent 5fbffd8700
commit c0944ec0a8
2 changed files with 61 additions and 28 deletions

View File

@ -1,7 +1,7 @@
/* /*
* Created by sweetbread on 22.02.2025, 15:45 * Created by sweetbread on 22.02.2025, 17:56
* Copyright (c) 2025. All rights reserved. * Copyright (c) 2025. All rights reserved.
* Last modified 22.02.2025, 15:45 * Last modified 22.02.2025, 17:48
*/ */
package ru.risdeveau.pixeldragon.api package ru.risdeveau.pixeldragon.api
@ -25,13 +25,13 @@ import ru.risdeveau.pixeldragon.token
// //
//} //}
suspend fun getRooms(): List<Room> { suspend fun getRooms(): List<String> {
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<Room>( return List<String>(
rooms.length() rooms.length()
) { i -> getRoom(rooms.getString(i)) } ) { i -> rooms.getString(i) }
} }
suspend fun getRoom(rid: String): Room { suspend fun getRoom(rid: String): Room {

View File

@ -1,7 +1,7 @@
/* /*
* Created by sweetbread on 22.02.2025, 15:45 * Created by sweetbread on 22.02.2025, 17:56
* Copyright (c) 2025. All rights reserved. * Copyright (c) 2025. All rights reserved.
* Last modified 22.02.2025, 15:45 * Last modified 22.02.2025, 17:56
*/ */
package ru.risdeveau.pixeldragon.ui.activity package ru.risdeveau.pixeldragon.ui.activity
@ -10,16 +10,21 @@ import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -41,6 +46,7 @@ import coil3.request.ImageRequest
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import ru.risdeveau.pixeldragon.api.getRoom
import ru.risdeveau.pixeldragon.api.getRooms import ru.risdeveau.pixeldragon.api.getRooms
import ru.risdeveau.pixeldragon.api.mxcToUrl import ru.risdeveau.pixeldragon.api.mxcToUrl
import ru.risdeveau.pixeldragon.db.Room import ru.risdeveau.pixeldragon.db.Room
@ -79,7 +85,7 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
fun RoomList(modifier: Modifier = Modifier) { fun RoomList(modifier: Modifier = Modifier) {
var list by remember { mutableStateOf(listOf<Room>()) } var list by remember { mutableStateOf(listOf<String>()) }
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val listState = rememberLazyListState() val listState = rememberLazyListState()
@ -99,8 +105,8 @@ fun RoomList(modifier: Modifier = Modifier) {
} }
LazyColumn(modifier = modifier, state = listState) { LazyColumn(modifier = modifier, state = listState) {
items(list) { room -> items(list) { rid ->
RoomItem(room = room) RoomItem(rid = rid)
} }
item { item {
@ -112,25 +118,52 @@ fun RoomList(modifier: Modifier = Modifier) {
} }
@Composable @Composable
fun RoomItem(modifier: Modifier = Modifier, room: Room) { fun RoomItem(modifier: Modifier = Modifier, rid: String) {
Row ( var room by remember { mutableStateOf<Room?>(null) }
modifier.height(64.dp).fillMaxWidth().padding(8.dp) val scope = rememberCoroutineScope()
LaunchedEffect(true) {
scope.launch {
withContext(Dispatchers.IO) {
room = getRoom(rid)
}
}
}
if (room != null) {
Row(
modifier
.padding(8.dp)
.height(72.dp)
.fillMaxWidth()
.background(MaterialTheme.colorScheme.primaryContainer, RoundedCornerShape(16.dp))
.padding(8.dp)
) { ) {
SubcomposeAsyncImage( SubcomposeAsyncImage(
modifier = Modifier
.padding(end = 4.dp)
.height(64.dp)
.width(64.dp),
model = ImageRequest.Builder(appCtx) model = ImageRequest.Builder(appCtx)
.data(mxcToUrl(room.avatarUrl ?: "")) .data(mxcToUrl(room!!.avatarUrl ?: ""))
.httpHeaders(NetworkHeaders.Builder() .httpHeaders(
NetworkHeaders.Builder()
.set("Authorization", "Bearer $token") .set("Authorization", "Bearer $token")
.build()) .set("Cache-Control", "max-age=86400")
.build()
)
.build(), .build(),
contentDescription = room.roomId, contentDescription = room!!.roomId,
loading = { loading = {
CircularProgressIndicator() CircularProgressIndicator()
} }
) )
// Column { Column {
Text(room.name ?: "Unknown") Text(room!!.name ?: "Unknown", maxLines = 1)
// } }
}
} else {
LinearProgressIndicator(Modifier.fillMaxWidth())
} }
} }