eventsGeoRequest.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import {useEffect, useMemo, useState} from 'react';
  2. import {Client} from 'sentry/api';
  3. import {DateString, OrganizationSummary} from 'sentry/types';
  4. import {getUtcDateString} from 'sentry/utils/dates';
  5. import {TableData, TableDataWithTitle} from 'sentry/utils/discover/discoverQuery';
  6. import EventView from 'sentry/utils/discover/eventView';
  7. import {doDiscoverQuery} from 'sentry/utils/discover/genericDiscoverQuery';
  8. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  9. import toArray from 'sentry/utils/toArray';
  10. import usePrevious from 'sentry/utils/usePrevious';
  11. interface ChildrenRenderProps {
  12. errored: boolean;
  13. loading: boolean;
  14. reloading: boolean;
  15. tableData?: TableDataWithTitle[];
  16. }
  17. export interface EventsGeoRequestProps {
  18. api: Client;
  19. children: (props: ChildrenRenderProps) => React.ReactElement;
  20. end: DateString;
  21. environments: string[];
  22. organization: OrganizationSummary;
  23. projects: number[];
  24. query: string;
  25. start: DateString;
  26. yAxis: string | string[];
  27. dataset?: DiscoverDatasets;
  28. orderby?: string;
  29. period?: string | null;
  30. referrer?: string;
  31. }
  32. const EventsGeoRequest = ({
  33. api,
  34. organization,
  35. yAxis,
  36. query,
  37. orderby,
  38. projects,
  39. period,
  40. start,
  41. end,
  42. environments,
  43. referrer,
  44. children,
  45. dataset,
  46. }: EventsGeoRequestProps) => {
  47. const eventView = useMemo(
  48. () =>
  49. EventView.fromSavedQuery({
  50. id: undefined,
  51. name: '',
  52. version: 2,
  53. fields: toArray(yAxis),
  54. query,
  55. orderby: orderby ?? '',
  56. projects,
  57. range: period ?? '',
  58. start: start ? getUtcDateString(start) : undefined,
  59. end: end ? getUtcDateString(end) : undefined,
  60. environment: environments,
  61. dataset,
  62. }),
  63. [yAxis, query, orderby, projects, period, start, end, environments, dataset]
  64. );
  65. const [results, setResults] = useState(undefined as ChildrenRenderProps['tableData']);
  66. const [reloading, setReloading] = useState(false);
  67. const [errored, setErrored] = useState(false);
  68. const prevApi = usePrevious(api);
  69. const prevEventView = usePrevious(eventView);
  70. const prevOrgSlug = usePrevious(organization.slug);
  71. const prevReferrer = usePrevious(referrer);
  72. useEffect(() => {
  73. let mounted = true;
  74. setErrored(false);
  75. if (
  76. prevApi !== api ||
  77. prevEventView !== eventView ||
  78. prevOrgSlug !== organization.slug ||
  79. prevReferrer !== referrer
  80. ) {
  81. setReloading(true);
  82. }
  83. doDiscoverQuery<TableData>(api, `/organizations/${organization.slug}/events-geo/`, {
  84. ...eventView.generateQueryStringObject(),
  85. referrer,
  86. })
  87. .then(discoverQueryResults => {
  88. if (mounted) {
  89. setResults([discoverQueryResults[0]] as TableDataWithTitle[]);
  90. setReloading(false);
  91. }
  92. })
  93. .catch(() => {
  94. if (mounted) {
  95. setErrored(true);
  96. setReloading(false);
  97. }
  98. });
  99. return () => {
  100. // Prevent setState leaking on unmounted component
  101. mounted = false;
  102. };
  103. }, [
  104. api,
  105. eventView,
  106. organization.slug,
  107. referrer,
  108. prevApi,
  109. prevEventView,
  110. prevOrgSlug,
  111. prevReferrer,
  112. ]);
  113. return children({
  114. errored,
  115. loading: !results && !errored,
  116. reloading,
  117. tableData: results,
  118. });
  119. };
  120. export default EventsGeoRequest;