RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/room/hooks/useUserInfoActions/actions/useBlockUserAction.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import type { IRoom, IUser } from '@rocket.chat/core-typings';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { useTranslation, useMethod, useToastMessageDispatch, useUserId, useUserSubscription, useUserRoom } from '@rocket.chat/ui-contexts';
import { useMemo } from 'react';

import { getRoomDirectives } from '../../../lib/getRoomDirectives';
import type { UserInfoAction } from '../useUserInfoActions';

export const useBlockUserAction = (user: Pick<IUser, '_id' | 'username'>, rid: IRoom['_id']): UserInfoAction | undefined => {
    const t = useTranslation();
    const dispatchToastMessage = useToastMessageDispatch();
    const currentSubscription = useUserSubscription(rid);
    const ownUserId = useUserId();
    const { _id: uid } = user;
    const room = useUserRoom(rid);

    if (!room) {
        throw Error('Room not provided');
    }

    const { roomCanBlock } = getRoomDirectives({ room, showingUserId: uid, userSubscription: currentSubscription });

    const isUserBlocked = currentSubscription?.blocker;
    const toggleBlock = useMethod(isUserBlocked ? 'unblockUser' : 'blockUser');

    const toggleBlockUserAction = useMutableCallback(async () => {
        try {
            await toggleBlock({ rid, blocked: uid });
            dispatchToastMessage({
                type: 'success',
                message: t(isUserBlocked ? 'User_is_unblocked' : 'User_is_blocked'),
            });
        } catch (error: unknown) {
            dispatchToastMessage({ type: 'error', message: error });
        }
    });

    const toggleBlockUserOption = useMemo(
        () =>
            roomCanBlock && uid !== ownUserId
                ? {
                        content: t(isUserBlocked ? 'Unblock' : 'Block'),
                        icon: 'ban' as const,
                        onClick: toggleBlockUserAction,
                  }
                : undefined,
        [isUserBlocked, ownUserId, roomCanBlock, t, toggleBlockUserAction, uid],
    );

    return toggleBlockUserOption;
};