package dev.inmo.postssystem.client.fsm.ui 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.coroutines.launchSafelyWithoutExceptions import dev.inmo.micro_utils.fsm.common.StatesMachine import dev.inmo.postssystem.client.ui.fsm.CreatePostUIFSMState import dev.inmo.postssystem.client.ui.fsm.UIFSMState import dev.inmo.postssystem.client.utils.renderComposableAndLinkToContext import dev.inmo.postssystem.features.content.client.ContentClientProvider import dev.inmo.postssystem.services.posts.client.ui.create.PostCreateUIViewModel import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope import org.jetbrains.compose.web.dom.Div import org.w3c.dom.HTMLElement import org.w3c.dom.Text class PostCreateView( private val createPostCreateUIModel: PostCreateUIViewModel, private val contentClientProviders: List, private val uiScope: CoroutineScope ) : JSView() { override suspend fun StatesMachine.safeHandleState( htmlElement: HTMLElement, state: CreatePostUIFSMState ): UIFSMState? { val result = CompletableDeferred() val contentProvidersList = mutableStateListOf() renderComposableAndLinkToContext(htmlElement) { Flex( UIKitFlex.Alignment.Horizontal.Center ) { Div ({ include(UIKitWidth.Fixed.XLarge) }) { contentProvidersList.forEachIndexed { i, it -> Flex(UIKitWidth.Expand) { it.render() DefaultButton("Remove") { contentProvidersList.removeAt(i) } } } Label("Add content", Attrs.empty()) Dropdown { DefaultNav { contentClientProviders.forEach { NavItemElement( attributesCustomizer = { onClick { _ -> contentProvidersList.add(it.createNewContentRenderer()) } } ) { Text(it.contentTypeNameForUser()) } } } } DefaultButton( "Upload", disabled = contentProvidersList.isEmpty() ) { it.preventDefault() uiScope.launchSafelyWithoutExceptions { createPostCreateUIModel.create( contentProvidersList.mapNotNull { it.state.value } ) } } } } } return result.await() } }