← 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,
  };
}