%PDF- %PDF-
| Direktori : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/gutenberg/components/ |
| Current File : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/gutenberg/components/preview.js |
// @codingStandardsIgnoreFile
/**
* Preview
*
* Handles the slideshow preview.
* It renders an iframe, a transparent overlay to trigger the block selection and a loading state.
*/
import icon from './metaslider-icon'
const wp = window.wp
const React = window.React
const { Placeholder, Spinner } = wp.components
const { __ } = wp.i18n
const { apiRequest } = wp
/**
* Custom iframe component to leverage events
*/
class MetaSliderPreview extends React.Component {
/**
* Custom_Iframe component
*
* @param object props Properties
* @return void
*/
constructor(props) {
super(props)
this.state = {
height: 200,
previewIsLoading: true,
slideshowId: null,
html: '',
previewErrorMessage: ''
}
this.handleOnLoad = this.handleOnLoad.bind(this)
this.setHeight = this.setHeight.bind(this)
this.getPreview = this.getPreview.bind(this)
this.handleResize = this.handleResize.bind(this)
this.iframe = React.createRef()
} // end constructor()
/**
* componentDidMount: Fires when the dom element is inserted
*/
componentDidMount() {
this.getPreview()
window.addEventListener('resize', this.handleResize)
if (this.props.componentDidMount) {
this.props.componentDidMount(this)
}
} // end componentDidMount()
/**
* componentWillUnmount - Fires just before the dom element is removed
*/
componentWillUnmount() {
window.removeEventListener('resize', this.handleResize)
if (this.props.componentWillUnmount) {
this.props.componentWillUnmount()
}
} // end componentWillUnmount()
/**
* ComponentDidUpdate
* When some props have been updated, before the component re-renders
*/
componentDidUpdate(prevProps) {
// if the source changes, change loaded status
if (this.props.slideshowId !== prevProps.slideshowId || this.props.refresh !== prevProps.refresh) {
this.setHeight(200)
this.getPreview()
this.iframe.current.contentDocument.location.reload(true)
}
}
/**
* handleOnLoad - The iframe onLoad event handler
*
* @param {Event} e - Event
*/
handleOnLoad(e) {
if (this.state.html) {
this.iframe.current.contentDocument.editor_block = this
setTimeout(() => {
clearInterval(this.loadInterval)
this.setHeight(this.iframe.current.contentDocument.body.clientHeight)
}, 50)
this.setState({previewIsLoading: false})
}
} // end handleOnLoad()
/**
* Handle window resize event
*
* @param {Event} e
*/
handleResize(e) {
// console.log('ss', this.iframe.current.contentDocument.body.clientHeight, this.iframe.current.contentDocument.body, this.iframe.current.contentDocument, this.iframe)
this.setHeight(this.iframe.current.contentDocument.body.clientHeight)
}
/**
* Sets iframe Height with a minimum of 200 if below 100
* Sometimes it shrinks on resize, so 200 looks best.
*
* @param {int} height
*/
setHeight(height) {
this.setState({height: height > 200 ? height : 200})
}
/**
* Get Preview - fetches the iframe's content
*/
getPreview() {
try {
this.setState({
html: '',
previewIsLoading: true,
previewErrorMessage: ''
})
apiRequest(
{
path: '/metaslider/v1/slideshow/preview',
data: {
action: 'ms_get_preview',
slideshow_id: this.props.slideshowId,
override_preview_style: true
}
}
).then(response => {
// Update the html inside the preview and set the height
this.setState({html: response.data})
this.setHeight(this.iframe.current.contentDocument.body.clientHeight)
}).fail(error => {
// Update the iframe but show an error that this slideshow no longer exists
if (410 === error.status) {
this.setState({
previewIsLoading: false,
previewErrorMessage: error.responseJSON.data.message
})
console.error('MetaSlider (Gutenberg): Slideshow not found:', error)
} else {
console.error('MetaSlider (Gutenberg): Could not load the preview:', error)
}
})
} catch (error) {
console.error('MetaSlider (Gutenberg): A general error occured:', error)
}
}
/**
* Render - React render function
*
* @return dom object
*/
render() {
return <div className={this.props.className + (this.state.previewIsLoading ? '' : ' loading') + ' ms-preview'}>
<iframe
key="preview-iframe"
height={this.state.height}
srcDoc={this.state.html || ''}
onLoad={this.handleOnLoad}
ref={this.iframe}
/>
<div key="trigger" className="ms-preview__trigger"></div>
{this.state.previewIsLoading && <Placeholder
key="ms-loader"
className="ms-loader"
label={[icon, ' MetaSlider']}>
<Spinner/> {__('Loading slideshow', 'ml-slider')}
</Placeholder>}
{(this.state.previewErrorMessage) && <Placeholder
key="ms-preview-empty"
className="ms-loader"
label={[icon, ' MetaSlider']}>
{this.state.previewErrorMessage}
</Placeholder>}
</div>
} // end render()
}
export default MetaSliderPreview