File size: 2,148 Bytes
3c76719
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
'use client';

import { useCallback } from 'react';
import { sortVideos } from '@/lib/utils/sort';
import type { SortOption } from '@/lib/store/settings-store';
import type { Video, SourceBadge } from '@/lib/types';
import { useSearchState } from './useSearchState';
import { useSearchAction } from './useSearchAction';

interface ParallelSearchResult {
  loading: boolean;
  results: Video[];
  availableSources: SourceBadge[];
  completedSources: number;
  totalSources: number;
  totalVideosFound: number;
  performSearch: (query: string, sources?: any[], sortBy?: SortOption) => Promise<void>;
  resetSearch: () => void;
  loadCachedResults: (results: Video[], sources: any[]) => void;
  applySorting: (sortBy: SortOption) => void;
}

export function useParallelSearch(
  onCacheUpdate: (query: string, results: any[], sources: any[]) => void,
  onUrlUpdate: (query: string) => void
): ParallelSearchResult {
  const state = useSearchState();
  const {
    loading,
    results,
    availableSources,
    completedSources,
    totalSources,
    totalVideosFound,
    setResults,
    setAvailableSources,
    setTotalVideosFound,
    resetState,
  } = state;

  const { performSearch, cancelSearch } = useSearchAction({
    state,
    onCacheUpdate,
    onUrlUpdate,
  });

  /**
   * Reset search state
   */
  const resetSearch = useCallback(() => {
    cancelSearch();
    resetState();
  }, [cancelSearch, resetState]);

  /**
   * Load cached results
   */
  const loadCachedResults = useCallback((cachedResults: Video[], cachedSources: any[]) => {
    setResults(cachedResults);
    setAvailableSources(cachedSources);
    setTotalVideosFound(cachedResults.length);
  }, [setResults, setAvailableSources, setTotalVideosFound]);

  /**
   * Apply sorting to current results
   */
  const applySorting = useCallback((sortBy: SortOption) => {
    setResults((currentResults) => sortVideos(currentResults, sortBy));
  }, [setResults]);

  return {
    loading,
    results,
    availableSources,
    completedSources,
    totalSources,
    totalVideosFound,
    performSearch,
    resetSearch,
    loadCachedResults,
    applySorting,
  };
}