import type { ReactNode } from 'react'
import { Button } from '@langgenius/dify-ui/button'
import {
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
} from '@langgenius/dify-ui/dropdown-menu'
import { toast } from '@langgenius/dify-ui/toast'
import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip'
import { useMutation } from '@tanstack/react-query'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { Plan } from '@/app/components/billing/type'
import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants'
import { useModalContext } from '@/context/modal-context'
import { useProviderContext } from '@/context/provider-context'
import { getDocDownloadUrl } from '@/service/common'
import { downloadUrl } from '@/utils/download'
import Gdpr from '../../base/icons/src/public/common/Gdpr'
import Iso from '../../base/icons/src/public/common/Iso'
import Soc2 from '../../base/icons/src/public/common/Soc2'
import SparklesSoft from '../../base/icons/src/public/common/SparklesSoft'
import PremiumBadge from '../../base/premium-badge'
import { MenuItemContent } from './menu-item-content'
const DocName = {
SOC2_Type_I: 'SOC2_Type_I',
SOC2_Type_II: 'SOC2_Type_II',
ISO_27001: 'ISO_27001',
GDPR: 'GDPR',
} as const
type DocName = (typeof DocName)[keyof typeof DocName]
type ComplianceDocActionVisualProps = {
isCurrentPlanCanDownload: boolean
isPending: boolean
tooltipText: string
downloadText: string
upgradeText: string
}
function ComplianceDocActionVisual({
isCurrentPlanCanDownload,
isPending,
tooltipText,
downloadText,
upgradeText,
}: ComplianceDocActionVisualProps) {
if (isCurrentPlanCanDownload) {
return (
)
}
const canShowUpgradeTooltip = tooltipText.length > 0
return (
{upgradeText}
}
/>
{canShowUpgradeTooltip && {tooltipText}}
)
}
type ComplianceDocRowItemProps = {
icon: ReactNode
label: ReactNode
docName: DocName
}
function ComplianceDocRowItem({ icon, label, docName }: ComplianceDocRowItemProps) {
const { t } = useTranslation()
const { plan } = useProviderContext()
const { setShowPricingModal, setShowAccountSettingModal } = useModalContext()
const isFreePlan = plan.type === Plan.sandbox
const { isPending, mutate: downloadCompliance } = useMutation({
mutationKey: ['downloadCompliance', docName],
mutationFn: async () => {
try {
const ret = await getDocDownloadUrl(docName)
downloadUrl({ url: ret.url })
toast.success(t(($) => $['operation.downloadSuccess'], { ns: 'common' }))
} catch (error) {
console.error(error)
toast.error(t(($) => $['operation.downloadFailed'], { ns: 'common' }))
}
},
})
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[docName].includes(plan.type)
const handleSelect = useCallback(() => {
if (isCurrentPlanCanDownload) {
if (!isPending) downloadCompliance()
return
}
if (isFreePlan) setShowPricingModal()
else setShowAccountSettingModal({ payload: ACCOUNT_SETTING_TAB.BILLING })
}, [
downloadCompliance,
isCurrentPlanCanDownload,
isFreePlan,
isPending,
setShowAccountSettingModal,
setShowPricingModal,
])
const upgradeTooltip: Record = {
[Plan.sandbox]: t(($) => $['compliance.sandboxUpgradeTooltip'], { ns: 'common' }),
[Plan.professional]: t(($) => $['compliance.professionalUpgradeTooltip'], { ns: 'common' }),
[Plan.team]: '',
[Plan.enterprise]: '',
}
const labelTitle = typeof label === 'string' ? label : undefined
return (
{icon}
{label}
$['operation.download'], { ns: 'common' })}
upgradeText={t(($) => $['upgradeBtn.encourageShort'], { ns: 'billing' })}
/>
)
}
// Submenu-only: this component must be rendered within an existing DropdownMenu root.
export default function Compliance() {
const { t } = useTranslation()
return (
$['userProfile.compliance'], { ns: 'common' })}
/>
}
label={t(($) => $['compliance.soc2Type1'], { ns: 'common' })}
docName={DocName.SOC2_Type_I}
/>
}
label={t(($) => $['compliance.soc2Type2'], { ns: 'common' })}
docName={DocName.SOC2_Type_II}
/>
}
label={t(($) => $['compliance.iso27001'], { ns: 'common' })}
docName={DocName.ISO_27001}
/>
}
label={t(($) => $['compliance.gdpr'], { ns: 'common' })}
docName={DocName.GDPR}
/>
)
}