useA11yData.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import {useMemo} from 'react';
  2. import {useReplayContext} from 'sentry/components/replays/replayContext';
  3. import {useQuery} from 'sentry/utils/queryClient';
  4. import type {RawA11yResponse} from 'sentry/utils/replays/hydrateA11yFrame';
  5. import hydrateA11yFrame from 'sentry/utils/replays/hydrateA11yFrame';
  6. import useApi from 'sentry/utils/useApi';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import useProjects from 'sentry/utils/useProjects';
  9. export default function useA11yData() {
  10. const api = useApi();
  11. const organization = useOrganization();
  12. const {currentTime, replay} = useReplayContext();
  13. const {projects} = useProjects();
  14. const replayRecord = replay?.getReplay();
  15. const startTimestampMs = replayRecord?.started_at.getTime();
  16. const project = projects.find(p => p.id === replayRecord?.project_id);
  17. const unixTimestamp = ((startTimestampMs || 0) + currentTime) / 1000;
  18. const {data, ...rest} = useQuery<RawA11yResponse>({
  19. queryKey: [
  20. `/projects/${organization.slug}/${project?.slug}/replays/${replayRecord?.id}/accessibility-issues/`,
  21. ],
  22. queryFn: ({queryKey: [url]}) =>
  23. api.requestPromise(String(url), {
  24. method: 'GET',
  25. query: {timestamp: unixTimestamp},
  26. }),
  27. staleTime: 0,
  28. enabled: Boolean(project) && Boolean(replayRecord),
  29. });
  30. const hydrated = useMemo(
  31. () => data?.data?.flatMap(record => hydrateA11yFrame(record, startTimestampMs ?? 0)),
  32. [data?.data, startTimestampMs]
  33. );
  34. return {data: hydrated, dataOffsetMs: currentTime, ...rest};
  35. }