← back to Wine Finder Next
src/hooks/useWineSearch.ts
57 lines
/**
* useWineSearch Hook
* Searches all wine sources in parallel and aggregates results
*/
import { useState, useCallback } from 'react';
import { searchWineEverywhere } from '../api/wineProviders';
import { WineListing } from '../types/wine';
interface UseWineSearchReturn {
listings: WineListing[];
isLoading: boolean;
error: string | null;
searchWine: (query: string) => Promise<void>;
clearResults: () => void;
}
export function useWineSearch(): UseWineSearchReturn {
const [listings, setListings] = useState<WineListing[]>([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const searchWine = useCallback(async (query: string) => {
if (!query.trim()) return;
setIsLoading(true);
setError(null);
try {
const results = await searchWineEverywhere(query);
setListings(results);
if (results.length === 0) {
setError(`No wines found for "${query}"`);
}
} catch (err) {
setError(err instanceof Error ? err.message : 'Search failed');
setListings([]);
} finally {
setIsLoading(false);
}
}, []);
const clearResults = useCallback(() => {
setListings([]);
setError(null);
}, []);
return {
listings,
isLoading,
error,
searchWine,
clearResults,
};
}