newSecretHandler.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import type {MouseEventHandler} from 'react';
  2. import styled from '@emotion/styled';
  3. import Alert from 'sentry/components/alert';
  4. import {Button} from 'sentry/components/button';
  5. import {PROVIDER_OPTION_TO_URLS} from 'sentry/components/events/featureFlags/utils';
  6. import FieldGroup from 'sentry/components/forms/fieldGroup';
  7. import ExternalLink from 'sentry/components/links/externalLink';
  8. import PanelItem from 'sentry/components/panels/panelItem';
  9. import TextCopyInput from 'sentry/components/textCopyInput';
  10. import {t, tct} from 'sentry/locale';
  11. import {space} from 'sentry/styles/space';
  12. function NewSecretHandler({
  13. secret,
  14. provider,
  15. onGoBack,
  16. }: {
  17. onGoBack: MouseEventHandler;
  18. provider: string;
  19. secret: string;
  20. }) {
  21. return (
  22. <div>
  23. <StyledAlert type="warning" showIcon system>
  24. {t('The secret has been posted.')}
  25. </StyledAlert>
  26. <StyledPanelItem>
  27. <InputWrapper>
  28. <StyledFieldGroup
  29. label={t('Webhook URL')}
  30. help={tct(
  31. "Create a webhook integration with your [link:feature flag service]. When you do so, you'll need to enter this URL.",
  32. {
  33. link: (
  34. <ExternalLink href={PROVIDER_OPTION_TO_URLS[provider.toLowerCase()]} />
  35. ),
  36. }
  37. )}
  38. inline
  39. flexibleControlStateSize
  40. >
  41. <TextCopyInput
  42. aria-label={t('Webhook URL')}
  43. >{`https://sentry.io/api/0/organizations/sentry/flags/hooks/provider/${provider.toLowerCase()}/`}</TextCopyInput>
  44. </StyledFieldGroup>
  45. <StyledFieldGroup
  46. label={t('Secret')}
  47. help={t(
  48. 'The secret should not be shared and will not be retrievable once you leave this page.'
  49. )}
  50. inline
  51. flexibleControlStateSize
  52. >
  53. <TextCopyInput aria-label={t('Secret')}>{secret}</TextCopyInput>
  54. </StyledFieldGroup>
  55. </InputWrapper>
  56. </StyledPanelItem>
  57. <StyledPanelItem>
  58. <ButtonWrapper>
  59. <Button onClick={onGoBack} priority="primary">
  60. {t('Done')}
  61. </Button>
  62. </ButtonWrapper>
  63. </StyledPanelItem>
  64. </div>
  65. );
  66. }
  67. const InputWrapper = styled('div')`
  68. flex: 1;
  69. `;
  70. const StyledFieldGroup = styled(FieldGroup)`
  71. padding: ${space(1)};
  72. `;
  73. const ButtonWrapper = styled('div')`
  74. margin-left: auto;
  75. display: flex;
  76. flex-direction: column;
  77. align-items: flex-end;
  78. font-size: ${p => p.theme.fontSizeSmall};
  79. gap: ${space(1)};
  80. `;
  81. const StyledPanelItem = styled(PanelItem)`
  82. padding: ${space(1.5)};
  83. `;
  84. const StyledAlert = styled(Alert)`
  85. margin: 0;
  86. `;
  87. export default NewSecretHandler;