RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/admin/permissions/hooks/usePermissionsAndRoles.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { IRole, IPermission } from '@rocket.chat/core-typings';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import type { Mongo } from 'meteor/mongo';
import { useCallback } from 'react';

import { CONSTANTS } from '../../../../../app/authorization/lib';
import { ChatPermissions, Roles } from '../../../../../app/models/client';
import { useReactiveValue } from '../../../../hooks/useReactiveValue';

export const usePermissionsAndRoles = (
    type = 'permissions',
    filter = '',
    limit = 25,
    skip = 0,
): { permissions: IPermission[]; total: number; roleList: IRole[]; reload: () => void } => {
    const getFilter = useCallback((): Mongo.Selector<IPermission> => {
        const filterRegExp = new RegExp(escapeRegExp(filter), 'i');

        return {
            level: type === 'permissions' ? { $ne: CONSTANTS.SETTINGS_LEVEL } : CONSTANTS.SETTINGS_LEVEL,
            _id: filterRegExp,
        };
    }, [type, filter]);

    const getPermissions = useCallback(
        () =>
            ChatPermissions.find(getFilter(), {
                sort: {
                    _id: 1,
                },
                skip,
                limit,
            }),
        [limit, skip, getFilter],
    );
    const getTotalPermissions = useCallback(() => ChatPermissions.find(getFilter()).count(), [getFilter]);

    const permissions = useReactiveValue(getPermissions);
    const permissionsTotal = useReactiveValue(getTotalPermissions);
    const getRoles = useMutableCallback(() => Roles.find().fetch());
    const roles = useReactiveValue(getRoles);

    return { permissions: permissions.fetch(), total: permissionsTotal, roleList: roles, reload: getRoles };
};