import { ChangeEvent, FC, useState } from "react"; import toast from "react-hot-toast"; import { useTranslation } from "react-i18next"; import Tippy from "@tippyjs/react"; import dayjs from "dayjs"; import * as linkify from "linkifyjs"; import { getLicensePriceList } from "@/app/config"; import { useGetLicensePaymentUrlMutation } from "@/app/services/server"; import { PriceSubscriptionDuration, PriceType } from "@/types/common"; import Modal from "@/components/Modal"; import Button from "@/components/styled/Button"; import Input from "@/components/styled/Input"; import StyledModal from "@/components/styled/Modal"; import StyledRadio from "@/components/styled/Radio"; // import { LicenseMetadata, RenewLicense } from "@/types/server"; interface Props { closeModal: () => void; // domain: string; } const getExpireDay = (sub_dur: PriceSubscriptionDuration) => { const currDate = dayjs(); // 默认10年 let res = currDate; switch (sub_dur) { case "year": res = currDate.add(100, "year"); break; case "month": res = currDate.add(1, "month"); break; case "quarter": res = currDate.add(3, "month"); break; default: break; } return res.format("YYYY-MM-DD"); }; const LicensePriceList = getLicensePriceList(); const LicensePriceListModal: FC = ({ closeModal }) => { const { t } = useTranslation("setting"); const { t: ct } = useTranslation(); const [getUrl, { isLoading, isSuccess }] = useGetLicensePaymentUrlMutation(); const [host, setHost] = useState(location.hostname); const [popUpVisible, setPopUpVisible] = useState(false); const [selectPrice, setSelectPrice] = useState( `${LicensePriceList[0].pid}|${LicensePriceList[0].limit}|${LicensePriceList[0].type}|${ LicensePriceList[0].sub_dur || "" }` ); const handleRenew = async () => { const hostPrefixed = `https://${host}`; if (!linkify.test(hostPrefixed)) { toast.error("Invalid Host"); return; } if (new URL(hostPrefixed).port !== "" || host.endsWith(":443")) { toast.error(t("license.tip_port")); return; } const [priceId, user_limit, type, sub_dur = "month"] = selectPrice.split("|") as [ string, string, PriceType, PriceSubscriptionDuration ]; const metadata = { user_limit: Number(user_limit), expire: type == "subscription" ? getExpireDay(sub_dur) : getExpireDay("year"), // 本地,则*通配符 domain: host.startsWith("localhost") ? "*" : host, }; console.log(metadata); // return; const resp = await getUrl({ type, priceId, metadata, cancel_url: location.href, success_url: `${location.origin}/#/cb/payment_success`, }); if ("error" in resp) { toast.error("Payment link initialized failed!"); return; } console.log("aaaa", resp.data); // todo location.href = resp.data.session_url; }; const handlePriceSelect = (price: string) => { console.log(price); setSelectPrice(price); }; const handleUpdateHost = (evt: ChangeEvent) => { setHost(evt.target.value); }; const togglePopUpVisible = () => { setPopUpVisible((prev) => !prev); }; const handleTalk = () => { window.open("https://buy.stripe.com/bJeaEX9ex2PUer2aLe6c00O", "_blank"); }; const isBooking = selectPrice.includes("booking"); return ( {t("vocespace.prerequisite.4")} } // className="!min-w-[480px]" title={t("license.renew")} description={t("license.renew_select")} buttons={ <> {isBooking ? ( ) : (
{t("license.tip_domain")}
{" "} {t("license.tip_port")}
} >
)} } > `${title} ${desc ? `[${desc}]` : ""}${price ? `[${price}]` : ""}` )} values={LicensePriceList.map( ({ pid, limit, type = "payment", sub_dur = "month" }) => `${pid}|${limit}|${type}|${sub_dur}` )} value={selectPrice} onChange={(v) => { handlePriceSelect(v); }} />
); }; export default LicensePriceListModal;