StripeSyncChangesCard.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { EdgeFunctions } from 'icons'
  2. import { Layers, Loader2, Table } from 'lucide-react'
  3. import { SchemaInstallationStatus } from 'stripe-experiment-sync/supabase'
  4. import { Card, CardContent, cn } from 'ui'
  5. import {
  6. hasInstallError,
  7. hasUninstallError,
  8. isInstallDone,
  9. isInstalled,
  10. isInstalling,
  11. isUninstallDone,
  12. isUninstalling,
  13. } from './stripe-sync-status'
  14. type StripeSyncChangesCardProps = {
  15. installationStatus: SchemaInstallationStatus
  16. className?: string
  17. isUpgrade?: boolean
  18. }
  19. const ListItemClassName = 'flex items-center gap-x-3 py-2 px-3 border-b'
  20. export const StripeSyncChangesCard = ({
  21. installationStatus,
  22. className,
  23. isUpgrade,
  24. }: StripeSyncChangesCardProps) => {
  25. const installed = isInstalled(installationStatus)
  26. const installError = hasInstallError(installationStatus)
  27. const uninstallError = hasUninstallError(installationStatus)
  28. const installInProgress = isInstalling(installationStatus)
  29. const uninstallInProgress = isUninstalling(installationStatus)
  30. const installDone = isInstallDone(installationStatus)
  31. const uninstallDone = isUninstallDone(installationStatus)
  32. // Special case: installed integration with upgrade available (shown in sheet context)
  33. const isInProgress = installInProgress || uninstallInProgress
  34. const isInstalledWithUpgrade = installed && isUpgrade
  35. const title = isInstalledWithUpgrade
  36. ? 'This integration will upgrade your Briven project:'
  37. : uninstallDone || installError
  38. ? 'This integration will modify your Briven project:'
  39. : isInProgress
  40. ? 'This integration is modifying your Briven project:'
  41. : installDone || installed || uninstallError
  42. ? 'This integration has modified your Briven project:'
  43. : ''
  44. const dbLine = isInstalledWithUpgrade
  45. ? 'Upgrades the database schema named'
  46. : uninstallDone || installError
  47. ? 'Creates a new database schema named'
  48. : installInProgress
  49. ? isUpgrade
  50. ? 'Upgrading database schema named'
  51. : 'Creating a new database schema named'
  52. : installDone || installed || uninstallError
  53. ? 'Created a new database schema named'
  54. : uninstallInProgress
  55. ? 'Dropping database schema named'
  56. : ''
  57. const tableAndViewLine = isInstalledWithUpgrade
  58. ? 'Upgrades tables and views in the'
  59. : uninstallDone || installError
  60. ? 'Creates tables and views in the'
  61. : installInProgress
  62. ? isUpgrade
  63. ? 'Upgrading tables and views in the'
  64. : 'Creating tables and views in the'
  65. : installDone || installed || uninstallError
  66. ? 'Created tables and views in the'
  67. : uninstallInProgress
  68. ? 'Dropping tables and views in the'
  69. : ''
  70. const edgeFunctionsLine = isInstalledWithUpgrade
  71. ? 'Upgrades Edge Functions to handle incoming webhooks from Stripe'
  72. : uninstallDone || installError
  73. ? 'Deploys Edge Functions to handle incoming webhooks from Stripe'
  74. : installInProgress
  75. ? isUpgrade
  76. ? 'Upgrading Edge Functions to handle incoming webhooks from Stripe'
  77. : 'Deploying Edge Functions to handle incoming webhooks from Stripe'
  78. : installDone || installed || uninstallError
  79. ? 'Deployed Edge Functions to handle incoming webhooks from Stripe'
  80. : uninstallInProgress
  81. ? 'Undeploying Edge Functions to handle incoming webhooks from Stripe'
  82. : ''
  83. const scheduleLine = isInstalledWithUpgrade
  84. ? 'Upgrades automatic Stripe data syncs using Briven Queues'
  85. : uninstallDone || installError
  86. ? 'Schedules automatic Stripe data syncs using Briven Queues'
  87. : installInProgress
  88. ? isUpgrade
  89. ? 'Upgrading automatic Stripe data syncs using Briven Queues'
  90. : 'Scheduling automatic Stripe data syncs using Briven Queues'
  91. : installDone || installed || uninstallError
  92. ? 'Scheduled automatic Stripe data syncs using Briven Queues'
  93. : uninstallInProgress
  94. ? 'Unscheduling automatic Stripe data syncs using Briven Queues'
  95. : ''
  96. return (
  97. <div className="flex flex-col gap-y-4">
  98. <h4>{title}</h4>
  99. <Card className={cn(className)}>
  100. <CardContent className="p-0">
  101. <ul className="text-foreground-light text-sm">
  102. <li className={ListItemClassName}>
  103. {isInProgress ? (
  104. <Loader2 size={16} className="animate-spin" />
  105. ) : (
  106. <Table size={16} strokeWidth={1.5} className="text-foreground-lighter shrink-0" />
  107. )}
  108. <span>
  109. {dbLine} <code className="text-code-inline">stripe</code>
  110. </span>
  111. </li>
  112. <li className={ListItemClassName}>
  113. {isInProgress ? (
  114. <Loader2 size={16} className="animate-spin" />
  115. ) : (
  116. <Table size={16} strokeWidth={1.5} className="text-foreground-lighter shrink-0" />
  117. )}
  118. <span>
  119. {tableAndViewLine} <code className="text-code-inline">stripe</code> schema for
  120. synced Stripe data
  121. </span>
  122. </li>
  123. <li className={ListItemClassName}>
  124. {isInProgress ? (
  125. <Loader2 size={16} className="animate-spin" />
  126. ) : (
  127. <EdgeFunctions
  128. size={16}
  129. strokeWidth={1.5}
  130. className="text-foreground-lighter shrink-0"
  131. />
  132. )}
  133. <span>{edgeFunctionsLine}</span>
  134. </li>
  135. <li className="flex items-center gap-x-3 py-2 px-3">
  136. {isInProgress ? (
  137. <Loader2 size={16} className="animate-spin" />
  138. ) : (
  139. <Layers size={16} strokeWidth={1.5} className="text-foreground-lighter shrink-0" />
  140. )}
  141. <span>{scheduleLine}</span>
  142. </li>
  143. </ul>
  144. </CardContent>
  145. </Card>
  146. </div>
  147. )
  148. }