Fix bunch of issues around login/logout and introduces messages feature

This commit is contained in:
ganfra 2022-11-04 14:50:30 +01:00
parent bb88919bb3
commit 823cef8b7c
19 changed files with 314 additions and 89 deletions

View file

@ -0,0 +1,44 @@
@file:OptIn(ExperimentalMaterial3Api::class)
package io.element.android.x.features.messages
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import com.airbnb.mvrx.compose.collectAsState
import com.airbnb.mvrx.compose.mavericksViewModel
import io.element.android.x.core.data.LogCompositions
import io.element.android.x.features.messages.model.MessagesViewState
@Composable
fun MessagesScreen(roomId: String) {
val viewModel: MessagesViewModel = mavericksViewModel(argsFactory = { roomId })
LogCompositions(tag = "MessagesScreen", msg = "Root")
val roomTitle by viewModel.collectAsState(prop1 = MessagesViewState::roomTitle)
MessagesContent(roomTitle)
}
@Composable
fun MessagesContent(roomTitle: String) {
val appBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(appBarState)
LogCompositions(tag = "RoomListScreen", msg = "Content")
Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
TopAppBar(
title = { Text(text = roomTitle) }
)
},
content = { padding ->
Box(modifier = Modifier.padding(padding))
}
)
}

View file

@ -0,0 +1,62 @@
package io.element.android.x.features.messages
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.Success
import io.element.android.x.core.data.parallelMap
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.designsystem.components.avatar.AvatarSize
import io.element.android.x.features.messages.model.MessagesViewState
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.MatrixInstance
import io.element.android.x.matrix.room.RoomSummary
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import org.matrix.rustcomponents.sdk.mediaSourceFromUrl
class MessagesViewModel(initialState: MessagesViewState) :
MavericksViewModel<MessagesViewState>(initialState) {
private val matrix = MatrixInstance.getInstance()
init {
handleInit()
}
private fun handleInit() {
viewModelScope.launch {
}
}
private suspend fun loadAvatarData(
client: MatrixClient,
name: String,
url: String?,
size: AvatarSize = AvatarSize.MEDIUM
): AvatarData {
val mediaContent = url?.let {
val mediaSource = mediaSourceFromUrl(it)
client.loadMediaThumbnailForSource(mediaSource, size.value.toLong(), size.value.toLong())
}
return mediaContent?.fold(
{ it },
{ null }
).let { model ->
AvatarData(name.first().uppercase(), model, size)
}
}
private suspend fun getClient(): MatrixClient {
return matrix.matrixClient().first().get()
}
override fun onCleared() {
super.onCleared()
}
}

View file

@ -0,0 +1,16 @@
package io.element.android.x.features.messages.model
import com.airbnb.mvrx.MavericksState
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.matrix.core.RoomId
data class MessagesViewState(
val roomId: String,
val roomTitle: String = "",
val roomAvatar: AvatarData? = null
) : MavericksState {
@Suppress("unused")
constructor(roomId: String) : this(roomId = roomId, roomTitle = "", roomAvatar = null)
}