import React, { useEffect, useState } from 'react' import { type Meta, type StoryObj } from '@storybook/react' import { fn } from '@storybook/test' import { MultiSelect, type MultiSelectProps } from '../index' const meta = { title: 'Components/MultiSelect', component: MultiSelect, argTypes: { selectedValues: { options: ['None', 'Single', 'Multiple'], control: { type: 'select', labels: { None: 'new Set()', Single: 'new Set(["waffle"])', Multiple: 'new Set(["waffle", "pancakes"])', }, }, mapping: { None: new Set(), Single: new Set(['waffle']), Multiple: new Set(['waffle', 'pancakes']), }, }, }, args: { label: 'Breakfast order', selectedValues: new Set(), isOpen: false, items: [ { label: 'Pancakes', value: 'pancakes', }, { label: 'Waffle', value: 'waffle', }, { label: 'Toastie', value: 'toastie', }, ], onSelectedValuesChange: fn(), onOpenChange: fn(), }, } satisfies Meta export default meta type Story = StoryObj const MultiSelectTemplate: Story = { render: (args) => { const [selectedValues, setSelectedValues] = useState( new Set(args.selectedValues), ) const [isOpen, setIsOpen] = useState(args.isOpen) useEffect(() => { setIsOpen(args.isOpen) }, [args.isOpen]) useEffect(() => { setSelectedValues(args.selectedValues) }, [args.selectedValues]) return ( ) }, } export const Playground: Story = { ...MultiSelectTemplate, parameters: { docs: { canvas: { sourceState: 'shown', }, }, }, } const sourceCodeItems = ` ` export const Items: Story = { ...MultiSelectTemplate, parameters: { docs: { source: { code: sourceCodeItems } } }, } const sourceCodeSelectedValues = ` const [selectedValues, setSelectedValues] = useState(new Set(["waffle"])) return ( ) ` export const SelectedValues: Story = { ...MultiSelectTemplate, args: { selectedValues: new Set(['waffle']), }, parameters: { docs: { source: { code: sourceCodeSelectedValues } } }, } const sourceCodeOpenState = ` const [isOpen, setIsOpen] = useState(false) return ( ) ` export const OpenState: Story = { ...MultiSelectTemplate, parameters: { docs: { source: { code: sourceCodeOpenState } } }, } export const Description: Story = { ...MultiSelectTemplate, args: { description: 'Breakfast will be delivered directly to your house', }, } export const ValidationMessage: Story = { ...MultiSelectTemplate, args: { validationMessage: { status: 'error', message: 'There are no more waffles', }, }, } export const ValidationMessageWithDescription: Story = { ...MultiSelectTemplate, args: { description: 'Breakfast will be delivered to your house.', validationMessage: { status: 'caution', message: 'Only five more waffles remain.', }, }, }