bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/container.jsx

235 lines
7.1 KiB
React
Raw Normal View History

import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import { useMutation } from '@apollo/client';
import FullscreenService from '/imports/ui/components/common/fullscreen-button/service';
import { useIsInfiniteWhiteboardEnabled, useIsPollingEnabled } from '/imports/ui/services/features';
import { PluginsContext } from '/imports/ui/components/components-data/plugin-context/context';
2023-12-11 21:31:13 +08:00
import { POLL_CANCEL, POLL_CREATE } from '/imports/ui/components/poll/mutations';
2024-07-06 04:09:19 +08:00
import { PRESENTATION_SET_ZOOM, PRESENTATION_SET_PAGE, PRESENTATION_SET_PAGE_INFINITE_WHITEBOARD } from '../mutations';
2024-05-17 04:03:36 +08:00
import PresentationToolbar from './component';
import Session from '/imports/ui/services/storage/in-memory';
import { useMeetingIsBreakout } from '/imports/ui/components/app/service';
2024-07-06 04:09:19 +08:00
const infiniteWhiteboardIcon = (isinfiniteWhiteboard) => {
if (isinfiniteWhiteboard) {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M14.6667 3H1.33333C1.14924 3 1 3.14924 1 3.33333V13.3333C1 13.5174
1.14924 13.6667 1.33333 13.6667H14.6667C14.8508 13.6667 15 13.5174 15 13.3333V3.33333C15
3.14924 14.8508 3 14.6667 3ZM1.33333 2C0.596954 2 0 2.59695 0 3.33333V13.3333C0 14.0697
0.596953 14.6667 1.33333 14.6667H14.6667C15.403 14.6667 16 14.0697 16 13.3333V3.33333C16
2.59695 15.403 2 14.6667 2H1.33333Z"
fill="#4E5A66"
/>
<path
d="M12.875 11.875L9.125 8.125M9.125 8.125L9.125 10.9375M9.125 8.125L11.9375 8.125"
stroke="#4E5A66"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M3.125 5.125L6.875 8.875M6.875 8.875L6.875 6.0625M6.875 8.875L4.0625 8.875"
stroke="#4E5A66"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M14.6667 3H1.33333C1.14924 3 1 3.14924 1 3.33333V13.3333C1 13.5174
1.14924 13.6667 1.33333 13.6667H14.6667C14.8508 13.6667 15 13.5174 15 13.3333V3.33333C15
3.14924 14.8508 3 14.6667 3ZM1.33333 2C0.596954 2 0 2.59695 0 3.33333V13.3333C0 14.0697
0.596953 14.6667 1.33333 14.6667H14.6667C15.403 14.6667 16 14.0697 16 13.3333V3.33333C16
2.59695 15.403 2 14.6667 2H1.33333Z"
fill="#4E5A66"
/>
<path
d="M9.125 8.125L12.875 11.875M12.875 11.875L12.875 9.0625M12.875 11.875L10.0625 11.875"
stroke="#4E5A66"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M6.875 8.875L3.125 5.125M3.125 5.125L3.125 7.9375M3.125 5.125L5.9375 5.125"
stroke="#4E5A66"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
};
const PresentationToolbarContainer = (props) => {
const pluginsContext = useContext(PluginsContext);
const { pluginsExtensibleAreasAggregatedState } = pluginsContext;
const WHITEBOARD_CONFIG = window.meetingClientSettings.public.whiteboard;
2024-01-20 22:01:20 +08:00
const {
userIsPresenter,
layoutSwapped,
currentSlideNum,
presentationId,
numberOfSlides,
2024-06-13 22:18:07 +08:00
hasPoll,
currentSlide,
currentPresentationPage,
2024-01-20 22:01:20 +08:00
} = props;
2016-08-03 06:55:20 +08:00
const handleToggleFullScreen = (ref) => FullscreenService.toggleFullScreen(ref);
2023-12-09 04:24:57 +08:00
const [stopPoll] = useMutation(POLL_CANCEL);
2023-12-11 21:31:13 +08:00
const [createPoll] = useMutation(POLL_CREATE);
const [presentationSetZoom] = useMutation(PRESENTATION_SET_ZOOM);
2024-01-20 22:01:20 +08:00
const [presentationSetPage] = useMutation(PRESENTATION_SET_PAGE);
2024-07-06 04:09:19 +08:00
const [presentationSetPageInfiniteWhiteboard] = useMutation(PRESENTATION_SET_PAGE_INFINITE_WHITEBOARD);
2023-12-09 04:24:57 +08:00
const resetSlide = () => {
const { pageId, num } = currentPresentationPage;
presentationSetZoom({
variables: {
presentationId,
pageId,
pageNum: num,
xOffset: 0,
yOffset: 0,
widthRatio: 100,
heightRatio: 100,
},
});
};
2023-03-16 02:06:59 +08:00
const endCurrentPoll = () => {
2023-12-09 04:24:57 +08:00
if (hasPoll) stopPoll();
2023-03-16 02:24:34 +08:00
};
2023-03-16 02:06:59 +08:00
2024-01-20 22:01:20 +08:00
const setPresentationPage = (pageId) => {
presentationSetPage({
variables: {
presentationId,
pageId,
},
});
};
2024-07-06 04:09:19 +08:00
const setPresentationPageInfiniteWhiteboard = (infiniteWhiteboard) => {
const pageId = `${presentationId}/${currentSlideNum}`;
2024-07-06 04:09:19 +08:00
presentationSetPageInfiniteWhiteboard({
variables: {
pageId,
2024-07-06 04:09:19 +08:00
infiniteWhiteboard,
},
});
};
2024-01-20 22:01:20 +08:00
const skipToSlide = (slideNum) => {
const slideId = `${presentationId}/${slideNum}`;
setPresentationPage(slideId);
};
const previousSlide = () => {
const prevSlideNum = currentSlideNum - 1;
if (prevSlideNum < 1) {
return;
}
2024-01-20 22:01:20 +08:00
skipToSlide(prevSlideNum);
};
const nextSlide = () => {
const nextSlideNum = currentSlideNum + 1;
if (nextSlideNum > numberOfSlides) {
return;
}
2024-01-20 22:01:20 +08:00
skipToSlide(nextSlideNum);
};
2023-12-11 21:31:13 +08:00
const startPoll = (pollType, pollId, answers = [], question, isMultipleResponse = false) => {
Session.setItem('openPanel', 'poll');
Session.setItem('forcePollOpen', true);
2023-12-11 21:31:13 +08:00
window.dispatchEvent(new Event('panelChanged'));
createPoll({
variables: {
pollType,
pollId: `${pollId}/${new Date().getTime()}`,
secretPoll: false,
question,
isMultipleResponse,
answers,
},
});
};
const isPollingEnabled = useIsPollingEnabled();
const meetingIsBreakout = useMeetingIsBreakout();
const allowInfiniteWhiteboard = useIsInfiniteWhiteboardEnabled();
if (userIsPresenter && !layoutSwapped) {
// Only show controls if user is presenter and layout isn't swapped
const pluginProvidedPresentationToolbarItems = pluginsExtensibleAreasAggregatedState
?.presentationToolbarItems;
return (
<PresentationToolbar
{...props}
2021-11-24 00:04:45 +08:00
amIPresenter={userIsPresenter}
2023-03-16 02:06:59 +08:00
endCurrentPoll={endCurrentPoll}
isPollingEnabled={isPollingEnabled}
allowInfiniteWhiteboardInBreakouts={WHITEBOARD_CONFIG?.allowInfiniteWhiteboardInBreakouts}
allowInfiniteWhiteboard={allowInfiniteWhiteboard}
// TODO: Remove this
isMeteorConnected
{...{
pluginProvidedPresentationToolbarItems,
handleToggleFullScreen,
2023-12-11 21:31:13 +08:00
startPoll,
2024-01-20 22:01:20 +08:00
previousSlide,
nextSlide,
skipToSlide,
2024-07-06 04:09:19 +08:00
setPresentationPageInfiniteWhiteboard,
currentSlide,
currentPresentationPage,
2024-07-06 04:09:19 +08:00
infiniteWhiteboardIcon,
resetSlide,
meetingIsBreakout,
}}
/>
);
2016-08-03 06:55:20 +08:00
}
return null;
};
2016-08-03 06:55:20 +08:00
export default PresentationToolbarContainer;
2016-08-03 06:55:20 +08:00
PresentationToolbarContainer.propTypes = {
// Number of current slide being displayed
currentSlideNum: PropTypes.number.isRequired,
// Total number of slides in this presentation
numberOfSlides: PropTypes.number.isRequired,
// Actions required for the presenter toolbar
layoutSwapped: PropTypes.bool,
};