useReplayList.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {useCallback, useEffect, useState} from 'react';
  2. import type {Location} from 'history';
  3. import type {Organization} from 'sentry/types/organization';
  4. import type EventView from 'sentry/utils/discover/eventView';
  5. import fetchReplayList from 'sentry/utils/replays/fetchReplayList';
  6. import useApi from 'sentry/utils/useApi';
  7. import usePageFilters from 'sentry/utils/usePageFilters';
  8. import type {
  9. ReplayListLocationQuery,
  10. ReplayListQueryReferrer,
  11. } from 'sentry/views/replays/types';
  12. type Options = {
  13. eventView: EventView;
  14. location: Location<ReplayListLocationQuery>;
  15. organization: Organization;
  16. perPage?: number;
  17. queryReferrer?: ReplayListQueryReferrer;
  18. };
  19. type State = Awaited<ReturnType<typeof fetchReplayList>> & {isFetching: boolean};
  20. type Result = State;
  21. function useReplayList({
  22. eventView,
  23. location,
  24. organization,
  25. queryReferrer,
  26. perPage,
  27. }: Options): Result {
  28. const api = useApi();
  29. const {selection} = usePageFilters();
  30. const [data, setData] = useState<State>({
  31. fetchError: undefined,
  32. isFetching: true,
  33. pageLinks: null,
  34. replays: [],
  35. });
  36. const loadReplays = useCallback(async () => {
  37. api.clear();
  38. setData(prev => ({
  39. ...prev,
  40. isFetching: true,
  41. }));
  42. const response = await fetchReplayList({
  43. api,
  44. organization,
  45. location,
  46. eventView,
  47. queryReferrer,
  48. perPage,
  49. selection,
  50. });
  51. setData({...response, isFetching: false});
  52. }, [api, organization, location, eventView, queryReferrer, perPage, selection]);
  53. useEffect(() => {
  54. loadReplays();
  55. }, [loadReplays]);
  56. return data;
  57. }
  58. export default useReplayList;