Skip to content

Commit d9f0fba

Browse files
chore: remove useReactiveValue from usePermissionsAndRoles (#36240)
1 parent dd20d85 commit d9f0fba

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

apps/meteor/client/lib/cachedCollections/DocumentMapStore.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ export interface IDocumentMapStore<T extends { _id: string }> {
140140
* @param predicate - A function that takes a document and returns true if it matches the condition.
141141
*/
142142
remove(predicate: (record: T) => boolean): void;
143+
count(predicate: (record: T) => boolean): number;
143144
}
144145

145146
/**
@@ -294,4 +295,13 @@ export const createDocumentMapStore = <T extends { _id: string }>({
294295
});
295296
onInvalidate?.(...affected);
296297
},
298+
count: (predicate: (record: T) => boolean) => {
299+
let results = 0;
300+
for (const record of get().records.values()) {
301+
if (predicate(record)) {
302+
results += 1;
303+
}
304+
}
305+
return results;
306+
},
297307
}));
Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,35 @@
11
import type { IRole, IPermission } from '@rocket.chat/core-typings';
2-
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
3-
import { useCallback, useMemo } from 'react';
2+
import { useCallback } from 'react';
3+
import { useShallow } from 'zustand/shallow';
44

55
import { useFilteredPermissions } from './useFilteredPermissions';
66
import { CONSTANTS } from '../../../../../app/authorization/lib';
77
import { Permissions, Roles } from '../../../../../app/models/client';
8-
import { useReactiveValue } from '../../../../hooks/useReactiveValue';
8+
import { pipe } from '../../../../lib/cachedCollections';
99

1010
export const usePermissionsAndRoles = (
1111
type = 'permissions',
1212
filter = '',
1313
limit = 25,
1414
skip = 0,
15-
): { permissions: IPermission[]; total: number; roleList: IRole[]; reload: () => void } => {
15+
): { permissions: IPermission[]; total: number; roleList: IRole[] } => {
1616
const filteredIds = useFilteredPermissions({ filter });
1717

18-
const selector = useMemo(() => {
19-
return {
20-
level: type === 'permissions' ? { $ne: CONSTANTS.SETTINGS_LEVEL } : CONSTANTS.SETTINGS_LEVEL,
21-
_id: { $in: filteredIds },
22-
};
23-
}, [filteredIds, type]);
24-
25-
const getPermissions = useCallback(
26-
() =>
27-
Permissions.find(selector, {
28-
sort: {
29-
_id: 1,
30-
},
31-
skip,
32-
limit,
33-
}),
34-
[selector, skip, limit],
18+
const predicate = useCallback(
19+
(record: IPermission): boolean => {
20+
if (type === 'permissions') {
21+
return record.level !== CONSTANTS.SETTINGS_LEVEL && filteredIds.includes(record._id);
22+
}
23+
return record.level === CONSTANTS.SETTINGS_LEVEL && filteredIds.includes(record._id);
24+
},
25+
[filteredIds, type],
3526
);
3627

37-
const getTotalPermissions = useCallback(() => Permissions.find(selector).count(), [selector]);
28+
const { apply: transform } = pipe<IPermission>().sortByField('_id', 1).slice(skip, limit);
29+
const permissions = Permissions.use(useShallow((state) => transform(state.filter(predicate))));
30+
const permissionsTotal = Permissions.use(useShallow((state) => state.count(predicate)));
3831

39-
const permissions = useReactiveValue(getPermissions);
40-
const permissionsTotal = useReactiveValue(getTotalPermissions);
41-
const getRoles = useEffectEvent(() => Roles.find().fetch());
42-
const roles = useReactiveValue(getRoles);
32+
const roleList = Roles.use(useShallow((state) => Array.from(state.records.values())));
4333

44-
return { permissions: permissions.fetch(), total: permissionsTotal, roleList: roles, reload: getRoles };
34+
return { permissions, total: permissionsTotal, roleList };
4535
};

0 commit comments

Comments
 (0)