bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/pads/pads-graphql/component.tsx
Tainan Felipe 3bc40df230
Add: useDeduplicatedSubscription hook (#20376)
* Add: useDeduplicatedSubscription hook

* Fix: TS error

* Add: components using useDeduplicatedSubscription

* Change: Move to useDeduplicatedSubscription

* Change: unsubscribe logic to own useEffect

* Change: remove file import over package

* Fix: TS errors

* Fix: private chat not loading

* Change: revert changes on queries

* Fix: eslint error

* Remove: html-webpack-plugin package

* Fix: external video

* Add: comment about the stringToHash function

* Fix: video player showing tools over presentation
2024-06-04 10:40:54 -03:00

116 lines
3.1 KiB
TypeScript

import React, { useEffect, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { useMutation } from '@apollo/client';
import { HAS_PAD_SUBSCRIPTION, HasPadSubscriptionResponse } from './queries';
import { PAD_SESSION_SUBSCRIPTION, PadSessionSubscriptionResponse } from './sessions/queries';
import { CREATE_SESSION } from './mutations';
import Service from './service';
import Styled from './styles';
import PadContent from './content/component';
import useDeduplicatedSubscription from '/imports/ui/core/hooks/useDeduplicatedSubscription';
const intlMessages = defineMessages({
hint: {
id: 'app.pads.hint',
description: 'Label for hint on how to escape iframe',
},
});
interface PadContainerGraphqlProps {
externalId: string;
hasPermission: boolean;
isResizing: boolean;
isRTL: boolean;
}
interface PadGraphqlProps extends Omit<PadContainerGraphqlProps, 'hasPermission'> {
hasSession: boolean;
sessionIds: Array<string>;
padId: string | undefined;
}
const PadGraphql: React.FC<PadGraphqlProps> = (props) => {
const {
externalId,
hasSession,
isResizing,
isRTL,
sessionIds,
padId,
} = props;
const [padURL, setPadURL] = useState<string | undefined>();
const intl = useIntl();
useEffect(() => {
if (!padId) {
setPadURL(undefined);
return;
}
setPadURL(Service.buildPadURL(padId, sessionIds));
}, [isRTL, hasSession]);
if (!hasSession) {
return <PadContent externalId={externalId} />;
}
return (
<Styled.Pad>
<Styled.IFrame
title="pad"
src={padURL}
aria-describedby="padEscapeHint"
style={{
pointerEvents: isResizing ? 'none' : 'inherit',
}}
/>
<Styled.Hint
id="padEscapeHint"
aria-hidden
>
{intl.formatMessage(intlMessages.hint)}
</Styled.Hint>
</Styled.Pad>
);
};
const PadContainerGraphql: React.FC<PadContainerGraphqlProps> = (props) => {
const {
externalId,
hasPermission,
isRTL,
isResizing,
} = props;
const { data: hasPadData } = useDeduplicatedSubscription<HasPadSubscriptionResponse>(
HAS_PAD_SUBSCRIPTION,
{ variables: { externalId } },
);
const { data: padSessionData } = useDeduplicatedSubscription<PadSessionSubscriptionResponse>(
PAD_SESSION_SUBSCRIPTION,
);
const [createSession] = useMutation(CREATE_SESSION);
const sessionData = padSessionData?.sharedNotes_session ?? [];
const session = sessionData.find((s) => s.sharedNotesExtId === externalId);
const hasPad = !!hasPadData && hasPadData.sharedNotes.length > 0;
const hasSession = !!session?.sessionId;
const sessionIds = new Set<string>(sessionData.map((s) => s.sessionId));
if (hasPad && !hasSession && hasPermission) {
createSession({ variables: { externalId } });
}
return (
<PadGraphql
hasSession={hasSession}
externalId={externalId}
isRTL={isRTL}
isResizing={isResizing}
sessionIds={Array.from(sessionIds)}
padId={session?.sharedNotes?.padId}
/>
);
};
export default PadContainerGraphql;