import React, { useCallback, useEffect, useState } from "react"; import { SellOutlined } from "@mui/icons-material"; import CopyAllOutlinedIcon from "@mui/icons-material/CopyAllOutlined"; import { Button, Chip, Collapse, Stack } from "@mui/material"; import { DateTime } from "luxon"; import { useSnackbar } from "notistack"; import CardActions from "../../../components/Card/CardActions"; import CardCloseButton from "../../../components/Card/CardCloseButton"; import CardContent from "../../../components/Card/CardContent"; import CardFieldDate from "../../../components/Card/CardFieldDate"; import CardFieldText from "../../../components/Card/CardFieldText"; import CardRow from "../../../components/Card/CardRow"; import { useApi } from "../../../contexts/ApiContext"; import { useCardContext } from "../../../contexts/CardContext"; import { useDialog } from "../../../contexts/DialogContext"; import { useI18n } from "../../../contexts/I18nContext"; import { useUser } from "../../../contexts/UserContext"; import { PageProps } from "../../../types"; import { hasPermission } from "../../../util/has_permission"; import { toTitleCase } from "../../../util/to_title_case"; import { currencyFormat } from "../../pos/utils/amountToCurrencyString"; import { Subscription, SubscriptionPeriod, SubscriptionPeriodResponse, } from "../types/subscription"; import EndSubscriptionButton from "./EndSubscriptionButton"; import ResumeSubscriptionButton from "./ResumeSubscriptionButton"; import StartSubscriptionButton from "./StartSubscriptionButton"; import SubscriptionsDialog from "./SubscriptionsDialog"; import SubscriptionsList from "./SubscriptionsList"; export interface SubscriptionsCardContentProps { subscription: Subscription; membership_number?: number; refresh: PageProps["refresh"]; } const SubscriptionsCardContent: React.FC = ({ subscription, membership_number, refresh, }) => { const [cancelDialogOpen, setCancelDialogOpen] = useState(false); const [periods, setPeriods] = useState(null); const openDialog = useDialog(); const api = useApi(); const { user } = useUser(); const { isOpen } = useCardContext(); const { t } = useI18n(); const { enqueueSnackbar } = useSnackbar(); const handleRefresh = async () => { refresh(); await fetchPeriods(); }; const fetchPeriods = async () => { const response = await api.operations["subscription.period:list"].call({ params: { subscription_id: subscription.id, }, }); const data: SubscriptionPeriodResponse = await response.json(); // TODO Coerce dates if (periods == null) setPeriods(data.results); }; const subscribeAgain = useCallback(async () => { if ( await openDialog( t("Subscribe"), `Are you sure you want to subscribe this member to "${subscription.name}" again?`, { ok: t("Yes, subscribe"), cancel: t("Cancel"), }, ) ) { const action = api.operations["subscription.contrib:member-subscription-create"]; if (!action) { throw new Error('Invalid action "subscription.contrib:member-subscription-create".'); } const response = await action.call({ params: { membership_number }, body: { reference: subscription.plan }, }); if (response.status == 201) { refresh(); enqueueSnackbar(t("New subscription created"), { variant: "success" }); } else if (response.status == 200) { enqueueSnackbar(t("Member already subscribed"), { variant: "info" }); } else { console.error("[SUBSCRIBE_AGAIN]", response); enqueueSnackbar(t("Failed to subscribe"), { variant: "error" }); } } }, [api, subscription]); useEffect(() => { if (periods != null) return; fetchPeriods(); }, [subscription, fetchPeriods, periods]); return ( <> {subscription.start_date != null && ( )} {subscription.is_cancelled && ( )} {subscription.end_date && ( )} {!subscription.is_cancelled && subscription.state === "RUNNING" && ( )} {subscription.voucher_codes.length > 0 && ( {subscription.voucher_codes.map((voucher) => ( } label={voucher} size="small" sx={{ pl: 0.5 }} /> ))} )} {subscription.state === "PENDING" && ( )} {subscription.state === "RUNNING" && subscription.is_cancelled === false && ( )} {subscription.state === "RUNNING" && subscription.is_cancelled === true && ( )} {subscription.state === "ENDED" && hasPermission(user, "subscription.add_subscription") && ( )} ); }; export default SubscriptionsCardContent;