Merge pull request #19744 from JoVictorNunes/patched-usr-list-curr-user
improvement: use patched subscriptions for both user list and current user data
This commit is contained in:
commit
16e38be12e
@ -7,11 +7,11 @@ import {
|
|||||||
import { DataConsumptionHooks } from 'bigbluebutton-html-plugin-sdk/dist/cjs/data-consumption/enums';
|
import { DataConsumptionHooks } from 'bigbluebutton-html-plugin-sdk/dist/cjs/data-consumption/enums';
|
||||||
import { UpdatedEventDetails } from 'bigbluebutton-html-plugin-sdk/dist/cjs/core/types';
|
import { UpdatedEventDetails } from 'bigbluebutton-html-plugin-sdk/dist/cjs/core/types';
|
||||||
import formatLoadedUserListDataFromGraphql from './utils';
|
import formatLoadedUserListDataFromGraphql from './utils';
|
||||||
import { useLoadedUserList } from '/imports/ui/core/hooks/useLoadedUserList';
|
import { useLocalUserList } from '/imports/ui/core/hooks/useLoadedUserList';
|
||||||
|
|
||||||
const LoadedUserListHookContainer = () => {
|
const LoadedUserListHookContainer = () => {
|
||||||
const [sendSignal, setSendSignal] = useState(false);
|
const [sendSignal, setSendSignal] = useState(false);
|
||||||
const [usersData] = useLoadedUserList((user: Partial<User>) => ({
|
const [usersData] = useLocalUserList((user: Partial<User>) => ({
|
||||||
userId: user.userId,
|
userId: user.userId,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
|
@ -24,8 +24,8 @@ import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser';
|
|||||||
import { layoutSelect } from '/imports/ui/components/layout/context';
|
import { layoutSelect } from '/imports/ui/components/layout/context';
|
||||||
import { Layout } from '/imports/ui/components/layout/layoutTypes';
|
import { Layout } from '/imports/ui/components/layout/layoutTypes';
|
||||||
import Service from '/imports/ui/components/user-list/service';
|
import Service from '/imports/ui/components/user-list/service';
|
||||||
import { USER_LIST_SUBSCRIPTION } from '/imports/ui/core/graphql/queries/users';
|
import { setLocalUserList, useLoadedUserList } from '/imports/ui/core/hooks/useLoadedUserList';
|
||||||
import { setLoadedUserList } from '/imports/ui/core/hooks/useLoadedUserList';
|
import { GraphqlDataHookSubscriptionResponse } from '/imports/ui/Types/hook';
|
||||||
|
|
||||||
interface UserListParticipantsProps {
|
interface UserListParticipantsProps {
|
||||||
users: Array<User>;
|
users: Array<User>;
|
||||||
@ -206,21 +206,14 @@ const UserListParticipantsContainer: React.FC = () => {
|
|||||||
} = useSubscription(USER_AGGREGATE_COUNT_SUBSCRIPTION);
|
} = useSubscription(USER_AGGREGATE_COUNT_SUBSCRIPTION);
|
||||||
const count = countData?.user_aggregate?.aggregate?.count || 0;
|
const count = countData?.user_aggregate?.aggregate?.count || 0;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => () => {
|
||||||
return () => {
|
setLocalUserList([]);
|
||||||
setLoadedUserList([]);
|
|
||||||
};
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: usersData,
|
data: usersData,
|
||||||
} = useSubscription(USER_LIST_SUBSCRIPTION, {
|
} = useLoadedUserList({ offset, limit }, (u) => u) as GraphqlDataHookSubscriptionResponse<Array<User>>;
|
||||||
variables: {
|
const users = usersData ?? [];
|
||||||
offset,
|
|
||||||
limit,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const { user: users } = (usersData || {});
|
|
||||||
|
|
||||||
const { data: currentUser } = useCurrentUser((c: Partial<User>) => ({
|
const { data: currentUser } = useCurrentUser((c: Partial<User>) => ({
|
||||||
isModerator: c.isModerator,
|
isModerator: c.isModerator,
|
||||||
@ -232,7 +225,7 @@ const UserListParticipantsContainer: React.FC = () => {
|
|||||||
const presentationPage = presentationData?.pres_page_curr[0] || {};
|
const presentationPage = presentationData?.pres_page_curr[0] || {};
|
||||||
const pageId = presentationPage?.pageId;
|
const pageId = presentationPage?.pageId;
|
||||||
|
|
||||||
setLoadedUserList(users);
|
setLocalUserList(users);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<UserListParticipants
|
<UserListParticipants
|
||||||
|
@ -4,7 +4,7 @@ import {
|
|||||||
} from 'react';
|
} from 'react';
|
||||||
import { gql, useApolloClient } from '@apollo/client';
|
import { gql, useApolloClient } from '@apollo/client';
|
||||||
import R from 'ramda';
|
import R from 'ramda';
|
||||||
import { applyPatch } from 'fast-json-patch';
|
import { applyPatch, deepClone } from 'fast-json-patch';
|
||||||
import { GraphqlDataHookSubscriptionResponse } from '../../Types/hook';
|
import { GraphqlDataHookSubscriptionResponse } from '../../Types/hook';
|
||||||
|
|
||||||
function createUseSubscription<T>(
|
function createUseSubscription<T>(
|
||||||
@ -55,7 +55,7 @@ function createUseSubscription<T>(
|
|||||||
const { data } = response;
|
const { data } = response;
|
||||||
let currentData: T[] = [];
|
let currentData: T[] = [];
|
||||||
if (usePatchedSubscription && data.patch) {
|
if (usePatchedSubscription && data.patch) {
|
||||||
const patchedData = applyPatch(dataRef.current, data.patch).newDocument;
|
const patchedData = applyPatch(deepClone(dataRef.current), data.patch).newDocument;
|
||||||
currentData = [...patchedData];
|
currentData = [...patchedData];
|
||||||
} else {
|
} else {
|
||||||
const resultSetKey = Object.keys(data)[0];
|
const resultSetKey = Object.keys(data)[0];
|
||||||
|
@ -2,7 +2,7 @@ import createUseSubscription from './createUseSubscription';
|
|||||||
import CURRENT_USER_SUBSCRIPTION from '../graphql/queries/currentUserSubscription';
|
import CURRENT_USER_SUBSCRIPTION from '../graphql/queries/currentUserSubscription';
|
||||||
import { User } from '../../Types/user';
|
import { User } from '../../Types/user';
|
||||||
|
|
||||||
const useCurrentUserSubscription = createUseSubscription<User>(CURRENT_USER_SUBSCRIPTION);
|
const useCurrentUserSubscription = createUseSubscription<User>(CURRENT_USER_SUBSCRIPTION, {}, true);
|
||||||
|
|
||||||
const useCurrentUser = (fn: (c: Partial<User>) => Partial<User>) => {
|
const useCurrentUser = (fn: (c: Partial<User>) => Partial<User>) => {
|
||||||
const response = useCurrentUserSubscription(fn);
|
const response = useCurrentUserSubscription(fn);
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import { makeVar, useReactiveVar } from '@apollo/client';
|
import { makeVar, useReactiveVar } from '@apollo/client';
|
||||||
import { isEqual } from 'radash';
|
import { isEqual } from 'radash';
|
||||||
import { User } from '../../Types/user';
|
import { User } from '../../Types/user';
|
||||||
|
import { useCreateUseSubscription } from './createUseSubscription';
|
||||||
|
import { USER_LIST_SUBSCRIPTION } from '../graphql/queries/users';
|
||||||
|
|
||||||
const createLoadedUserListDataGathering = (): [
|
const createLocalUserListDataGathering = (): [
|
||||||
(fn: (c: Partial<User>) => Partial<User>) => [
|
(fn: (c: Partial<User>) => Partial<User>) => [
|
||||||
Partial<User>[],
|
Partial<User>[],
|
||||||
(result: Partial<User>[]) => void,
|
(result: Partial<User>[]) => void,
|
||||||
@ -11,7 +13,7 @@ const createLoadedUserListDataGathering = (): [
|
|||||||
] => {
|
] => {
|
||||||
const loadedUserList = makeVar<Partial<User>[]>([]);
|
const loadedUserList = makeVar<Partial<User>[]>([]);
|
||||||
|
|
||||||
const setLoadedUserList = (result: Partial<User>[]): void => {
|
const setLocalUserList = (result: Partial<User>[]): void => {
|
||||||
const gatheredUserList = loadedUserList();
|
const gatheredUserList = loadedUserList();
|
||||||
const hasUsers = gatheredUserList && gatheredUserList.length > 0;
|
const hasUsers = gatheredUserList && gatheredUserList.length > 0;
|
||||||
const shouldAdd = !hasUsers || !isEqual(gatheredUserList, result);
|
const shouldAdd = !hasUsers || !isEqual(gatheredUserList, result);
|
||||||
@ -24,18 +26,41 @@ const createLoadedUserListDataGathering = (): [
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const useLoadedUserList = (fn: ((c: Partial<User>) => Partial<User>)): [
|
const useLocalUserList = (fn: ((c: Partial<User>) => Partial<User>)): [
|
||||||
Partial<User>[],
|
Partial<User>[],
|
||||||
(result: Partial<User>[]) => void,
|
(result: Partial<User>[]) => void,
|
||||||
] => {
|
] => {
|
||||||
const gatheredLoadedUserList = useReactiveVar(loadedUserList);
|
const gatheredLoadedUserList = useReactiveVar(loadedUserList);
|
||||||
const loadedUserListData = Object.values(gatheredLoadedUserList).filter((i) => Array.isArray(i)).flat();
|
const loadedUserListData = Object.values(gatheredLoadedUserList).filter((i) => Array.isArray(i)).flat();
|
||||||
return [loadedUserListData.map(fn), setLoadedUserList];
|
return [loadedUserListData.map(fn), setLocalUserList];
|
||||||
};
|
};
|
||||||
|
|
||||||
return [useLoadedUserList, setLoadedUserList];
|
return [useLocalUserList, setLocalUserList];
|
||||||
};
|
};
|
||||||
|
|
||||||
const [useLoadedUserList, setLoadedUserList] = createLoadedUserListDataGathering();
|
const useLoadedUserList = (
|
||||||
|
variables: { offset: number, limit: number },
|
||||||
|
fn: (c: Partial<User>) => Partial<User>,
|
||||||
|
) => {
|
||||||
|
const useLoadedUserListSubscription = useCreateUseSubscription<User>(
|
||||||
|
USER_LIST_SUBSCRIPTION,
|
||||||
|
variables,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
const loadedUserList = useLoadedUserListSubscription(fn);
|
||||||
|
return loadedUserList;
|
||||||
|
};
|
||||||
|
|
||||||
export { useLoadedUserList, setLoadedUserList };
|
const [useLocalUserList, setLocalUserList] = createLocalUserListDataGathering();
|
||||||
|
|
||||||
|
export {
|
||||||
|
useLoadedUserList,
|
||||||
|
useLocalUserList,
|
||||||
|
setLocalUserList,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
useLoadedUserList,
|
||||||
|
useLocalUserList,
|
||||||
|
setLocalUserList,
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user