import { useDebouncedValue } from "@mantine/hooks"; import { useSearchParams } from "react-router"; import { useStockSearch } from "@/entities/stock"; import { apiErrorCode } from "@/shared/api"; import { instrumentLogoUrl } from "@/shared/lib"; const SEARCH_DEBOUNCE_MS = 300; function useStocksPageVm() { const [params, setParams] = useSearchParams(); const query = params.get("q") ?? ""; const [debounced] = useDebouncedValue(query.trim(), SEARCH_DEBOUNCE_MS); const result = useStockSearch(debounced); const waiting = query.trim() !== debounced; return { query, setQuery: (q: string) => setParams(q ? { q } : {}, { replace: true }), loading: query.trim().length >= 2 && (waiting || result.isLoading), error: result.isError, code: apiErrorCode(result.error), retry: () => { void result.refetch(); }, ready: debounced.length >= 2 && !waiting && Boolean(result.data), items: result.data?.map((stock) => ({ ...stock, to: `/stocks/${encodeURIComponent(stock.slug ?? stock.instrumentUid)}`, logoSrc: instrumentLogoUrl(stock.logoName), })) ?? [], }; } type StocksPageVm = ReturnType; export { type StocksPageVm, useStocksPageVm };