import React, { useMemo } from 'react'; import { ModalBody, ModalFooter, Table, Thead, Tbody, Tr, Th, Td, TableContainer, ModalCloseButton, HStack, Box, Flex } from '@chakra-ui/react'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useQuery } from '@tanstack/react-query'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { getTeamPlans } from '@/web/support/user/team/api'; import { subTypeMap, standardSubLevelMap, SubTypeEnum } from '@fastgpt/global/support/wallet/sub/constants'; import { TeamSubSchema } from '@fastgpt/global/support/wallet/sub/type'; import { formatTime2YMDHM } from '@fastgpt/global/common/string/time'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; type packageStatus = 'active' | 'inactive' | 'expired'; const StandDetailModal = ({ onClose }: { onClose: () => void }) => { const { t } = useTranslation(); const { Loading } = useLoading(); const { subPlans } = useSystemStore(); const { data: teamPlans = [], loading: isLoading } = useRequest2( () => getTeamPlans().then((res) => { return [ ...res.filter((plan) => plan.type === SubTypeEnum.standard), ...res.filter((plan) => plan.type === SubTypeEnum.extraDatasetSize), ...res.filter((plan) => plan.type === SubTypeEnum.extraPoints) ].map((item, index) => { return { ...item, status: new Date(item.expiredTime).getTime() < new Date().getTime() ? 'expired' : item.type === SubTypeEnum.standard ? index === 0 ? 'active' : 'inactive' : 'active' }; }); }), { manual: false } ); return ( {teamPlans.map( ({ _id, type, currentSubLevel, currentExtraDatasetSize, surplusPoints = 0, totalPoints = 0, startTime, expiredTime, status }) => { const standardPlan = currentSubLevel ? subPlans?.standard?.[currentSubLevel] : undefined; const datasetSize = standardPlan?.maxDatasetSize || currentExtraDatasetSize; const now = new Date(); return ( ); } )}
{t('common:support.standard.type')} {t('common:support.standard.storage')} {t('common:support.standard.AI Bonus Points')} {t('user:bill.valid_time')} {t('common:support.standard.due_date')}
{t(subTypeMap[type]?.label as any)} {currentSubLevel && `(${t(standardSubLevelMap[currentSubLevel]?.label as any)})`} {datasetSize ? `${datasetSize + t('common:core.dataset.data.group')}` : '-'} {totalPoints ? `${Math.round(totalPoints - surplusPoints)} / ${totalPoints} ${t('common:support.wallet.subscription.point')}` : '-'} {formatTime2YMDHM(startTime)} {formatTime2YMDHM(expiredTime)}
{t('user:bill.standard_valid_tip')}
); }; function StatusTag({ status }: { status: packageStatus }) { const { t } = useTranslation(); const statusText = useMemo(() => { return { inactive: t('common:support.wallet.subscription.status.inactive'), active: t('common:support.wallet.subscription.status.active'), expired: t('common:support.wallet.subscription.status.expired') }; }, [t]); const styleMap = useMemo(() => { return { inactive: { color: 'adora.600', bg: 'adora.50' }, active: { color: 'green.600', bg: 'green.50' }, expired: { color: 'myGray.700', bg: 'myGray.100' } }; }, []); return ( {statusText[status]} ); } export default StandDetailModal;