UNPKG

react-cms

Version:

For personal use. Not production.

307 lines (278 loc) 8.88 kB
/* @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"> &#8597;&nbsp; <input onChange={this.updateValue} onBlur={this.updateValue} value={height} name="height" className="rdw-embedded-modal-size-input" placeholder="Height" /> &nbsp;&#8596;&nbsp; <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;