bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/external-video-player/modal/component.jsx

142 lines
3.8 KiB
React
Raw Normal View History

import React, { Component } from 'react';
import { withModalMounter } from '/imports/ui/components/modal/service';
import Modal from '/imports/ui/components/modal/simple/component';
import Button from '/imports/ui/components/button/component';
import { defineMessages, injectIntl } from 'react-intl';
import { isUrlValid, getUrlFromVideoId } from '../service';
import { styles } from './styles';
const intlMessages = defineMessages({
start: {
id: 'app.externalVideo.start',
description: 'Share youtube video',
},
urlError: {
id: 'app.externalVideo.urlError',
description: 'Not a video URL error',
},
input: {
id: 'app.externalVideo.input',
description: 'Video URL',
},
2019-03-12 00:14:34 +08:00
urlInput: {
id: 'app.externalVideo.urlInput',
description: 'URL input field placeholder',
},
title: {
id: 'app.externalVideo.title',
description: 'Modal title',
},
close: {
id: 'app.externalVideo.close',
description: 'Close',
},
2019-03-15 21:04:19 +08:00
note: {
id: 'app.externalVideo.noteLabel',
description: 'provides hint about Shared YouTube videos',
},
});
class ExternalVideoModal extends Component {
constructor(props) {
super(props);
2019-07-13 04:08:55 +08:00
const { videoUrl } = props;
2019-01-15 03:10:08 +08:00
this.state = {
2019-07-13 04:08:55 +08:00
url: videoUrl,
sharing: videoUrl,
};
this.startWatchingHandler = this.startWatchingHandler.bind(this);
this.updateVideoUrlHandler = this.updateVideoUrlHandler.bind(this);
this.renderUrlError = this.renderUrlError.bind(this);
this.updateVideoUrlHandler = this.updateVideoUrlHandler.bind(this);
}
startWatchingHandler() {
const { startWatching, closeModal } = this.props;
const { url } = this.state;
2019-05-02 04:09:49 +08:00
startWatching(url.trim());
closeModal();
}
updateVideoUrlHandler(ev) {
this.setState({ url: ev.target.value });
}
renderUrlError() {
2019-01-15 03:10:08 +08:00
const { intl } = this.props;
const { url } = this.state;
const valid = (!url || url.length <= 3) || isUrlValid(url);
return (
!valid
? (
<div className={styles.urlError}>
{intl.formatMessage(intlMessages.urlError)}
</div>
)
: null
);
}
render() {
const { intl, videoId, closeModal } = this.props;
const { url, sharing } = this.state;
const startDisabled = !isUrlValid(url) || (getUrlFromVideoId(videoId) === url);
return (
<Modal
overlayClassName={styles.overlay}
className={styles.modal}
onRequestClose={closeModal}
contentLabel={intl.formatMessage(intlMessages.title)}
hideBorder
>
<header data-test="videoModealHeader" className={styles.header}>
<h3 className={styles.title}>{intl.formatMessage(intlMessages.title)}</h3>
</header>
<div className={styles.content}>
<div className={styles.videoUrl}>
<label htmlFor="video-modal-input" id="video-modal-input">
{intl.formatMessage(intlMessages.input)}
<input
id="video-modal-input"
onChange={this.updateVideoUrlHandler}
name="video-modal-input"
value={url}
2019-03-12 00:14:34 +08:00
placeholder={intl.formatMessage(intlMessages.urlInput)}
disabled={sharing}
2019-05-03 22:18:40 +08:00
aria-describedby="youtube-note"
/>
</label>
2019-05-03 22:18:40 +08:00
<div className={styles.youtubeNote} id="youtube-note">
2019-03-15 21:04:19 +08:00
{intl.formatMessage(intlMessages.note)}
</div>
</div>
<div>
{this.renderUrlError()}
</div>
<Button
className={styles.startBtn}
label={intl.formatMessage(intlMessages.start)}
onClick={this.startWatchingHandler}
disabled={startDisabled}
/>
</div>
</Modal>
);
}
}
export default injectIntl(withModalMounter(ExternalVideoModal));