2019-06-13 02:40:58 +08:00
|
|
|
import React, { PureComponent } from 'react';
|
2017-06-04 10:40:14 +08:00
|
|
|
import PropTypes from 'prop-types';
|
2019-06-06 23:04:02 +08:00
|
|
|
import { defineMessages, injectIntl } from 'react-intl';
|
2018-09-18 02:02:52 +08:00
|
|
|
import browser from 'browser-detect';
|
2017-09-26 07:45:44 +08:00
|
|
|
import injectWbResizeEvent from '/imports/ui/components/presentation/resize-wrapper/component';
|
2017-08-21 08:16:39 +08:00
|
|
|
import Button from '/imports/ui/components/button/component';
|
2018-12-05 19:00:12 +08:00
|
|
|
import { HUNDRED_PERCENT, MAX_PERCENT, STEP } from '/imports/utils/slideCalcUtils';
|
2019-04-14 05:22:47 +08:00
|
|
|
import cx from 'classnames';
|
2018-01-08 14:17:18 +08:00
|
|
|
import { styles } from './styles.scss';
|
2018-08-23 01:49:33 +08:00
|
|
|
import ZoomTool from './zoom-tool/component';
|
2019-07-23 00:59:34 +08:00
|
|
|
import FullscreenButtonContainer from '../../fullscreen-button/container';
|
2019-03-12 00:21:12 +08:00
|
|
|
import Tooltip from '/imports/ui/components/tooltip/component';
|
2020-01-11 03:00:06 +08:00
|
|
|
import QuickPollDropdown from '/imports/ui/components/actions-bar/quick-poll-dropdown/component';
|
2019-04-13 11:48:21 +08:00
|
|
|
import KEY_CODES from '/imports/utils/keyCodes';
|
2016-08-03 06:55:20 +08:00
|
|
|
|
2017-02-17 06:14:10 +08:00
|
|
|
const intlMessages = defineMessages({
|
|
|
|
previousSlideLabel: {
|
2017-02-24 04:20:21 +08:00
|
|
|
id: 'app.presentation.presentationToolbar.prevSlideLabel',
|
2017-04-10 23:50:03 +08:00
|
|
|
description: 'Previous slide button label',
|
2017-02-17 06:14:10 +08:00
|
|
|
},
|
2019-06-06 23:04:02 +08:00
|
|
|
previousSlideDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.prevSlideDesc',
|
|
|
|
description: 'Aria description for when switching to previous slide',
|
|
|
|
},
|
2017-02-17 06:14:10 +08:00
|
|
|
nextSlideLabel: {
|
2017-02-24 04:20:21 +08:00
|
|
|
id: 'app.presentation.presentationToolbar.nextSlideLabel',
|
2017-04-26 22:08:47 +08:00
|
|
|
description: 'Next slide button label',
|
2017-02-17 06:14:10 +08:00
|
|
|
},
|
2019-06-06 23:04:02 +08:00
|
|
|
nextSlideDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.nextSlideDesc',
|
|
|
|
description: 'Aria description for when switching to next slide',
|
|
|
|
},
|
|
|
|
noNextSlideDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.noNextSlideDesc',
|
|
|
|
description: '',
|
|
|
|
},
|
|
|
|
noPrevSlideDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.noPrevSlideDesc',
|
|
|
|
description: '',
|
|
|
|
},
|
|
|
|
skipSlideLabel: {
|
|
|
|
id: 'app.presentation.presentationToolbar.skipSlideLabel',
|
|
|
|
description: 'Aria label for when switching to a specific slide',
|
|
|
|
},
|
|
|
|
skipSlideDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.skipSlideDesc',
|
|
|
|
description: 'Aria description for when switching to a specific slide',
|
|
|
|
},
|
2017-11-17 23:54:23 +08:00
|
|
|
goToSlide: {
|
|
|
|
id: 'app.presentation.presentationToolbar.goToSlide',
|
2017-11-14 18:41:51 +08:00
|
|
|
description: 'button for slide select',
|
|
|
|
},
|
2019-03-12 00:21:12 +08:00
|
|
|
selectLabel: {
|
|
|
|
id: 'app.presentation.presentationToolbar.selectLabel',
|
|
|
|
description: 'slide select label',
|
|
|
|
},
|
2018-10-25 01:54:19 +08:00
|
|
|
fitToWidth: {
|
|
|
|
id: 'app.presentation.presentationToolbar.fitToWidth',
|
2018-10-24 04:34:09 +08:00
|
|
|
description: 'button for fit to width',
|
|
|
|
},
|
2019-06-06 23:04:02 +08:00
|
|
|
fitToWidthDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.fitWidthDesc',
|
|
|
|
description: 'Aria description to display the whole width of the slide',
|
|
|
|
},
|
2019-03-11 01:21:48 +08:00
|
|
|
fitToPage: {
|
|
|
|
id: 'app.presentation.presentationToolbar.fitToPage',
|
|
|
|
description: 'button label for fit to width',
|
|
|
|
},
|
2019-06-06 23:04:02 +08:00
|
|
|
fitToPageDesc: {
|
|
|
|
id: 'app.presentation.presentationToolbar.fitScreenDesc',
|
|
|
|
description: 'Aria description to display the whole slide',
|
|
|
|
},
|
2019-02-14 20:03:25 +08:00
|
|
|
presentationLabel: {
|
|
|
|
id: 'app.presentationUploder.title',
|
|
|
|
description: 'presentation area element label',
|
|
|
|
},
|
2017-02-17 06:14:10 +08:00
|
|
|
});
|
|
|
|
|
2019-07-24 03:56:39 +08:00
|
|
|
const ALLOW_FULLSCREEN = Meteor.settings.public.app.allowFullscreen;
|
|
|
|
|
2019-06-13 02:40:58 +08:00
|
|
|
class PresentationToolbar extends PureComponent {
|
2016-08-03 06:55:20 +08:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
2018-04-12 04:05:30 +08:00
|
|
|
this.handleSkipToSlideChange = this.handleSkipToSlideChange.bind(this);
|
2018-08-23 01:49:33 +08:00
|
|
|
this.change = this.change.bind(this);
|
2019-06-06 23:04:02 +08:00
|
|
|
this.renderAriaDescs = this.renderAriaDescs.bind(this);
|
2019-04-13 11:48:21 +08:00
|
|
|
this.switchSlide = this.switchSlide.bind(this);
|
2019-07-18 08:30:28 +08:00
|
|
|
this.nextSlideHandler = this.nextSlideHandler.bind(this);
|
|
|
|
this.previousSlideHandler = this.previousSlideHandler.bind(this);
|
2018-04-12 04:05:30 +08:00
|
|
|
}
|
|
|
|
|
2019-04-13 11:48:21 +08:00
|
|
|
componentDidMount() {
|
|
|
|
document.addEventListener('keydown', this.switchSlide);
|
|
|
|
}
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
|
|
|
document.removeEventListener('keydown', this.switchSlide);
|
|
|
|
}
|
|
|
|
|
|
|
|
switchSlide(event) {
|
|
|
|
const { target, which } = event;
|
|
|
|
const isBody = target.nodeName === 'BODY';
|
|
|
|
|
|
|
|
if (isBody) {
|
2019-09-19 07:29:09 +08:00
|
|
|
switch (which) {
|
|
|
|
case KEY_CODES.ARROW_LEFT:
|
2019-11-27 06:00:28 +08:00
|
|
|
case KEY_CODES.PAGE_UP:
|
2019-09-19 07:29:09 +08:00
|
|
|
this.previousSlideHandler();
|
|
|
|
break;
|
|
|
|
case KEY_CODES.ARROW_RIGHT:
|
2019-11-27 06:00:28 +08:00
|
|
|
case KEY_CODES.PAGE_DOWN:
|
2019-09-19 07:29:09 +08:00
|
|
|
this.nextSlideHandler();
|
|
|
|
break;
|
|
|
|
default:
|
2019-09-19 01:00:33 +08:00
|
|
|
}
|
2019-04-13 11:48:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-12 04:05:30 +08:00
|
|
|
handleSkipToSlideChange(event) {
|
2019-07-18 08:30:28 +08:00
|
|
|
const {
|
|
|
|
skipToSlide,
|
|
|
|
podId,
|
|
|
|
} = this.props;
|
2018-12-22 00:03:55 +08:00
|
|
|
const requestedSlideNum = Number.parseInt(event.target.value, 10);
|
2019-07-18 08:30:28 +08:00
|
|
|
skipToSlide(requestedSlideNum, podId);
|
2016-08-03 06:55:20 +08:00
|
|
|
}
|
|
|
|
|
2019-07-18 08:30:28 +08:00
|
|
|
nextSlideHandler() {
|
|
|
|
const {
|
|
|
|
nextSlide,
|
|
|
|
currentSlideNum,
|
|
|
|
numberOfSlides,
|
|
|
|
podId,
|
|
|
|
} = this.props;
|
|
|
|
|
|
|
|
nextSlide(currentSlideNum, numberOfSlides, podId);
|
|
|
|
}
|
|
|
|
|
|
|
|
previousSlideHandler() {
|
|
|
|
const {
|
|
|
|
previousSlide,
|
|
|
|
currentSlideNum,
|
|
|
|
podId,
|
|
|
|
} = this.props;
|
|
|
|
|
|
|
|
previousSlide(currentSlideNum, podId);
|
2016-08-03 06:55:20 +08:00
|
|
|
}
|
|
|
|
|
2018-08-23 01:49:33 +08:00
|
|
|
change(value) {
|
2018-12-22 00:03:55 +08:00
|
|
|
const { zoomChanger } = this.props;
|
|
|
|
zoomChanger(value);
|
2018-08-23 01:49:33 +08:00
|
|
|
}
|
|
|
|
|
2019-06-06 23:04:02 +08:00
|
|
|
renderAriaDescs() {
|
|
|
|
const { intl } = this.props;
|
|
|
|
return (
|
|
|
|
<div hidden>
|
|
|
|
{/* Aria description's for toolbar buttons */}
|
|
|
|
<div id="prevSlideDesc">
|
|
|
|
{intl.formatMessage(intlMessages.previousSlideDesc)}
|
|
|
|
</div>
|
|
|
|
<div id="noPrevSlideDesc">
|
|
|
|
{intl.formatMessage(intlMessages.noPrevSlideDesc)}
|
|
|
|
</div>
|
|
|
|
<div id="nextSlideDesc">
|
|
|
|
{intl.formatMessage(intlMessages.nextSlideDesc)}
|
|
|
|
</div>
|
|
|
|
<div id="noNextSlideDesc">
|
|
|
|
{intl.formatMessage(intlMessages.noNextSlideDesc)}
|
|
|
|
</div>
|
|
|
|
<div id="skipSlideDesc">
|
|
|
|
{intl.formatMessage(intlMessages.skipSlideDesc)}
|
|
|
|
</div>
|
|
|
|
<div id="fitWidthDesc">
|
|
|
|
{intl.formatMessage(intlMessages.fitToWidthDesc)}
|
|
|
|
</div>
|
|
|
|
<div id="fitPageDesc">
|
|
|
|
{intl.formatMessage(intlMessages.fitToPageDesc)}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2017-11-14 18:41:51 +08:00
|
|
|
renderSkipSlideOpts(numberOfSlides) {
|
|
|
|
// Fill drop down menu with all the slides in presentation
|
|
|
|
const { intl } = this.props;
|
|
|
|
const optionList = [];
|
|
|
|
for (let i = 1; i <= numberOfSlides; i += 1) {
|
|
|
|
optionList.push((
|
|
|
|
<option
|
|
|
|
value={i}
|
|
|
|
key={i}
|
|
|
|
>
|
|
|
|
{
|
2017-11-17 23:54:23 +08:00
|
|
|
intl.formatMessage(intlMessages.goToSlide, { 0: i })
|
2017-11-14 18:41:51 +08:00
|
|
|
}
|
|
|
|
</option>));
|
|
|
|
}
|
|
|
|
|
|
|
|
return optionList;
|
|
|
|
}
|
2016-08-03 06:55:20 +08:00
|
|
|
|
|
|
|
render() {
|
|
|
|
const {
|
|
|
|
currentSlideNum,
|
|
|
|
numberOfSlides,
|
2018-12-22 00:03:55 +08:00
|
|
|
fitToWidthHandler,
|
2019-03-11 01:21:48 +08:00
|
|
|
fitToWidth,
|
2017-02-17 06:14:10 +08:00
|
|
|
intl,
|
2018-08-23 01:49:33 +08:00
|
|
|
zoom,
|
2019-02-12 21:35:52 +08:00
|
|
|
isFullscreen,
|
|
|
|
fullscreenRef,
|
2019-06-27 00:29:34 +08:00
|
|
|
isMeteorConnected,
|
2020-01-11 03:00:06 +08:00
|
|
|
isPollingEnabled,
|
|
|
|
amIPresenter,
|
|
|
|
currentSlidHasContent,
|
|
|
|
parseCurrentSlideContent,
|
2020-01-11 04:18:43 +08:00
|
|
|
startPoll,
|
|
|
|
currentSlide,
|
2016-08-03 06:55:20 +08:00
|
|
|
} = this.props;
|
|
|
|
|
2018-09-18 02:02:52 +08:00
|
|
|
const BROWSER_RESULTS = browser();
|
2018-12-22 00:03:55 +08:00
|
|
|
const isMobileBrowser = BROWSER_RESULTS.mobile
|
|
|
|
|| BROWSER_RESULTS.os.includes('Android');
|
2019-03-12 00:21:12 +08:00
|
|
|
|
2019-06-06 23:04:02 +08:00
|
|
|
const startOfSlides = !(currentSlideNum > 1);
|
|
|
|
const endOfSlides = !(currentSlideNum < numberOfSlides);
|
|
|
|
|
|
|
|
const prevSlideAriaLabel = startOfSlides
|
|
|
|
? intl.formatMessage(intlMessages.previousSlideLabel)
|
|
|
|
: `${intl.formatMessage(intlMessages.previousSlideLabel)} (${currentSlideNum <= 1 ? '' : (currentSlideNum - 1)})`;
|
|
|
|
|
|
|
|
const nextSlideAriaLabel = endOfSlides
|
|
|
|
? intl.formatMessage(intlMessages.nextSlideLabel)
|
|
|
|
: `${intl.formatMessage(intlMessages.nextSlideLabel)} (${currentSlideNum >= 1 ? (currentSlideNum + 1) : ''})`;
|
|
|
|
|
2016-08-03 06:55:20 +08:00
|
|
|
return (
|
2017-02-24 04:20:21 +08:00
|
|
|
<div id="presentationToolbarWrapper" className={styles.presentationToolbarWrapper}>
|
2019-06-06 23:04:02 +08:00
|
|
|
{this.renderAriaDescs()}
|
2020-01-11 03:00:06 +08:00
|
|
|
{
|
|
|
|
<div>
|
|
|
|
{isPollingEnabled
|
|
|
|
? (
|
|
|
|
<QuickPollDropdown
|
|
|
|
{...{
|
|
|
|
currentSlidHasContent,
|
|
|
|
intl,
|
|
|
|
amIPresenter,
|
|
|
|
parseCurrentSlideContent,
|
2020-01-11 04:18:43 +08:00
|
|
|
startPoll,
|
|
|
|
currentSlide,
|
2020-01-11 03:00:06 +08:00
|
|
|
}}
|
|
|
|
/>
|
|
|
|
) : null
|
|
|
|
}
|
|
|
|
</div>
|
|
|
|
}
|
2018-08-23 01:49:33 +08:00
|
|
|
{
|
2019-03-12 00:21:12 +08:00
|
|
|
<div className={styles.presentationSlideControls}>
|
2018-08-23 01:49:33 +08:00
|
|
|
<Button
|
|
|
|
role="button"
|
2019-06-06 23:04:02 +08:00
|
|
|
aria-label={prevSlideAriaLabel}
|
|
|
|
aria-describedby={startOfSlides ? 'noPrevSlideDesc' : 'prevSlideDesc'}
|
2019-06-27 00:29:34 +08:00
|
|
|
disabled={startOfSlides || !isMeteorConnected}
|
2018-08-23 01:49:33 +08:00
|
|
|
color="default"
|
|
|
|
icon="left_arrow"
|
|
|
|
size="md"
|
2019-07-18 08:30:28 +08:00
|
|
|
onClick={this.previousSlideHandler}
|
2018-08-23 01:49:33 +08:00
|
|
|
label={intl.formatMessage(intlMessages.previousSlideLabel)}
|
|
|
|
hideLabel
|
2019-04-14 05:22:47 +08:00
|
|
|
className={cx(styles.prevSlide, styles.presentationBtn)}
|
2018-08-23 01:49:33 +08:00
|
|
|
/>
|
2019-03-12 00:21:12 +08:00
|
|
|
|
|
|
|
<Tooltip
|
|
|
|
title={intl.formatMessage(intlMessages.selectLabel)}
|
2019-04-14 05:22:47 +08:00
|
|
|
className={styles.presentationBtn}
|
2018-08-23 01:49:33 +08:00
|
|
|
>
|
2019-03-12 00:21:12 +08:00
|
|
|
<select
|
|
|
|
id="skipSlide"
|
2019-06-06 23:04:02 +08:00
|
|
|
aria-label={intl.formatMessage(intlMessages.skipSlideLabel)}
|
2019-03-12 00:21:12 +08:00
|
|
|
aria-describedby="skipSlideDesc"
|
|
|
|
aria-live="polite"
|
|
|
|
aria-relevant="all"
|
2019-06-27 00:29:34 +08:00
|
|
|
disabled={!isMeteorConnected}
|
2019-03-12 00:21:12 +08:00
|
|
|
value={currentSlideNum}
|
|
|
|
onChange={this.handleSkipToSlideChange}
|
|
|
|
className={styles.skipSlideSelect}
|
|
|
|
>
|
|
|
|
{this.renderSkipSlideOpts(numberOfSlides)}
|
|
|
|
</select>
|
|
|
|
</Tooltip>
|
2018-08-23 01:49:33 +08:00
|
|
|
<Button
|
|
|
|
role="button"
|
2019-06-06 23:04:02 +08:00
|
|
|
aria-label={nextSlideAriaLabel}
|
|
|
|
aria-describedby={endOfSlides ? 'noNextSlideDesc' : 'nextSlideDesc'}
|
2019-07-24 03:56:39 +08:00
|
|
|
disabled={endOfSlides || !isMeteorConnected}
|
2018-08-23 01:49:33 +08:00
|
|
|
color="default"
|
|
|
|
icon="right_arrow"
|
|
|
|
size="md"
|
2019-07-18 08:30:28 +08:00
|
|
|
onClick={this.nextSlideHandler}
|
2018-08-23 01:49:33 +08:00
|
|
|
label={intl.formatMessage(intlMessages.nextSlideLabel)}
|
|
|
|
hideLabel
|
2019-04-14 05:22:47 +08:00
|
|
|
className={cx(styles.skipSlide, styles.presentationBtn)}
|
2018-08-23 01:49:33 +08:00
|
|
|
/>
|
2019-03-12 00:21:12 +08:00
|
|
|
</div>
|
2018-08-23 01:49:33 +08:00
|
|
|
}
|
|
|
|
{
|
2019-03-12 00:21:12 +08:00
|
|
|
<div className={styles.presentationZoomControls}>
|
2019-02-12 21:35:52 +08:00
|
|
|
{
|
|
|
|
!isMobileBrowser
|
|
|
|
? (
|
|
|
|
<ZoomTool
|
|
|
|
zoomValue={zoom}
|
|
|
|
change={this.change}
|
|
|
|
minBound={HUNDRED_PERCENT}
|
|
|
|
maxBound={MAX_PERCENT}
|
|
|
|
step={STEP}
|
2019-06-27 00:29:34 +08:00
|
|
|
isMeteorConnected={isMeteorConnected}
|
2019-02-12 21:35:52 +08:00
|
|
|
/>
|
|
|
|
)
|
|
|
|
: null
|
|
|
|
}
|
|
|
|
<Button
|
|
|
|
role="button"
|
2019-06-06 23:04:02 +08:00
|
|
|
aria-describedby={fitToWidth ? 'fitPageDesc' : 'fitWidthDesc'}
|
|
|
|
aria-label={fitToWidth
|
|
|
|
? `${intl.formatMessage(intlMessages.presentationLabel)} ${intl.formatMessage(intlMessages.fitToPage)}`
|
|
|
|
: `${intl.formatMessage(intlMessages.presentationLabel)} ${intl.formatMessage(intlMessages.fitToWidth)}`
|
|
|
|
}
|
2019-02-12 21:35:52 +08:00
|
|
|
color="default"
|
2019-06-27 00:29:34 +08:00
|
|
|
disabled={!isMeteorConnected}
|
2019-02-12 21:35:52 +08:00
|
|
|
icon="fit_to_width"
|
|
|
|
size="md"
|
|
|
|
circle={false}
|
|
|
|
onClick={fitToWidthHandler}
|
2019-03-11 01:21:48 +08:00
|
|
|
label={fitToWidth
|
|
|
|
? intl.formatMessage(intlMessages.fitToPage)
|
|
|
|
: intl.formatMessage(intlMessages.fitToWidth)
|
|
|
|
}
|
2019-02-12 21:35:52 +08:00
|
|
|
hideLabel
|
2019-04-18 22:29:17 +08:00
|
|
|
className={cx(styles.fitToWidth, styles.presentationBtn)}
|
2019-02-12 21:35:52 +08:00
|
|
|
/>
|
|
|
|
{
|
2019-07-24 03:56:39 +08:00
|
|
|
ALLOW_FULLSCREEN
|
|
|
|
? (
|
|
|
|
<FullscreenButtonContainer
|
|
|
|
fullscreenRef={fullscreenRef}
|
|
|
|
isFullscreen={isFullscreen}
|
|
|
|
elementName={intl.formatMessage(intlMessages.presentationLabel)}
|
|
|
|
className={styles.presentationBtn}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
: null
|
2019-02-12 21:35:52 +08:00
|
|
|
}
|
2019-03-12 00:21:12 +08:00
|
|
|
</div>
|
2018-08-23 01:49:33 +08:00
|
|
|
}
|
2016-08-03 06:55:20 +08:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2017-02-17 06:14:10 +08:00
|
|
|
|
2017-08-21 08:16:39 +08:00
|
|
|
PresentationToolbar.propTypes = {
|
2019-07-18 08:30:28 +08:00
|
|
|
// The Id for the current pod. Should always be default pod
|
|
|
|
podId: PropTypes.string.isRequired,
|
2017-08-21 08:16:39 +08:00
|
|
|
// 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
|
2019-07-18 08:30:28 +08:00
|
|
|
nextSlide: PropTypes.func.isRequired,
|
|
|
|
previousSlide: PropTypes.func.isRequired,
|
|
|
|
skipToSlide: PropTypes.func.isRequired,
|
2017-09-26 07:45:44 +08:00
|
|
|
intl: PropTypes.shape({
|
|
|
|
formatMessage: PropTypes.func.isRequired,
|
|
|
|
}).isRequired,
|
2019-03-11 01:21:48 +08:00
|
|
|
zoomChanger: PropTypes.func.isRequired,
|
|
|
|
fitToWidthHandler: PropTypes.func.isRequired,
|
|
|
|
fitToWidth: PropTypes.bool.isRequired,
|
2019-05-03 01:35:13 +08:00
|
|
|
fullscreenRef: PropTypes.instanceOf(Element),
|
2019-03-11 01:21:48 +08:00
|
|
|
isFullscreen: PropTypes.bool.isRequired,
|
|
|
|
zoom: PropTypes.number.isRequired,
|
2019-06-27 00:29:34 +08:00
|
|
|
isMeteorConnected: PropTypes.bool.isRequired,
|
2017-08-21 08:16:39 +08:00
|
|
|
};
|
|
|
|
|
2019-05-03 01:35:13 +08:00
|
|
|
PresentationToolbar.defaultProps = {
|
|
|
|
fullscreenRef: null,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2017-09-26 07:45:44 +08:00
|
|
|
export default injectWbResizeEvent(injectIntl(PresentationToolbar));
|