trixnity-messenger-playground

A playground for trixnity-messenger based on jetbrains compose-html
git clone git://archive.git.mtrnord.blog/MTRNord/trixnity-messenger-playground.git
Log | Files | Refs | README

commit f86b19c49b4889d3cc644a542415826f78c8670e
parent 054bca33f71d47fe488eb6c806c93a8fc45bc5b2
Author: MTRNord <mtrnord1@gmail.com>
Date:   Wed, 27 Sep 2023 16:25:12 +0200

Feat: Add basic room switching

Diffstat:
Msrc/jsMain/kotlin/Main.kt | 4+---
Msrc/jsMain/kotlin/pages/Main.kt | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/src/jsMain/kotlin/Main.kt b/src/jsMain/kotlin/Main.kt @@ -14,8 +14,6 @@ import de.connect2x.trixnity.messenger.viewmodel.RootRouter import de.connect2x.trixnity.messenger.viewmodel.RootViewModel import de.connect2x.trixnity.messenger.viewmodel.RootViewModelImpl import de.connect2x.trixnity.messenger.viewmodel.connecting.MatrixClientInitializationViewModel -import io.github.oshai.kotlinlogging.KotlinLoggingConfiguration -import io.github.oshai.kotlinlogging.Level import kotlinx.browser.document import kotlinx.coroutines.ExperimentalCoroutinesApi import org.jetbrains.compose.web.css.Style @@ -29,7 +27,7 @@ import org.w3c.dom.HTMLElement import pages.Main fun main() { - KotlinLoggingConfiguration.LOG_LEVEL = Level.DEBUG + //KotlinLoggingConfiguration.LOG_LEVEL = Level.DEBUG // Init Kobweb initSilk() diff --git a/src/jsMain/kotlin/pages/Main.kt b/src/jsMain/kotlin/pages/Main.kt @@ -8,19 +8,31 @@ import com.varabyte.kobweb.compose.css.Overflow import com.varabyte.kobweb.compose.css.borderRight import com.varabyte.kobweb.compose.css.overflowX import com.varabyte.kobweb.compose.css.overflowY +import com.varabyte.kobweb.silk.components.forms.Button import de.connect2x.trixnity.messenger.viewmodel.MainViewModel +import de.connect2x.trixnity.messenger.viewmodel.room.RoomRouter +import de.connect2x.trixnity.messenger.viewmodel.room.RoomViewModel +import de.connect2x.trixnity.messenger.viewmodel.room.timeline.RoomHeaderViewModel +import de.connect2x.trixnity.messenger.viewmodel.room.timeline.TimelineRouter import de.connect2x.trixnity.messenger.viewmodel.roomlist.RoomListElementViewModel import de.connect2x.trixnity.messenger.viewmodel.roomlist.RoomListRouter import de.connect2x.trixnity.messenger.viewmodel.roomlist.RoomListViewModel +import io.github.oshai.kotlinlogging.KotlinLogging +import net.folivo.trixnity.core.model.RoomId import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.Text +private val log = KotlinLogging.logger { } @Composable fun Main(mainViewModel: MainViewModel) { - mainViewModel.start() + suspend { + mainViewModel.start() + } val roomListData by mainViewModel.roomListRouterStack.subscribeAsState() + val roomData by mainViewModel.roomRouterStack.subscribeAsState() + val room = roomData.active.instance val roomList = roomListData.active.instance @@ -48,6 +60,7 @@ fun Main(mainViewModel: MainViewModel) { RoomList(roomList.roomListViewModel) } } + Div({ style { display(DisplayStyle.Flex) @@ -57,7 +70,15 @@ fun Main(mainViewModel: MainViewModel) { padding(4.px) } }) { - Text("Room") + when (room) { + is RoomRouter.RoomWrapper.None -> { + Text("Room") + } + + is RoomRouter.RoomWrapper.View -> { + Room(room.roomViewModel) + } + } } } } @@ -74,16 +95,42 @@ fun RoomList(roomListViewModel: RoomListViewModel) { }) } else { rooms.forEach { room -> - Room(room.second, room.first == selectedRoomId) + RoomListItem(room.second, room.first == selectedRoomId) { roomID -> + roomListViewModel.selectRoom(roomID) + } } } } @Composable -fun Room(roomViewModel: RoomListElementViewModel, selected: Boolean) { +fun RoomListItem(roomViewModel: RoomListElementViewModel, selected: Boolean, selectRoom: (RoomId) -> Unit) { val roomName by roomViewModel.roomName.collectAsState() val roomId = roomViewModel.roomId - Div { - Text(roomName ?: roomId.full) + val roomNameReal = roomName ?: roomId.full + Button(onClick = { + if (!selected) { + // Geht das eleganter? + selectRoom(roomId) + } + }) { + Text(roomNameReal) } } + +@Composable +fun Room(roomViewModel: RoomViewModel) { + val timelineStack by roomViewModel.timelineStack.subscribeAsState() + val timeline = timelineStack.active.instance + if (timeline is TimelineRouter.TimelineWrapper.View) { + val roomHeaderViewModel = timeline.timelineViewModel.roomHeaderViewModel + + RoomHeaderElement(roomHeaderViewModel) + } +} + + +@Composable +fun RoomHeaderElement(roomHeaderViewModel: RoomHeaderViewModel) { + val roomHeaderElement by roomHeaderViewModel.roomHeaderElement.collectAsState() + Text(roomHeaderElement.roomName) +} +\ No newline at end of file