react-cms
Version:
For personal use. Not production.
307 lines (278 loc) • 8.88 kB
JavaScript
/* @flow */
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
// import Option from './Option';
import Spinner from './Spinner';
import styles from './styles.css'; // eslint-disable-line no-unused-vars
class LayoutComponent extends Component {
static propTypes: Object = {
expanded: PropTypes.bool,
onExpandEvent: PropTypes.func,
doCollapse: PropTypes.func,
onChange: PropTypes.func,
config: PropTypes.object,
translations: PropTypes.object,
};
state: Object = {
imgSrc: '',
dragEnter: false,
uploadHighlighted: this.props.config.uploadEnabled && !!this.props.config.uploadCallback,
showImageLoading: false,
height: this.props.config.defaultSize.height,
width: this.props.config.defaultSize.width,
};
constructor(props){
super(props);
}
componentWillReceiveProps(props: Object): void {
if (this.props.expanded && !props.expanded) {
this.setState({
imgSrc: '',
dragEnter: false,
uploadHighlighted: this.props.config.uploadEnabled && !!this.props.config.uploadCallback,
showImageLoading: false,
height: this.props.config.defaultSize.height,
width: this.props.config.defaultSize.width,
})
} else if (props.config.uploadCallback !== this.props.config.uploadCallback ||
props.config.uploadEnabled !== this.props.config.uploadEnabled) {
this.setState({
uploadHighlighted: props.config.uploadEnabled && !!props.config.uploadCallback,
});
}
}
updateValue: Function = (event: Object): void => {
this.setState({
[`${event.target.name}`]: event.target.value,
});
};
toggleShowImageLoading: Function = (): void => {
const showImageLoading = !this.state.showImageLoading;
this.setState({
showImageLoading,
});
};
showImageURLOption: Function = (): void => {
this.setState({
uploadHighlighted: false,
});
};
showImageUploadOption: Function = (): void => {
this.setState({
uploadHighlighted: true,
});
};
addImageFromState: Function = (): void => {
const { imgSrc, height, width } = this.state;
const { onChange } = this.props;
onChange(imgSrc, height, width);
};
addImageFromSrcLink: Function = (imgSrc: string): void => {
const { height, width } = this.state;
const { onChange } = this.props;
onChange(imgSrc, height, width);
};
onImageDrop: Function = (event: Object): void => {
event.preventDefault();
event.stopPropagation();
this.setState({
dragEnter: false,
});
this.uploadImage(event.dataTransfer.files[0]);
};
onDragEnter: Function = (event: Object): void => {
this.stopPropagation(event);
this.setState({
dragEnter: true,
});
};
selectImage: Function = (event: Object): void => {
if (event.target.files && event.target.files.length > 0) {
this.uploadImage(event.target.files[0]);
}
};
uploadImage: Function = (file: Object): void => {
this.toggleShowImageLoading();
const { uploadCallback } = this.props.config;
uploadCallback(file)
.then(({ data }) => {
this.setState({
showImageLoading: false,
dragEnter: false,
});
this.addImageFromSrcLink(data.link);
}).catch(() => {
this.setState({
showImageLoading: false,
dragEnter: false,
});
});
};
fileUploadClick = (event) => {
this.fileUpload = true;
event.stopPropagation();
}
stopPropagation: Function = (event: Object): void => {
if (!this.fileUpload) {
event.preventDefault();
event.stopPropagation();
} else {
this.fileUpload = false;
}
};
renderAddImageModal(): Object {
const { imgSrc, uploadHighlighted, showImageLoading, dragEnter, height, width } = this.state;
const { config: { popupClassName, uploadCallback, uploadEnabled, urlEnabled, inputAccept }, doCollapse, translations } = this.props;
return (
<div
className={classNames('rdw-image-modal', popupClassName)}
onClick={this.stopPropagation}
>
<div className="rdw-image-modal-header">
{uploadEnabled && uploadCallback &&
<span
onClick={this.showImageUploadOption}
className="rdw-image-modal-header-option"
>
{translations['components.controls.image.fileUpload']}
<span
className={classNames(
'rdw-image-modal-header-label',
{ 'rdw-image-modal-header-label-highlighted': uploadHighlighted }
)}
/>
</span>}
{ urlEnabled &&
<span
onClick={this.showImageURLOption}
className="rdw-image-modal-header-option"
>
{translations['components.controls.image.byURL']}
<span
className={classNames(
'rdw-image-modal-header-label',
{ 'rdw-image-modal-header-label-highlighted': !uploadHighlighted }
)}
/>
</span>}
</div>
{
uploadHighlighted ?
<div onClick={this.fileUploadClick}>
<div
onDragEnter={this.onDragEnter}
onDragOver={this.stopPropagation}
onDrop={this.onImageDrop}
className={classNames(
'rdw-image-modal-upload-option',
{ 'rdw-image-modal-upload-option-highlighted': dragEnter })}
>
<label
htmlFor="file"
className="rdw-image-modal-upload-option-label"
>
{translations['components.controls.image.dropFileText']}
</label>
</div>
<input
type="file"
id="file"
accept={inputAccept}
onChange={this.selectImage}
className="rdw-image-modal-upload-option-input"
/>
</div> :
<div className="rdw-image-modal-url-section">
<input
className="rdw-image-modal-url-input"
placeholder="Enter url"
name="imgSrc"
onChange={this.updateValue}
onBlur={this.updateValue}
value={imgSrc}
/>
</div>
}
{/*
<div className="rdw-embedded-modal-size">
↕
<input
onChange={this.updateValue}
onBlur={this.updateValue}
value={height}
name="height"
className="rdw-embedded-modal-size-input"
placeholder="Height"
/>
↔
<input
onChange={this.updateValue}
onBlur={this.updateValue}
value={width}
name="width"
className="rdw-embedded-modal-size-input"
placeholder="Width"
/>
</div>
*/}
<span className="rdw-image-modal-btn-section">
<button
className="rdw-image-modal-btn"
onClick={this.addImageFromState}
disabled={!imgSrc || !height || !width}
>
{translations['generic.add']}
</button>
<button
className="rdw-image-modal-btn"
onClick={doCollapse}
>
{translations['generic.cancel']}
</button>
</span>
{showImageLoading ?
<div className="rdw-image-modal-spinner">
<Spinner />
</div> :
undefined}
</div>
);
}
render(): Object {
const { config: { icon, className, title }, expanded, onExpandEvent } = this.props;
return (
<div
className="rdw-image-wrapper"
aria-haspopup="true"
aria-expanded={expanded}
aria-label="rdw-image-control"
>
{this.props.children}
{expanded ? this.renderAddImageModal() : undefined}
</div>
)
}
}
// (
// <div
// className="rdw-image-wrapper"
// aria-haspopup="true"
// aria-expanded={expanded}
// aria-label="rdw-image-control"
// >
// <Option
// className={classNames(className)}
// value="unordered-list-item"
// onClick={onExpandEvent}
// title={title}
// >
// <img
// src={icon}
// alt=""
// />
// </Option>
// {expanded ? this.renderAddImageModal() : undefined}
// </div>
// );
export default LayoutComponent;