@benev/slate
Version:
frontend web stuff
50 lines (40 loc) • 1.28 kB
text/typescript
import {Context} from "../context.js"
import {Shell} from "../parts/shell.js"
import {LightElement} from "../../element/silver.js"
import {LightComponentRenderer} from "../parts/types.js"
import {usekey} from "../parts/use/parts/utils/usekey.js"
import {UseLightComponent} from "../parts/use/tailored.js"
import {Reactivity, setup_reactivity} from "../parts/setup_reactivity.js"
export const prepare_light_component = (
<C extends Context>(shell: Shell<C>) =>
(renderer: LightComponentRenderer<C>) => (
class extends LightElement {
#use = new UseLightComponent(
this as LightElement,
() => void this.requestUpdate(),
shell.context,
)
#rend = this.#use[usekey].wrap(() => renderer(this.#use))
#reactivity?: Reactivity<[]>
render() {
this.updateComplete.then(() => this.#use[usekey].afterRender())
return this.#reactivity?.render()
}
connectedCallback() {
super.connectedCallback()
this.#reactivity = setup_reactivity<[]>(
this.#rend,
() => void this.requestUpdate(),
)
this.#use[usekey].reconnect()
}
disconnectedCallback() {
super.disconnectedCallback()
if (this.#reactivity) {
this.#reactivity.stop()
this.#reactivity = undefined
}
this.#use[usekey].disconnect()
}
} as typeof LightElement
))