image-optimization
/
trunk
/
modules
/
optimization
/
assets
/
js
/
classes
/
control
/
control-sync.js
control-sync.js in Image Optimizer – Compress Images and Convert to WebP or AVIF 1.5.2, at trunk/modules/optimization/assets/js/classes/control/control-sync.js
| 1 | import API from '../api'; |
| 2 | import { SELECTORS } from '../../constants'; |
| 3 | import ControlMeta from './control-meta'; |
| 4 | import ControlStates from './control-states'; |
| 5 | |
| 6 | class ControlSync { |
| 7 | async run() { |
| 8 | const controls = document.querySelectorAll( SELECTORS.controlWrapperSelector ); |
| 9 | |
| 10 | if ( ! controls.length ) { |
| 11 | return; |
| 12 | } |
| 13 | |
| 14 | const imageIds = this.mapImageIds( controls ); |
| 15 | const { status } = await API.getOptimizationStatus( imageIds ); |
| 16 | |
| 17 | controls.forEach( ( controlWrapper ) => { |
| 18 | const imageId = new ControlMeta( controlWrapper ).getImageId(); |
| 19 | const currentStatus = new ControlMeta( controlWrapper ).getStatus(); |
| 20 | const imageData = status[ imageId ]; |
| 21 | const controlStates = new ControlStates( controlWrapper ); |
| 22 | |
| 23 | if ( currentStatus === imageData.status ) { |
| 24 | return; |
| 25 | } |
| 26 | |
| 27 | if ( controlWrapper.dataset.isFrozen === 'true' ) { |
| 28 | controlWrapper.dataset.isFrozen = false; |
| 29 | |
| 30 | return; |
| 31 | } |
| 32 | |
| 33 | if ( currentStatus === 'error' && ! new ControlMeta( controlWrapper ).allowRetry() ) { |
| 34 | return; |
| 35 | } |
| 36 | |
| 37 | switch ( imageData.status ) { |
| 38 | case 'optimization-in-progress': |
| 39 | controlStates.renderLoading( 'optimize' ); |
| 40 | |
| 41 | break; |
| 42 | |
| 43 | case 'reoptimizing-in-progress': |
| 44 | controlStates.renderLoading( 'reoptimize' ); |
| 45 | |
| 46 | break; |
| 47 | |
| 48 | case 'restoring-in-progress': |
| 49 | controlStates.renderLoading( 'restore' ); |
| 50 | |
| 51 | break; |
| 52 | |
| 53 | case 'not-optimized': |
| 54 | controlStates.renderNotOptimized(); |
| 55 | |
| 56 | break; |
| 57 | |
| 58 | case 'optimized': |
| 59 | const statsData = { |
| 60 | sizesOptimized: imageData.stats.optimized_image_count, |
| 61 | saved: { |
| 62 | absolute: imageData.stats.initial_image_size - imageData.stats.current_image_size, |
| 63 | relative: Math.max( 100 - Math.round( imageData.stats.current_image_size / imageData.stats.initial_image_size * 100 ), 0 ), |
| 64 | }, |
| 65 | }; |
| 66 | |
| 67 | controlStates.renderOptimized( statsData ); |
| 68 | |
| 69 | break; |
| 70 | |
| 71 | case 'optimization-failed': |
| 72 | controlStates.renderError( { |
| 73 | message: imageData.message, |
| 74 | imagesLeft: imageData.images_left, |
| 75 | action: 'optimize', |
| 76 | } ); |
| 77 | |
| 78 | break; |
| 79 | |
| 80 | case 'reoptimizing-failed': |
| 81 | controlStates.renderError( { |
| 82 | message: imageData.message, |
| 83 | imagesLeft: imageData.images_left, |
| 84 | action: 'reoptimize', |
| 85 | } ); |
| 86 | |
| 87 | break; |
| 88 | |
| 89 | case 'restoring-failed': |
| 90 | controlStates.renderError( { |
| 91 | message: imageData.message, |
| 92 | action: 'restore', |
| 93 | } ); |
| 94 | } |
| 95 | } ); |
| 96 | } |
| 97 | |
| 98 | mapImageIds( nodes ) { |
| 99 | return Array.prototype.map.call( |
| 100 | nodes, |
| 101 | ( node ) => new ControlMeta( node ).getImageId(), |
| 102 | ); |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | export default ControlSync; |
| 107 |