import { useState, useRef, useEffect, useCallback } from 'react' import { Dialog, DialogContent, DialogDescription, 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[] /** When provided, the dialog operates in edit mode with pre-populated fields. */ editingView?: ViewDefinition | null } interface CreateViewDialogFormProps { availableFields: string[] initialName: string initialIcon: string initialFilters: FilterGroup isEditing: boolean onClose: () => void onCreate: (definition: ViewDefinition) => void } function CreateViewDialogForm({ availableFields, initialName, initialIcon, initialFilters, isEditing, onClose, onCreate, }: CreateViewDialogFormProps) { const [name, setName] = useState(initialName) const [icon, setIcon] = useState(initialIcon) const [showEmojiPicker, setShowEmojiPicker] = useState(false) const [filters, setFilters] = useState(initialFilters) const inputRef = useRef(null) useEffect(() => { const timeoutId = window.setTimeout(() => inputRef.current?.focus(), 50) return () => window.clearTimeout(timeoutId) }, []) 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) }, []) const isCreateDisabled = !name.trim() return (
{showEmojiPicker && ( )}
setName(e.target.value)} />
) } export function CreateViewDialog({ open, onClose, onCreate, availableFields, editingView }: CreateViewDialogProps) { const isEditing = !!editingView const initialFilters = editingView?.filters ?? { all: [{ field: availableFields[0] ?? 'type', op: 'equals', value: '' }] } const formKey = editingView ? `edit:${editingView.name}` : `create:${availableFields[0] ?? 'type'}` return ( { if (!isOpen) onClose() }}> {isEditing ? 'Edit View' : 'Create View'} {isEditing ? 'Update the name, icon, and filters for this saved view.' : 'Create a saved view by choosing a name, icon, and filter rules.'} {open && ( )} ) }