From 6a3aee4db0216cd229d95c7db1f766aeb6ccb6c3 Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Sun, 5 Jul 2026 15:09:29 +0000 Subject: [PATCH] Market View: queue multiple per-date scrapes, dispatched sequentially Co-Authored-By: Claude Fable 5 --- frontend/src/pages/MarketView.tsx | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/frontend/src/pages/MarketView.tsx b/frontend/src/pages/MarketView.tsx index ef48f9c..3ff928f 100644 --- a/frontend/src/pages/MarketView.tsx +++ b/frontend/src/pages/MarketView.tsx @@ -922,8 +922,11 @@ const RateMatrixTab: React.FC = () => { const [showDirect, setShowDirect] = useState(false) const queryClient = useQueryClient() - // The scrape endpoint returns immediately (runs in background), so we watch - // scraper status until a new batch finishes, then refetch the matrix. + // The scrape endpoint returns immediately (runs in background), and the + // scraper handles one date at a time, so queued dates are dispatched + // sequentially: watch scraper status until a new batch finishes, refetch + // the matrix, then start the next date in the queue. + const [scrapeQueue, setScrapeQueue] = useState([]) const [scrapeWatch, setScrapeWatch] = useState<{ prevBatch: string | null, startedAt: number } | null>(null) const dateScrapeM = useMutation({ @@ -936,9 +939,17 @@ const RateMatrixTab: React.FC = () => { onError: () => { setScrapingDate(null) setScrapeWatch(null) + setScrapeQueue(q => q.slice(1)) }, }) + // Dispatch the next queued date when idle + useEffect(() => { + if (scrapeQueue.length && !scrapeWatch && !dateScrapeM.isPending) { + dateScrapeM.mutate(scrapeQueue[0]) + } + }, [scrapeQueue, scrapeWatch, dateScrapeM.isPending]) // eslint-disable-line react-hooks/exhaustive-deps + const { data: watchStatus } = useQuery({ queryKey: ['scraper-status'], queryFn: async () => (await api.get('/competitors/status')).data, @@ -956,6 +967,7 @@ const RateMatrixTab: React.FC = () => { queryClient.invalidateQueries({ queryKey: ['scraper-status'] }) setScrapingDate(null) setScrapeWatch(null) + setScrapeQueue(q => q.slice(1)) } }, [watchStatus, scrapeWatch, queryClient]) @@ -1155,15 +1167,19 @@ const RateMatrixTab: React.FC = () => { {scrapeAge} ) : null}