groupUptimeChecks.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {usePageFilterDates} from 'sentry/components/checkInTimeline/hooks/useMonitorDates';
  2. import LoadingError from 'sentry/components/loadingError';
  3. import LoadingIndicator from 'sentry/components/loadingIndicator';
  4. import {t} from 'sentry/locale';
  5. import parseLinkHeader from 'sentry/utils/parseLinkHeader';
  6. import {decodeScalar} from 'sentry/utils/queryString';
  7. import {useLocation} from 'sentry/utils/useLocation';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import {useParams} from 'sentry/utils/useParams';
  10. import {UptimeChecksGrid} from 'sentry/views/alerts/rules/uptime/uptimeChecksGrid';
  11. import {useUptimeChecks} from 'sentry/views/insights/uptime/utils/useUptimeChecks';
  12. import {EventListTable} from 'sentry/views/issueDetails/streamline/eventListTable';
  13. import {useUptimeIssueAlertId} from 'sentry/views/issueDetails/streamline/issueUptimeCheckTimeline';
  14. import {useGroup} from 'sentry/views/issueDetails/useGroup';
  15. import {useUptimeRule} from '../insights/uptime/utils/useUptimeRule';
  16. export default function GroupUptimeChecks() {
  17. const organization = useOrganization();
  18. const {groupId} = useParams<{groupId: string}>();
  19. const location = useLocation();
  20. const {since, until} = usePageFilterDates();
  21. const uptimeAlertId = useUptimeIssueAlertId({groupId});
  22. const {
  23. data: group,
  24. isPending: isGroupPending,
  25. isError: isGroupError,
  26. refetch: refetchGroup,
  27. } = useGroup({groupId});
  28. const canFetchUptimeChecks =
  29. Boolean(organization.slug) && Boolean(group?.project.slug) && Boolean(uptimeAlertId);
  30. const {data: uptimeRule} = useUptimeRule(
  31. {
  32. projectSlug: group?.project.slug ?? '',
  33. uptimeRuleId: uptimeAlertId ?? '',
  34. },
  35. {enabled: canFetchUptimeChecks}
  36. );
  37. const {data: uptimeChecks, getResponseHeader} = useUptimeChecks(
  38. {
  39. orgSlug: organization.slug,
  40. projectSlug: group?.project.slug ?? '',
  41. uptimeAlertId: uptimeAlertId ?? '',
  42. cursor: decodeScalar(location.query.cursor),
  43. limit: 50,
  44. start: since.toISOString(),
  45. end: until.toISOString(),
  46. },
  47. {enabled: canFetchUptimeChecks}
  48. );
  49. if (isGroupError) {
  50. return <LoadingError onRetry={refetchGroup} />;
  51. }
  52. if (isGroupPending || uptimeChecks === undefined || uptimeRule === undefined) {
  53. return <LoadingIndicator />;
  54. }
  55. const links = parseLinkHeader(getResponseHeader?.('Link') ?? '');
  56. const previousDisabled = links?.previous?.results === false;
  57. const nextDisabled = links?.next?.results === false;
  58. const pageCount = uptimeChecks.length;
  59. return (
  60. <EventListTable
  61. title={t('All Uptime Checks')}
  62. pagination={{
  63. tableUnits: t('uptime checks'),
  64. links,
  65. pageCount,
  66. nextDisabled,
  67. previousDisabled,
  68. }}
  69. >
  70. <UptimeChecksGrid uptimeRule={uptimeRule} uptimeChecks={uptimeChecks} />
  71. </EventListTable>
  72. );
  73. }