import { __ } from '@wordpress/i18n'; import { speak } from '@wordpress/a11y'; import { SELECTORS } from './constants'; import API from './classes/api'; import ControlSync from './classes/control/control-sync'; import ControlStates from './classes/control/control-states'; import ControlMeta from './classes/control/control-meta'; import OptimizationDetails from './classes/optimization-details'; class OptimizationControl { constructor() { this.controlSyncRequestInProgress = false; this.init(); this.controlSync = new ControlSync(); } init() { this.initEventListeners(); setInterval( () => this.runStatusCheckLoop(), 5000 ); } async runStatusCheckLoop() { if ( this.controlSyncRequestInProgress ) { return; } this.controlSyncRequestInProgress = true; await this.controlSync.run(); this.controlSyncRequestInProgress = false; } initEventListeners() { document.addEventListener( 'click', ( e ) => this.handleOptimizeButtonClick( e ) ); document.addEventListener( 'click', ( e ) => this.handleReoptimizeButtonClick( e ) ); document.addEventListener( 'click', ( e ) => this.handleRestoreButtonClick( e ) ); document.addEventListener( 'click', ( e ) => this.handleOptimizationDetailsOpen( e ) ); document.addEventListener( 'click', ( e ) => this.handleOptimizationDetailsClick( e ) ); } async handleOptimizeButtonClick( e ) { if ( ! e.target.closest( `${ SELECTORS.optimizeButtonSelector }, ${ SELECTORS.tryAgainOptimizeButtonSelector }` ) ) { return; } speak( __( 'Optimization is in progress', 'image-optimization' ), 'assertive' ); const controlWrapper = e.target.closest( SELECTORS.controlWrapperSelector ); const states = new ControlStates( controlWrapper ); states.renderLoading( 'optimize' ); try { controlWrapper.dataset.isFrozen = true; await API.optimizeSingleImage( { imageId: new ControlMeta( controlWrapper ).getImageId(), reoptimize: false, } ); } catch ( error ) { states.renderError( error ); } } async handleReoptimizeButtonClick( e ) { if ( ! e.target.closest( `${ SELECTORS.reoptimizeButtonSelector }, ${ SELECTORS.tryAgainReoptimizeButtonSelector }` ) ) { return; } speak( __( 'Reoptimizing is in progress', 'image-optimization' ), 'assertive' ); const controlWrapper = e.target.closest( SELECTORS.controlWrapperSelector ); const states = new ControlStates( controlWrapper ); states.renderLoading( 'reoptimize' ); try { controlWrapper.dataset.isFrozen = true; await API.optimizeSingleImage( { imageId: new ControlMeta( controlWrapper ).getImageId(), reoptimize: true, } ); } catch ( error ) { states.renderError( error ); } } async handleRestoreButtonClick( e ) { if ( ! e.target.closest( `${ SELECTORS.restoreButtonSelector }, ${ SELECTORS.tryAgainRestoreButtonSelector }` ) ) { return; } speak( __( 'Image restoring is in progress', 'image-optimization' ), 'assertive' ); const controlWrapper = e.target.closest( SELECTORS.controlWrapperSelector ); const states = new ControlStates( controlWrapper ); states.renderLoading( 'restore' ); try { controlWrapper.dataset.isFrozen = true; await API.restoreSingleImage( new ControlMeta( controlWrapper ).getImageId() ); } catch ( error ) { states.renderError( error ); } } async handleOptimizationDetailsOpen( e ) { if ( ! e.target.closest( `${ SELECTORS.optimizationDetailsButtonSelector }` ) ) { return; } const controlWrapper = e.target.closest( SELECTORS.controlWrapperSelector ); const imageId = new ControlMeta( controlWrapper ).getImageId(); try { OptimizationDetails.initModal(); OptimizationDetails.renderLoading(); const details = await API.getOptimizationDetails( imageId ); OptimizationDetails.openModal(); OptimizationDetails.renderData( imageId, details ); } catch ( error ) { OptimizationDetails.openModal(); OptimizationDetails.renderError( error.message ); } } async handleOptimizationDetailsClick( e ) { if ( ! e.target.closest( `${ SELECTORS.optimizationDetailsOptimizeButtonSelector }` ) ) { return; } const imageId = parseInt( e.target.dataset?.imageId, 10 ); await API.optimizeSingleImage( { imageId } ); const controlWrapper = document.querySelector( `.image-optimization-control[data-image-optimization-image-id="${ imageId }"]` ); if ( controlWrapper ) { new ControlStates( controlWrapper ).renderLoading( 'optimize' ); } OptimizationDetails.closeModal(); } } export default OptimizationControl; { "name": "woocommerce/product-image", "title": "Product Image", "description": "Display the main product image.", "category": "woocommerce-product-elements", "attributes": { "showProductLink": { "type": "boolean", "default": true }, "showSaleBadge": { "type": "boolean", "default": true }, "saleBadgeAlign": { "type": "string", "default": "right" }, "imageSizing": { "type": "string", "default": "single" }, "productId": { "type": "number", "default": 0 }, "isDescendentOfQueryLoop": { "type": "boolean", "default": false }, "isDescendentOfSingleProductBlock": { "type": "boolean", "default": false }, "width": { "type": "string" }, "height": { "type": "string" }, "scale": { "type": "string", "default": "cover" }, "aspectRatio": { "type": "string" } }, "supports": { "interactivity": { "clientNavigation": true }, "html": false, "__experimentalBorder": { "radius": true, "__experimentalSkipSerialization": true }, "typography": { "fontSize": true, "__experimentalSkipSerialization": true }, "spacing": { "margin": true, "padding": true }, "dimensions": { "aspectRatio": true, "__experimentalSkipSerialization": true }, "email": true }, "selectors": { "root": ".wp-block-woocommerce-product-image.wc-block-components-product-image, .wp-block-woocommerce-product-image .wc-block-components-product-image" }, "ancestor": [ "woocommerce/all-products", "woocommerce/single-product", "woocommerce/product-template", "core/post-template" ], "usesContext": [ "imageId", "postId", "query", "queryId" ], "keywords": [ "WooCommerce" ], "textdomain": "woocommerce", "apiVersion": 3, "$schema": "https://schemas.wp.org/trunk/block.json" } Les Filles du Thé https://validator.w3.org/feed/docs/rss2.html 0 COMMANDES La Maison de Thé Où trouver nos thés ? Commencez ici Comment faire son Thé Glacé Maison ? Les Secrets de Fabrication du Thé Mojito signé Les Filles du Thé ! 2 ASTUCES POUR MIEUX GÉRER SON STOCK DE THÉ Boîte à outils 4/12 : Les Filles du Thé à Valenciennes : Long Jing & Grand Yunnan chez IsaBella -FERME- O goût thé à Toulon : Le home sweet home du salon de thé ! -FERME- 11/12 : Reporters pour les Filles du Thé à Toulon – Multiples dégustations O goût thé! -FERME- 9/12 : Les Filles du Thé de retour à Bruxelles : Jade de Dong Ding & Rou gui Que boire le matin pour avoir la même forme qu’Antoine Griezmann ? Un Darjeeling dans la baignoire … le Singtom FF ! 12/12 : Les Filles du Thé de retour à Lille : Thé au jasmin & Matcha Genmaïcha chez Caféine Coffee Caféine Coffee, un concept au service de nos papilles ! Tendance et moderne, la dégustation de thé au IsaBella à Valenciennes – FERME- 3/12 : Les Filles du Thé à Bruxelles : Bai mu dan et Pu Er à La Mercerie -FERME- La Mercerie : un salon enchanté à Bruxelles – FERME 2/12 : Les Filles du Thé à Lille, Tamaryokucha et Ben Shan Un fondant aux Azukis façon les Filles du Thé Comment faire le tour du monde en Pizza ? Recettes Le Five Minutes Gasmatcha ? Qu’est-ce-que c’est que ça ? Merci beaucoup ! Bien-être comme Thé Taormina, « Saint Tropez » de la Sicile mais pas que…Quel rapport avec les Filles du Thé ? Le goût du gras… une nouvelle saveur ! Peut-on la retrouver dans le Thé ? Ou peut-elle aller se « Gras Thé » ? Darjeeling : les 4 indispensables pour choisir un Champagne des Thés plutôt qu’un Champony ! Darjeeling, une ville, une région, des Thés, un Champagne et une histoire ! Retour à l’Otaku pour l’interview d’une des Filles du Thé par Weskhy TV ! Toute la vérithé sur les propriétés du Thé Vert ! Les Thés Verts de Chine, comment les préparer pour profiter de tous leurs secrets ? Les Thés Verts de Chine : Qui sont-ils ? Lorsque Michel Cymes conseille aux cerveaux des Filles du Thé de « S’hydrater au Thé Vert » Le Thé blanc, comment profiter de toutes ses subtilités ? Le Thé Blanc : Qui est-il? L’Otaku, Thés et Mangas jusqu’au bout des doigts ! L’esprit du « Cha-Zen » chez Jugetsudo – Paris Le Pu Er | Comment le préparer pour profiter de tous ses bienfaits pour la santé? Le Pu Er, le Thé Sombre anti gueule de bois et notre meilleur ami des lendemains de fêtes. Le Pu Er | qui est-il ? Brownies au Pu Er, une recette qui rime avec bien être ! Le Parti du Thé ou le Paradis des Thés Japonais A propos Quelle bouilloire choisir pour que le mauvais thé ne soit plus une fatalité ? Une Fin d’année très Chakaiclub pour les Filles du Thé ! Dammann Frères, Paris 1692… tout est dit ! Bonne année et surtout bonne sant(h)é ! Interview | Kosyuen, LE salon de Thé JAPONAIS à PARIS