75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
'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
|
|
};
|
|
}
|