@@ -7,7 +7,6 @@ import { visualBuilderStyles } from "../visualBuilder.style";
77const VARIANT_UPDATE_DELAY_MS : Readonly < number > = 8000 ;
88
99type OnAudienceModeVariantPatchUpdate = {
10- expectedCSLPValues : Record < "variant" | "base" , string > ;
1110 highlightVariantFields : boolean ;
1211} ;
1312
@@ -24,71 +23,93 @@ export function useRecalculateVariantDataCSLPValues(): void {
2423 }
2524 ) ;
2625}
27-
2826function updateVariantClasses ( {
29- expectedCSLPValues,
3027 highlightVariantFields,
3128} : OnAudienceModeVariantPatchUpdate ) : void {
32- const variantElement = document . querySelector (
33- `[${ DATA_CSLP_ATTR_SELECTOR } ="${ expectedCSLPValues . variant } "]`
29+ const variant = VisualBuilder . VisualBuilderGlobalState . value . variant ;
30+ const observers : MutationObserver [ ] = [ ] ;
31+
32+ // Helper function to update element classes
33+ const updateElementClasses = (
34+ element : HTMLElement ,
35+ dataCslp : string ,
36+ observer : MutationObserver
37+ ) => {
38+ if ( ! dataCslp ) return ;
39+
40+ if (
41+ dataCslp . startsWith ( "v2:" ) &&
42+ element . classList . contains ( "visual-builder__base-field" )
43+ ) {
44+ element . classList . remove ( "visual-builder__base-field" ) ;
45+ if ( highlightVariantFields ) {
46+ element . classList . add (
47+ visualBuilderStyles ( ) [ "visual-builder__variant-field" ] ,
48+ "visual-builder__variant-field"
49+ ) ;
50+ } else {
51+ element . classList . add ( "visual-builder__variant-field" ) ;
52+ }
53+ } else if (
54+ ! dataCslp . startsWith ( "v2:" ) &&
55+ element . classList . contains ( "visual-builder__variant-field" )
56+ ) {
57+ element . classList . remove (
58+ visualBuilderStyles ( ) [ "visual-builder__variant-field" ] ,
59+ "visual-builder__variant-field"
60+ ) ;
61+ element . classList . add ( "visual-builder__base-field" ) ;
62+ } else if (
63+ dataCslp . startsWith ( "v2:" ) &&
64+ variant &&
65+ ! dataCslp . includes ( variant ) &&
66+ element . classList . contains ( "visual-builder__variant-field" )
67+ ) {
68+ element . classList . remove (
69+ visualBuilderStyles ( ) [ "visual-builder__variant-field" ] ,
70+ "visual-builder__variant-field"
71+ ) ;
72+ element . classList . add ( "visual-builder__disabled-variant-field" ) ;
73+ }
74+
75+ // Disconnect this observer after processing
76+ observer . disconnect ( ) ;
77+ const index = observers . indexOf ( observer ) ;
78+ if ( index > - 1 ) {
79+ observers . splice ( index , 1 ) ;
80+ }
81+ } ;
82+
83+ // Create a separate observer for each element
84+ const elementsWithCslp = document . querySelectorAll (
85+ `[${ DATA_CSLP_ATTR_SELECTOR } ]`
3486 ) ;
35- if ( variantElement ) {
36- // No need to recalculate classList for variant fields
37- return ;
38- } else {
39- const baseElement = document . querySelector (
40- `[${ DATA_CSLP_ATTR_SELECTOR } ="${ expectedCSLPValues . base } "]`
41- ) ;
42- if ( ! baseElement ) return ;
4387
44- let hasObserverDisconnected = false ;
45- let timeoutId : ReturnType < typeof setTimeout > | null = null ;
88+ elementsWithCslp . forEach ( ( elementNode ) => {
89+ const element = elementNode as HTMLElement ;
4690
47- const observer = new MutationObserver ( ( mutations , obs ) => {
91+ const observer = new MutationObserver ( ( mutations ) => {
4892 mutations . forEach ( ( mutation ) => {
4993 if (
5094 mutation . type === "attributes" &&
5195 mutation . attributeName === DATA_CSLP_ATTR_SELECTOR
5296 ) {
53- const element = mutation . target as HTMLElement ;
5497 const dataCslp = element . getAttribute (
5598 DATA_CSLP_ATTR_SELECTOR
5699 ) ;
57- if ( ! dataCslp ) return ;
58- if (
59- dataCslp . startsWith ( "v2:" ) &&
60- element . classList . contains ( "visual-builder__base-field" )
61- ) {
62- element . classList . remove ( "visual-builder__base-field" ) ;
63- if ( highlightVariantFields ) {
64- // Append class and styles
65- element . classList . add (
66- visualBuilderStyles ( ) [
67- "visual-builder__variant-field"
68- ] ,
69- "visual-builder__variant-field"
70- ) ;
71- } else {
72- // Append only class
73- element . classList . add (
74- "visual-builder__variant-field"
75- ) ;
76- }
77- }
78- obs . disconnect ( ) ;
79- hasObserverDisconnected = true ;
80- return ;
100+ updateElementClasses ( element , dataCslp || "" , observer ) ;
81101 }
82102 } ) ;
83- if ( ! hasObserverDisconnected && ! timeoutId ) {
84- // disconnect the observer whether we found the new instance or not after timeout
85- timeoutId = setTimeout ( ( ) => {
86- obs . disconnect ( ) ;
87- hasObserverDisconnected = false ;
88- } , VARIANT_UPDATE_DELAY_MS ) ;
89- }
90103 } ) ;
91104
92- observer . observe ( baseElement , { attributes : true } ) ;
93- }
105+ observers . push ( observer ) ;
106+ observer . observe ( element , { attributes : true } ) ;
107+ } ) ;
108+
109+ setTimeout ( ( ) => {
110+ if ( observers . length > 0 ) {
111+ observers . forEach ( ( observer ) => observer . disconnect ( ) ) ;
112+ observers . length = 0 ;
113+ }
114+ } , VARIANT_UPDATE_DELAY_MS ) ;
94115}
0 commit comments