File size: 2,352 Bytes
6d643ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';

import { scrapeApi } from '@/api/scrapeApi';
import { CACHE_CONFIG } from '@/lib/config';
import {
  handleMutationError,
  handleMutationSuccess,
  handleQueryError,
} from '@/lib/errors';
import { QUERY_KEYS } from '@/utils/constants';

// Query keys for consistent caching
export const scrapeQueryKeys = {
  all: [QUERY_KEYS.SCRAPE] as const,
  brands: () => [...scrapeQueryKeys.all, 'brands'] as const,
  jobs: (params?: { limit?: number; source?: string }) =>
    [...scrapeQueryKeys.all, 'jobs', params] as const,
  stats: () => [...scrapeQueryKeys.all, 'stats'] as const,
};

// Get available brands for scraping
export const useAvailableBrands = () => {
  return useQuery<string[]>({
    queryKey: scrapeQueryKeys.brands(),
    queryFn: () => scrapeApi.getAvailableBrands(),
    staleTime: CACHE_CONFIG.STALE_TIME,
    throwOnError: (error: unknown) => {
      handleQueryError(error, 'Loading available brands');
      return false;
    },
  });
};

// Scrape specific brand mutation
export const useScrapeBrand = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (brand: string) => scrapeApi.scrapeBrand(brand),
    onSuccess: (data, brand) => {
      // Invalidate jobs and stats to show updated data
      void queryClient.invalidateQueries({ queryKey: scrapeQueryKeys.jobs() });
      void queryClient.invalidateQueries({ queryKey: scrapeQueryKeys.stats() });

      handleMutationSuccess(`Started scraping ${brand}: ${data.message}`, data);
    },
    onError: (error: unknown) => {
      handleMutationError(error, 'Failed to start scraping');
    },
  });
};

// Scrape all brands mutation
export const useScrapeAll = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: () => scrapeApi.scrapeAll(),
    onSuccess: (data) => {
      // Invalidate jobs and stats to show updated data
      void queryClient.invalidateQueries({ queryKey: scrapeQueryKeys.jobs() });
      void queryClient.invalidateQueries({ queryKey: scrapeQueryKeys.stats() });

      handleMutationSuccess(
        `Started scraping all brands: ${data.message}`,
        data
      );
    },
    onError: (error: unknown) => {
      handleMutationError(error, 'Failed to start scraping all brands');
    },
  });
};