Skip to content

Commit bd71fb4

Browse files
committed
fix(VE-5061): refactor handleBuilderInteraction
1 parent e0869b5 commit bd71fb4

1 file changed

Lines changed: 102 additions & 63 deletions

File tree

src/visualBuilder/listeners/mouseClick.ts

Lines changed: 102 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -81,43 +81,24 @@ async function handleBuilderInteraction(
8181
}
8282

8383
const eventDetails = getCsDataOfElement(params.event);
84-
visualBuilderPostMessage
85-
?.send(VisualBuilderPostMessageEvents.MOUSE_CLICK, {
86-
cslpData: eventDetails?.cslpData,
87-
fieldMetadata: eventDetails?.fieldMetadata,
88-
})
89-
.catch((err) => {
90-
console.warn("Error while sending post message", err);
91-
});
84+
85+
// Send mouse click post message
86+
sendMouseClickPostMessage(eventDetails);
87+
9288
if (
9389
!eventDetails ||
9490
!params.overlayWrapper ||
9591
!params.visualBuilderContainer
9692
) {
9793
return;
9894
}
99-
const { editableElement, fieldMetadata } = eventDetails;
10095

101-
if (
102-
(VisualBuilder.VisualBuilderGlobalState.value
103-
.previousSelectedEditableDOM &&
104-
VisualBuilder.VisualBuilderGlobalState.value
105-
.previousSelectedEditableDOM !== editableElement) ||
106-
params.reEvaluate
107-
) {
108-
cleanIndividualFieldResidual({
109-
overlayWrapper: params.overlayWrapper,
110-
visualBuilderContainer: params.visualBuilderContainer,
111-
focusedToolbar: params.focusedToolbar,
112-
resizeObserver: params.resizeObserver,
113-
});
114-
}
96+
const { editableElement, fieldMetadata } = eventDetails;
97+
// Clean residuals if necessary
98+
cleanResidualsIfNeeded(params, editableElement);
11599

116-
// if the selected element is our empty block element, return
117-
if (
118-
editableElement.classList.contains(VB_EmptyBlockParentClass) ||
119-
editableElement.classList.contains("visual-builder__empty-block")
120-
) {
100+
// Return if the selected element is an empty block
101+
if (isEmptyBlockElement(editableElement)) {
121102
return;
122103
}
123104

@@ -129,15 +110,87 @@ async function handleBuilderInteraction(
129110
VisualBuilder.VisualBuilderGlobalState.value
130111
.previousSelectedEditableDOM;
131112
if (
132-
previousSelectedElement &&
133-
previousSelectedElement === editableElement &&
134-
!params.reEvaluate
113+
isSameSelectedElement(previousSelectedElement, editableElement, params)
135114
) {
136115
return;
137116
}
138117

139118
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =
140119
editableElement;
120+
121+
// Add overlay and focused toolbar
122+
addOverlayAndToolbar(params, eventDetails, editableElement);
123+
124+
const { cslpValue } = fieldMetadata;
125+
126+
toggleHighlightedCommentIconDisplay(cslpValue, false);
127+
128+
// Handle field schema and individual fields
129+
await handleFieldSchemaAndIndividualFields(
130+
params,
131+
eventDetails,
132+
fieldMetadata,
133+
editableElement
134+
);
135+
136+
// Observe changes to the editable element
137+
observeEditableElementChanges(params, editableElement);
138+
}
139+
140+
function sendMouseClickPostMessage(eventDetails: any) {
141+
visualBuilderPostMessage
142+
?.send(VisualBuilderPostMessageEvents.MOUSE_CLICK, {
143+
cslpData: eventDetails?.cslpData,
144+
fieldMetadata: eventDetails?.fieldMetadata,
145+
})
146+
.catch((err) => {
147+
console.warn("Error while sending post message", err);
148+
});
149+
}
150+
function cleanResidualsIfNeeded(
151+
params: HandleBuilderInteractionParams,
152+
editableElement: Element
153+
) {
154+
const previousSelectedElement =
155+
VisualBuilder.VisualBuilderGlobalState.value
156+
.previousSelectedEditableDOM;
157+
if (
158+
(previousSelectedElement &&
159+
previousSelectedElement !== editableElement) ||
160+
params.reEvaluate
161+
) {
162+
cleanIndividualFieldResidual({
163+
overlayWrapper: params.overlayWrapper!,
164+
visualBuilderContainer: params.visualBuilderContainer,
165+
focusedToolbar: params.focusedToolbar,
166+
resizeObserver: params.resizeObserver,
167+
});
168+
}
169+
}
170+
function isEmptyBlockElement(editableElement: Element): boolean {
171+
return (
172+
editableElement.classList.contains(VB_EmptyBlockParentClass) ||
173+
editableElement.classList.contains("visual-builder__empty-block")
174+
);
175+
}
176+
177+
function isSameSelectedElement(
178+
previousSelectedElement: Element | null,
179+
editableElement: Element,
180+
params: HandleBuilderInteractionParams
181+
): boolean {
182+
return !!(
183+
previousSelectedElement &&
184+
previousSelectedElement === editableElement &&
185+
!params.reEvaluate
186+
);
187+
}
188+
189+
function addOverlayAndToolbar(
190+
params: HandleBuilderInteractionParams,
191+
eventDetails: any,
192+
editableElement: Element
193+
) {
141194
addOverlay({
142195
overlayWrapper: params.overlayWrapper,
143196
resizeObserver: params.resizeObserver,
@@ -156,18 +209,20 @@ async function handleBuilderInteraction(
156209
});
157210
},
158211
});
159-
160-
const { content_type_uid, fieldPath, cslpValue } = fieldMetadata;
161-
162-
toggleHighlightedCommentIconDisplay(cslpValue, false);
163-
212+
}
213+
async function handleFieldSchemaAndIndividualFields(
214+
params: HandleBuilderInteractionParams,
215+
eventDetails: any,
216+
fieldMetadata: any,
217+
editableElement: Element
218+
) {
219+
const { content_type_uid, fieldPath } = fieldMetadata;
164220
const fieldSchema = await FieldSchemaMap.getFieldSchema(
165221
content_type_uid,
166222
fieldPath
167223
);
168224

169225
if (fieldSchema) {
170-
// after field schema is available re-add disabled overlay
171226
const { isDisabled } = isFieldDisabled(fieldSchema, eventDetails);
172227
if (isDisabled) {
173228
addOverlay({
@@ -179,38 +234,22 @@ async function handleBuilderInteraction(
179234
}
180235
}
181236

182-
// This is most probably redundant code, as the handleIndividualFields function
183-
// takes care of this
184-
// TODO: Remove this
185-
// if (
186-
// fieldSchema.data_type === "block" ||
187-
// fieldSchema.multiple ||
188-
// (fieldSchema.data_type === "reference" &&
189-
// // @ts-ignore
190-
// fieldSchema.field_metadata.ref_multiple)
191-
// ) {
192-
// handleAddButtonsForMultiple(eventDetails, {
193-
// editableElement: editableElement,
194-
// visualBuilderContainer: params.visualBuilderContainer,
195-
// resizeObserver: params.resizeObserver,
196-
// });
197-
// } else {
198-
// removeAddInstanceButtons({
199-
// eventTarget: params.event.target,
200-
// visualBuilderContainer: params.visualBuilderContainer,
201-
// overlayWrapper: params.overlayWrapper,
202-
// });
203-
// }
204237
visualBuilderPostMessage?.send(VisualBuilderPostMessageEvents.FOCUS_FIELD, {
205238
DOMEditStack: getDOMEditStack(editableElement),
206239
});
207240

208241
await handleIndividualFields(eventDetails, {
209-
visualBuilderContainer: params.visualBuilderContainer,
242+
visualBuilderContainer: params.visualBuilderContainer!,
210243
resizeObserver: params.resizeObserver,
211-
lastEditedField: previousSelectedElement,
244+
lastEditedField:
245+
VisualBuilder.VisualBuilderGlobalState.value
246+
.previousSelectedEditableDOM,
212247
});
213-
248+
}
249+
function observeEditableElementChanges(
250+
params: HandleBuilderInteractionParams,
251+
editableElement: Element
252+
) {
214253
const focusElementObserver = new MutationObserver((mutations) => {
215254
mutations.forEach((mutation) => {
216255
if (
@@ -224,7 +263,7 @@ async function handleBuilderInteraction(
224263
}
225264
});
226265
});
227-
//store it in global state
266+
228267
VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =
229268
focusElementObserver;
230269
focusElementObserver.observe(editableElement, { attributes: true });

0 commit comments

Comments
 (0)