import { createUseOptions, createUseOptionsEdit, Options, RootKey, type OptionDispatch, type OptionSelect, } from '@ska/plugin' import { uniqueId, uniqueSlugForObject, } from '@ska/utils' import { variationOptions as initialState, } from '../../data' import { type Variation, type Variations, type VariationSlug, } from '.' export type VariationOptions = Options<{ variations: Variations }> export const VARIATIONS_ROOT_KEY = 'ska_blocks_variations' as RootKey const useOptions = createUseOptions(VARIATIONS_ROOT_KEY, initialState) const useOptionsEdit = createUseOptionsEdit(VARIATIONS_ROOT_KEY, initialState) const useVariationOptionsEdit = () => { const [select, dispatch] = useOptionsEdit() const addVariation = (variation: Omit) => { const variations = select.getOption('variations') as any as VariationOptions['variations'] const slug: VariationSlug = uniqueSlugForObject(variation.title, variations) dispatch.updateOption({ option: 'variations', value: { ...variations, [slug]: { ref: uniqueId(), isDefault: false, ...variation, }, } as VariationOptions['variations'], }) return slug } const updateVariation = (slug: VariationSlug, updates: Partial) => { const variations = select.getOption('variations') as any as VariationOptions['variations'] if(!Object(variations).hasOwnProperty(slug)) { throw new Error('Variation not found.') } const nextVariation = { ...variations[slug], isDefault: false, ...updates, } dispatch.updateOption({ option: 'variations', value: { ...variations, [slug]: nextVariation, }, }) } const deleteVariation = (slug: VariationSlug) => { const variations = select.getOption('variations') as any as VariationOptions['variations'] const { [slug]: _variation, ...nextVariations } = variations dispatch.updateOption({ option: 'variations', value: { ...nextVariations, }, }) } return [ select, { ...dispatch, addVariation, updateVariation, deleteVariation, }, ] as [ OptionSelect, OptionDispatch & { addVariation: typeof addVariation, updateVariation: typeof updateVariation, deleteVariation: typeof deleteVariation, }, ] } export { useOptions as useVariationOptions, useVariationOptionsEdit, }