Main.kt (3295B)
1 import androidx.compose.runtime.Composable 2 import androidx.compose.runtime.collectAsState 3 import androidx.compose.runtime.getValue 4 import androidx.compose.runtime.remember 5 import com.arkivanov.decompose.DefaultComponentContext 6 import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState 7 import com.arkivanov.essenty.lifecycle.LifecycleRegistry 8 import com.varabyte.kobweb.silk.SilkStyleSheet 9 import com.varabyte.kobweb.silk.init.initSilk 10 import com.varabyte.kobweb.silk.init.setSilkVariables 11 import de.connect2x.trixnity.messenger.DefaultMatrixClientService 12 import de.connect2x.trixnity.messenger.trixnityMessengerModule 13 import de.connect2x.trixnity.messenger.viewmodel.RootRouter 14 import de.connect2x.trixnity.messenger.viewmodel.RootViewModel 15 import de.connect2x.trixnity.messenger.viewmodel.RootViewModelImpl 16 import de.connect2x.trixnity.messenger.viewmodel.connecting.MatrixClientInitializationViewModel 17 import kotlinx.browser.document 18 import kotlinx.coroutines.ExperimentalCoroutinesApi 19 import org.jetbrains.compose.web.css.Style 20 import org.jetbrains.compose.web.css.padding 21 import org.jetbrains.compose.web.css.px 22 import org.jetbrains.compose.web.dom.Div 23 import org.jetbrains.compose.web.dom.Text 24 import org.jetbrains.compose.web.renderComposable 25 import org.koin.dsl.koinApplication 26 import org.w3c.dom.HTMLElement 27 import pages.Main 28 29 fun main() { 30 //KotlinLoggingConfiguration.LOG_LEVEL = Level.DEBUG 31 // Init Kobweb 32 initSilk() 33 34 val koinApplication = koinApplication { 35 modules(trixnityMessengerModule()) 36 } 37 val matrixClientService = DefaultMatrixClientService(koinApplication.koin) 38 val componentContext = DefaultComponentContext(LifecycleRegistry()) 39 40 val rootViewModel = RootViewModelImpl( 41 componentContext = componentContext, 42 matrixClientService = matrixClientService, 43 koinApplication = koinApplication, 44 initialSyncOnceIsFinished = { finished -> 45 46 } 47 ) 48 renderComposable(rootElementId = "root") { 49 // Further Init for kobweb 50 val root = remember { document.getElementById("root") as HTMLElement } 51 root.setSilkVariables() 52 Style(SilkStyleSheet) 53 54 Base(rootViewModel) 55 } 56 57 } 58 59 @OptIn(ExperimentalCoroutinesApi::class) 60 @Composable 61 fun Base(rootViewModel: RootViewModel) { 62 // Trixnity messenger router 63 val routerState by rootViewModel.rootStack.subscribeAsState() 64 when (val route = routerState.active.instance) { 65 is RootRouter.RootWrapper.MatrixClientInitialization -> { 66 Init(route.matrixClientInitializationViewModel) 67 } // show initialization of the MatrixClient (aka loading screen) 68 69 is RootRouter.RootWrapper.Main -> { 70 Main(route.mainViewModel) 71 } 72 73 is RootRouter.RootWrapper.AddMatrixAccount -> { 74 Login(route.addMatrixAccountViewModel) 75 } 76 77 is RootRouter.RootWrapper.PasswordLogin -> { 78 PasswordLogin(route.passwordLoginViewModel) 79 } 80 81 else -> {} // add more cases 82 } 83 } 84 85 86 @Composable 87 fun Init(matrixClientInitializationViewModel: MatrixClientInitializationViewModel) { 88 val initState by matrixClientInitializationViewModel.currentState.collectAsState() 89 Div({ style { padding(25.px) } }) { 90 Text(initState) 91 } 92 }