import { useState } from 'react' import { Dices } from 'lucide-react' import { Slider } from './Slider' import { Switch } from './Switch' import { Dropdown } from './Dropdown' import { EFFECTS } from '../config/effects' import type { EffectValues } from '../types/effects' interface EffectsBarProps { values: EffectValues onChange: (parameterId: string, value: number | boolean | string) => void onMapClick?: (paramId: string, lfoIndex: number) => void getMappedLFOs?: (paramId: string) => number[] } export function EffectsBar({ values, onChange, onMapClick, getMappedLFOs }: EffectsBarProps) { const [activeTab, setActiveTab] = useState(EFFECTS[0].id) const [isCollapsed, setIsCollapsed] = useState(true) const randomizeEffect = (effect: typeof EFFECTS[number]) => { effect.parameters.forEach(param => { if (param.id.endsWith('Enable')) return if (param.options) { const randomOption = param.options[Math.floor(Math.random() * param.options.length)] onChange(param.id, randomOption.value) } else { const range = param.max - param.min const steps = Math.floor(range / param.step) const randomStep = Math.floor(Math.random() * (steps + 1)) const randomValue = param.min + (randomStep * param.step) onChange(param.id, randomValue) } }) } return (
{/* Desktop: Grid layout */}
{EFFECTS.map(effect => { return (

{effect.name.toUpperCase()}

{effect.bypassable && ( onChange(`${effect.id}Bypass`, !checked)} label={values[`${effect.id}Bypass`] ? 'OFF' : 'ON'} /> )}
{effect.parameters.map(param => { if (param.options) { return ( onChange(param.id, value)} /> ) } const isSwitch = param.min === 0 && param.max === 1 && param.step === 1 if (isSwitch) { return (
{param.label.toUpperCase()} onChange(param.id, checked ? 1 : 0)} label={values[param.id] ? 'ON' : 'OFF'} />
) } return ( onChange(param.id, value)} valueId={param.id} paramId={param.id} onMapClick={onMapClick} mappedLFOs={getMappedLFOs ? getMappedLFOs(param.id) : []} /> ) })}
) })}
{/* Mobile: Tabbed layout */}
{EFFECTS.map(effect => ( ))}
{!isCollapsed && EFFECTS.map(effect => { if (activeTab !== effect.id) return null return (
{effect.bypassable && ( onChange(`${effect.id}Bypass`, !checked)} label={values[`${effect.id}Bypass`] ? 'OFF' : 'ON'} /> )}
{effect.parameters.map(param => { if (param.options) { return ( onChange(param.id, value)} /> ) } const isSwitch = param.min === 0 && param.max === 1 && param.step === 1 if (isSwitch) { return (
{param.label.toUpperCase()} onChange(param.id, checked ? 1 : 0)} label={values[param.id] ? 'ON' : 'OFF'} />
) } return ( onChange(param.id, value)} valueId={param.id} paramId={param.id} onMapClick={onMapClick} mappedLFOs={getMappedLFOs ? getMappedLFOs(param.id) : []} /> ) })}
) })}
) }