Skip to content

Synchronisation de l'Éditeur Visuel (Ghost Mode) ​

Vue d'ensemble ​

Le mode Ghost permet une édition interactive en direct. L'application Display (TV) envoie des intentions d'édition au CMS, qui effectue les mutations dans Directus et renvoie des aperçus ciblés via postMessage.

Flux de Mise à Jour (CMS vers Display) ​

Lorsqu'une modification est effectuée dans le CMS, celui-ci envoie un message UPDATE_CONTENT_PREVIEW contenant :

  1. Le payload partiel ou complet de l'objet modifié.
  2. Un syncId unique (nonce) identifiant la transaction de synchronisation.

Traitement côté Display (cmsPreviewSync.ts) ​

À la réception d'un UPDATE_CONTENT_PREVIEW :

  • Invalidation du cache : Le service appelle invalidateAdvertisingStoreCache(). C'est une Ă©tape cruciale car le advertisingStore possède des optimisations de cache qui bloqueraient sinon le rafraĂ®chissement des donnĂ©es du carrousel si l'ID de la publicitĂ© reste le mĂŞme.
  • Mise Ă  jour du pipeline : Les donnĂ©es locales de la facility sont mises Ă  jour via cmsPipelineService.updateFacilityData.
  • ÉvĂ©nement local : Un Ă©vĂ©nement live_content_update est dispatchĂ© sur window. Le syncId est injectĂ© dans les dĂ©tails de l'Ă©vĂ©nement sous la propriĂ©tĂ© __syncId.
  • Acquittement : Une confirmation VISUAL_EDITOR_SYNC_DONE est renvoyĂ©e au CMS.

Réactivité Instantanée des Assets ​

Pour garantir que les images (fonds de slide) se mettent à jour sans rechargement de page, l'application utilise un mécanisme de "Fast Track" synchrone.

Gestion du Fond de Slide (HeroShowcase.svelte) ​

Le fond de la slide active est piloté par la variable liveBackdropUrl, calculée réactivement à partir de localizedActiveContent.

Pour forcer le navigateur à rafraîchir l'image (même si l'URL semble identique), nous utilisons le syncId comme paramètre de version :

typescript
const syncId = (localizedActiveContent as any)?.__syncId;
const ghostBuster = $isGhostModeActive && syncId ? `?v=${syncId}` : '';
liveBackdropUrl = `${getAssetUrl(coverId)}${ghostBuster}`;

Avantages de l'approche par syncId : ​

  • StabilitĂ© : Contrairement Ă  un timestamp Date.now(), le syncId ne change que lorsque le CMS confirme rĂ©ellement une modification.
  • Économie de bande passante : Le navigateur ne recharge l'asset que s'il a rĂ©ellement Ă©tĂ© modifiĂ© cĂ´tĂ© serveur.
  • ZĂ©ro Clignotement : Évite les rafraĂ®chissements d'images lors de l'Ă©dition de simples champs textuels (car le syncId des textes est diffĂ©rent ou gĂ©rĂ© sĂ©parĂ©ment).

Identité du Carrousel ​

Les éléments du carrousel sont identifiés par leur carouselItemId (ID de la table de jonction Directus). C'est cet ID qui doit être utilisé pour toutes les opérations de déplacement (MOVE) ou de retrait (REMOVE), car le content.id n'est pas unique au sein d'un même carrousel.

Fichiers de Référence ​

  • Contrat technique : src/lib/types/visual-editor.ts
  • Service de synchro : src/lib/services/cmsPreviewSync.ts
  • Composant de rendu : src/lib/heroShowcase/HeroShowcase.svelte
  • Invalidateur de cache : src/lib/stores/advertisingStore.ts