import { useState, useEffect } from 'react' import { useAtom } from 'jotai' import { useTranslations } from 'next-intl' import { usersAtom } from '@/lib/atoms' import { useHelpers } from '@/lib/client-helpers' import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar' 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 t = useTranslations('AddEditWishlistItemModal') 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 { currentUser } = useHelpers() const [selectedUserIds, setSelectedUserIds] = useState((editingItem?.userIds || []).filter(id => id !== currentUser?.id)) const [errors, setErrors] = useState<{ [key: string]: string }>({}) const [usersData] = useAtom(usersAtom) 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 = t('errorNameRequired') } if (coinCost < 1) { newErrors.coinCost = t('errorCoinCostMin') } if (targetCompletions !== undefined && targetCompletions < 1) { newErrors.targetCompletions = t('errorTargetCompletionsMin') } if (link && !isValidUrl(link)) { newErrors.link = t('errorInvalidUrl') } 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, userIds: selectedUserIds.length > 0 ? selectedUserIds.concat(currentUser?.id || []) : (currentUser && [currentUser.id]) } if (editingItem) { editWishlistItem({ ...itemData, id: editingItem.id }) } else { addWishlistItem(itemData) } setIsOpen(false) setEditingItem(null) } return ( {editingItem ? t('editTitle') : t('addTitle')}
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() }} />