details.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {Fragment} from 'react';
  2. import {RouteComponentProps} from 'react-router';
  3. import styled from '@emotion/styled';
  4. import DatePageFilter from 'sentry/components/datePageFilter';
  5. import * as Layout from 'sentry/components/layouts/thirds';
  6. import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
  7. import {Panel, PanelHeader} from 'sentry/components/panels';
  8. import {t} from 'sentry/locale';
  9. import space from 'sentry/styles/space';
  10. import {Organization} from 'sentry/types';
  11. import withOrganization from 'sentry/utils/withOrganization';
  12. import AsyncView from 'sentry/views/asyncView';
  13. import MonitorCheckIns from './monitorCheckIns';
  14. import MonitorHeader from './monitorHeader';
  15. import MonitorIssues from './monitorIssues';
  16. import MonitorStats from './monitorStats';
  17. import MonitorOnboarding from './onboarding';
  18. import {Monitor} from './types';
  19. type Props = AsyncView['props'] &
  20. RouteComponentProps<{monitorId: string; orgId: string}, {}> & {
  21. organization: Organization;
  22. };
  23. type State = AsyncView['state'] & {
  24. monitor: Monitor | null;
  25. };
  26. class MonitorDetails extends AsyncView<Props, State> {
  27. get orgSlug() {
  28. return this.props.organization.slug;
  29. }
  30. getEndpoints(): ReturnType<AsyncView['getEndpoints']> {
  31. const {params, location} = this.props;
  32. return [['monitor', `/monitors/${params.monitorId}/`, {query: location.query}]];
  33. }
  34. getTitle() {
  35. if (this.state.monitor) {
  36. return `${this.state.monitor.name} - Monitors - ${this.orgSlug}`;
  37. }
  38. return `Monitors - ${this.orgSlug}`;
  39. }
  40. onUpdate = (data: Monitor) =>
  41. this.setState(state => ({monitor: {...state.monitor, ...data}}));
  42. renderBody() {
  43. const {monitor} = this.state;
  44. if (monitor === null) {
  45. return null;
  46. }
  47. return (
  48. <Fragment>
  49. <MonitorHeader monitor={monitor} orgId={this.orgSlug} onUpdate={this.onUpdate} />
  50. <Layout.Body>
  51. <Layout.Main fullWidth>
  52. {!monitor.lastCheckIn && <MonitorOnboarding monitor={monitor} />}
  53. <StyledPageFilterBar condensed>
  54. <DatePageFilter alignDropdown="left" />
  55. </StyledPageFilterBar>
  56. <MonitorStats monitor={monitor} />
  57. <MonitorIssues monitor={monitor} orgId={this.orgSlug} />
  58. <Panel>
  59. <PanelHeader>{t('Recent Check-ins')}</PanelHeader>
  60. <MonitorCheckIns monitor={monitor} />
  61. </Panel>
  62. </Layout.Main>
  63. </Layout.Body>
  64. </Fragment>
  65. );
  66. }
  67. }
  68. const StyledPageFilterBar = styled(PageFilterBar)`
  69. margin-bottom: ${space(2)};
  70. `;
  71. export default withOrganization(MonitorDetails);