searchStore.js 1.71 KB
import { writable, derived } from 'svelte/store';
import { initSearchIndex, search, isIndexReady } from '$lib/services/search';

// Estado del buscador
export const query = writable('');
export const results = writable([]);
export const isLoading = writable(false);
export const indexLoaded = writable(false);
export const error = writable(null);
export const selectedIndex = writable(-1);

// Estado derivado: si está mostrando resultados
export const showResults = derived(
  [query, results, indexLoaded],
  ([$query, $results, $indexLoaded]) => $indexLoaded && $query.length >= 2
);

/**
 * Inicializa el índice de búsqueda
 */
export async function initIndex() {
  if (isIndexReady()) {
    indexLoaded.set(true);
    return;
  }

  isLoading.set(true);
  error.set(null);

  try {
    await initSearchIndex();
    indexLoaded.set(true);
  } catch (e) {
    error.set('Error al cargar el índice de búsqueda');
    console.error(e);
  } finally {
    isLoading.set(false);
  }
}

/**
 * Realiza la búsqueda
 */
export function performSearch(searchQuery) {
  query.set(searchQuery);
  selectedIndex.set(-1);

  if (searchQuery.length < 2) {
    results.set([]);
    return;
  }

  const searchResults = search(searchQuery, 15);
  results.set(searchResults);
}

/**
 * Limpia la búsqueda
 */
export function clearSearch() {
  query.set('');
  results.set([]);
  selectedIndex.set(-1);
}

/**
 * Navegación por teclado
 */
export function navigateResults(direction, totalResults) {
  selectedIndex.update(current => {
    if (direction === 'down') {
      return current < totalResults - 1 ? current + 1 : 0;
    } else if (direction === 'up') {
      return current > 0 ? current - 1 : totalResults - 1;
    }
    return current;
  });
}