useGroupEvent.tsx 2.3 KB

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