organizationFeatureFlagsProviderRow.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Button} from 'sentry/components/button';
  4. import Confirm from 'sentry/components/confirm';
  5. import {Flex} from 'sentry/components/container/flex';
  6. import LoadingIndicator from 'sentry/components/loadingIndicator';
  7. import TimeSince from 'sentry/components/timeSince';
  8. import {Tooltip} from 'sentry/components/tooltip';
  9. import {IconSubtract} from 'sentry/icons';
  10. import {t} from 'sentry/locale';
  11. import {space} from 'sentry/styles/space';
  12. import type {Secret} from 'sentry/views/settings/featureFlags';
  13. import useUserFromId from 'sentry/views/settings/featureFlags/useUserFromId';
  14. export function OrganizationFeatureFlagsProviderRow({
  15. isRemoving,
  16. secret,
  17. removeSecret,
  18. }: {
  19. isRemoving: boolean;
  20. secret: Secret;
  21. removeSecret?: (id: number) => void;
  22. }) {
  23. const {isPending: isUserPending, data: user} = useUserFromId({id: secret.createdBy});
  24. return (
  25. <Fragment>
  26. <div>
  27. <div>{secret.provider}</div>
  28. <SecretPreview aria-label={t('Secret preview')}>{secret.secret}</SecretPreview>
  29. </div>
  30. <DateTime>
  31. <TimeSince date={secret.createdAt} />
  32. </DateTime>
  33. <Flex align="center">{isUserPending ? <LoadingIndicator mini /> : user?.name}</Flex>
  34. <Actions>
  35. <Tooltip
  36. title={t(
  37. 'You must be an organization owner, manager or admin to remove a secret.'
  38. )}
  39. disabled={!!removeSecret}
  40. >
  41. <Confirm
  42. disabled={!removeSecret || isRemoving}
  43. onConfirm={removeSecret ? () => removeSecret(secret.id) : undefined}
  44. message={t(
  45. 'Are you sure you want to remove the secret for %s provider? It will not be usable anymore, and this cannot be undone.',
  46. secret.provider
  47. )}
  48. >
  49. <Button
  50. size="sm"
  51. disabled={isRemoving || !removeSecret}
  52. aria-label={t('Remove secret for %s provider', secret.provider)}
  53. icon={
  54. isRemoving ? (
  55. <LoadingIndicator mini />
  56. ) : (
  57. <IconSubtract isCircled size="xs" />
  58. )
  59. }
  60. >
  61. {t('Remove')}
  62. </Button>
  63. </Confirm>
  64. </Tooltip>
  65. </Actions>
  66. </Fragment>
  67. );
  68. }
  69. const Actions = styled('div')`
  70. display: flex;
  71. justify-content: flex-end;
  72. `;
  73. const DateTime = styled('div')`
  74. display: flex;
  75. align-items: center;
  76. gap: ${space(0.5)};
  77. `;
  78. const SecretPreview = styled('div')`
  79. color: ${p => p.theme.gray300};
  80. `;