From 1dafe0a679c58f404d36cf6011a9d1f42575d485 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 17 Mar 2022 23:23:35 +0600 Subject: [PATCH] make it possible to connect modules in project --- .../client/fsm/ui/PostCreateView.kt | 24 +++------- features/content/binary/client/build.gradle | 3 ++ .../client/BinaryContentClientProvider.kt | 44 +++++++++++++++++++ features/content/client/build.gradle | 1 + .../content/client/ContentClientProvider.kt | 4 +- features/content/text/client/build.gradle | 1 + .../text/client/TextContentClientProvider.kt | 40 ++++++++--------- server/build.gradle | 2 +- 8 files changed, 78 insertions(+), 41 deletions(-) create mode 100644 features/content/binary/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/binary/client/BinaryContentClientProvider.kt diff --git a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/PostCreateView.kt b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/PostCreateView.kt index 61bc9530..2ca86394 100644 --- a/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/PostCreateView.kt +++ b/client/src/jsMain/kotlin/dev/inmo/postssystem/client/fsm/ui/PostCreateView.kt @@ -4,7 +4,6 @@ import androidx.compose.runtime.* import dev.inmo.jsuikit.elements.* import dev.inmo.jsuikit.modifiers.* import dev.inmo.jsuikit.utils.Attrs -import dev.inmo.micro_utils.common.compose.DefaultDisposableEffectResult import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions import dev.inmo.micro_utils.fsm.common.StatesMachine import dev.inmo.postssystem.client.ui.fsm.CreatePostUIFSMState @@ -15,7 +14,6 @@ import dev.inmo.postssystem.features.content.common.Content import dev.inmo.postssystem.services.posts.client.ui.create.PostCreateUIViewModel import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.StateFlow import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.Text import org.w3c.dom.HTMLElement @@ -31,27 +29,16 @@ class PostCreateView( ): UIFSMState? { val result = CompletableDeferred() - val contentProvidersList = mutableStateListOf() - val statesList = mutableListOf>() + val contentProvidersList = mutableStateListOf>>() renderComposableAndLinkToContext(htmlElement) { Flex( UIKitFlex.Alignment.Horizontal.Center ) { Div ({ include(UIKitWidth.Fixed.XLarge) }) { - contentProvidersList.forEachIndexed { i, renderer -> + contentProvidersList.forEachIndexed { i, (provider, state) -> Flex(UIKitWidth.Expand) { - Div( - { - ref { - val flow = renderer.drawNewContent(it) - statesList.add(i, flow) - DefaultDisposableEffectResult { - statesList.removeAt(i) - } - } - } - ) + provider.renderNewInstance(state) DefaultButton("Remove") { contentProvidersList.removeAt(i) @@ -65,7 +52,8 @@ class PostCreateView( NavItemElement( attributesCustomizer = { onClick { _ -> - contentProvidersList.add(it) + val newContentState = mutableStateOf(null) + contentProvidersList.add(it to newContentState) } } ) { @@ -81,7 +69,7 @@ class PostCreateView( it.preventDefault() uiScope.launchSafelyWithoutExceptions { createPostCreateUIModel.create( - statesList.map { it.value } + contentProvidersList.mapNotNull { it.second.value } ) } } diff --git a/features/content/binary/client/build.gradle b/features/content/binary/client/build.gradle index fa327c6b..bb2ab94a 100644 --- a/features/content/binary/client/build.gradle +++ b/features/content/binary/client/build.gradle @@ -2,6 +2,7 @@ plugins { id "org.jetbrains.kotlin.multiplatform" id "org.jetbrains.kotlin.plugin.serialization" id "com.android.library" + alias(libs.plugins.compose) } apply from: "$mppProjectWithSerializationPresetPath" @@ -12,6 +13,8 @@ kotlin { dependencies { api project(":postssystem.features.content.binary.common") api project(":postssystem.features.common.client") + api project(":postssystem.features.content.client") + api libs.microutils.common.compose } } } diff --git a/features/content/binary/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/binary/client/BinaryContentClientProvider.kt b/features/content/binary/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/binary/client/BinaryContentClientProvider.kt new file mode 100644 index 00000000..c368c34b --- /dev/null +++ b/features/content/binary/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/binary/client/BinaryContentClientProvider.kt @@ -0,0 +1,44 @@ +package dev.inmo.postssystem.features.content.binary.client + +import androidx.compose.runtime.* +import dev.inmo.jsuikit.elements.DefaultButton +import dev.inmo.jsuikit.modifiers.UIKitWidth +import dev.inmo.micro_utils.common.selectFile +import dev.inmo.postssystem.features.common.common.* +import dev.inmo.postssystem.features.content.client.ContentClientProvider +import dev.inmo.postssystem.features.content.common.* +import org.koin.core.module.Module + +object LoadingClientModule : ModuleLoader { + init { + AdditionalModules.addModule(this) + } + + override fun Module.load() { + singleWithRandomQualifier { + BinaryContentClientProvider + } + } +} + +private val loadingClientModuleForLoadingAtRuntime = LoadingClientModule + +object BinaryContentClientProvider : ContentClientProvider { + override fun contentTypeNameForUser(): String = "File" + + @Composable + override fun renderNewInstance(state: MutableState) { + console.log(state.value) + val value = (state.value as? BinaryContent) + if (value == null) { + selectFile { + state.value = it.binaryContent() + } + } + DefaultButton(value ?.filename ?.name ?: "Select file", UIKitWidth.Expand) { + selectFile { + state.value = it.binaryContent() + } + } + } +} diff --git a/features/content/client/build.gradle b/features/content/client/build.gradle index 54bea44c..4f518105 100644 --- a/features/content/client/build.gradle +++ b/features/content/client/build.gradle @@ -2,6 +2,7 @@ plugins { id "org.jetbrains.kotlin.multiplatform" id "org.jetbrains.kotlin.plugin.serialization" id "com.android.library" + alias(libs.plugins.compose) } apply from: "$mppProjectWithSerializationPresetPath" diff --git a/features/content/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/client/ContentClientProvider.kt b/features/content/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/client/ContentClientProvider.kt index 68fac428..fb72cefc 100644 --- a/features/content/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/client/ContentClientProvider.kt +++ b/features/content/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/client/ContentClientProvider.kt @@ -1,5 +1,6 @@ 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 @@ -7,5 +8,6 @@ import org.w3c.dom.HTMLElement interface ContentClientProvider { fun contentTypeNameForUser(): String - fun drawNewContent(root: HTMLElement): StateFlow + @Composable + fun renderNewInstance(state: MutableState) } diff --git a/features/content/text/client/build.gradle b/features/content/text/client/build.gradle index 9868882f..add69bfb 100644 --- a/features/content/text/client/build.gradle +++ b/features/content/text/client/build.gradle @@ -2,6 +2,7 @@ plugins { id "org.jetbrains.kotlin.multiplatform" id "org.jetbrains.kotlin.plugin.serialization" id "com.android.library" + alias(libs.plugins.compose) } apply from: "$mppProjectWithSerializationPresetPath" diff --git a/features/content/text/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/text/client/TextContentClientProvider.kt b/features/content/text/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/text/client/TextContentClientProvider.kt index a9806fd0..5a89050e 100644 --- a/features/content/text/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/text/client/TextContentClientProvider.kt +++ b/features/content/text/client/src/jsMain/kotlin/dev/inmo/postssystem/features/content/text/client/TextContentClientProvider.kt @@ -3,39 +3,37 @@ 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 +import org.koin.core.module.Module -val loadingClientModule = ModuleLoader { - singleWithRandomQualifier { - TextContentClientProvider +object LoadingClientModule : ModuleLoader { + init { + AdditionalModules.addModule(this) + } + + override fun Module.load() { + singleWithRandomQualifier { + TextContentClientProvider + } } -}.also { - AdditionalModules.addModule(it) } +private val loadingClientModuleForLoadingAtRuntime = LoadingClientModule + object TextContentClientProvider : ContentClientProvider { override fun contentTypeNameForUser(): String = "Text" - override fun drawNewContent(root: HTMLElement): StateFlow { - val flow = MutableStateFlow(TextContent("")) - - renderComposableAndLinkToRoot(root) { - val state = remember { flow.collectAsState() } - TextArea(state.value.text) { - include(UIKitWidth.Expand) - onInput { flow.value = TextContent(it.value) } - } + @Composable + override fun renderNewInstance(state: MutableState) { + console.log(state.value) + val value = state.value as? TextContent + TextArea(value ?.text) { + include(UIKitWidth.Expand) + onInput { state.value = TextContent(it.value) } } - - return flow } } diff --git a/server/build.gradle b/server/build.gradle index 999705a1..7463db8e 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -42,7 +42,7 @@ task copyClient(type: Copy) { File clientSources = project(":postssystem.client").file("build/distributions") SourceDirectorySet resources = sourceSets.main.resources File webFolderPath = new File(resources.getSrcDirs()[0].toString(), "web") - exclude("*.map") +// exclude("*.map") from clientSources.absolutePath into webFolderPath.absolutePath }