import { useState, useRef, useEffect, useCallback } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { FilterBuilder } from './FilterBuilder' import { EmojiPicker } from './EmojiPicker' import type { FilterGroup, ViewDefinition } from '../types' interface CreateViewDialogProps { open: boolean onClose: () => void onCreate: (definition: ViewDefinition) => void availableFields: string[] /** Returns known values for a given field (for autocomplete). */ valueSuggestions?: (field: string) => string[] } export function CreateViewDialog({ open, onClose, onCreate, availableFields, valueSuggestions }: CreateViewDialogProps) { const [name, setName] = useState('') const [icon, setIcon] = useState('') const [showEmojiPicker, setShowEmojiPicker] = useState(false) const [filters, setFilters] = useState({ all: [{ field: 'type', op: 'equals', value: '' }], }) const inputRef = useRef(null) useEffect(() => { if (open) { setName('') // eslint-disable-line react-hooks/set-state-in-effect -- reset on dialog open setIcon('') // eslint-disable-line react-hooks/set-state-in-effect -- reset on dialog open setShowEmojiPicker(false) // eslint-disable-line react-hooks/set-state-in-effect -- reset on dialog open setFilters({ all: [{ field: availableFields[0] ?? 'type', op: 'equals', value: '' }] }) // eslint-disable-line react-hooks/set-state-in-effect -- reset on dialog open setTimeout(() => inputRef.current?.focus(), 50) } }, [open, availableFields]) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() const trimmed = name.trim() if (!trimmed) return const definition: ViewDefinition = { name: trimmed, icon: icon || null, color: null, sort: null, filters, } onCreate(definition) onClose() } const handleSelectEmoji = useCallback((emoji: string) => { setIcon(emoji) setShowEmojiPicker(false) }, []) const handleCloseEmojiPicker = useCallback(() => { setShowEmojiPicker(false) }, []) return ( { if (!isOpen) onClose() }}> Create View
{showEmojiPicker && ( )}
setName(e.target.value)} />
) }