resourceSubscriptions.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {Component, Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Context} from 'sentry/components/deprecatedforms/form';
  4. import FormContext from 'sentry/components/forms/formContext';
  5. import {Permissions, WebhookEvent} from 'sentry/types';
  6. import {
  7. EVENT_CHOICES,
  8. PERMISSIONS_MAP,
  9. } from 'sentry/views/settings/organizationDeveloperSettings/constants';
  10. import SubscriptionBox from 'sentry/views/settings/organizationDeveloperSettings/subscriptionBox';
  11. type Resource = typeof EVENT_CHOICES[number];
  12. type DefaultProps = {
  13. webhookDisabled: boolean;
  14. };
  15. type Props = DefaultProps & {
  16. events: WebhookEvent[];
  17. onChange: (events: WebhookEvent[]) => void;
  18. permissions: Permissions;
  19. };
  20. export default class Subscriptions extends Component<Props> {
  21. static defaultProps: DefaultProps = {
  22. webhookDisabled: false,
  23. };
  24. constructor(props: Props, context: Context) {
  25. super(props, context);
  26. this.context.form.setValue('events', this.props.events);
  27. }
  28. UNSAFE_componentWillReceiveProps(nextProps: Props) {
  29. // if webhooks are disabled, unset the events
  30. if (nextProps.webhookDisabled && this.props.events.length) {
  31. this.save([]);
  32. }
  33. }
  34. componentDidUpdate() {
  35. const {permissions, events} = this.props;
  36. const permittedEvents = events.filter(
  37. resource => permissions[PERMISSIONS_MAP[resource]] !== 'no-access'
  38. );
  39. if (JSON.stringify(events) !== JSON.stringify(permittedEvents)) {
  40. this.save(permittedEvents);
  41. }
  42. }
  43. static contextType = FormContext;
  44. onChange = (resource: Resource, checked: boolean) => {
  45. const events = new Set(this.props.events);
  46. checked ? events.add(resource) : events.delete(resource);
  47. this.save(Array.from(events));
  48. };
  49. save = (events: WebhookEvent[]) => {
  50. this.props.onChange(events);
  51. this.context.form.setValue('events', events);
  52. };
  53. render() {
  54. const {permissions, webhookDisabled, events} = this.props;
  55. return (
  56. <SubscriptionGrid>
  57. {EVENT_CHOICES.map(choice => {
  58. const disabledFromPermissions =
  59. permissions[PERMISSIONS_MAP[choice]] === 'no-access';
  60. return (
  61. <Fragment key={choice}>
  62. <SubscriptionBox
  63. key={choice}
  64. disabledFromPermissions={disabledFromPermissions}
  65. webhookDisabled={webhookDisabled}
  66. checked={events.includes(choice) && !disabledFromPermissions}
  67. resource={choice}
  68. onChange={this.onChange}
  69. isNew={choice === 'comment'}
  70. />
  71. </Fragment>
  72. );
  73. })}
  74. </SubscriptionGrid>
  75. );
  76. }
  77. }
  78. const SubscriptionGrid = styled('div')`
  79. display: grid;
  80. grid-template: auto / 1fr 1fr 1fr;
  81. @media (max-width: ${props => props.theme.breakpoints.large}) {
  82. grid-template: 1fr 1fr 1fr / auto;
  83. }
  84. `;