integrationButton.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import {useContext} from 'react';
  2. import {LinkButton} from 'sentry/components/button';
  3. import {IconOpen} from 'sentry/icons';
  4. import type {Integration} from 'sentry/types/integrations';
  5. import useOrganization from 'sentry/utils/useOrganization';
  6. import {AddIntegrationButton} from 'sentry/views/settings/organizationIntegrations/addIntegrationButton';
  7. import {IntegrationContext} from 'sentry/views/settings/organizationIntegrations/integrationContext';
  8. import RequestIntegrationButton from 'sentry/views/settings/organizationIntegrations/integrationRequest/RequestIntegrationButton';
  9. type Props = {
  10. buttonProps: ButtonProps;
  11. onAddIntegration: (integration: Integration) => void;
  12. onExternalClick: () => void;
  13. userHasAccess: boolean;
  14. externalInstallText?: string;
  15. };
  16. type ButtonProps = {
  17. disabled?: any;
  18. priority?: any;
  19. size?: any;
  20. style?: any;
  21. } | null;
  22. function IntegrationButton({
  23. userHasAccess,
  24. onAddIntegration,
  25. onExternalClick,
  26. externalInstallText,
  27. buttonProps,
  28. }: Props) {
  29. const organization = useOrganization();
  30. const {provider, type, installStatus, analyticsParams, modalParams} =
  31. useContext(IntegrationContext) ?? {};
  32. if (!provider || !type) {
  33. return null;
  34. }
  35. const {metadata} = provider;
  36. if (!userHasAccess) {
  37. return (
  38. <RequestIntegrationButton name={provider.name} slug={provider.slug} type={type} />
  39. );
  40. }
  41. if (provider.canAdd) {
  42. return (
  43. <AddIntegrationButton
  44. provider={provider}
  45. onAddIntegration={onAddIntegration}
  46. installStatus={installStatus}
  47. analyticsParams={analyticsParams}
  48. modalParams={modalParams}
  49. organization={organization}
  50. {...buttonProps}
  51. />
  52. );
  53. }
  54. if (metadata.aspects.externalInstall) {
  55. return (
  56. <LinkButton
  57. icon={externalInstallText ? null : <IconOpen />}
  58. href={metadata.aspects.externalInstall.url}
  59. onClick={onExternalClick}
  60. external
  61. {...buttonProps}
  62. >
  63. {externalInstallText
  64. ? externalInstallText
  65. : metadata.aspects.externalInstall.buttonText}
  66. </LinkButton>
  67. );
  68. }
  69. return null;
  70. }
  71. export default IntegrationButton;