import React, { useState, useMemo } from 'react'; import { useSearchParams, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useGlobalSearch, SearchResult } from '@/api/hooks'; import { Card } from '@/components/ui/Card'; import { Input } from '@/components/ui/Input'; import { Select } from '@/components/ui/Select'; import { Button } from '@/components/ui/Button'; import { EmptyState } from '@/components/ui/EmptyState'; import { Badge } from '@/components/ui/Badge'; import { Skeleton } from '@/components/ui/Skeleton'; function highlightMatch(text: string, query: string): React.ReactNode { if (!query.trim()) return text; const lowerText = text.toLowerCase(); const lowerQuery = query.toLowerCase(); const idx = lowerText.indexOf(lowerQuery); if (idx === -1) return text; return ( <> {text.slice(0, idx)} {text.slice(idx, idx + query.length)} {text.slice(idx + query.length)} ); } export function GlobalSearchResultsPage() { const { t } = useTranslation(); const navigate = useNavigate(); const [searchParams, setSearchParams] = useSearchParams(); const query = searchParams.get('q') || ''; const [searchInput, setSearchInput] = useState(query); const [entityType, setEntityType] = useState(searchParams.get('type') || 'all'); const [dateFrom, setDateFrom] = useState(searchParams.get('dateFrom') || ''); const [dateTo, setDateTo] = useState(searchParams.get('dateTo') || ''); const entityTypes = useMemo(() => { if (entityType === 'all') return undefined; return [entityType]; }, [entityType]); const { data: results, isLoading } = useGlobalSearch(query, entityTypes); const handleSearch = (e: React.FormEvent) => { e.preventDefault(); const params: Record = {}; if (searchInput) params.q = searchInput; if (entityType !== 'all') params.type = entityType; if (dateFrom) params.dateFrom = dateFrom; if (dateTo) params.dateTo = dateTo; setSearchParams(params); }; const filteredResults = useMemo(() => { if (!results) return []; let filtered = results; if (dateFrom) { filtered = filtered.filter((r) => { return true; }); } return filtered; }, [results, dateFrom, dateTo]); return (

{t('search.title')}

setSearchInput(e.target.value)} placeholder={t('common.search')} data-testid="search-input" /> setDateFrom(e.target.value)} /> setDateTo(e.target.value)} />
{query && (

{t('search.resultsFor', { query })}:

)} {!query ? ( ) : isLoading ? (
{[1, 2, 3].map((i) => ( ))}
) : filteredResults.length === 0 ? ( ) : (
{filteredResults.map((result) => ( ))}
)}
); }