import { useState, useMemo } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Search, MapPin, Calendar, AlertTriangle, CheckCircle2, ImageOff, Clock, Users, } from 'lucide-react'; import { cn } from '@/lib/utils'; import type { PickerEvent } from '@/lib/types/ad-control'; interface EventPickerModalProps { open: boolean; onOpenChange: (open: boolean) => void; events: PickerEvent[]; onSelectEvent: (event: PickerEvent) => void; alreadyPlacedEventIds: string[]; } export function EventPickerModal({ open, onOpenChange, events, onSelectEvent, alreadyPlacedEventIds }: EventPickerModalProps) { const [query, setQuery] = useState(''); const now = new Date(); const filtered = useMemo(() => { if (!query.trim()) return events; const q = query.toLowerCase(); return events.filter(e => e.title.toLowerCase().includes(q) || e.id.toLowerCase().includes(q) || e.organizer.toLowerCase().includes(q) || e.city.toLowerCase().includes(q) || e.category.toLowerCase().includes(q) ); }, [events, query]); const getWarnings = (event: PickerEvent): { label: string; severity: 'warning' | 'error' }[] => { const warns: { label: string; severity: 'warning' | 'error' }[] = []; if (event.approvalStatus === 'PENDING') warns.push({ label: 'Pending Approval', severity: 'warning' }); if (event.approvalStatus === 'REJECTED') warns.push({ label: 'Rejected', severity: 'error' }); if (new Date(event.endDate) < now) warns.push({ label: 'Event Ended', severity: 'error' }); if (!event.coverImage) warns.push({ label: 'No Cover Image', severity: 'warning' }); return warns; }; const handleSelect = (event: PickerEvent) => { const warnings = getWarnings(event); const hasErrors = warnings.some(w => w.severity === 'error'); if (hasErrors) { const msg = warnings.filter(w => w.severity === 'error').map(w => w.label).join(', '); if (!confirm(`This event has issues: ${msg}. Proceed anyway?`)) return; } onSelectEvent(event); onOpenChange(false); setQuery(''); }; return ( Select Event Search for an event to place on this surface. {/* Search */}
setQuery(e.target.value)} placeholder="Search by name, ID, organizer, city, or category..." className="pl-10" autoFocus />
{/* Event List */}
{filtered.length === 0 && (
No events found matching "{query}"
)} {filtered.map(event => { const warnings = getWarnings(event); const isPlaced = alreadyPlacedEventIds.includes(event.id); const fillPercent = Math.round((event.ticketsSold / event.capacity) * 100); return ( ); })}
); }