diff --git a/clients/apps/web/src/components/Checkout/CheckoutBenefits.tsx b/clients/apps/web/src/components/Checkout/CheckoutBenefits.tsx index 5d85136b0b..d342186626 100644 --- a/clients/apps/web/src/components/Checkout/CheckoutBenefits.tsx +++ b/clients/apps/web/src/components/Checkout/CheckoutBenefits.tsx @@ -1,8 +1,11 @@ import { useCustomerBenefitGrants } from '@/hooks/queries/customerPortal' +import { useCustomerSSE } from '@/hooks/sse' import { buildAPI } from '@/utils/api' import { CheckoutPublic } from '@polar-sh/sdk' import { List, ListItem } from 'polarkit/components/ui/atoms/list' +import { useEffect } from 'react' import { BenefitGrant } from '../Benefit/BenefitGrant' +import { SpinnerNoMargin } from '../Shared/Spinner' interface CheckoutBenefitsProps { checkout: CheckoutPublic @@ -14,23 +17,37 @@ const CheckoutBenefits = ({ customerSessionToken, }: CheckoutBenefitsProps) => { const api = buildAPI({ token: customerSessionToken }) - const { data: benefitGrants } = useCustomerBenefitGrants(api, { + const { data: benefitGrants, refetch } = useCustomerBenefitGrants(api, { checkoutId: checkout.id, }) + const expectedBenefits = checkout.product.benefits.length + + const customerEvents = useCustomerSSE(customerSessionToken) + useEffect(() => { + customerEvents.on('benefit.granted', refetch) + return () => { + customerEvents.off('benefit.granted', refetch) + } + }, [customerEvents, refetch]) return ( <>
{benefitGrants?.items.map((benefitGrant) => ( - setSelectedBenefit(benefit)} - > + ))} + {!benefitGrants || + (benefitGrants.items.length < expectedBenefits && ( + + +

+ Granting benefits... +

+
+ ))}