Files
Neon-Desk/hooks/use-link-prefetch.ts
francy51 db01f207a5 Expand financials surfaces with ratios, KPIs, and cadence support
- Add bundled financial modeling pipeline (ratios, KPI dimensions/notes, trend series, standardization)
- Introduce company financial bundles storage (Drizzle migration + repo wiring)
- Refactor financials page/API/query flow to use surfaceKind + cadence and new response shapes
2026-03-07 15:16:35 -05:00

82 lines
2.7 KiB
TypeScript

'use client';
import { useQueryClient } from '@tanstack/react-query';
import { useRouter } from 'next/navigation';
import { useCallback } from 'react';
import {
aiReportQueryOptions,
companyAnalysisQueryOptions,
companyFinancialStatementsQueryOptions,
filingsQueryOptions,
holdingsQueryOptions,
latestPortfolioInsightQueryOptions,
portfolioSummaryQueryOptions,
recentTasksQueryOptions,
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 filingsHref = `/filings?ticker=${encodeURIComponent(normalizedTicker)}`;
const financialsHref = `/financials?ticker=${encodeURIComponent(normalizedTicker)}`;
router.prefetch(analysisHref);
router.prefetch(filingsHref);
router.prefetch(financialsHref);
void queryClient.prefetchQuery(companyAnalysisQueryOptions(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
};
}