import * as React from 'react'; import Dialog from '@mui/material/Dialog'; import DialogContent from '@mui/material/DialogContent'; import DialogTitle from '@mui/material/DialogTitle'; import {Alert, CardActionArea, CardContent, useMediaQuery} from "@mui/material"; import theme from "./theme"; import DialogFooter from "./DialogFooter"; import Button from "@mui/material/Button"; import accountApi, {TopicReservedError, UnauthorizedError} from "../app/AccountApi"; import session from "../app/Session"; import routes from "./routes"; import {useContext, useEffect, useState} from "react"; import Card from "@mui/material/Card"; import Typography from "@mui/material/Typography"; import {AccountContext} from "./App"; import {formatShortDate} from "../app/utils"; import {useTranslation} from "react-i18next"; import subscriptionManager from "../app/SubscriptionManager"; const UpgradeDialog = (props) => { const { t } = useTranslation(); const { account } = useContext(AccountContext); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const [tiers, setTiers] = useState(null); const [newTier, setNewTier] = useState(account?.tier?.code || null); const [errorText, setErrorText] = useState(""); useEffect(() => { (async () => { setTiers(await accountApi.billingTiers()); })(); }, []); if (!account || !tiers) { return <>; } const currentTier = account.tier?.code || null; let action, submitButtonLabel, submitButtonEnabled; if (currentTier === newTier) { submitButtonLabel = "Update subscription"; submitButtonEnabled = false; action = null; } else if (currentTier === null) { submitButtonLabel = "Pay $5 now and subscribe"; submitButtonEnabled = true; action = Action.CREATE; } else if (newTier === null) { submitButtonLabel = "Cancel subscription"; submitButtonEnabled = true; action = Action.CANCEL; } else { submitButtonLabel = "Update subscription"; submitButtonEnabled = true; action = Action.UPDATE; } const handleSubmit = async () => { try { if (action === Action.CREATE) { const response = await accountApi.createBillingSubscription(newTier); window.location.href = response.redirect_url; } else if (action === Action.UPDATE) { await accountApi.updateBillingSubscription(newTier); } else if (action === Action.CANCEL) { await accountApi.deleteBillingSubscription(); } props.onCancel(); } catch (e) { console.log(`[UpgradeDialog] Error changing billing subscription`, e); if ((e instanceof UnauthorizedError)) { session.resetAndRedirect(routes.login); } // FIXME show error } } return ( {t("account_upgrade_dialog_title")}
setNewTier(null)} /> {tiers.map(tier => setNewTier(tier.code)} /> )}
{action === Action.CANCEL && {t("account_upgrade_dialog_cancel_warning", { date: formatShortDate(account.billing.paid_until) })} } {action === Action.UPDATE && {t("account_upgrade_dialog_proration_info")} }
); }; const TierCard = (props) => { const cardStyle = (props.selected) ? { background: "#eee", border: "2px solid #338574" } : {}; return ( {props.selected &&
Selected
} {props.name} {props.features && {props.features} } {props.price && {props.price} / month }
); } const Action = { CREATE: 1, UPDATE: 2, CANCEL: 3 }; export default UpgradeDialog;