newSecretHandler.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. import useOrganization from 'sentry/utils/useOrganization';
  13. function NewSecretHandler({
  14. secret,
  15. provider,
  16. onGoBack,
  17. }: {
  18. onGoBack: MouseEventHandler;
  19. provider: string;
  20. secret: string;
  21. }) {
  22. const organization = useOrganization();
  23. return (
  24. <div>
  25. <StyledAlert type="success" showIcon system>
  26. {t('The secret has been posted.')}
  27. </StyledAlert>
  28. <StyledPanelItem>
  29. <InputWrapper>
  30. <StyledFieldGroup
  31. label={t('Webhook URL')}
  32. help={tct(
  33. "Create a webhook integration with your [link:feature flag service]. When you do so, you'll need to enter this URL.",
  34. {
  35. link: (
  36. // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message
  37. <ExternalLink href={PROVIDER_OPTION_TO_URLS[provider.toLowerCase()]} />
  38. ),
  39. }
  40. )}
  41. inline
  42. flexibleControlStateSize
  43. >
  44. <TextCopyInput
  45. aria-label={t('Webhook URL')}
  46. >{`https://sentry.io/api/0/organizations/${organization.slug}/flags/hooks/provider/${provider.toLowerCase()}/`}</TextCopyInput>
  47. </StyledFieldGroup>
  48. <StyledFieldGroup
  49. label={t('Secret')}
  50. help={t(
  51. 'The secret should not be shared and will not be retrievable once you leave this page.'
  52. )}
  53. inline
  54. flexibleControlStateSize
  55. >
  56. <TextCopyInput aria-label={t('Secret')}>{secret}</TextCopyInput>
  57. </StyledFieldGroup>
  58. </InputWrapper>
  59. </StyledPanelItem>
  60. <StyledPanelItem>
  61. <ButtonWrapper>
  62. <Button onClick={onGoBack} priority="primary">
  63. {t('Done')}
  64. </Button>
  65. </ButtonWrapper>
  66. </StyledPanelItem>
  67. </div>
  68. );
  69. }
  70. const InputWrapper = styled('div')`
  71. flex: 1;
  72. `;
  73. const StyledFieldGroup = styled(FieldGroup)`
  74. padding: ${space(1)};
  75. `;
  76. const ButtonWrapper = styled('div')`
  77. margin-left: auto;
  78. display: flex;
  79. flex-direction: column;
  80. align-items: flex-end;
  81. font-size: ${p => p.theme.fontSizeSmall};
  82. gap: ${space(1)};
  83. `;
  84. const StyledPanelItem = styled(PanelItem)`
  85. padding: ${space(1.5)};
  86. `;
  87. const StyledAlert = styled(Alert)`
  88. margin: 0;
  89. `;
  90. export default NewSecretHandler;