import React, { useMemo, useState } from 'react'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { Box, Button, Flex, Grid, HStack } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { StandardSubLevelEnum, SubModeEnum } from '@fastgpt/global/support/wallet/sub/constants'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { standardSubLevelMap } from '@fastgpt/global/support/wallet/sub/constants'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { TeamSubSchema } from '@fastgpt/global/support/wallet/sub/type'; import QRCodePayModal, { type QRPayProps } from '@/components/support/wallet/QRCodePayModal'; import { getWxPayQRCode } from '@/web/support/wallet/bill/api'; import { BillTypeEnum } from '@fastgpt/global/support/wallet/bill/constants'; import StandardPlanContentList from '@/components/support/wallet/StandardPlanContentList'; export enum PackageChangeStatusEnum { buy = 'buy', renewal = 'renewal', upgrade = 'upgrade' } const Standard = ({ standardPlan: myStandardPlan, onPaySuccess }: { standardPlan?: TeamSubSchema; onPaySuccess?: () => void; }) => { const { t } = useTranslation(); const packagePayTextMap = { [PackageChangeStatusEnum.buy]: t('common:pay.package_tip.buy'), [PackageChangeStatusEnum.renewal]: t('common:pay.package_tip.renewal'), [PackageChangeStatusEnum.upgrade]: t('common:pay.package_tip.upgrade') }; const [packageChange, setPackageChange] = useState(); const { subPlans, feConfigs } = useSystemStore(); const [selectSubMode, setSelectSubMode] = useState<`${SubModeEnum}`>(SubModeEnum.month); const standardSubList = useMemo(() => { return subPlans?.standard ? Object.entries(subPlans.standard).map(([level, value]) => { return { price: value.price * (selectSubMode === SubModeEnum.month ? 1 : 10), level: level as `${StandardSubLevelEnum}`, ...standardSubLevelMap[level as `${StandardSubLevelEnum}`], label: value.name || standardSubLevelMap[level as `${StandardSubLevelEnum}`].label, // custom label maxTeamMember: value.maxTeamMember, maxAppAmount: value.maxAppAmount, maxDatasetAmount: value.maxDatasetAmount, chatHistoryStoreDuration: value.chatHistoryStoreDuration, maxDatasetSize: value.maxDatasetSize, permissionCustomApiKey: value.permissionCustomApiKey, permissionCustomCopyright: value.permissionCustomCopyright, trainingWeight: value.trainingWeight, permissionReRank: value.permissionReRank, totalPoints: value.totalPoints * (selectSubMode === SubModeEnum.month ? 1 : 12), permissionWebsiteSync: value.permissionWebsiteSync }; }) : []; }, [subPlans?.standard, selectSubMode]); // Pay code const [qrPayData, setQRPayData] = useState(); /* Get pay code */ const { runAsync: onPay, loading: isLoading } = useRequest2(getWxPayQRCode, { onSuccess(res) { setQRPayData({ readPrice: res.readPrice, codeUrl: res.codeUrl, billId: res.billId }); } }); return ( <> {t('common:support.wallet.subscription.mode.Year')} ({t('common:support.wallet.subscription.mode.Year sale')}) ), value: SubModeEnum.year } ]} value={selectSubMode} onChange={(e) => setSelectSubMode(e as `${SubModeEnum}`)} /> {/* card */} {standardSubList.map((item) => { const isCurrentPlan = item.level === myStandardPlan?.currentSubLevel; const isHigherLevel = standardSubLevelMap[item.level].weight > standardSubLevelMap[myStandardPlan?.currentSubLevel || StandardSubLevelEnum.free] .weight; return ( {isCurrentPlan && ( {t('common:is_using')} )} {t(item.label as any)} ¥{item.price} {t(item.desc as any, { title: feConfigs?.systemTitle })} {/* Button */} {(() => { if (item.level === StandardSubLevelEnum.free) { return ( ); } // feature: // if ( // item.level === myStandardPlan?.nextSubLevel && // selectSubMode === myStandardPlan?.nextMode // ) { // return ( // // ); // } if (isCurrentPlan) { return ( ); } if (isHigherLevel) { return ( ); } return ( ); })()} {/* function list */} ); })} {!!qrPayData && packageChange && ( )} ); }; export default React.memo(Standard); const RowTabs = ({ list, value, onChange }: { list: { icon?: string; label: string | React.ReactNode; value: string; }[]; value: string; onChange: (e: string) => void; }) => { return ( {list.map((item) => ( onChange(item.value) })} > {item.icon && } {item.label} ))} ); };