'use client' import type { Subject } from '@/models/access-control' import type { App } from '@/types/app' import { Description as DialogDescription, DialogTitle } from '@headlessui/react' import { RiBuildingLine, RiGlobalLine, RiVerifiedBadgeLine } from '@remixicon/react' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { toast } from '@/app/components/base/ui/toast' import { useGlobalPublicStore } from '@/context/global-public-context' import { AccessMode, SubjectType } from '@/models/access-control' import { useUpdateAccessMode } from '@/service/access-control' import useAccessControlStore from '../../../../context/access-control-store' import Button from '../../base/button' import AccessControlDialog from './access-control-dialog' import AccessControlItem from './access-control-item' import SpecificGroupsOrMembers, { WebAppSSONotEnabledTip } from './specific-groups-or-members' type AccessControlProps = { app: App onClose: () => void onConfirm?: () => void } export default function AccessControl(props: AccessControlProps) { const { app, onClose, onConfirm } = props const { t } = useTranslation() const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) const setAppId = useAccessControlStore(s => s.setAppId) const specificGroups = useAccessControlStore(s => s.specificGroups) const specificMembers = useAccessControlStore(s => s.specificMembers) const currentMenu = useAccessControlStore(s => s.currentMenu) const setCurrentMenu = useAccessControlStore(s => s.setCurrentMenu) const hideTip = systemFeatures.webapp_auth.enabled && (systemFeatures.webapp_auth.allow_sso || systemFeatures.webapp_auth.allow_email_password_login || systemFeatures.webapp_auth.allow_email_code_login) useEffect(() => { setAppId(app.id) setCurrentMenu(app.access_mode ?? AccessMode.SPECIFIC_GROUPS_MEMBERS) }, [app, setAppId, setCurrentMenu]) const { isPending, mutateAsync: updateAccessMode } = useUpdateAccessMode() const handleConfirm = useCallback(async () => { const submitData: { appId: string accessMode: AccessMode subjects?: Pick[] } = { appId: app.id, accessMode: currentMenu } if (currentMenu === AccessMode.SPECIFIC_GROUPS_MEMBERS) { const subjects: Pick[] = [] specificGroups.forEach((group) => { subjects.push({ subjectId: group.id, subjectType: SubjectType.GROUP }) }) specificMembers.forEach((member) => { subjects.push({ subjectId: member.id, subjectType: SubjectType.ACCOUNT, }) }) submitData.subjects = subjects } await updateAccessMode(submitData) toast.success(t('accessControlDialog.updateSuccess', { ns: 'app' })) onConfirm?.() }, [updateAccessMode, app, specificGroups, specificMembers, t, onConfirm, currentMenu]) return (
{t('accessControlDialog.title', { ns: 'app' })} {t('accessControlDialog.description', { ns: 'app' })}

{t('accessControlDialog.accessLabel', { ns: 'app' })}

{t('accessControlDialog.accessItems.organization', { ns: 'app' })}

{t('accessControlDialog.accessItems.external', { ns: 'app' })}

{!hideTip && }

{t('accessControlDialog.accessItems.anyone', { ns: 'app' })}

) }