import { Card, FormField } from '@/components/ui'; import Button from '@/components/ui/Button'; import Flex from '@/components/ui/Flex'; import Grid from '@/components/ui/Grid'; import Input from '@/components/ui/Input'; import Select from '@/components/ui/Select'; import Stack from '@/components/ui/Stack'; import { useTranslation } from '@/hooks/useI18n'; import { getCategories, type SearchQuery } from '@/services/discovery-api'; import { useQuery } from '@tanstack/react-query'; import { Filter, MapPin, Search } from 'lucide-react'; import React, { useMemo, useState } from 'react'; interface DiscoverySearchBarProps { onSearch: (query: SearchQuery) => void; initialQuery?: SearchQuery; showFilters?: boolean; } export default function DiscoverySearchBar({ onSearch, initialQuery, showFilters = true, }: DiscoverySearchBarProps) { const { t } = useTranslation(); const [query, setQuery] = useState(initialQuery?.query || ''); const [category, setCategory] = useState(initialQuery?.categories?.[0] || ''); const [radius, setRadius] = useState(initialQuery?.radius_km?.toString() || '50'); const [showAdvanced, setShowAdvanced] = useState(false); // Fetch categories from backend const { data: categoriesData, isLoading: categoriesLoading } = useQuery({ queryKey: ['discovery-categories'], queryFn: getCategories, staleTime: 1000 * 60 * 60, // Cache for 1 hour }); // Combine all categories for the dropdown const allCategories = useMemo(() => { if (!categoriesData) return []; // Combine all category types, removing duplicates const combined = [ ...categoriesData.products, ...categoriesData.services, ...categoriesData.community, ]; // Remove duplicates and sort return Array.from(new Set(combined)).sort(); }, [categoriesData]); const handleSearch = () => { const searchQuery: SearchQuery = { query: query || undefined, categories: category ? [category] : undefined, radius_km: radius ? parseFloat(radius) : undefined, limit: 20, }; // Try to get user location if available if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => { searchQuery.latitude = position.coords.latitude; searchQuery.longitude = position.coords.longitude; onSearch(searchQuery); }, () => { // Location denied or unavailable, search without location onSearch(searchQuery); } ); } else { onSearch(searchQuery); } }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { handleSearch(); } }; return (
setQuery(e.target.value)} onKeyPress={handleKeyPress} className="pl-10" />
{showFilters && (
setRadius(e.target.value)} className="pl-10" />
)} {showAdvanced && showFilters && ( )}
); }