import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react' import { RiArrowDownCircleLine, RiArrowRightSLine, RiVerifiedBadgeLine } from '@remixicon/react' import type { FC, MouseEvent } from 'react' import { Fragment, useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useMutation } from '@tanstack/react-query' import PremiumBadge from '../../base/premium-badge' import SparklesSoft from '../../base/icons/src/public/common/SparklesSoft' import Button from '../../base/button' import Soc2 from '../../base/icons/src/public/common/Soc2' import Iso from '../../base/icons/src/public/common/Iso' import Gdpr from '../../base/icons/src/public/common/Gdpr' import Toast from '../../base/toast' import Tooltip from '../../base/tooltip' import cn from '@/utils/classnames' import { useProviderContext } from '@/context/provider-context' import { Plan } from '@/app/components/billing/type' import { useModalContext } from '@/context/modal-context' import { getDocDownloadUrl } from '@/service/common' enum DocName { SOC2_Type_I = 'SOC2_Type_I', SOC2_Type_II = 'SOC2_Type_II', ISO_27001 = 'ISO_27001', GDPR = 'GDPR', } type UpgradeOrDownloadProps = { doc_name: DocName } const UpgradeOrDownload: FC = ({ doc_name }) => { const { t } = useTranslation() const { plan } = useProviderContext() const { setShowPricingModal, setShowAccountSettingModal } = useModalContext() const isFreePlan = plan.type === Plan.sandbox const handlePlanClick = useCallback(() => { if (isFreePlan) setShowPricingModal() else setShowAccountSettingModal({ payload: 'billing' }) }, [isFreePlan, setShowAccountSettingModal, setShowPricingModal]) const { isPending, mutate: downloadCompliance } = useMutation({ mutationKey: ['downloadCompliance', doc_name], mutationFn: async () => { try { const ret = await getDocDownloadUrl(doc_name) const a = document.createElement('a') a.href = ret.url a.click() Toast.notify({ type: 'success', message: t('common.operation.downloadSuccess'), }) } catch (error) { console.error(error) Toast.notify({ type: 'error', message: t('common.operation.downloadFailed'), }) } }, }) const whichPlanCanDownloadCompliance = { [DocName.SOC2_Type_I]: [Plan.professional, Plan.team], [DocName.SOC2_Type_II]: [Plan.team], [DocName.ISO_27001]: [Plan.team], [DocName.GDPR]: [Plan.team, Plan.professional, Plan.sandbox], } const isCurrentPlanCanDownload = whichPlanCanDownloadCompliance[doc_name].includes(plan.type) const handleDownloadClick = useCallback((e: MouseEvent) => { e.preventDefault() downloadCompliance() }, [downloadCompliance]) if (isCurrentPlanCanDownload) { return } const upgradeTooltip: Record = { [Plan.sandbox]: t('common.compliance.sandboxUpgradeTooltip'), [Plan.professional]: t('common.compliance.professionalUpgradeTooltip'), [Plan.team]: '', [Plan.enterprise]: '', } return
{t('billing.upgradeBtn.encourageShort')}
} export default function Compliance() { const itemClassName = ` flex items-center w-full h-10 pl-1 pr-2 py-1 text-text-secondary system-md-regular rounded-lg hover:bg-state-base-hover gap-1 ` const { t } = useTranslation() return { ({ open }) => ( <>
{t('common.userProfile.compliance')}
{t('common.compliance.soc2Type1')}
{t('common.compliance.soc2Type2')}
{t('common.compliance.iso27001')}
{t('common.compliance.gdpr')}
) }
}