'use client'; import { useState } from 'react'; import { useDroppable } from '@dnd-kit/core'; import { getEventLabel } from '@/lib/utils'; import { playUISound } from '@/lib/ui-audio'; import type { HookEvent, SelectMode } from '@/lib/types'; interface HookSlotProps { event: HookEvent | string; scope: string; assignedSound?: string; onClear: () => void; onPreview: (path: string) => void; selectMode: SelectMode | null; onSelect: () => void; // called when empty slot is clicked to enter select mode } export function HookSlot({ event, scope, assignedSound, onClear, onPreview, selectMode, onSelect }: HookSlotProps) { const dropId = `${scope}:${event}`; const { isOver, setNodeRef } = useDroppable({ id: dropId }); const [isHovered, setIsHovered] = useState(false); const label = getEventLabel(event as HookEvent); const filename = assignedSound ? assignedSound.split('/').pop() ?? assignedSound : null; const isSelected = selectMode?.scope === scope && selectMode?.event === event; const isSelectModeActive = !!selectMode; const handleContainerClick = () => { if (assignedSound) { onPreview(assignedSound); } else { onSelect(); } }; const handlePlayClick = (e: React.MouseEvent) => { e.stopPropagation(); if (assignedSound) onPreview(assignedSound); }; const handleClearClick = (e: React.MouseEvent) => { e.stopPropagation(); onClear(); }; // Border logic let borderColor: string; let borderStyle: 'solid' | 'dashed'; let bgColor: string; if (isOver) { borderColor = 'var(--sf-cyan)'; borderStyle = 'solid'; bgColor = 'rgba(0,229,255,0.12)'; } else if (isSelected) { borderColor = 'var(--sf-cyan)'; borderStyle = 'dashed'; bgColor = 'rgba(0,229,255,0.08)'; } else if (assignedSound) { borderColor = isHovered ? 'rgba(0,229,255,0.7)' : 'rgba(0,229,255,0.4)'; borderStyle = 'solid'; bgColor = isHovered ? 'rgba(0,229,255,0.08)' : 'rgba(0,229,255,0.04)'; } else if (isSelectModeActive) { // Another slot is being selected — mute everything borderColor = 'rgba(0,229,255,0.06)'; borderStyle = 'dashed'; bgColor = 'transparent'; } else { borderColor = isHovered ? 'rgba(0,229,255,0.25)' : 'rgba(0,229,255,0.12)'; borderStyle = 'dashed'; bgColor = isHovered ? 'rgba(0,229,255,0.03)' : 'transparent'; } return (