@frontkom/gutenberg-js
Version:
gutenberg-js - An extension of the Wordpress Gutenberg editor
120 lines (101 loc) • 2.88 kB
JavaScript
/**
* External dependencies
*/
import { Component, Fragment } from 'react';
import { get } from 'lodash';
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import { Popover } from '@wordpress/components';
import { withSelect } from '@wordpress/data';
class MediaContainer extends Component {
constructor( props ) {
super( props );
this.onImageClick = this.onImageClick.bind( this );
}
onImageClick( img ) {
const { onSelect, closePopover, gallery = false, multiple = false } = this.props;
const imgObject = {
alt: img.alt_text,
caption: img.caption.raw,
id: img.id,
link: img.link,
mime: img.mime_type,
sizes: img.media_details.sizes,
subtype: img.mime_type.split( '/' )[ 1 ],
type: img.mime_type.split( '/' )[ 0 ],
url: img.source_url,
data: img.data,
};
if ( gallery || multiple ) {
onSelect( [ imgObject ] );
} else {
onSelect( imgObject );
}
closePopover();
}
render() {
const { media, allowedTypes = [] } = this.props;
const items = media && media.filter( ( item ) => ! allowedTypes.length || allowedTypes.includes( item.media_type ) );
return (
<div className="media-library__popover__content">
{ items && items.map( ( item ) => {
const sourceUrl = get( item, 'media_details.sizes.thumbnail.source_url' ) ||
( item.media_type === 'image' && item.source_url );
const buttonStyle = sourceUrl ? { backgroundImage: `url(${ sourceUrl })` } : {};
return <button
key={ item.id }
className="media-library-thumbnail"
style={ buttonStyle }
onClick={ () => this.onImageClick( item ) }
></button>;
} ) }
</div>
);
}
}
const MediaLibrary = withSelect( ( select ) => ( {
media: select( 'core' ).getMediaItems(),
} ) )( MediaContainer );
class MediaUpload extends Component {
constructor( props ) {
super( props );
this.state = { isVisible: false };
this.openPopover = this.openPopover.bind( this );
this.closePopover = this.closePopover.bind( this );
}
openPopover() {
this.setState( { isVisible: true } );
}
closePopover() {
this.setState( { isVisible: false } );
}
render() {
if ( ! this.props.mediaLibrary ) {
// console.log('Media Library is deactivated');
return false;
}
const { isVisible } = this.state;
return <Fragment>
{ isVisible &&
<Popover
className="media-library__popover"
onClose={ this.closePopover }
onClick={ ( event ) => event.stopPropagation() }
position="middle left"
headerTitle={ __( 'Media Library' ) }
>
<MediaLibrary
{ ...this.props }
closePopover={ this.closePopover }
/>
</Popover>
}
{ this.props.render( { open: this.openPopover } ) }
</Fragment>;
}
}
export default withSelect( ( select ) => ( {
mediaLibrary: select( 'core/editor' ).getEditorSettings().mediaLibrary,
} ) )( MediaUpload );