export default function useSearchField()

in src/hooks/useSearchField/index.ts [52:155]


export default function useSearchField(flowID: string, runNumber: string): SearchFieldReturnType {
  const { t } = useTranslation();
  const [qp, setQp] = useQueryParams({ q: StringParam });
  const [searchValue, setSearchValue] = useState(qp.q ? qp.q : isCached(flowID, runNumber) ? cache.text : '');
  const [searchResults, setSearchResults] = useState<SearchResultModel>(
    isCached(flowID, runNumber) ? cache.results : notAskedSearchResults,
  );
  const [enabled, setEnabled] = useState(true);

  const updateSearchResults = useCallback(
    (newResults: SearchResultModel) => {
      setSearchResults({
        ...newResults,
        // Only display items that were searchable, unsearchable result indicates error
        result: newResults.result.filter((r) => r.searchable),
      });
      cache.results = newResults;
      cache.id = flowID + runNumber;
    },
    [flowID, runNumber],
  );

  const updateText = useCallback(
    (str: string, forceUpdate?: boolean) => {
      setSearchValue(str);
      setQp({ q: str }, 'replaceIn');
      cache.text = str;
      cache.id = flowID + runNumber;

      if (forceUpdate) {
        setEnabled(false);
      }
    },
    [setQp, runNumber, flowID],
  );

  useEffect(() => {
    if (!enabled) {
      setEnabled(true);
    }
  }, [enabled]);

  const onError = useCallback(() => {
    updateSearchResults({ result: [], status: 'Error', errorMsg: t('search.failed-to-search') });
  }, [t, updateSearchResults]);

  const onUpdate = useCallback(
    (event: SearchResult) => {
      if (event.type === 'result' && Array.isArray(event.matches)) {
        updateSearchResults({ result: event.matches || [], status: 'Ok' });
      } else if (event.type === 'error' && event.message) {
        updateSearchResults({ status: 'Error', errorMsg: event.message, result: [] });
      }
    },
    [updateSearchResults],
  );

  const onConnecting = useCallback(() => {
    // if (searchResults.status !== 'Loading') {
    //   updateSearchResults({ ...searchResults, status: 'Loading' });
    // }

    setSearchResults((existingSearchResults) => {
      cache.results = { ...existingSearchResults, status: 'Loading' };
      cache.id = flowID + runNumber;
      return {
        ...existingSearchResults,
        status: 'Loading',
        // Only display items that were searchable, unsearchable result indicates error
        result: existingSearchResults.result.filter((r) => r.searchable),
      };
    });
  }, [flowID, runNumber]);

  useSearchRequest({
    url: `/search/flows/${flowID}/runs/${runNumber}`,
    searchValue: searchValue,
    onUpdate,
    onConnecting,
    onError,
    enabled,
  });

  useEffect(() => {
    if (searchValue === '') {
      setSearchResults(notAskedSearchResults);
    }
  }, [searchValue, setSearchResults]);

  useEffect(() => {
    if (qp.q) {
      cache.text = qp.q;
      cache.id = flowID + runNumber;
    }
  }, [qp.q, flowID, runNumber]);

  return useMemo(
    () => ({
      results: searchResults,
      fieldProps: { text: searchValue, setText: updateText },
    }),
    [searchResults, searchValue, updateText],
  );
}