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"
}
Le thé du Lumeçon | Les Filles du Thé
Aller au contenu
Une fiche tout aussi particulière que celle du thé du Petit Singe , il s’agit également d’un thé aromatisé !
Nom : Le thé du Lumeçon
Couleur/type : Thé vert
Lieu de création : Mons (Belgique)
Lieu de vente : L’instant Thé à Mons
Histoire : Pourquoi Le Thé du Lumeçon ?
Lui aussi a été créé spécialement pour l’Instant Thé en lien avec le folklore Montois.
Le Lumeçon est un combat entre Saint Georges (le bien) et le dragon (le mal). Il a lieu sur la Grand’Place de Mons le dimanche de la Trinité et se termine à 13 heures précises.
Saint Georges, symbolisant le Bien, est chargé de mettre hors d’état de nuire le dragon, symbolisant le Mal, monstre géant d’osier qui mesure une dizaine de mètres.
Saint Georges tourne dans l’arène dans le sens des aiguilles d’une montre, le dragon tourne dans le sens contraire. symbolisant à la fois l’opposition du bien et du mal et de l’ordre et du désordre.
Le combat se termine suite à plusieurs tentatives de Saint Georges contre le dragon. Ce dernier sera terrassé après deux tentatives infructueuses de coup de pistolet. C’est le troisième coup qui mettra fin au combat.
Pendant toute la durée du combat, les porteurs du dragon font plonger la queue dans le public qui tente alors de s’emparer du crin et des rubans qui la constitue : ils sont censés porter bonheur.
Composition :
Le Thé du Lumeçon est composé de Thé vert à 92% accompagné de fruits rouges (morceaux de cerise, de groseilles séchées), de fleurs de bleuet rose et d’arôme de cassis.
Les conseils des Filles du Thé
Pour choisir : Les amateurs de thés aromatisés aux fruits rouges, Ce thé est fait pour vous !
Pour préparer : Rien de plus simple : Infuser pendant 2-3 min , 2g de Lumeçon dans 30 cl d’eau à 80°C.
Pour déguster : Vous retrouverez les saveurs du combat dans le thé du Lumeçon. A déguster le jour de la trinité !