'use client'; import { useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; import { useCallback } from 'react'; import { buildGraphingHref } from '@/lib/graphing/catalog'; import { aiReportQueryOptions, companyAnalysisQueryOptions, companyFinancialStatementsQueryOptions, filingsQueryOptions, holdingsQueryOptions, latestPortfolioInsightQueryOptions, portfolioSummaryQueryOptions, recentTasksQueryOptions, researchWorkspaceQueryOptions, watchlistQueryOptions } from '@/lib/query/options'; function normalizeTicker(ticker: string) { return ticker.trim().toUpperCase(); } export function useLinkPrefetch() { const queryClient = useQueryClient(); const router = useRouter(); const prefetchResearchTicker = useCallback((ticker: string) => { const normalizedTicker = normalizeTicker(ticker); if (!normalizedTicker) { return; } const analysisHref = `/analysis?ticker=${encodeURIComponent(normalizedTicker)}`; const researchHref = `/research?ticker=${encodeURIComponent(normalizedTicker)}`; const filingsHref = `/filings?ticker=${encodeURIComponent(normalizedTicker)}`; const financialsHref = `/financials?ticker=${encodeURIComponent(normalizedTicker)}`; const graphingHref = buildGraphingHref(normalizedTicker); router.prefetch(analysisHref); router.prefetch(researchHref); router.prefetch(filingsHref); router.prefetch(financialsHref); router.prefetch(graphingHref); void queryClient.prefetchQuery(companyAnalysisQueryOptions(normalizedTicker)); void queryClient.prefetchQuery(researchWorkspaceQueryOptions(normalizedTicker)); void queryClient.prefetchQuery(companyFinancialStatementsQueryOptions({ ticker: normalizedTicker, surfaceKind: 'income_statement', cadence: 'annual', includeDimensions: false })); void queryClient.prefetchQuery(filingsQueryOptions({ ticker: normalizedTicker, limit: 120 })); }, [queryClient, router]); const prefetchReport = useCallback((ticker: string, accessionNumber: string) => { const normalizedTicker = normalizeTicker(ticker); const normalizedAccession = accessionNumber.trim(); if (!normalizedTicker || !normalizedAccession) { return; } const reportHref = `/analysis/reports/${encodeURIComponent(normalizedTicker)}/${encodeURIComponent(normalizedAccession)}`; router.prefetch(reportHref); void queryClient.prefetchQuery(aiReportQueryOptions(normalizedAccession)); void queryClient.prefetchQuery(companyAnalysisQueryOptions(normalizedTicker)); }, [queryClient, router]); const prefetchPortfolioSurfaces = useCallback(() => { router.prefetch('/portfolio'); router.prefetch('/watchlist'); void queryClient.prefetchQuery(holdingsQueryOptions()); void queryClient.prefetchQuery(portfolioSummaryQueryOptions()); void queryClient.prefetchQuery(latestPortfolioInsightQueryOptions()); void queryClient.prefetchQuery(watchlistQueryOptions()); void queryClient.prefetchQuery(recentTasksQueryOptions(20)); }, [queryClient, router]); return { prefetchResearchTicker, prefetchReport, prefetchPortfolioSurfaces }; }