import * as React from 'react'; import { Link } from 'react-router-dom'; import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Chip from '@mui/material/Chip'; import Card from '@mui/material/Card'; import CardActions from '@mui/material/CardActions'; import CardContent from '@mui/material/CardContent'; import Divider from '@mui/material/Divider'; import Grid from '@mui/material/Grid'; import Typography from '@mui/material/Typography'; import PropTypes from 'prop-types'; import TrialOverAlert from 'components/TrialOverAlert/index.ee'; import SubscriptionCancelledAlert from 'components/SubscriptionCancelledAlert/index.ee'; import CheckoutCompletedAlert from 'components/CheckoutCompletedAlert/index.ee'; import * as URLS from 'config/urls'; import useFormatMessage from 'hooks/useFormatMessage'; import usePlanAndUsage from 'hooks/usePlanAndUsage'; import useSubscription from 'hooks/useSubscription.ee'; import useUserTrial from 'hooks/useUserTrial.ee'; import { useQueryClient } from '@tanstack/react-query'; import useCurrentUser from 'hooks/useCurrentUser'; const capitalize = (str) => str[0].toUpperCase() + str.slice(1, str.length); function BillingCard(props) { const { name, title = '', action, text } = props; return ( theme.palette.background.default, }} > {name} {title || '---'} ); } BillingCard.propTypes = { name: PropTypes.string.isRequired, title: PropTypes.string, action: PropTypes.string, text: PropTypes.string, }; function Action(props) { const { action, text } = props; if (!action) return ; if (action.startsWith('http')) { return ( ); } else if (action.startsWith('/')) { return ( ); } return ( {text} ); } Action.propTypes = { action: PropTypes.string, text: PropTypes.string, }; export default function UsageDataInformation() { const formatMessage = useFormatMessage(); const queryClient = useQueryClient(); const { data: currentUser } = useCurrentUser(); const currentUserId = currentUser?.data?.id; const { data } = usePlanAndUsage(currentUserId); const planAndUsage = data?.data; const trial = useUserTrial(); const subscriptionData = useSubscription(); const subscription = subscriptionData?.data; let billingInfo; React.useEffect(() => { queryClient.invalidateQueries({ queryKey: ['users', currentUserId, 'planAndUsage'], }); }, [subscription, queryClient, currentUserId]); if (trial.hasTrial) { billingInfo = { monthlyQuota: { title: formatMessage('usageDataInformation.freeTrial'), action: URLS.SETTINGS_PLAN_UPGRADE, text: 'Upgrade plan', }, nextBillAmount: { title: null, action: null, text: null, }, nextBillDate: { title: null, action: null, text: null, }, }; } else { billingInfo = { monthlyQuota: { title: planAndUsage?.plan?.limit, action: subscription?.cancelUrl, text: formatMessage('usageDataInformation.cancelPlan'), }, nextBillAmount: { title: subscription?.nextBillAmount ? `€${subscription?.nextBillAmount}` : null, action: subscription?.updateUrl, text: formatMessage('usageDataInformation.updatePaymentMethod'), }, nextBillDate: { title: subscription?.nextBillDate, action: formatMessage('usageDataInformation.monthlyPayment'), text: formatMessage('usageDataInformation.monthlyPayment'), }, }; } return ( {formatMessage('usageDataInformation.subscriptionPlan')} {subscription?.status && ( )} {formatMessage('usageDataInformation.yourUsage')} {formatMessage('usageDataInformation.yourUsageDescription')} {formatMessage('usageDataInformation.yourUsageTasks')} {planAndUsage?.usage.task} {/* free plan has `null` status so that we can show the upgrade button */} {subscription?.status === undefined && ( )} ); }