|
1 | 1 | 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'; |
4 | 4 |
|
5 | 5 | import { useFilteredPermissions } from './useFilteredPermissions'; |
6 | 6 | import { CONSTANTS } from '../../../../../app/authorization/lib'; |
7 | 7 | import { Permissions, Roles } from '../../../../../app/models/client'; |
8 | | -import { useReactiveValue } from '../../../../hooks/useReactiveValue'; |
| 8 | +import { pipe } from '../../../../lib/cachedCollections'; |
9 | 9 |
|
10 | 10 | export const usePermissionsAndRoles = ( |
11 | 11 | type = 'permissions', |
12 | 12 | filter = '', |
13 | 13 | limit = 25, |
14 | 14 | skip = 0, |
15 | | -): { permissions: IPermission[]; total: number; roleList: IRole[]; reload: () => void } => { |
| 15 | +): { permissions: IPermission[]; total: number; roleList: IRole[] } => { |
16 | 16 | const filteredIds = useFilteredPermissions({ filter }); |
17 | 17 |
|
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], |
35 | 26 | ); |
36 | 27 |
|
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))); |
38 | 31 |
|
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()))); |
43 | 33 |
|
44 | | - return { permissions: permissions.fetch(), total: permissionsTotal, roleList: roles, reload: getRoles }; |
| 34 | + return { permissions, total: permissionsTotal, roleList }; |
45 | 35 | }; |
0 commit comments