/* global WPHB_Admin */ /** * External dependencies */ import React from 'react'; import classNames from 'classnames'; /** * WordPress dependencies */ const { __ } = wp.i18n; /** * Internal dependencies */ import Assets from './assets'; import Configurations from './configurations'; import Icon from '../../components/sui-icon'; import Tag from '../../components/sui-tag'; import Toggle from '../../components/sui-toggle'; import BoxBuilderField from '../../components/sui-box-builder/field'; /** * AutoAssets component. * * @since 3.3.0 */ export default class AutoAssets extends React.Component { /** * Component constructor. * * @param {Object} props */ constructor( props ) { super( props ); this.state = { loading: this.props.loading, type: 'speedy', // Accepts: 'speedy' or 'basic'. assets: { styles: {}, scripts: {}, }, enabled: { styles: true, scripts: true, fonts: true, }, exclusions: { styles: [], scripts: [], }, }; this.resetSettings = this.resetSettings.bind( this ); this.handleToggleChange = this.handleToggleChange.bind( this ); this.updateCheckBox = this.updateCheckBox.bind( this ); this.updateExclusions = this.updateExclusions.bind( this ); this.saveSettings = this.saveSettings.bind( this ); } /** * Invoked immediately after a component is mounted. */ componentDidMount() { this.props.api .post( 'minify_auto_status' ) .then( ( response ) => { this.setState( { loading: false, type: response.type, assets: response.assets, enabled: response.enabled, exclusions: response.exclusions, } ); } ) .catch( ( error ) => window.console.log( error ) ); } /** * Reset asset optimization settings. */ resetSettings() { this.setState( { loading: true } ); this.props.api .post( 'minify_reset_settings' ) .then( () => { WPHB_Admin.notices.show( __( 'Settings restored to defaults', 'wphb' ) ); this.setState( { loading: false, enabled: { styles: true, scripts: true, fonts: true, }, exclusions: { styles: [], scripts: [], }, } ); } ) .catch( ( error ) => window.console.log( error ) ); } /** * Handle toggle click (Speedy/Basic). * * @param {Object} e Event. */ handleToggleChange( e ) { if ( ! e.target.checked ) { return; } this.setState( { type: e.target.dataset.type, } ); } /** * Update files checkbox states. * * @param {Object} e */ updateCheckBox( e ) { if ( 'undefined' === e.target.id ) { return; } const enabled = { styles: this.state.enabled.styles, scripts: this.state.enabled.scripts, fonts: this.state.enabled.fonts, }; if ( 'wphb-auto-css' === e.target.id ) { enabled.styles = e.target.checked; } if ( 'wphb-auto-js' === e.target.id ) { enabled.scripts = e.target.checked; } if ( 'wphb-auto-fonts' === e.target.id ) { enabled.fonts = e.target.checked; } this.setState( { enabled } ); } /** * Update exclusions list. * * @param {Object} e */ updateExclusions( e ) { if ( ! e.target.value ) { return; } const selected = jQuery( '#wphb-auto-exclude' ).find( ':selected' ); const exclusions = { styles: [], scripts: [] }; for ( let i = 0; i < selected.length; ++i ) { /** * Our values in select are in the format of -. * So we separate the string into type and handle values. */ const type = selected[ i ].value.slice( 0, selected[ i ].value.indexOf( '-' ) ); const handle = selected[ i ].value.slice( selected[ i ].value.indexOf( '-' ) + 1 ); exclusions[ type ].push( handle ); } this.setState( { exclusions } ); } /** * Save asset optimization settings. */ saveSettings() { this.setState( { loading: true } ); const settings = { type: this.state.type, styles: this.state.enabled.styles, scripts: this.state.enabled.scripts, fonts: this.state.enabled.fonts, exclusions: this.state.exclusions, }; this.props.api .post( 'minify_auto_save_settings', settings ) .then( ( r ) => { // Automatic type has not changed. if ( 'undefined' !== typeof r.notice && false === r.notice ) { WPHB_Admin.notices.show(); } else { window.wphbMixPanel.trackAOUpdated( { 'Mode': 'undefined' === typeof r.type ? this.state.type : r.type, 'assets_found': wphb.stats.assetsFound, 'total_files': wphb.stats.totalFiles, 'filesize_reductions': wphb.stats.filesizeReductions, } ); WPHB_Admin.notices.show( r.notice, 'success', false ); // Allow opening a "how-to" modal from the notice. const noticeLink = document.getElementById( 'wphb-basic-hdiw-link' ); if ( noticeLink ) { noticeLink.addEventListener( 'click', () => { window.SUI.closeNotice( 'wphb-ajax-update-notice' ); window.SUI.openModal( 'automatic-ao-hdiw-modal-content', 'automatic-ao-hdiw-modal-expand' ); } ); } } const type = 'undefined' === typeof r.type ? this.state.type : r.type; this.setState( { loading: false, type, assets: r.assets, enabled: r.enabled, exclusions: r.exclusions, } ); } ) .catch( ( error ) => window.console.log( error ) ); } /** * Speedy view toggle. * * @return {JSX.Element} BoxBuilderField element. */ speedyView() { return ( } class={ classNames( { 'wphb-close-section': 'basic' === this.state.type } ) } description={ __( 'Speedy Optimization goes beyond just compressing your files. It also auto-combines smaller files together to help decrease the number of requests made when a page is loaded, and automatic font optimization will speed up the delivery of fonts to improve your site score.', 'wphb' ) } label={ { __( 'Speedy', 'wphb' ) } } /> ); } /** * Basic view toggle. * * @return {JSX.Element} BoxBuilderField element. */ basicView() { return ( } class={ classNames( { 'wphb-close-section': 'speedy' === this.state.type, } ) } description={ __( 'Basic Optimization will optimize your files by compressing them. This helps to improve site speed by de-cluttering CSS and JavaScript files, and by generating a faster version of each file.', 'wphb' ) } label={ { __( 'Basic', 'wphb' ) } } /> ); } /** * Render component. * * @return {JSX.Element} Assets component. */ render() { return ( { this.speedyView() } { this.basicView() } } /> ); } }