bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/settings/component.jsx

246 lines
7.9 KiB
React
Raw Normal View History

import React, { Component } from 'react';
import Modal from '/imports/ui/components/modal/fullscreen/component';
2017-01-27 23:41:11 +08:00
import { Tab, Tabs, TabList, TabPanel } from 'react-tabs';
import { defineMessages, injectIntl, intlShape } from 'react-intl';
2017-02-16 02:49:40 +08:00
import ClosedCaptions from '/imports/ui/components/settings/submenus/closed-captions/component';
import DataSaving from '/imports/ui/components/settings/submenus/data-saving/component';
import Application from '/imports/ui/components/settings/submenus/application/container';
2017-04-05 01:51:05 +08:00
import _ from 'lodash';
import PropTypes from 'prop-types';
2017-01-27 23:41:11 +08:00
import { withModalMounter } from '../modal/service';
2017-01-27 23:41:11 +08:00
import Icon from '../icon/component';
2018-01-08 14:17:18 +08:00
import { styles } from './styles';
2017-01-27 23:41:11 +08:00
2017-04-18 02:19:27 +08:00
const intlMessages = defineMessages({
appTabLabel: {
id: 'app.settings.applicationTab.label',
description: 'label for application tab',
},
audioTabLabel: {
id: 'app.settings.audioTab.label',
description: 'label for audio tab',
},
videoTabLabel: {
id: 'app.settings.videoTab.label',
description: 'label for video tab',
},
closecaptionTabLabel: {
id: 'app.settings.closedcaptionTab.label',
description: 'label for closed-captions tab',
},
usersTabLabel: {
id: 'app.settings.usersTab.label',
description: 'label for participants tab',
},
2017-04-28 23:56:27 +08:00
SettingsLabel: {
id: 'app.settings.main.label',
description: 'General settings label',
},
CancelLabel: {
id: 'app.settings.main.cancel.label',
description: 'Discard the changes and close the settings menu',
},
CancelLabelDesc: {
id: 'app.settings.main.cancel.label.description',
description: 'Settings modal cancel button description',
},
2017-04-28 23:56:27 +08:00
SaveLabel: {
id: 'app.settings.main.save.label',
description: 'Save the changes and close the settings menu',
},
SaveLabelDesc: {
id: 'app.settings.main.save.label.description',
description: 'Settings modal save button label',
},
2018-02-01 19:31:17 +08:00
dataSavingLabel: {
id: 'app.settings.dataSavingTab.label',
2018-01-30 19:20:51 +08:00
description: 'label for data savings tab',
},
2017-04-18 02:19:27 +08:00
});
2017-01-27 23:41:11 +08:00
const propTypes = {
intl: intlShape.isRequired,
dataSaving: PropTypes.object.isRequired,
application: PropTypes.object.isRequired,
cc: PropTypes.object.isRequired,
participants: PropTypes.object.isRequired,
updateSettings: PropTypes.func.isRequired,
availableLocales: PropTypes.object.isRequired,
mountModal: PropTypes.func.isRequired,
locales: PropTypes.array.isRequired,
2017-01-27 23:41:11 +08:00
};
2016-05-06 05:14:39 +08:00
2017-04-18 02:19:27 +08:00
class Settings extends Component {
2017-10-11 06:08:51 +08:00
static setHtmlFontSize(size) {
document.getElementsByTagName('html')[0].style.fontSize = size;
}
2016-05-06 05:14:39 +08:00
constructor(props) {
super(props);
2017-12-19 19:13:37 +08:00
const {
dataSaving, participants, cc, application,
2017-12-19 19:13:37 +08:00
} = props;
2017-03-09 22:34:33 +08:00
2017-01-27 23:41:11 +08:00
this.state = {
current: {
dataSaving: _.clone(dataSaving),
2017-03-29 04:16:57 +08:00
application: _.clone(application),
cc: _.clone(cc),
participants: _.clone(participants),
2017-01-27 23:41:11 +08:00
},
saved: {
dataSaving: _.clone(dataSaving),
2017-03-09 22:34:33 +08:00
application: _.clone(application),
cc: _.clone(cc),
participants: _.clone(participants),
},
selectedTab: 0,
2016-05-06 05:14:39 +08:00
};
2017-03-29 02:41:48 +08:00
this.updateSettings = props.updateSettings;
2017-01-27 23:41:11 +08:00
this.handleUpdateSettings = this.handleUpdateSettings.bind(this);
this.handleSelectTab = this.handleSelectTab.bind(this);
2016-07-12 01:43:42 +08:00
}
2017-04-06 20:36:59 +08:00
componentWillMount() {
2017-06-03 03:25:02 +08:00
this.props.availableLocales.then((locales) => {
2017-04-06 20:36:59 +08:00
this.setState({ availableLocales: locales });
});
}
2017-01-27 23:41:11 +08:00
handleUpdateSettings(key, newSettings) {
2017-06-03 03:25:02 +08:00
const settings = this.state;
2017-01-27 23:41:11 +08:00
settings.current[key] = newSettings;
this.setState(settings);
2017-01-27 23:41:11 +08:00
}
handleSelectTab(tab) {
2017-01-27 23:41:11 +08:00
this.setState({
selectedTab: tab,
});
}
renderModalContent() {
2018-01-30 19:20:51 +08:00
const { intl } = this.props;
2017-01-27 23:41:11 +08:00
return (
<Tabs
className={styles.tabs}
onSelect={this.handleSelectTab}
2017-01-27 23:41:11 +08:00
selectedIndex={this.state.selectedTab}
2017-04-18 02:19:27 +08:00
role="presentation"
2017-12-19 19:13:37 +08:00
selectedTabPanelClassName={styles.selectedTab}
2017-01-27 23:41:11 +08:00
>
2018-01-30 19:20:51 +08:00
<TabList className={styles.tabList}>
2017-12-19 19:13:37 +08:00
<Tab
className={styles.tabSelector}
aria-labelledby="appTab"
selectedClassName={styles.selected}
>
2017-06-03 03:25:02 +08:00
<Icon iconName="application" className={styles.icon} />
2017-04-18 02:19:27 +08:00
<span id="appTab">{intl.formatMessage(intlMessages.appTabLabel)}</span>
2017-03-09 22:34:33 +08:00
</Tab>
2017-09-07 03:36:52 +08:00
{/* <Tab className={styles.tabSelector} aria-labelledby="videoTab"> */}
{/* <Icon iconName='video' className={styles.icon}/> */}
{/* <span id="videoTab">{intl.formatMessage(intlMessages.videoTabLabel)}</span> */}
{/* </Tab> */}
2017-12-19 19:13:37 +08:00
<Tab
className={styles.tabSelector}
aria-labelledby="ccTab"
selectedClassName={styles.selected}
>
2017-06-03 03:25:02 +08:00
<Icon iconName="user" className={styles.icon} />
2017-04-18 02:19:27 +08:00
<span id="ccTab">{intl.formatMessage(intlMessages.closecaptionTabLabel)}</span>
2017-01-27 23:41:11 +08:00
</Tab>
2018-01-30 19:20:51 +08:00
<Tab
className={styles.tabSelector}
2018-01-31 00:41:45 +08:00
aria-labelledby="dataSavingTab"
2018-01-30 19:20:51 +08:00
selectedClassName={styles.selected}
>
<Icon iconName="network" className={styles.icon} />
2018-02-01 19:31:17 +08:00
<span id="dataSaving">{intl.formatMessage(intlMessages.dataSavingLabel)}</span>
2018-01-30 19:20:51 +08:00
</Tab>
{/* { isModerator ? */}
{/* <Tab className={styles.tabSelector} aria-labelledby="usersTab"> */}
{/* <Icon iconName="user" className={styles.icon} /> */}
{/* <span id="usersTab">{intl.formatMessage(intlMessages.usersTabLabel)}</span> */}
{/* </Tab> */}
{/* : null } */}
2017-01-27 23:41:11 +08:00
</TabList>
2017-03-09 22:34:33 +08:00
<TabPanel className={styles.tabPanel}>
<Application
2017-04-06 20:36:59 +08:00
availableLocales={this.state.availableLocales}
2017-03-09 22:34:33 +08:00
handleUpdateSettings={this.handleUpdateSettings}
settings={this.state.current.application}
2017-06-03 03:25:02 +08:00
/>
2017-03-09 22:34:33 +08:00
</TabPanel>
2017-09-07 03:36:52 +08:00
{/* <TabPanel className={styles.tabPanel}> */}
{/* <Video */}
{/* handleUpdateSettings={this.handleUpdateSettings} */}
{/* settings={this.state.current.video} */}
{/* /> */}
{/* </TabPanel> */}
2017-01-27 23:41:11 +08:00
<TabPanel className={styles.tabPanel}>
2017-02-16 02:49:40 +08:00
<ClosedCaptions
settings={this.state.current.cc}
handleUpdateSettings={this.handleUpdateSettings}
2017-06-03 03:25:02 +08:00
locales={this.props.locales}
/>
2017-01-27 23:41:11 +08:00
</TabPanel>
2018-01-30 19:20:51 +08:00
<TabPanel className={styles.tabPanel}>
<DataSaving
settings={this.state.current.dataSaving}
handleUpdateSettings={this.handleUpdateSettings}
/>
2018-01-30 19:20:51 +08:00
</TabPanel>
{/* { isModerator ? */}
{/* <TabPanel className={styles.tabPanel}> */}
{/* <Participants */}
{/* settings={this.state.current.participants} */}
{/* handleUpdateSettings={this.handleUpdateSettings} */}
{/* /> */}
{/* </TabPanel> */}
{/* : null } */}
2017-01-27 23:41:11 +08:00
</Tabs>
);
}
2017-10-11 06:08:51 +08:00
render() {
const {
intl,
2018-07-03 23:09:20 +08:00
mountModal,
} = this.props;
2017-10-11 06:08:51 +08:00
return (
<Modal
title={intl.formatMessage(intlMessages.SettingsLabel)}
confirm={{
callback: () => {
this.updateSettings(this.state.current);
// router.push(location.pathname); // TODO 4767
2018-04-17 23:06:19 +08:00
/* We need to use mountModal(null) here to prevent submenu state updates,
* from re-opening the modal.
*/
2018-07-03 23:09:20 +08:00
mountModal(null);
},
2017-10-11 06:08:51 +08:00
label: intl.formatMessage(intlMessages.SaveLabel),
description: intl.formatMessage(intlMessages.SaveLabelDesc),
}}
dismiss={{
callback: () => {
Settings.setHtmlFontSize(this.state.saved.application.fontSize);
2018-07-03 23:09:20 +08:00
mountModal(null);
},
2017-10-11 06:08:51 +08:00
label: intl.formatMessage(intlMessages.CancelLabel),
description: intl.formatMessage(intlMessages.CancelLabelDesc),
}}
>
{this.renderModalContent()}
</Modal>
);
}
2017-01-27 23:41:11 +08:00
}
2017-02-16 02:49:40 +08:00
Settings.propTypes = propTypes;
export default withModalMounter(injectIntl(Settings));