UNPKG

@chasemoskal/magical

Version:

web toolkit for lit apps

58 lines (48 loc) 1.14 kB
import {UseView} from "./types.js" import {debounce} from "../toolbox/debounce/debounce.js" import {createStateSetter} from "./create-state-setter.js" import {initializeAndGetState} from "./initialize-and-get-state.js" export function makeUseObjectForView({ stateMap, setupMap, render, getRenderCount, pullStateIndex, pullSetupIndex, }: { stateMap: Map<number, [any, any]> setupMap: Map<number, () => void> render(): void getRenderCount(): number pullStateIndex(): number pullSetupIndex(): number }): UseView { const rerender = debounce(0, render) return { state(initial) { const stateIndex = pullStateIndex() const [currentValue, previousValue] = initializeAndGetState({ initial, stateIndex, stateMap, }) ?? [] const setter = createStateSetter<any>({ stateMap, stateIndex, rerender, }) const getter = () => (stateMap.get(stateIndex) ?? [])[0] return [ currentValue, setter, getter, previousValue, ] }, setup(e) { const setupIndex = pullSetupIndex() if (getRenderCount() === 0) setupMap.set(setupIndex, e(rerender)) }, } }