Skip to content

Commit 3391c85

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

File tree

6 files changed

+114
-97
lines changed

6 files changed

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

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)