super-fit-web-app / src / components / dashboard / billing-management.tsx
billing-management.tsx
Raw
import React, { useEffect } from 'react'
import { trpc } from '@/utils/trpc'
import { toast } from 'react-toastify'
import { useRouter } from 'next/router'
import { Button, Box, Typography } from '@mui/material'
import PlanContainer from '../plans/PlanContainer'
import { useUserContext } from '@/context/UserContext'

const BillingManagement = () => {
  const router = useRouter();
  const { userData, session_valid, userSessionDataLoading } = useUserContext()
  const { data: portalSessionData, mutateAsync: getPortalSession,  } = trpc.stripe.portal.useMutation();
  const { data: checkoutSessionData, mutateAsync: getCheckoutSession, isLoading: checkoutSessionIsLoading } = trpc.stripe.checkoutSession.useMutation()
  const { data: customerSubscriptions } = trpc.stripe.getSubscriptionData.useQuery({stripeCustomerId: userData?.stripeCustomerId!, session_valid})

  const goToCheckout = async () => {
    await getCheckoutSession()
    .then((checkoutSessionData) => {
      router.push(checkoutSessionData)
    }).catch((error) => {
      toast.error(error.message)
    })
  }

  const loadPortal = async () => {
    const session = await getPortalSession()
    router.push(session.url);
  }

  return (
    <Box
      sx={{
        maxWidth: '500px',
      }}
    >
      <Typography variant='h3'>Billing</Typography>
      <Typography variant='subtitle1'>Manage billing and update subscription plan.</Typography>
      {!userSessionDataLoading && userData.isSubscribed ? (
        <>
          <Button
            variant='contained'
            onClick={() => loadPortal()}
          >
            Manage Subscription
          </Button>
        </>
      ) : (
        <>
          <Button
            variant='contained'
            onClick={() =>{
              if (checkoutSessionIsLoading) return;
              else goToCheckout()
            }}
          >
            {checkoutSessionIsLoading ? 'Loading...' : 'Get Checkout Session'}
          </Button>
        </>
      )}
    </Box>
  )
}

export default BillingManagement