/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useState, useEffect, useRef } from 'react'; import { format } from 'date-fns'; interface SearchModalProps { isOpen: boolean; onClose: () => void; tasks: any[]; events: any[]; onSelectTask: (date: Date) => void; } export default function SearchModal({ isOpen, onClose, tasks, events, onSelectTask }: SearchModalProps) { const [query, setQuery] = useState(''); const [results, setResults] = useState<{ type: 'task' | 'event', item: any }[]>([]); const inputRef = useRef(null); useEffect(() => { if (isOpen && inputRef.current) { inputRef.current.focus(); } }, [isOpen]); useEffect(() => { if (!query.trim()) { setResults([]); return; } const lowerQuery = query.toLowerCase(); const filteredTasks = tasks.filter(t => t.title.toLowerCase().includes(lowerQuery) && !t.somedayListId ).map(t => ({ type: 'task' as const, item: t })); const filteredEvents = events.filter(e => e.title.toLowerCase().includes(lowerQuery) ).map(e => ({ type: 'event' as const, item: e })); setResults([...filteredTasks, ...filteredEvents].slice(0, 10)); }, [query, tasks, events]); if (!isOpen) return null; return (
e.stopPropagation()}>
setQuery(e.target.value)} onKeyDown={e => e.key === 'Escape' && onClose()} />
{results.length > 0 ? (
{results.map((result, idx) => (
{ const date = result.type === 'task' ? (result.item.scheduledDate ? new Date(result.item.scheduledDate) : new Date()) : (new Date(result.item.startTime)); onSelectTask(date); onClose(); }} >
{result.type === 'task' ? ( ) : ( )}
{result.item.title}
{format( result.type === 'task' ? (result.item.scheduledDate ? new Date(result.item.scheduledDate) : new Date()) : new Date(result.item.startTime), 'PPP' )}
{result.type === 'task' && result.item.completed && ( Completed )}
))}
) : query.trim() ? (
No Item found.
) : (
Start typing to search...
)}
); }