'use client' import type { Member } from '@/models/common' import { CheckIcon, ChevronDownIcon } from '@heroicons/react/24/outline' import { memo, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import { ToastContext } from '@/app/components/base/toast' import { useProviderContext } from '@/context/provider-context' import { deleteMemberOrCancelInvitation, updateMemberRole } from '@/service/common' import { cn } from '@/utils/classnames' type IOperationProps = { member: Member operatorRole: string onOperate: () => void } const Operation = ({ member, operatorRole, onOperate, }: IOperationProps) => { const [open, setOpen] = useState(false) const { t } = useTranslation() const { datasetOperatorEnabled } = useProviderContext() const RoleMap = { owner: t('common.members.owner'), admin: t('common.members.admin'), editor: t('common.members.editor'), normal: t('common.members.normal'), dataset_operator: t('common.members.datasetOperator'), } const roleList = useMemo(() => { if (operatorRole === 'owner') { return [ 'admin', 'editor', 'normal', ...(datasetOperatorEnabled ? ['dataset_operator'] : []), ] } if (operatorRole === 'admin') { return [ 'editor', 'normal', ...(datasetOperatorEnabled ? ['dataset_operator'] : []), ] } return [] }, [operatorRole, datasetOperatorEnabled]) const { notify } = useContext(ToastContext) const toHump = (name: string) => name.replace(/_(\w)/g, (all, letter) => letter.toUpperCase()) const handleDeleteMemberOrCancelInvitation = async () => { setOpen(false) try { await deleteMemberOrCancelInvitation({ url: `/workspaces/current/members/${member.id}` }) onOperate() notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) } catch { } } const handleUpdateMemberRole = async (role: string) => { setOpen(false) try { await updateMemberRole({ url: `/workspaces/current/members/${member.id}/update-role`, body: { role }, }) onOperate() notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) } catch { } } return ( setOpen(prev => !prev)}>
{RoleMap[member.role] || RoleMap.normal}
{ roleList.map(role => (
handleUpdateMemberRole(role)}> { role === member.role ? :
}
{t(`common.members.${toHump(role)}` as any)}
{t(`common.members.${toHump(role)}Tip` as any)}
)) }
{t('common.members.removeFromTeam')}
{t('common.members.removeFromTeamTip')}
) } export default memo(Operation)