import { escapeHTML } from '@rocket.chat/tools';
import { GenericModal } from '@rocket.chat/ui-client';
import { useSetModal, useToastMessageDispatch, useUserRoom, useEndpoint } from '@rocket.chat/ui-contexts';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { roomsQueryKeys } from '../../../lib/queryKeys';
import { roomCoordinator } from '../../../lib/rooms/roomCoordinator';
type UseBanUserProps = {
roomId: string;
};
export const useBanUser = ({ roomId }: UseBanUserProps) => {
const { t } = useTranslation();
const room = useUserRoom(roomId);
const setModal = useSetModal();
const dispatchToastMessage = useToastMessageDispatch();
const queryClient = useQueryClient();
const banUserEndpoint = useEndpoint('POST', '/v1/rooms.banUser');
if (!room) {
throw new Error('error-invalid-room');
}
const roomName = escapeHTML(roomCoordinator.getRoomName(room.t, room));
const { mutate: banUser } = useMutation({
mutationFn: ({ roomId, username }: { roomId: string; username: string }) => {
return banUserEndpoint({ roomId, username });
},
onSuccess: (_, { username }) => {
dispatchToastMessage({ type: 'success', message: t('User__username__banned_from__roomName__', { username, roomName }) });
void queryClient.invalidateQueries({ queryKey: roomsQueryKeys.members(room._id, room.t) });
void queryClient.invalidateQueries({ queryKey: roomsQueryKeys.bannedUsers(room._id) });
},
onError: (error) => {
dispatchToastMessage({ type: 'error', message: error });
},
onSettled: () => {
setModal(null);
},
});
return useCallback(
(username: string) => {
setModal(
setModal(null)}
onCancel={() => setModal(null)}
onConfirm={() => banUser({ roomId: room._id, username })}
>
{t('The_user_will_be_banned_from__roomName__', { roomName })}
,
);
},
[setModal, t, roomName, room._id, banUser],
);
};