unbuildable version

This commit is contained in:
2022-03-17 22:36:53 +06:00
parent d92f20e8f0
commit 31047f9382
6 changed files with 68 additions and 58 deletions
client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui
features/content
client
src
jsMain
kotlin
dev
inmo
postssystem
features
text
client
build.gradle
src
jsMain
kotlin
dev
inmo
postssystem
features
gradle
kotlin-js-store

@ -1,39 +1,11 @@
package dev.inmo.postssystem.features.content.client
import androidx.compose.runtime.*
import dev.inmo.postssystem.features.content.common.Content
import kotlinx.coroutines.flow.StateFlow
import org.w3c.dom.HTMLElement
interface ContentClientProvider {
fun contentTypeNameForUser(): String
interface ContentRenderer {
val state: State<Content?>
val render: @Composable () -> Unit
class Default<T : Content?>(
initValue: T,
private val onRender: @Composable (MutableState<T>) -> Unit
) : ContentRenderer {
private val mutableState = mutableStateOf(initValue)
override val state: State<Content?>
get() = mutableState
override val render: @Composable () -> Unit = @Composable {
onRender(mutableState)
}
}
companion object {
fun <T: Content> default(onRender: @Composable (MutableState<T?>) -> Unit) = Default(
null,
onRender
)
fun <T: Content?> default(initValue: T, onRender: @Composable (MutableState<T>) -> Unit) = Default(
initValue,
onRender
)
}
}
fun createNewContentRenderer(): ContentRenderer
fun drawNewContent(root: HTMLElement): StateFlow<Content>
}

@ -13,6 +13,7 @@ kotlin {
api project(":postssystem.features.content.text.common")
api project(":postssystem.features.common.client")
api project(":postssystem.features.content.client")
api libs.microutils.common.compose
}
}
}

@ -3,11 +3,16 @@ package dev.inmo.postssystem.features.content.text.client
import androidx.compose.runtime.*
import dev.inmo.jsuikit.modifiers.UIKitWidth
import dev.inmo.jsuikit.modifiers.include
import dev.inmo.micro_utils.common.compose.renderComposableAndLinkToRoot
import dev.inmo.postssystem.features.common.common.*
import dev.inmo.postssystem.features.content.client.ContentClientProvider
import dev.inmo.postssystem.features.content.common.Content
import dev.inmo.postssystem.features.content.text.common.TextContent
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import org.jetbrains.compose.web.dom.TextArea
import org.jetbrains.compose.web.renderComposable
import org.w3c.dom.HTMLElement
val loadingClientModule = ModuleLoader {
singleWithRandomQualifier<ContentClientProvider> {
@ -20,12 +25,17 @@ val loadingClientModule = ModuleLoader {
object TextContentClientProvider : ContentClientProvider {
override fun contentTypeNameForUser(): String = "Text"
override fun createNewContentRenderer(): ContentClientProvider.ContentRenderer {
return ContentClientProvider.ContentRenderer.default<TextContent> @Composable { state ->
TextArea(state.value ?. text ?: "") {
override fun drawNewContent(root: HTMLElement): StateFlow<Content> {
val flow = MutableStateFlow(TextContent(""))
renderComposableAndLinkToRoot(root) {
val state = remember { flow.collectAsState() }
TextArea(state.value.text) {
include(UIKitWidth.Expand)
onInput { state.value = TextContent(it.value) }
onInput { flow.value = TextContent(it.value) }
}
}
return flow
}
}