bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/shortcut-help/component.jsx

213 lines
6.2 KiB
React
Raw Normal View History

import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
import browser from 'browser-detect';
2018-05-01 03:18:29 +08:00
import Modal from '/imports/ui/components/modal/simple/component';
import _ from 'lodash';
import { styles } from './styles';
import withShortcutHelper from './service';
2018-05-01 03:18:29 +08:00
const intlMessages = defineMessages({
title: {
id: 'app.shortcut-help.title',
2018-05-03 11:33:28 +08:00
description: 'modal title label',
2018-05-01 03:18:29 +08:00
},
closeLabel: {
id: 'app.shortcut-help.closeLabel',
2018-05-03 11:33:28 +08:00
description: 'label for close button',
2018-05-01 03:18:29 +08:00
},
closeDesc: {
id: 'app.shortcut-help.closeDesc',
2018-05-03 11:33:28 +08:00
description: 'description for close button',
2018-05-01 03:18:29 +08:00
},
accessKeyNotAvailable: {
id: 'app.shortcut-help.accessKeyNotAvailable',
2018-05-03 11:33:28 +08:00
description: 'message shown in place of access key table if not supported',
},
comboLabel: {
id: 'app.shortcut-help.comboLabel',
2018-05-03 11:33:28 +08:00
description: 'heading for key combo column',
},
functionLabel: {
id: 'app.shortcut-help.functionLabel',
2018-05-03 11:33:28 +08:00
description: 'heading for shortcut function column',
},
openoptions: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.openOptions',
2018-05-03 11:33:28 +08:00
description: 'describes the open options shortcut',
2018-05-01 03:18:29 +08:00
},
toggleuserlist: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.toggleUserList',
2018-05-03 11:33:28 +08:00
description: 'describes the toggle userlist shortcut',
2018-05-01 03:18:29 +08:00
},
togglemute: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.toggleMute',
2018-05-03 11:33:28 +08:00
description: 'describes the toggle mute shortcut',
2018-05-01 03:18:29 +08:00
},
togglepublicchat: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.togglePublicChat',
2018-05-03 11:33:28 +08:00
description: 'describes the toggle public chat shortcut',
2018-05-01 03:18:29 +08:00
},
hideprivatechat: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.hidePrivateChat',
2018-05-03 11:33:28 +08:00
description: 'describes the hide public chat shortcut',
2018-05-01 03:18:29 +08:00
},
closeprivatechat: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.closePrivateChat',
2018-05-03 11:33:28 +08:00
description: 'describes the close private chat shortcut',
2018-05-01 03:18:29 +08:00
},
openactions: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.openActions',
2018-05-03 11:33:28 +08:00
description: 'describes the open actions shortcut',
2018-05-01 03:18:29 +08:00
},
2020-12-27 08:55:32 +08:00
opendebugwindow: {
id: 'app.shortcut-help.openDebugWindow',
description: 'describes the open debug window shortcut',
},
openstatus: {
2018-05-01 03:18:29 +08:00
id: 'app.shortcut-help.openStatus',
2018-05-03 11:33:28 +08:00
description: 'describes the open status shortcut',
2018-05-01 03:18:29 +08:00
},
joinaudio: {
2018-05-01 03:18:29 +08:00
id: 'app.audio.joinAudio',
2018-05-03 11:33:28 +08:00
description: 'describes the join audio shortcut',
2018-05-01 03:18:29 +08:00
},
leaveaudio: {
2018-05-01 03:18:29 +08:00
id: 'app.audio.leaveAudio',
2018-05-03 11:33:28 +08:00
description: 'describes the leave audio shortcut',
2018-05-01 03:18:29 +08:00
},
2021-03-22 07:47:15 +08:00
raisehand: {
id: 'app.shortcut-help.raiseHand',
description: 'describes the toggle raise hand shortcut',
},
2019-04-12 08:08:14 +08:00
togglePan: {
id: 'app.shortcut-help.togglePan',
description: 'describes the toggle pan shortcut',
},
2020-10-08 07:06:42 +08:00
toggleFullscreen: {
id: 'app.shortcut-help.toggleFullscreen',
description: 'describes the toggle full-screen shortcut',
},
nextSlideDesc: {
id: 'app.shortcut-help.nextSlideDesc',
description: 'describes the next slide shortcut',
},
previousSlideDesc: {
id: 'app.shortcut-help.previousSlideDesc',
description: 'describes the previous slide shortcut',
},
2018-05-01 03:18:29 +08:00
});
const CHAT_CONFIG = Meteor.settings.public.chat;
const CHAT_ENABLED = CHAT_CONFIG.enabled;
const ShortcutHelpComponent = (props) => {
const { intl, shortcuts } = props;
2020-04-14 23:20:48 +08:00
const { name, os } = browser();
2018-05-02 08:02:45 +08:00
let accessMod = null;
2018-05-01 03:18:29 +08:00
2020-04-14 23:20:48 +08:00
// different browsers use different access modifier keys
// on different systems when using accessKey property.
// Overview how different browsers behave: https://www.w3schools.com/jsref/prop_html_accesskey.asp
switch (name) {
case 'chrome':
case 'edge':
accessMod = 'Alt';
break;
case 'firefox':
accessMod = 'Alt + Shift';
break;
case 'safari':
case 'crios':
case 'fxios':
accessMod = 'Control + Alt';
break;
default:
break;
}
2020-04-14 23:20:48 +08:00
// all Browsers on MacOS are using Control + Option as access modifier
if (os.includes('OS X 10')) {
accessMod = 'Control + Option';
}
const shortcutItems = shortcuts.map((shortcut) => {
if (!CHAT_ENABLED && shortcut.descId.indexOf('Chat') !== -1) return null;
return (
<tr key={_.uniqueId('hotkey-item-')}>
<td className={styles.keyCell}>{`${accessMod} + ${shortcut.accesskey}`}</td>
<td className={styles.descCell}>{`${intl.formatMessage(intlMessages[`${shortcut.descId.toLowerCase()}`])}`}</td>
</tr>
);
});
2019-04-12 08:08:14 +08:00
shortcutItems.push((
<tr key={_.uniqueId('hotkey-item-')}>
<td className={styles.keyCell}>Spacebar</td>
<td className={styles.descCell}>{intl.formatMessage(intlMessages.togglePan)}</td>
</tr>
));
2020-10-08 07:06:42 +08:00
shortcutItems.push((
<tr key={_.uniqueId('hotkey-item-')}>
<td className={styles.keyCell}>Enter</td>
<td className={styles.descCell}>{intl.formatMessage(intlMessages.toggleFullscreen)}</td>
</tr>
));
2021-03-22 07:47:15 +08:00
shortcutItems.push((
<tr key={_.uniqueId('hotkey-item-')}>
<td className={styles.keyCell}>Right Arrow</td>
<td className={styles.descCell}>{intl.formatMessage(intlMessages.nextSlideDesc)}</td>
</tr>
));
shortcutItems.push((
<tr key={_.uniqueId('hotkey-item-')}>
<td className={styles.keyCell}>Left Arrow</td>
<td className={styles.descCell}>{intl.formatMessage(intlMessages.previousSlideDesc)}</td>
</tr>
));
return (
<Modal
title={intl.formatMessage(intlMessages.title)}
dismiss={{
label: intl.formatMessage(intlMessages.closeLabel),
description: intl.formatMessage(intlMessages.closeDesc),
}}
>
2019-04-12 08:08:14 +08:00
{!accessMod ? <p>{intl.formatMessage(intlMessages.accessKeyNotAvailable)}</p>
: (
<span>
<table className={styles.shortcutTable}>
<tbody>
<tr>
<th>{intl.formatMessage(intlMessages.comboLabel)}</th>
<th>{intl.formatMessage(intlMessages.functionLabel)}</th>
</tr>
{shortcutItems}
</tbody>
</table>
</span>
)
}
</Modal>
);
};
ShortcutHelpComponent.defaultProps = {
intl: {},
};
ShortcutHelpComponent.propTypes = {
intl: PropTypes.object.isRequired,
shortcuts: PropTypes.arrayOf(PropTypes.shape({
accesskey: PropTypes.string.isRequired,
descId: PropTypes.string.isRequired,
})).isRequired,
};
2018-05-01 03:18:29 +08:00
export default withShortcutHelper(injectIntl(ShortcutHelpComponent));