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" /> setEntityType(e.target.value)} /> setDateFrom(e.target.value)} /> setDateTo(e.target.value)} /> {t('common.search')} {query && ( {t('search.resultsFor', { query })}: )} {!query ? ( ) : isLoading ? ( {[1, 2, 3].map((i) => ( ))} ) : filteredResults.length === 0 ? ( ) : ( {filteredResults.map((result) => ( navigate(result.url)} className="w-full flex items-center gap-4 text-left hover:bg-secondary-50 p-2 rounded-md min-h-touch" data-testid={`search-result-${result.type}-${result.id}`} > {result.type === 'company' ? 'F' : 'K'} {highlightMatch(result.name, query)} {result.type === 'company' ? t('search.companies') : t('search.contacts')} {result.description && ( {highlightMatch(result.description, query)} )} → ))} )} ); }
{t('search.resultsFor', { query })}:
{highlightMatch(result.name, query)}
{highlightMatch(result.description, query)}