268 lines
5.9 KiB
JavaScript
268 lines
5.9 KiB
JavaScript
|
/* global WP_Smush */
|
||
|
|
||
|
/**
|
||
|
* Abstract Media Library Scanner.
|
||
|
*
|
||
|
*/
|
||
|
import Fetcher from '../utils/fetcher';
|
||
|
import { scanProgressBar } from './progressbar';
|
||
|
import { GlobalStats } from './globalStats';
|
||
|
const { __ } = wp.i18n;
|
||
|
export default class MediaLibraryScanner {
|
||
|
constructor() {
|
||
|
this.autoSyncDuration = 1500;
|
||
|
this.progressTimeoutId = 0;
|
||
|
this.scanProgress = scanProgressBar( this.autoSyncDuration );
|
||
|
}
|
||
|
|
||
|
startScan( optimizeOnScanCompleted = false ) {
|
||
|
this.onStart();
|
||
|
return Fetcher.scanMediaLibrary.start( optimizeOnScanCompleted ).then( ( response ) => {
|
||
|
if ( ! response?.success ) {
|
||
|
this.onStartFailure( response );
|
||
|
return;
|
||
|
}
|
||
|
this.showProgressBar().autoSyncStatus();
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
onStart() {
|
||
|
// Do nothing at the moment.
|
||
|
}
|
||
|
|
||
|
onStartFailure( response ) {
|
||
|
WP_Smush.helpers.showNotice( response, {
|
||
|
showdismiss: true,
|
||
|
autoclose: false,
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
showProgressBar() {
|
||
|
this.onShowProgressBar();
|
||
|
this.scanProgress.reset().setOnCancelCallback( this.showStopScanningModal.bind( this ) ).open();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
onShowProgressBar() {
|
||
|
// Do nothing at the moment.
|
||
|
}
|
||
|
|
||
|
showStopScanningModal() {
|
||
|
if ( ! window.SUI ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.onShowStopScanningModal();
|
||
|
|
||
|
window.SUI.openModal(
|
||
|
'smush-stop-scanning-dialog',
|
||
|
'wpbody-content',
|
||
|
undefined,
|
||
|
false
|
||
|
);
|
||
|
}
|
||
|
|
||
|
onShowStopScanningModal() {
|
||
|
this.registerCancelProcessEvent();
|
||
|
}
|
||
|
|
||
|
registerCancelProcessEvent() {
|
||
|
const stopScanButton = document.querySelector( '.smush-stop-scanning-dialog-button' );
|
||
|
if ( ! stopScanButton ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
stopScanButton.addEventListener( 'click', this.cancelProgress.bind( this ) );
|
||
|
}
|
||
|
|
||
|
closeStopScanningModal() {
|
||
|
if ( ! window.SUI ) {
|
||
|
return;
|
||
|
}
|
||
|
const stopScanningElement = document.querySelector( '#smush-stop-scanning-dialog' );
|
||
|
const isModalClosed = ( ! stopScanningElement ) || ! stopScanningElement.classList.contains( 'sui-content-fade-in' );
|
||
|
if ( isModalClosed ) {
|
||
|
return;
|
||
|
}
|
||
|
window.SUI.closeModal( 'smush-stop-scanning-dialog' );
|
||
|
}
|
||
|
|
||
|
closeProgressBar() {
|
||
|
this.onCloseProgressBar();
|
||
|
this.scanProgress.close();
|
||
|
}
|
||
|
|
||
|
onCloseProgressBar() {
|
||
|
// Do nothing at the moment.
|
||
|
}
|
||
|
|
||
|
updateProgress( stats ) {
|
||
|
const totalItems = this.getTotalItems( stats );
|
||
|
const processedItems = this.getProcessedItems( stats );
|
||
|
|
||
|
return this.scanProgress.update( processedItems, totalItems );
|
||
|
}
|
||
|
|
||
|
getProcessedItems( stats ) {
|
||
|
return stats?.processed_items || 0;
|
||
|
}
|
||
|
|
||
|
getTotalItems( stats ) {
|
||
|
return stats?.total_items || 0;
|
||
|
}
|
||
|
|
||
|
cancelProgress() {
|
||
|
this.scanProgress.setCancelButtonOnCancelling();
|
||
|
return Fetcher.scanMediaLibrary.cancel().then( ( response ) => {
|
||
|
if ( ! response?.success ) {
|
||
|
this.onCancelFailure( response );
|
||
|
return;
|
||
|
}
|
||
|
this.onCancelled( response.data );
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
onCancelFailure( response ) {
|
||
|
WP_Smush.helpers.showNotice( response, {
|
||
|
showdismiss: true,
|
||
|
autoclose: false,
|
||
|
} );
|
||
|
this.scanProgress.resetCancelButtonOnFailure();
|
||
|
}
|
||
|
|
||
|
getErrorProgressMessage() {
|
||
|
return __( 'Unfortunately the scan hit an error due to limited resources on your site, we have adjusted the scan to use fewer resources the next time.', 'wp-smushit' );
|
||
|
}
|
||
|
|
||
|
onDead( stats ) {
|
||
|
this.clearProgressTimeout();
|
||
|
this.closeProgressBar();
|
||
|
this.closeStopScanningModal();
|
||
|
this.showRetryScanModal();
|
||
|
}
|
||
|
|
||
|
showRetryScanModal() {
|
||
|
const retryScanModalElement = document.getElementById( 'smush-retry-scan-notice' );
|
||
|
if ( ! window.SUI || ! retryScanModalElement ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
retryScanModalElement.querySelector('.smush-retry-scan-notice-button').onclick = (e) => {
|
||
|
window.SUI.closeModal( 'smush-retry-scan-notice' );
|
||
|
const recheckImagesBtn = document.querySelector( '.wp-smush-scan' );
|
||
|
if ( ! recheckImagesBtn ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
e.preventDefault();
|
||
|
recheckImagesBtn.click();
|
||
|
}
|
||
|
|
||
|
window.SUI.openModal(
|
||
|
'smush-retry-scan-notice',
|
||
|
'wpbody-content',
|
||
|
undefined,
|
||
|
false
|
||
|
);
|
||
|
}
|
||
|
|
||
|
onCompleted( stats ) {
|
||
|
this.onFinish( stats );
|
||
|
}
|
||
|
|
||
|
onCancelled( stats ) {
|
||
|
this.onFinish( stats );
|
||
|
}
|
||
|
|
||
|
onFinish( stats ) {
|
||
|
this.clearProgressTimeout();
|
||
|
const globalStats = stats?.global_stats;
|
||
|
this.updateGlobalStatsAndBulkContent( globalStats );
|
||
|
this.closeProgressBar();
|
||
|
this.closeStopScanningModal();
|
||
|
}
|
||
|
|
||
|
clearProgressTimeout() {
|
||
|
if ( this.progressTimeoutId ) {
|
||
|
clearTimeout( this.progressTimeoutId );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
updateGlobalStatsAndBulkContent( globalStats ) {
|
||
|
if ( ! globalStats ) {
|
||
|
return;
|
||
|
}
|
||
|
GlobalStats.updateGlobalStatsFromSmushScriptData( globalStats );
|
||
|
GlobalStats.renderStats();
|
||
|
}
|
||
|
|
||
|
getStatus() {
|
||
|
return Fetcher.scanMediaLibrary.getScanStatus();
|
||
|
}
|
||
|
|
||
|
autoSyncStatus() {
|
||
|
const startTime = new Date().getTime();
|
||
|
this.getStatus().then( ( response ) => {
|
||
|
if ( ! response?.success ) {
|
||
|
return;
|
||
|
}
|
||
|
const stats = response.data;
|
||
|
|
||
|
if ( stats.is_dead ) {
|
||
|
this.onDead( response.data );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.beforeUpdateStatus( stats );
|
||
|
|
||
|
this.updateProgress( stats ).then( () => {
|
||
|
this.scanProgress.increaseDurationToHaveChangeOnProgress( new Date().getTime() - startTime );
|
||
|
|
||
|
const isCompleted = stats?.is_completed;
|
||
|
if ( isCompleted ) {
|
||
|
this.onCompleted( stats );
|
||
|
return;
|
||
|
}
|
||
|
const isCancelled = stats?.is_cancelled;
|
||
|
if ( isCancelled ) {
|
||
|
this.onCancelled( stats );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.progressTimeoutId = setTimeout( () => this.autoSyncStatus(), this.autoSyncDuration );
|
||
|
} );
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
beforeUpdateStatus() {
|
||
|
// Do nothing at the moment.
|
||
|
}
|
||
|
|
||
|
setInnerText( element, newText ) {
|
||
|
if ( ! element ) {
|
||
|
return;
|
||
|
}
|
||
|
element.dataset.originalText = element.dataset.originalText || element.innerText.trim();
|
||
|
element.innerText = newText;
|
||
|
}
|
||
|
|
||
|
revertInnerText( element ) {
|
||
|
if ( ! element || ! element.dataset.originalText ) {
|
||
|
return;
|
||
|
}
|
||
|
element.innerText = element.dataset.originalText.trim();
|
||
|
}
|
||
|
|
||
|
hideAnElement( element ) {
|
||
|
if ( element ) {
|
||
|
element.classList.add( 'sui-hidden' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
showAnElement( element ) {
|
||
|
if ( element ) {
|
||
|
element.classList.remove( 'sui-hidden' );
|
||
|
}
|
||
|
}
|
||
|
}
|