import { useState, useEffect } 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 { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { SmilePlus, Info } from 'lucide-react' import data from '@emoji-mart/data' import Picker from '@emoji-mart/react' import { WishlistItemType } from '@/lib/types' interface AddEditWishlistItemModalProps { isOpen: boolean setIsOpen: (isOpen: boolean) => void editingItem: WishlistItemType | null setEditingItem: (item: WishlistItemType | null) => void addWishlistItem: (item: Omit) => void editWishlistItem: (item: WishlistItemType) => void } export default function AddEditWishlistItemModal({ isOpen, setIsOpen, editingItem, setEditingItem, addWishlistItem, editWishlistItem }: AddEditWishlistItemModalProps) { const [name, setName] = useState(editingItem?.name || '') const [description, setDescription] = useState(editingItem?.description || '') const [coinCost, setCoinCost] = useState(editingItem?.coinCost || 1) const [targetCompletions, setTargetCompletions] = useState(editingItem?.targetCompletions) const [link, setLink] = useState(editingItem?.link || '') const [errors, setErrors] = useState<{ [key: string]: string }>({}) useEffect(() => { if (editingItem) { setName(editingItem.name) setDescription(editingItem.description) setCoinCost(editingItem.coinCost) setTargetCompletions(editingItem.targetCompletions) setLink(editingItem.link || '') } else { setName('') setDescription('') setCoinCost(1) setTargetCompletions(undefined) setLink('') } setErrors({}) }, [editingItem]) const validate = () => { const newErrors: { [key: string]: string } = {} if (!name.trim()) { newErrors.name = 'Name is required' } if (coinCost < 1) { newErrors.coinCost = 'Coin cost must be at least 1' } if (targetCompletions !== undefined && targetCompletions < 1) { newErrors.targetCompletions = 'Target completions must be at least 1' } if (link && !isValidUrl(link)) { newErrors.link = 'Please enter a valid URL' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const isValidUrl = (url: string) => { try { new URL(url) return true } catch { return false } } const handleClose = () => { setIsOpen(false) setEditingItem(null) } const handleSave = (e: React.FormEvent) => { e.preventDefault() if (!validate()) return const itemData = { name, description, coinCost, targetCompletions: targetCompletions || undefined, link: link.trim() || undefined } if (editingItem) { editWishlistItem({ ...itemData, id: editingItem.id }) } else { addWishlistItem(itemData) } setIsOpen(false) setEditingItem(null) } return ( {editingItem ? 'Edit Reward' : 'Add New Reward'}
setName(e.target.value)} className="flex-1" required /> { setName(prev => `${prev}${emoji.native}`) // Focus back on input after selection const input = document.getElementById('name') as HTMLInputElement input?.focus() }} />