Rob Murdock
07/15/2020, 7:34 PMchadmorrow
07/15/2020, 7:49 PMRob Murdock
07/15/2020, 7:52 PMdata class PinSectionProps(
val pinList: List<Pin>,
val scale: PinButtonScale = PinButtonScale.Small,
val canDrag: Boolean,
val className: String
) : RProps
val PinSection = reactFunction<PinSectionProps> { (pinList, scale, canDrag, className) ->
styledDiv {
etc etc
Code that does it (using the RClass<P> type for various reasons I can’t remember at the moment):
inline fun <reified P : RProps> reactFunction(crossinline function: RBuilder.(P) -> Unit): RClass<P> =
buildReactFunction(P::class) { props ->
buildElement { function(props) }
}
fun <P : RProps> buildReactFunction(kClass: KClass<P>, builder: (props: P) -> ReactElement) = { props: P ->
ensureKotlinClassProps(props, kClass.js)
.let(builder)
}.unsafeCast<RClass<P>>()
private fun <P : RProps> ensureKotlinClassProps(props: P, jsClass: JsClass<P>): P = if (props::class.js == jsClass) {
props
} else {
val newProps = js("new jsClass()")
objectAssign(newProps, props)
newProps.unsafeCast<P>()
}
Rob Murdock
07/15/2020, 7:53 PMRob Murdock
07/15/2020, 7:54 PMJoost Klitsie
07/17/2020, 6:48 AMRob Murdock
07/21/2020, 1:43 PM