41 lines
1.2 KiB
Kotlin
41 lines
1.2 KiB
Kotlin
|
package dev.inmo.postssystem.features.content.client
|
||
|
|
||
|
import androidx.compose.runtime.*
|
||
|
import dev.inmo.postssystem.features.content.common.Content
|
||
|
|
||
|
interface ContentClientProvider {
|
||
|
fun contentTypeNameForUser(): String
|
||
|
|
||
|
interface ContentRenderer {
|
||
|
val state: State<Content?>
|
||
|
|
||
|
@Composable
|
||
|
fun render()
|
||
|
|
||
|
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
|
||
|
|
||
|
@Composable
|
||
|
override fun render() { 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
|
||
|
}
|