54 lines
1.5 KiB
TypeScript

import type { AnyNodeId, Interactive, LightEffect, SliderControl } from '@pascal-app/core'
import { create } from 'zustand'
export type LightRegistration = {
nodeId: AnyNodeId
effect: LightEffect
toggleIndex: number
sliderIndex: number
sliderMin: number
sliderMax: number
hasSlider: boolean
}
type ItemLightPoolStore = {
registrations: Map<string, LightRegistration>
register: (key: string, nodeId: AnyNodeId, effect: LightEffect, interactive: Interactive) => void
unregister: (key: string) => void
}
export const useItemLightPool = create<ItemLightPoolStore>((set) => ({
registrations: new Map(),
register: (key, nodeId, effect, interactive) => {
const toggleIndex = interactive.controls.findIndex((c) => c.kind === 'toggle')
const sliderIndex = interactive.controls.findIndex((c) => c.kind === 'slider')
const sliderControl =
sliderIndex >= 0 ? (interactive.controls[sliderIndex] as SliderControl) : null
const registration: LightRegistration = {
nodeId,
effect,
toggleIndex,
sliderIndex,
hasSlider: sliderControl !== null,
sliderMin: sliderControl?.min ?? 0,
sliderMax: sliderControl?.max ?? 1,
}
set((s) => {
const next = new Map(s.registrations)
next.set(key, registration)
return { registrations: next }
})
},
unregister: (key) => {
set((s) => {
const next = new Map(s.registrations)
next.delete(key)
return { registrations: next }
})
},
}))