upgrade navigation and route prefetch responsiveness

This commit is contained in:
2026-03-01 20:45:08 -05:00
parent d6895f185f
commit dc84f34fe9
17 changed files with 1208 additions and 142 deletions

View File

@@ -0,0 +1,74 @@
'use client';
import { useQueryClient } from '@tanstack/react-query';
import { useRouter } from 'next/navigation';
import { useCallback } from 'react';
import {
aiReportQueryOptions,
companyAnalysisQueryOptions,
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(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
};
}