bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/activity-check/component.jsx

121 lines
3.1 KiB
React
Raw Normal View History

2019-02-27 01:40:01 +08:00
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { defineMessages } from 'react-intl';
2019-02-27 01:40:01 +08:00
2022-02-15 04:20:50 +08:00
import Button from '/imports/ui/components/common/button/component';
2022-02-15 23:54:55 +08:00
import Modal from '/imports/ui/components/common/modal/simple/component';
2019-02-27 01:40:01 +08:00
import { makeCall } from '/imports/ui/services/api';
2021-08-09 22:24:02 +08:00
import { Meteor } from 'meteor/meteor';
2021-10-26 20:02:01 +08:00
import Styled from './styles';
2019-02-27 01:40:01 +08:00
const propTypes = {
2021-08-09 22:24:02 +08:00
intl: PropTypes.shape({
formatMessage: PropTypes.func.isRequired,
}).isRequired,
2019-02-27 01:40:01 +08:00
responseDelay: PropTypes.number.isRequired,
};
const intlMessages = defineMessages({
activityCheckTitle: {
id: 'app.user.activityCheck',
description: 'Title for activity check modal',
},
activityCheckLabel: {
id: 'app.user.activityCheck.label',
description: 'Label for activity check modal',
},
activityCheckButton: {
id: 'app.user.activityCheck.check',
description: 'Check button for activity modal',
},
});
const handleInactivityDismiss = () => makeCall('userActivitySign');
class ActivityCheck extends Component {
constructor(props) {
super(props);
const { responseDelay } = this.props;
this.state = ({
responseDelay,
});
this.stopRemainingTime = this.stopRemainingTime.bind(this);
this.updateRemainingTime = this.updateRemainingTime.bind(this);
this.playAudioAlert = this.playAudioAlert.bind(this);
2019-02-27 01:40:01 +08:00
}
componentDidMount() {
this.playAudioAlert();
2019-02-27 01:40:01 +08:00
this.interval = this.updateRemainingTime();
}
componentDidUpdate() {
this.stopRemainingTime();
this.interval = this.updateRemainingTime();
}
componentWillUnmount() {
this.stopRemainingTime();
}
updateRemainingTime() {
const { responseDelay } = this.state;
return setInterval(() => {
2021-08-09 22:24:02 +08:00
if (responseDelay === 0) return;
2019-02-27 01:40:01 +08:00
const remainingTime = responseDelay - 1;
2019-02-27 01:40:01 +08:00
this.setState({
responseDelay: remainingTime,
});
}, 1000);
}
stopRemainingTime() {
clearInterval(this.interval);
}
playAudioAlert() {
2020-12-01 00:09:35 +08:00
this.alert = new Audio(`${Meteor.settings.public.app.cdn + Meteor.settings.public.app.basename + Meteor.settings.public.app.instanceId}/resources/sounds/notify.mp3`);
this.alert.addEventListener('ended', () => { this.alert.src = null; });
this.alert.play();
}
2019-02-27 01:40:01 +08:00
render() {
const { intl } = this.props;
const { responseDelay } = this.state;
return (
<Modal
hideBorder
onRequestClose={handleInactivityDismiss}
2019-02-27 01:40:01 +08:00
shouldCloseOnOverlayClick={false}
shouldShowCloseButton={false}
>
2021-10-26 20:02:01 +08:00
<Styled.ActivityModalContent>
2019-02-27 01:40:01 +08:00
<h1>{intl.formatMessage(intlMessages.activityCheckTitle)}</h1>
<p>{intl.formatMessage(intlMessages.activityCheckLabel, { 0: responseDelay })}</p>
<Button
color="primary"
disabled={responseDelay <= 0}
2019-02-27 01:40:01 +08:00
label={intl.formatMessage(intlMessages.activityCheckButton)}
onClick={handleInactivityDismiss}
role="button"
size="lg"
/>
2021-10-26 20:02:01 +08:00
</Styled.ActivityModalContent>
2019-02-27 01:40:01 +08:00
</Modal>
);
}
}
ActivityCheck.propTypes = propTypes;
export default ActivityCheck;