All files / src/pages/suppliers/dialogs/DeleteSupplierDialog useSupplierSearch.ts

100% Statements 100/100
100% Branches 8/8
100% Functions 1/1
100% Lines 100/100

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 1011x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 4x 4x 4x 1x 1x 1x 3x 3x 3x 3x 2x 4x 1x 4x 3x 3x 10x 10x 10x 10x 10x 10x 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x  
/**
 * @file useSupplierSearch.ts
 * @module dialogs/DeleteSupplierDialog/useSupplierSearch
 *
 * @summary
 * Hook for supplier search functionality.
 * Handles search query, results, and loading state.
 *
 * @enterprise
 * - Encapsulates all search-related logic
 * - Reusable for other supplier search scenarios
 * - Minimum 2 characters required for API call
 */
 
import * as React from 'react';
import { getSuppliersPage } from '../../../../api/suppliers';
import type { SupplierRow } from '../../../../api/suppliers/types';
 
/**
 * Hook return type for supplier search.
 * 
 * @interface UseSupplierSearchReturn
 */
export interface UseSupplierSearchReturn {
  /** Current search query */
  searchQuery: string;
  /** Set search query */
  setSearchQuery: (query: string) => void;
  /** Search results */
  searchResults: SupplierRow[];
  /** Whether search is currently loading */
  searchLoading: boolean;
  /** Handle search query change with debouncing */
  handleSearchQueryChange: (query: string) => Promise<void>;
  /** Reset search to initial state */
  resetSearch: () => void;
}
 
/**
 * Hook for supplier search functionality.
 *
 * Manages:
 * - Search query state
 * - Search results from API
 * - Loading state during API calls
 * - Minimum character validation (2 chars)
 *
 * @returns Search state and handlers
 *
 * @example
 * ```ts
 * const { searchQuery, searchResults, handleSearchQueryChange } = useSupplierSearch();
 * ```
 */
export const useSupplierSearch = (): UseSupplierSearchReturn => {
  const [searchQuery, setSearchQuery] = React.useState('');
  const [searchResults, setSearchResults] = React.useState<SupplierRow[]>([]);
  const [searchLoading, setSearchLoading] = React.useState(false);
 
  /**
   * Search for suppliers by name.
   * Requires minimum 2 characters.
   * Clears results if query is too short.
   */
  const handleSearchQueryChange = React.useCallback(async (query: string) => {
    setSearchQuery(query);
 
    if (query.trim().length < 2) {
      setSearchResults([]);
      return;
    }
 
    setSearchLoading(true);
    try {
      const response = await getSuppliersPage({ page: 1, pageSize: 10, q: query });
      setSearchResults(response.items);
    } catch {
      setSearchResults([]);
    } finally {
      setSearchLoading(false);
    }
  }, []);
 
  /**
   * Reset search to initial state.
   */
  const resetSearch = React.useCallback(() => {
    setSearchQuery('');
    setSearchResults([]);
  }, []);
 
  return {
    searchQuery,
    setSearchQuery,
    searchResults,
    searchLoading,
    handleSearchQueryChange,
    resetSearch,
  };
};