StatusDisplay.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { AlertCircle, Check, RefreshCwIcon } from 'lucide-react'
  2. import { SchemaInstallationStatus } from 'stripe-experiment-sync/supabase'
  3. import {
  4. hasInstallError,
  5. hasUninstallError,
  6. isInstalled,
  7. isInstalling,
  8. isUninstalling,
  9. } from './stripe-sync-status'
  10. export const StatusDisplay = ({
  11. status,
  12. isInstallRequested,
  13. isInstallInitiated,
  14. isUninstallRequested,
  15. isUninstallInitiated,
  16. isUpgrade,
  17. timedOut,
  18. }: {
  19. status: SchemaInstallationStatus
  20. isInstallRequested: boolean
  21. isInstallInitiated: boolean
  22. isUninstallRequested: boolean
  23. isUninstallInitiated: boolean
  24. isUpgrade?: boolean
  25. timedOut: boolean
  26. }) => {
  27. const installed = isInstalled(status)
  28. const installError = hasInstallError(status)
  29. const uninstallError = hasUninstallError(status)
  30. const installInProgress = isInstalling(status)
  31. const uninstallInProgress = isUninstalling(status)
  32. const installing = (installInProgress || isInstallRequested || isInstallInitiated) && !timedOut
  33. const uninstalling =
  34. (uninstallInProgress || isUninstallRequested || isUninstallInitiated) && !timedOut
  35. if (uninstalling) {
  36. return (
  37. <span className="flex items-center gap-2 text-foreground-light text-sm">
  38. <RefreshCwIcon size={14} className="animate-spin text-foreground-lighter" />
  39. Uninstalling...
  40. </span>
  41. )
  42. }
  43. if (uninstallError) {
  44. return (
  45. <span className="flex items-center gap-2 text-foreground-light text-sm">
  46. <AlertCircle size={14} className="text-destructive" />
  47. Uninstallation error
  48. </span>
  49. )
  50. }
  51. if (installing) {
  52. return (
  53. <span className="flex items-center gap-2 text-foreground-light text-sm">
  54. <RefreshCwIcon size={14} className="animate-spin text-foreground-lighter" />
  55. {isUpgrade ? 'Upgrading...' : 'Installing...'}
  56. </span>
  57. )
  58. }
  59. if (installError) {
  60. return (
  61. <span className="flex items-center gap-2 text-foreground-light text-sm">
  62. <AlertCircle size={14} className="text-destructive" />
  63. {isUpgrade ? 'Upgrade error' : 'Installation error'}
  64. </span>
  65. )
  66. }
  67. if (installed) {
  68. return (
  69. <span className="flex items-center gap-2 text-foreground-light text-sm">
  70. <Check size={14} strokeWidth={1.5} className="text-brand" /> Installed
  71. </span>
  72. )
  73. }
  74. return (
  75. <span className="flex items-center gap-2 text-foreground-light text-sm">Not installed</span>
  76. )
  77. }