useGroupEvent.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import type {Event} from 'sentry/types/event';
  2. import {getPeriod} from 'sentry/utils/duration/getPeriod';
  3. import {useApiQuery} from 'sentry/utils/queryClient';
  4. import {useLocation} from 'sentry/utils/useLocation';
  5. import useOrganization from 'sentry/utils/useOrganization';
  6. import usePageFilters from 'sentry/utils/usePageFilters';
  7. import {useEventQuery} from 'sentry/views/issueDetails/streamline/eventSearch';
  8. import {
  9. getGroupEventQueryKey,
  10. useDefaultIssueEvent,
  11. useHasStreamlinedUI,
  12. } from 'sentry/views/issueDetails/utils';
  13. export const RESERVED_EVENT_IDS = new Set(['recommended', 'latest', 'oldest']);
  14. interface UseGroupEventOptions {
  15. environments: string[];
  16. eventId: string | undefined;
  17. groupId: string;
  18. }
  19. export function useGroupEvent({
  20. groupId,
  21. eventId: eventIdProp,
  22. environments,
  23. }: UseGroupEventOptions) {
  24. const organization = useOrganization();
  25. const location = useLocation<{query?: string}>();
  26. const defaultIssueEvent = useDefaultIssueEvent();
  27. const hasStreamlinedUI = useHasStreamlinedUI();
  28. const eventQuery = useEventQuery({groupId});
  29. const eventId = eventIdProp ?? defaultIssueEvent;
  30. const isReservedEventId = RESERVED_EVENT_IDS.has(eventId);
  31. const isLatestOrRecommendedEvent = eventId === 'latest' || eventId === 'recommended';
  32. const query =
  33. isLatestOrRecommendedEvent && typeof location.query.query === 'string'
  34. ? location.query.query
  35. : undefined;
  36. const {selection: pageFilters} = usePageFilters();
  37. const periodQuery = hasStreamlinedUI ? getPeriod(pageFilters.datetime) : {};
  38. const queryKey = getGroupEventQueryKey({
  39. orgSlug: organization.slug,
  40. groupId,
  41. eventId,
  42. environments,
  43. query: hasStreamlinedUI ? eventQuery : query,
  44. ...periodQuery,
  45. });
  46. // Legacy: Latest/recommended event will change over time, so only cache for 30 seconds
  47. // Oldest/specific events will never change
  48. const staleTime = isLatestOrRecommendedEvent ? 30000 : Infinity;
  49. // Streamlined: Only specific events will never change, so cache indefinitely
  50. const streamlineStaleTime = isReservedEventId ? Infinity : 30000;
  51. return useApiQuery<Event>(queryKey, {
  52. staleTime: hasStreamlinedUI ? streamlineStaleTime : staleTime,
  53. retry: false,
  54. });
  55. }