/* global WPHB_Admin */
/**
* External dependencies
*/
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
/**
* WordPress dependencies
*/
import domReady from '@wordpress/dom-ready';
const { __ } = wp.i18n;
/**
* Internal dependencies
*/
import '../../app.scss';
import HBAPIFetch from '../../api';
import { UserContext } from '../../context';
import Status from '../../views/caching/browser/status';
import Wizard from '../../views/caching/browser/wizard';
import { getString } from '../../../js/utils/helpers';
/**
* BrowserCachingPage component.
*
* @since 2.7.2
*/
class BrowserCachingPage extends React.Component {
/**
* Component constructor.
*
* @param {Object} props
*/
constructor( props ) {
super( props );
this.state = {
api: new HBAPIFetch(),
isMember: this.props.wphbData.isMember,
links: this.props.wphbData.links,
loading: true,
detectedServer: this.props.wphbData.module.detectedServer,
cloudflare: {
isAuthed: false,
isConnected: false,
isSetup: false,
notice: false,
},
status: { // Expires - server settings (in seconds).
CSS: false,
Images: false,
JavaScript: false,
Media: false,
},
expires: { // Expires - User selected settings (format).
CSS: false,
Images: false,
JavaScript: false,
Media: false,
},
snippets: this.props.wphbData.module.snippets,
human: {}, // Expires - human readable format.
showWizard: false,
};
this.updateStatus = this.updateStatus.bind( this );
this.showWizard = this.showWizard.bind( this );
this.hideWizard = this.hideWizard.bind( this );
this.setExpiry = this.setExpiry.bind( this );
this.saveExpiryRules = this.saveExpiryRules.bind( this );
this.clearCache = this.clearCache.bind( this );
this.disconnectCloudflare = this.disconnectCloudflare.bind( this );
}
/**
* Fetch/refresh browser caching status.
*
* @param {string} action Accepts: 'get' and 'refresh'.
*/
browserCachingStatus( action = 'get' ) {
this.state.api
.post( 'browser_caching_status', action )
.then( ( response ) => {
this.setState( {
loading: false,
cloudflare: {
isAuthed: response.cloudflareAuthed,
isConnected: response.usingCloudflare,
isSetup: response.cloudflareSetUp,
notice: response.cloudflareNotice,
},
detectedServer: response.detectedServer,
status: response.status,
expires: response.expires,
human: response.human,
} );
} )
.catch( ( error ) => window.console.log( error ) );
}
/**
* Invoked immediately after a component is mounted.
*/
componentDidMount() {
this.browserCachingStatus();
}
/**
* Update browser caching status.
*/
updateStatus() {
this.setState( { loading: true } );
this.browserCachingStatus( 'refresh' );
}
/**
* Show setup wizard.
*
* @since 3.2.0
*/
showWizard() {
this.setState( { showWizard: true } );
}
/**
* Hide setup wizard.
*
* @since 3.2.0
*/
hideWizard() {
this.setState( { showWizard: false } );
}
/**
* Update expiry values.
*
* @since 3.2.0
*
* @param {Object} e Select that triggered the change.
*/
setExpiry( e ) {
let CSS;
let Images;
let JavaScript;
let Media;
if ( 'set-expiry-all' === e.target.id ) {
CSS = e.target.value;
Images = e.target.value;
JavaScript = e.target.value;
Media = e.target.value;
// Fix for select2 not picking up updates.
if ( ! this.state.cloudflare.isAuthed && ! this.state.cloudflare.isSetup ) {
const event = new Event( 'change' );
document.getElementById( 'set-expiry-css' ).value = e.target.value;
document.getElementById( 'set-expiry-css' ).dispatchEvent( event );
document.getElementById( 'set-expiry-images' ).value = e.target.value;
document.getElementById( 'set-expiry-images' ).dispatchEvent( event );
document.getElementById( 'set-expiry-javascript' ).value = e.target.value;
document.getElementById( 'set-expiry-javascript' ).dispatchEvent( event );
document.getElementById( 'set-expiry-media' ).value = e.target.value;
document.getElementById( 'set-expiry-media' ).dispatchEvent( event );
}
} else {
CSS = document.getElementById( 'set-expiry-css' ).value;
Images = document.getElementById( 'set-expiry-images' ).value;
JavaScript = document.getElementById( 'set-expiry-javascript' ).value;
Media = document.getElementById( 'set-expiry-media' ).value;
}
this.setState( { expires: { CSS, Images, JavaScript, Media } } );
}
/**
* Update expiry rules in the database.
*
* @since 3.2.0
*
* @param {string} server Selected server.
*/
saveExpiryRules( server ) {
const data = {
server,
expires: this.state.expires,
};
return this.state.api
.post( 'update_expiry', data )
.then( ( response ) => {
this.setState( { snippets: response.snippets } );
// Update status if we were able to apply Apache rules.
if ( ( 'apache' === server || 'litespeed' === server ) && 'undefined' !== typeof response.status ) {
this.setState( {
status: response.status,
human: response.human,
} );
}
return response;
} )
.catch( ( error ) => window.console.log( error ) );
}
/**
* Scroll to Cloudflare settings, when clicking on the upsell "Connect" button.
*/
handleCloudflareClick() {
window.SUI.openModal(
'cloudflare-connect',
'wrap-wphb-browser-caching',
'cloudflare-email',
false,
false
);
}
/**
* Clear Cloudflare cache.
*
* @since 3.2.0
*/
clearCache() {
this.setState( { loading: true } );
return this.state.api
.post( 'clear_cache' )
.then( () => {
this.setState( { loading: false } );
WPHB_Admin.notices.show(
getString( 'successCloudflarePurge' )
);
} )
.catch( ( error ) => window.console.log( error ) );
}
/**
* Disconnect Cloudflare.
*
* @since 3.2.0
*/
disconnectCloudflare() {
this.setState( { loading: true } );
this.state.api
.post( 'cloudflare_disconnect' )
.then( () => {
this.browserCachingStatus( 'refresh' );
window.wphbMixPanel.disableFeature( 'Cloudflare_integration' );
WPHB_Admin.notices.show(
__( 'Cloudflare was disconnected successfully.', 'wphb' )
);
} )
.catch( ( error ) => window.console.log( error ) );
}
/**
* Render component.
*
* @return {*} BrowserCachingPage.
*/
render() {
return (
{ this.state.showWizard &&
}
{ ! this.state.showWizard &&
}
);
}
}
BrowserCachingPage.propTypes = {
wphbData: PropTypes.object,
};
domReady( function() {
const browserCachingPageDiv = document.getElementById(
'wrap-wphb-browser-caching'
);
if ( browserCachingPageDiv ) {
ReactDOM.render(
/*** @var {object} window.wphb */
,
browserCachingPageDiv
);
}
} );