import { escapeHTML } from '@rocket.chat/tools';
import { GenericModal } from '@rocket.chat/ui-client';
import { useEndpoint, useSetModal, useToastMessageDispatch, useUserRoom } 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 UseUnbanUserProps = {
roomId: string;
};
export const useUnbanUser = ({ roomId }: UseUnbanUserProps) => {
const { t } = useTranslation();
const room = useUserRoom(roomId);
const setModal = useSetModal();
const dispatchToastMessage = useToastMessageDispatch();
const queryClient = useQueryClient();
const unbanUserEndpoint = useEndpoint('POST', '/v1/rooms.unbanUser');
if (!room) {
throw new Error('error-invalid-room');
}
const roomName = escapeHTML(roomCoordinator.getRoomName(room.t, room));
const { mutate: unbanUser } = useMutation({
mutationFn: ({ roomId, username }: { roomId: string; username: string }) => unbanUserEndpoint({ roomId, username }),
onSuccess: (_, { username }) => {
dispatchToastMessage({ type: 'success', message: t('User__username__unbanned_from__roomName__', { username, roomName }) });
void queryClient.invalidateQueries({ queryKey: roomsQueryKeys.bannedUsers(room._id) });
void queryClient.invalidateQueries({ queryKey: roomsQueryKeys.members(room._id, room.t) });
},
onError: (error) => {
dispatchToastMessage({ type: 'error', message: error });
},
onSettled: () => {
setModal(null);
},
});
return useCallback(
(username: string) => {
setModal(
setModal(null)}
onCancel={() => setModal(null)}
onConfirm={() => unbanUser({ roomId: room._id, username })}
>
{t('The_user_will_be_unbanned_from__roomName__', { roomName })}
,
);
},
[setModal, roomName, t, room._id, unbanUser],
);
};