bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx
2024-03-26 08:57:28 -03:00

61 lines
1.8 KiB
TypeScript

import { useQuery } from '@apollo/client';
import React, { useCallback, useEffect } from 'react';
import { Meteor } from 'meteor/meteor';
import { UserCustomParameterResponse, getCustomParameter } from './queries';
interface CustomUsersSettingsProps {
children: React.ReactNode;
}
const CustomUsersSettings: React.FC<CustomUsersSettingsProps> = ({
children,
}) => {
const {
data: customParameterData,
loading: customParameterLoading,
error: customParameterError,
} = useQuery<UserCustomParameterResponse>(getCustomParameter);
const [allowToRender, setAllowToRender] = React.useState(false);
const sendToServer = useCallback((data: Array<{[x: string]: string}>, count = 0) => {
Meteor.callAsync('addUserSettings', data).then(() => {
setAllowToRender(true);
})
.catch(() => {
if (count < 3) {
setTimeout(() => {
sendToServer(data, count + 1);
}, 500);
} else {
throw new Error('Error on sending user settings to server');
}
});
}, []);
useEffect(() => {
if (customParameterData && !customParameterLoading) {
const filteredData = customParameterData.user_customParameter.map((uc) => {
const { parameter, value } = uc;
return { [parameter]: value };
});
const clientSettings = JSON.parse(sessionStorage.getItem('clientStartupSettings') || '{}');
if (clientSettings.skipMeteorConnection) {
setAllowToRender(true);
return;
}
sendToServer(filteredData);
}
}, [
customParameterData,
customParameterLoading,
]);
useEffect(() => {
if (customParameterError) {
throw new Error(`Error on requesting custom parameter data: ${customParameterError}`);
}
}, [customParameterError]);
return allowToRender ? <>{children}</> : null;
};
export default CustomUsersSettings;