IntegrationActions.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { PermissionAction } from '@supabase/shared-types/out/constants'
  2. import { Button, cn } from 'ui'
  3. import { hasInstallError, hasUninstallError } from './stripe-sync-status'
  4. import { useStripeSyncStatus } from '@/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus'
  5. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  6. import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
  7. export const IntegrationInstalledActions = ({
  8. className,
  9. disabled,
  10. upgradeAvailable,
  11. installing,
  12. uninstalling,
  13. setShowUninstallModal,
  14. setShouldShowInstallSheet,
  15. }: {
  16. className?: string
  17. disabled?: boolean
  18. upgradeAvailable: boolean
  19. installing: boolean
  20. uninstalling: boolean
  21. isUninstallRequested: boolean
  22. setShowUninstallModal: (value: boolean) => void
  23. setShouldShowInstallSheet: (value: boolean) => void
  24. }) => {
  25. const { can: canManageSecrets } = useAsyncCheckPermissions(
  26. PermissionAction.FUNCTIONS_SECRET_WRITE,
  27. '*'
  28. )
  29. const {
  30. schemaComment: { status: installationStatus },
  31. } = useStripeSyncStatus()
  32. const uninstallError = hasUninstallError(installationStatus)
  33. return (
  34. <>
  35. <div className={cn('flex gap-x-2 justify-end', className)}>
  36. {upgradeAvailable && !uninstallError && !uninstalling && (
  37. <ButtonTooltip
  38. type="primary"
  39. onClick={() => setShouldShowInstallSheet(true)}
  40. disabled={disabled}
  41. loading={installing}
  42. tooltip={{
  43. content: {
  44. text: !canManageSecrets
  45. ? 'You need additional permissions to upgrade the Stripe Sync Engine.'
  46. : undefined,
  47. },
  48. }}
  49. >
  50. Upgrade integration
  51. </ButtonTooltip>
  52. )}
  53. <ButtonTooltip
  54. type="default"
  55. onClick={() => setShowUninstallModal(true)}
  56. disabled={disabled}
  57. loading={uninstalling}
  58. tooltip={{
  59. content: {
  60. text: !canManageSecrets
  61. ? 'You need additional permissions to uninstall the Stripe Sync Engine.'
  62. : undefined,
  63. },
  64. }}
  65. >
  66. {uninstallError ? 'Retry uninstallation' : 'Uninstall integration'}
  67. </ButtonTooltip>
  68. </div>
  69. </>
  70. )
  71. }
  72. export const IntegrationNotInstalledActions = ({
  73. className,
  74. installing,
  75. canInstall,
  76. isUninstallRequested,
  77. hideInstallCTA = false,
  78. handleUninstall,
  79. setShouldShowInstallSheet,
  80. }: {
  81. className?: string
  82. installing: boolean
  83. canInstall: boolean
  84. isUninstallRequested: boolean
  85. hideInstallCTA?: boolean
  86. handleUninstall: () => void
  87. setShouldShowInstallSheet: (value: boolean) => void
  88. }) => {
  89. const { can: canManageSecrets } = useAsyncCheckPermissions(
  90. PermissionAction.FUNCTIONS_SECRET_WRITE,
  91. '*'
  92. )
  93. const {
  94. schemaComment: { status: installationStatus },
  95. } = useStripeSyncStatus()
  96. const installError = hasInstallError(installationStatus)
  97. return (
  98. <div className={cn('flex gap-x-2 justify-end', className)}>
  99. {!hideInstallCTA && (
  100. <ButtonTooltip
  101. type="primary"
  102. onClick={() => setShouldShowInstallSheet(true)}
  103. disabled={!canInstall || !canManageSecrets}
  104. loading={installing}
  105. tooltip={{
  106. content: {
  107. text: !canInstall
  108. ? 'Your database already uses a schema named "stripe"'
  109. : !canManageSecrets
  110. ? 'You need additional permissions to install the Stripe Sync Engine.'
  111. : undefined,
  112. },
  113. }}
  114. >
  115. {installError ? 'Retry installation' : 'Install integration'}
  116. </ButtonTooltip>
  117. )}
  118. {installError && (
  119. <Button type="default" loading={isUninstallRequested} onClick={handleUninstall}>
  120. Uninstall
  121. </Button>
  122. )}
  123. </div>
  124. )
  125. }