import { Box } from '@rocket.chat/fuselage'; import { useStableCallback } from '@rocket.chat/fuselage-hooks'; import type { GenericMenuItemProps } from '@rocket.chat/ui-client'; import { GenericModal } from '@rocket.chat/ui-client'; import { useRouter, useSetModal, useEndpoint, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { Trans, useTranslation } from 'react-i18next'; import { useIsABACAvailable } from './useIsABACAvailable'; import { useViewRoomsAction } from './useViewRoomsAction'; import { ABACQueryKeys } from '../../../../lib/queryKeys'; export const useAttributeOptions = (attribute: { _id: string; key: string }): GenericMenuItemProps[] => { const { t } = useTranslation(); const router = useRouter(); const setModal = useSetModal(); const queryClient = useQueryClient(); const deleteAttribute = useEndpoint('DELETE', '/v1/abac/attributes/:_id', { _id: attribute._id }); const isAttributeUsed = useEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', { key: attribute.key }); const dispatchToastMessage = useToastMessageDispatch(); const isABACAvailable = useIsABACAvailable(); const viewRoomsAction = useViewRoomsAction(); const editAction = useStableCallback(() => { return router.navigate( { name: 'admin-ABAC', params: { tab: 'room-attributes', context: 'edit', id: attribute._id, }, }, { replace: true }, ); }); const deleteMutation = useMutation({ mutationFn: deleteAttribute, onSuccess: () => { dispatchToastMessage({ type: 'success', message: t('ABAC_Attribute_deleted', { attributeName: attribute.key }) }); }, onError: (error) => { dispatchToastMessage({ type: 'error', message: error }); }, onSettled: () => { queryClient.invalidateQueries({ queryKey: ABACQueryKeys.roomAttributes.all() }); setModal(null); }, }); const deleteAction = useStableCallback(async () => { const isUsed = await isAttributeUsed(); if (isUsed.inUse) { return setModal( { viewRoomsAction(attribute.key); setModal(null); }} onCancel={() => setModal(null)} > }} /> , ); } setModal( { deleteMutation.mutateAsync(undefined); }} onCancel={() => setModal(null)} > }} /> , ); }); return [ { id: 'edit', icon: 'edit' as const, content: t('Edit'), onClick: () => editAction(), disabled: !isABACAvailable }, { id: 'delete', iconColor: 'danger', icon: 'trash' as const, content: {t('Delete')}, onClick: () => deleteAction(), }, ]; };