Skip to content

Commit d0f4a7b

Browse files
committed
Use query for UserRoles
1 parent 38b4861 commit d0f4a7b

File tree

6 files changed

+106
-97
lines changed

6 files changed

+106
-97
lines changed

apps/meteor/client/components/message/header/hooks/useMessageRoles.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@ import { useCallback } from 'react';
44
import { Roles } from '../../../../../app/models/client';
55
import { useReactiveValue } from '../../../../hooks/useReactiveValue';
66
import { useRoomRolesStore } from '../../../../hooks/useRoomRolesStore';
7-
import { useUserRolesStore } from '../../../../hooks/useUserRolesStore';
7+
import { useUserRolesQuery } from '../../../../hooks/useUserRolesQuery';
88

99
export const useMessageRoles = (userId: IUser['_id'] | undefined, roomId: IRoom['_id'], shouldLoadRoles: boolean): Array<string> => {
10-
const userRoles = useUserRolesStore((state) => (userId ? state.rolesByUser.get(userId) : undefined));
11-
const roomRoles = useRoomRolesStore((state) => state.records.find((record) => record.rid === roomId && record.u._id === userId));
10+
const { data: userRoles } = useUserRolesQuery({
11+
select: (records) => records.find((record) => record.uid === userId)?.roles,
12+
enabled: shouldLoadRoles && !!userId,
13+
});
14+
15+
const roomRoles = useRoomRolesStore((state) =>
16+
userId ? state.records.find((record) => record.rid === roomId && record.u._id === userId) : undefined,
17+
);
1218

1319
return useReactiveValue(
1420
useCallback(() => {
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import type { IRole, IUser } from '@rocket.chat/core-typings';
2+
import { useMethod, useStream, useUserId } from '@rocket.chat/ui-contexts';
3+
import type { UseQueryOptions } from '@tanstack/react-query';
4+
import { useQuery, useQueryClient } from '@tanstack/react-query';
5+
import { useEffect } from 'react';
6+
7+
import { rolesQueryKeys } from '../lib/queryKeys';
8+
9+
type UserRoles = {
10+
uid: IUser['_id'];
11+
roles: IRole['_id'][];
12+
};
13+
14+
type UseUserRolesQueryOptions<TData = UserRoles[]> = Omit<
15+
UseQueryOptions<UserRoles[], Error, TData, ReturnType<typeof rolesQueryKeys.userRoles>>,
16+
'queryKey' | 'queryFn'
17+
>;
18+
19+
export const useUserRolesQuery = <TData = UserRoles[]>(options?: UseUserRolesQueryOptions<TData>) => {
20+
const queryClient = useQueryClient();
21+
22+
const uid = useUserId();
23+
24+
const subscribeToNotifyLogged = useStream('notify-logged');
25+
26+
const enabled = !!uid && (options?.enabled ?? true);
27+
28+
useEffect(() => {
29+
if (!enabled) return;
30+
31+
return subscribeToNotifyLogged('roles-change', (role) => {
32+
switch (role.type) {
33+
case 'added': {
34+
const { _id: roleId, scope, u } = role;
35+
if (!!scope || !u) return;
36+
37+
queryClient.setQueryData(rolesQueryKeys.userRoles(), (data: UserRoles[] | undefined = []) => {
38+
const record = data?.find((record) => record.uid === u._id);
39+
40+
if (!record) {
41+
return [...data, { uid: u._id, roles: [roleId] }];
42+
}
43+
44+
const roles = new Set(record.roles);
45+
roles.add(roleId);
46+
record.roles = [...roles];
47+
48+
return [...data];
49+
});
50+
break;
51+
}
52+
53+
case 'removed': {
54+
const { _id: roleId, scope, u } = role;
55+
if (!!scope || !u) return;
56+
57+
queryClient.setQueryData(rolesQueryKeys.userRoles(), (data: UserRoles[] | undefined = []) => {
58+
const record = data?.find((record) => record.uid === u._id);
59+
60+
if (!record) return data;
61+
62+
const roles = new Set(record.roles);
63+
roles.delete(roleId);
64+
record.roles = [...roles];
65+
66+
return [...data];
67+
});
68+
break;
69+
}
70+
}
71+
});
72+
}, [enabled, queryClient, subscribeToNotifyLogged, uid]);
73+
74+
const getUserRoles = useMethod('getUserRoles');
75+
76+
return useQuery({
77+
queryKey: rolesQueryKeys.userRoles(),
78+
queryFn: async () => {
79+
const results = await getUserRoles();
80+
81+
return results.map(
82+
(record): UserRoles => ({
83+
uid: record._id,
84+
roles: record.roles,
85+
}),
86+
);
87+
},
88+
staleTime: Infinity,
89+
...options,
90+
enabled,
91+
});
92+
};

apps/meteor/client/hooks/useUserRolesStore.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

apps/meteor/client/lib/queryKeys.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,8 @@ export const subscriptionsQueryKeys = {
1818
export const cannedResponsesQueryKeys = {
1919
all: ['canned-responses'] as const,
2020
};
21+
22+
export const rolesQueryKeys = {
23+
all: ['roles'] as const,
24+
userRoles: () => [...rolesQueryKeys.all, 'user-roles'] as const,
25+
};

apps/meteor/client/startup/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,3 @@ import './slashCommands';
2222
import './startup';
2323
import './streamMessage';
2424
import './unread';
25-
import './userRoles';

apps/meteor/client/startup/userRoles.ts

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)