BillingSettings.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { cn } from 'ui'
  2. import PaymentMethods from '../../Billing/Payment/PaymentMethods/PaymentMethods'
  3. import { InvoicesSection } from '../InvoicesSettings/InvoicesSection'
  4. import BillingBreakdown from './BillingBreakdown/BillingBreakdown'
  5. import { BillingCustomerData } from './BillingCustomerData/BillingCustomerData'
  6. import BillingEmail from './BillingEmail'
  7. import CostControl from './CostControl/CostControl'
  8. import CreditBalance from './CreditBalance'
  9. import Subscription from './Subscription/Subscription'
  10. import {
  11. ScaffoldContainer,
  12. ScaffoldContainerLegacy,
  13. ScaffoldDivider,
  14. ScaffoldTitle,
  15. } from '@/components/layouts/Scaffold'
  16. import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query'
  17. import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
  18. import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
  19. import { MANAGED_BY } from '@/lib/constants/infrastructure'
  20. export const BillingSettings = () => {
  21. const {
  22. billingAccountData: isBillingAccountDataEnabledOnProfileLevel,
  23. billingPaymentMethods: isBillingPaymentMethodsEnabledOnProfileLevel,
  24. billingCredits: isBillingCreditsEnabledOnProfileLevel,
  25. billingInvoices: isBillingInvoicesEnabledOnProfileLevel,
  26. } = useIsFeatureEnabled([
  27. 'billing:account_data',
  28. 'billing:payment_methods',
  29. 'billing:credits',
  30. 'billing:invoices',
  31. ])
  32. const { data: org } = useSelectedOrganizationQuery()
  33. const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: org?.slug })
  34. const isNotOrgWithPartnerBilling = !subscription?.billing_via_partner
  35. const isStripeOrg = org?.managed_by === MANAGED_BY.STRIPE_PROJECTS
  36. const billingAccountDataEnabled =
  37. isBillingAccountDataEnabledOnProfileLevel && isNotOrgWithPartnerBilling
  38. const billingPaymentMethodsEnabled =
  39. isBillingPaymentMethodsEnabledOnProfileLevel && (isNotOrgWithPartnerBilling || isStripeOrg)
  40. return (
  41. <>
  42. <ScaffoldContainerLegacy>
  43. <ScaffoldTitle>Billing</ScaffoldTitle>
  44. </ScaffoldContainerLegacy>
  45. <ScaffoldContainer id="subscription" className={cn('[&>div]:pt-0!')}>
  46. <Subscription />
  47. </ScaffoldContainer>
  48. <ScaffoldDivider />
  49. <ScaffoldContainer id="cost-control">
  50. <CostControl />
  51. </ScaffoldContainer>
  52. <ScaffoldDivider />
  53. {org && org.plan.id !== 'free' && (
  54. <ScaffoldContainer id="breakdown">
  55. <BillingBreakdown />
  56. </ScaffoldContainer>
  57. )}
  58. {isBillingInvoicesEnabledOnProfileLevel && (
  59. <>
  60. <ScaffoldDivider />
  61. <ScaffoldContainer id="invoices">
  62. <InvoicesSection />
  63. </ScaffoldContainer>
  64. </>
  65. )}
  66. {billingPaymentMethodsEnabled && (
  67. <>
  68. <ScaffoldDivider />
  69. <ScaffoldContainer id="payment-methods">
  70. <PaymentMethods />
  71. </ScaffoldContainer>
  72. </>
  73. )}
  74. {isBillingCreditsEnabledOnProfileLevel && (
  75. <>
  76. <ScaffoldDivider />
  77. <ScaffoldContainer id="credits-balance">
  78. <CreditBalance />
  79. </ScaffoldContainer>
  80. </>
  81. )}
  82. {billingAccountDataEnabled && (
  83. <>
  84. <ScaffoldDivider />
  85. <ScaffoldContainer id="email">
  86. <BillingEmail />
  87. </ScaffoldContainer>
  88. <ScaffoldDivider />
  89. <ScaffoldContainer id="address">
  90. <BillingCustomerData />
  91. </ScaffoldContainer>
  92. </>
  93. )}
  94. </>
  95. )
  96. }