/v1.0

Autocomplete

Campo de texto que busca en un endpoint de API o en un arreglo local mientras el usuario escribe. Los resultados aparecen en un popover desplegable con navegación por teclado. Maneja debounce, estados de carga, error y sin resultados automáticamente.

Props

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | path | string | No | — | Ruta de la API a consultar. Si se omite, se usa localData. | | apiBaseUrl | string | No | — | URL base del cliente HTTP. | | useAuthToken | boolean | No | false | Cuando es true, usa el cliente autenticado. | | localData | any[] | No | [] | Arreglo de datos a filtrar cuando no hay path. | | searchParam | string | No | — | Nombre del parámetro de query al usar path. | | placeholder | string | No | 'Search...' | Texto de placeholder del campo. | | minSearchLength | number | No | 1 | Caracteres mínimos para disparar la búsqueda. | | debounceTime | number | No | 300 | Milisegundos de espera tras la última tecla. | | maxResults | number | No | 10 | Máximo de resultados a mostrar. | | loadingText | string | No | 'Searching...' | Texto mientras se cargan los resultados. | | noResultsText | string | No | 'No results found.' | Texto cuando no hay resultados. | | errorText | string | No | 'An error occurred.' | Texto cuando la llamada a la API falla. | | disabled | boolean | No | false | Deshabilita el campo. | | defaultValue | string | No | '' | Valor inicial del campo. | | filters | any[] | No | — | Filtros adicionales enviados como parámetro filters. | | itemLabelKey | string | No | — | Clave del item usada como etiqueta principal. | | itemDescriptionKey | string | No | — | Clave del item usada como descripción secundaria. | | itemImageKey | string | No | — | Clave del item usada como URL de imagen. | | renderItem | (item, index, results) => ReactNode | No | — | Render personalizado de cada resultado. | | onSelect | (item: any) => void | No | — | Se ejecuta al seleccionar un resultado. | | onSearch | (query: string) => void | No | — | Se ejecuta en cada intento de búsqueda. | | loadingIndicator | ReactNode | No | — | Indicador de carga personalizado. | | containerStyle | React.CSSProperties | No | — | Estilos del contenedor externo. | | searchInputStyle | React.CSSProperties | No | — | Estilos del campo de texto. | | itemStyle | React.CSSProperties | No | — | Estilos de cada fila de resultado. | | popoverStyle | React.CSSProperties | No | — | Estilos del popover de resultados. |

Uso

Búsqueda en API remota

import Autocomplete from '@/components/Autocomplete';

export default function Example() {
  return (
    <Autocomplete
      apiBaseUrl="https://api.example.com"
      path="/v1/products/search"
      searchParam="q"
      itemLabelKey="name"
      itemDescriptionKey="sku"
      useAuthToken
      onSelect={(item) => console.log('Seleccionado:', item)}
    />
  );
}

Datos locales con render personalizado

import Autocomplete from '@/components/Autocomplete';

const ciudades = [
  { id: 1, name: 'Buenos Aires', country: 'Argentina' },
  { id: 2, name: 'Córdoba', country: 'Argentina' },
];

export default function Example() {
  return (
    <Autocomplete
      localData={ciudades}
      placeholder="Buscar ciudades..."
      renderItem={(item) => (
        <span>
          <strong>{item.name}</strong> — {item.country}
        </span>
      )}
      onSelect={(item) => console.log('Seleccionado:', item)}
    />
  );
}