@elementor/editor-canvas 3.33.0-233 → 3.33.0-235
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +162 -52
- package/dist/index.mjs +146 -36
- package/package.json +15 -14
- package/src/components/interactions-renderer.tsx +33 -0
- package/src/hooks/use-interactions-items.ts +107 -0
- package/src/init.tsx +9 -0
- package/src/sync/types.ts +5 -0
package/dist/index.js
CHANGED
|
@@ -45,6 +45,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
45
45
|
|
|
46
46
|
// src/init.tsx
|
|
47
47
|
var import_editor = require("@elementor/editor");
|
|
48
|
+
var import_editor_interactions2 = require("@elementor/editor-interactions");
|
|
48
49
|
|
|
49
50
|
// src/components/classes-rename.tsx
|
|
50
51
|
var import_react = require("react");
|
|
@@ -239,27 +240,143 @@ function useElementsDom() {
|
|
|
239
240
|
);
|
|
240
241
|
}
|
|
241
242
|
|
|
242
|
-
// src/components/
|
|
243
|
+
// src/components/interactions-renderer.tsx
|
|
243
244
|
var React3 = __toESM(require("react"));
|
|
244
|
-
var
|
|
245
|
+
var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
|
|
245
246
|
var import_ui2 = require("@elementor/ui");
|
|
246
247
|
|
|
247
|
-
// src/hooks/use-
|
|
248
|
+
// src/hooks/use-interactions-items.ts
|
|
249
|
+
var import_react7 = require("react");
|
|
250
|
+
var import_editor_interactions = require("@elementor/editor-interactions");
|
|
248
251
|
var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
|
|
249
252
|
|
|
253
|
+
// src/hooks/use-on-mount.ts
|
|
254
|
+
var import_react6 = require("react");
|
|
255
|
+
function useOnMount(cb) {
|
|
256
|
+
const mounted = (0, import_react6.useRef)(false);
|
|
257
|
+
(0, import_react6.useEffect)(() => {
|
|
258
|
+
if (!mounted.current) {
|
|
259
|
+
mounted.current = true;
|
|
260
|
+
cb();
|
|
261
|
+
}
|
|
262
|
+
}, []);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// src/hooks/use-interactions-items.ts
|
|
266
|
+
function useInteractionsItems() {
|
|
267
|
+
const [interactionItems, setInteractionItems] = (0, import_react7.useState)({});
|
|
268
|
+
const providerAndSubscribers = (0, import_react7.useMemo)(() => {
|
|
269
|
+
try {
|
|
270
|
+
const providers = import_editor_interactions.interactionsRepository.getProviders();
|
|
271
|
+
const mapped = providers.map((provider) => {
|
|
272
|
+
return {
|
|
273
|
+
provider,
|
|
274
|
+
subscriber: createProviderSubscriber({
|
|
275
|
+
provider,
|
|
276
|
+
setInteractionItems
|
|
277
|
+
})
|
|
278
|
+
};
|
|
279
|
+
});
|
|
280
|
+
return mapped;
|
|
281
|
+
} catch {
|
|
282
|
+
return [];
|
|
283
|
+
}
|
|
284
|
+
}, []);
|
|
285
|
+
(0, import_react7.useEffect)(() => {
|
|
286
|
+
if (providerAndSubscribers.length === 0) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const unsubscribes = providerAndSubscribers.map(({ provider, subscriber }) => {
|
|
290
|
+
const safeSubscriber = () => {
|
|
291
|
+
try {
|
|
292
|
+
subscriber();
|
|
293
|
+
} catch {
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
const unsubscribe = provider.subscribe(safeSubscriber);
|
|
297
|
+
return unsubscribe;
|
|
298
|
+
});
|
|
299
|
+
return () => {
|
|
300
|
+
unsubscribes.forEach((unsubscribe) => unsubscribe());
|
|
301
|
+
};
|
|
302
|
+
}, [providerAndSubscribers]);
|
|
303
|
+
useOnMount(() => {
|
|
304
|
+
if (providerAndSubscribers.length === 0) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
(0, import_editor_v1_adapters2.registerDataHook)("after", "editor/documents/attach-preview", async () => {
|
|
308
|
+
providerAndSubscribers.forEach(({ subscriber }) => {
|
|
309
|
+
try {
|
|
310
|
+
subscriber();
|
|
311
|
+
} catch {
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
return (0, import_react7.useMemo)(
|
|
317
|
+
() => Object.values(interactionItems).sort(sortByProviderPriority).flatMap(({ items }) => items),
|
|
318
|
+
[interactionItems]
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
|
|
322
|
+
return providerA.priority - providerB.priority;
|
|
323
|
+
}
|
|
324
|
+
function createProviderSubscriber({ provider, setInteractionItems }) {
|
|
325
|
+
return () => {
|
|
326
|
+
try {
|
|
327
|
+
const items = provider.actions.all();
|
|
328
|
+
const providerKey = provider.getKey();
|
|
329
|
+
setInteractionItems((prev) => ({
|
|
330
|
+
...prev,
|
|
331
|
+
[providerKey]: { provider, items }
|
|
332
|
+
}));
|
|
333
|
+
} catch {
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
|
|
250
338
|
// src/sync/get-canvas-iframe-document.ts
|
|
251
339
|
function getCanvasIframeDocument() {
|
|
252
340
|
const extendedWindow = window;
|
|
253
341
|
return extendedWindow.elementor?.$preview?.[0]?.contentDocument;
|
|
254
342
|
}
|
|
255
343
|
|
|
344
|
+
// src/components/interactions-renderer.tsx
|
|
345
|
+
function InteractionsRenderer() {
|
|
346
|
+
const container = usePortalContainer();
|
|
347
|
+
const interactionItems = useInteractionsItems();
|
|
348
|
+
if (!container) {
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
const interactionsData = JSON.stringify(interactionItems);
|
|
352
|
+
return /* @__PURE__ */ React3.createElement(import_ui2.Portal, { container }, /* @__PURE__ */ React3.createElement(
|
|
353
|
+
"script",
|
|
354
|
+
{
|
|
355
|
+
type: "application/json",
|
|
356
|
+
"data-e-interactions": "true",
|
|
357
|
+
dangerouslySetInnerHTML: {
|
|
358
|
+
__html: interactionsData
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
));
|
|
362
|
+
}
|
|
363
|
+
function usePortalContainer() {
|
|
364
|
+
return (0, import_editor_v1_adapters3.__privateUseListenTo)((0, import_editor_v1_adapters3.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// src/components/style-renderer.tsx
|
|
368
|
+
var React4 = __toESM(require("react"));
|
|
369
|
+
var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
|
|
370
|
+
var import_ui3 = require("@elementor/ui");
|
|
371
|
+
|
|
256
372
|
// src/hooks/use-documents-css-links.ts
|
|
373
|
+
var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
|
|
257
374
|
var REMOVED_ATTR = "data-e-removed";
|
|
258
375
|
var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
|
|
259
376
|
var CSS_LINK_ID_PREFIX = "elementor-post-";
|
|
260
377
|
var CSS_LINK_ID_SUFFIX = "-css";
|
|
261
378
|
function useDocumentsCssLinks() {
|
|
262
|
-
return (0,
|
|
379
|
+
return (0, import_editor_v1_adapters4.__privateUseListenTo)((0, import_editor_v1_adapters4.commandEndEvent)("editor/documents/attach-preview"), () => {
|
|
263
380
|
const iframeDocument = getCanvasIframeDocument();
|
|
264
381
|
if (!iframeDocument) {
|
|
265
382
|
return [];
|
|
@@ -300,11 +417,11 @@ function getLinkAttrs(el) {
|
|
|
300
417
|
}
|
|
301
418
|
|
|
302
419
|
// src/hooks/use-style-items.ts
|
|
303
|
-
var
|
|
420
|
+
var import_react10 = require("react");
|
|
304
421
|
var import_editor_responsive2 = require("@elementor/editor-responsive");
|
|
305
422
|
var import_editor_styles3 = require("@elementor/editor-styles");
|
|
306
423
|
var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
|
|
307
|
-
var
|
|
424
|
+
var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
|
|
308
425
|
|
|
309
426
|
// src/utils/abort-previous-runs.ts
|
|
310
427
|
function abortPreviousRuns(cb) {
|
|
@@ -337,20 +454,8 @@ function signalizedProcess(signal, steps = []) {
|
|
|
337
454
|
};
|
|
338
455
|
}
|
|
339
456
|
|
|
340
|
-
// src/hooks/use-on-mount.ts
|
|
341
|
-
var import_react6 = require("react");
|
|
342
|
-
function useOnMount(cb) {
|
|
343
|
-
const mounted = (0, import_react6.useRef)(false);
|
|
344
|
-
(0, import_react6.useEffect)(() => {
|
|
345
|
-
if (!mounted.current) {
|
|
346
|
-
mounted.current = true;
|
|
347
|
-
cb();
|
|
348
|
-
}
|
|
349
|
-
}, []);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
457
|
// src/hooks/use-style-prop-resolver.ts
|
|
353
|
-
var
|
|
458
|
+
var import_react8 = require("react");
|
|
354
459
|
var import_editor_styles = require("@elementor/editor-styles");
|
|
355
460
|
|
|
356
461
|
// src/renderers/create-props-resolver.ts
|
|
@@ -472,7 +577,7 @@ var enqueueFont = (fontFamily, context = "preview") => {
|
|
|
472
577
|
|
|
473
578
|
// src/hooks/use-style-prop-resolver.ts
|
|
474
579
|
function useStylePropResolver() {
|
|
475
|
-
return (0,
|
|
580
|
+
return (0, import_react8.useMemo)(() => {
|
|
476
581
|
return createPropsResolver({
|
|
477
582
|
transformers: styleTransformersRegistry,
|
|
478
583
|
schema: (0, import_editor_styles.getStylesSchema)(),
|
|
@@ -487,7 +592,7 @@ function useStylePropResolver() {
|
|
|
487
592
|
}
|
|
488
593
|
|
|
489
594
|
// src/hooks/use-style-renderer.ts
|
|
490
|
-
var
|
|
595
|
+
var import_react9 = require("react");
|
|
491
596
|
var import_editor_responsive = require("@elementor/editor-responsive");
|
|
492
597
|
|
|
493
598
|
// src/renderers/create-styles-renderer.ts
|
|
@@ -588,7 +693,7 @@ function customCssToString(customCss) {
|
|
|
588
693
|
var SELECTOR_PREFIX = ".elementor";
|
|
589
694
|
function useStyleRenderer(resolve) {
|
|
590
695
|
const breakpoints = (0, import_editor_responsive.useBreakpointsMap)();
|
|
591
|
-
return (0,
|
|
696
|
+
return (0, import_react9.useMemo)(() => {
|
|
592
697
|
return createStylesRenderer({
|
|
593
698
|
selectorPrefix: SELECTOR_PREFIX,
|
|
594
699
|
breakpoints,
|
|
@@ -601,12 +706,12 @@ function useStyleRenderer(resolve) {
|
|
|
601
706
|
function useStyleItems() {
|
|
602
707
|
const resolve = useStylePropResolver();
|
|
603
708
|
const renderStyles = useStyleRenderer(resolve);
|
|
604
|
-
const [styleItems, setStyleItems] = (0,
|
|
605
|
-
const providerAndSubscribers = (0,
|
|
709
|
+
const [styleItems, setStyleItems] = (0, import_react10.useState)({});
|
|
710
|
+
const providerAndSubscribers = (0, import_react10.useMemo)(() => {
|
|
606
711
|
return import_editor_styles_repository2.stylesRepository.getProviders().map((provider) => {
|
|
607
712
|
return {
|
|
608
713
|
provider,
|
|
609
|
-
subscriber:
|
|
714
|
+
subscriber: createProviderSubscriber2({
|
|
610
715
|
provider,
|
|
611
716
|
renderStyles,
|
|
612
717
|
setStyleItems
|
|
@@ -614,7 +719,7 @@ function useStyleItems() {
|
|
|
614
719
|
};
|
|
615
720
|
});
|
|
616
721
|
}, [renderStyles]);
|
|
617
|
-
(0,
|
|
722
|
+
(0, import_react10.useEffect)(() => {
|
|
618
723
|
const unsubscribes = providerAndSubscribers.map(
|
|
619
724
|
({ provider, subscriber }) => provider.subscribe(subscriber)
|
|
620
725
|
);
|
|
@@ -623,20 +728,20 @@ function useStyleItems() {
|
|
|
623
728
|
};
|
|
624
729
|
}, [providerAndSubscribers]);
|
|
625
730
|
useOnMount(() => {
|
|
626
|
-
(0,
|
|
731
|
+
(0, import_editor_v1_adapters5.registerDataHook)("after", "editor/documents/attach-preview", async () => {
|
|
627
732
|
const promises = providerAndSubscribers.map(async ({ subscriber }) => subscriber());
|
|
628
733
|
await Promise.all(promises);
|
|
629
734
|
});
|
|
630
735
|
});
|
|
631
736
|
const breakpointsOrder = (0, import_editor_responsive2.getBreakpoints)().map((breakpoint) => breakpoint.id);
|
|
632
|
-
return (0,
|
|
633
|
-
() => Object.values(styleItems).sort(
|
|
737
|
+
return (0, import_react10.useMemo)(
|
|
738
|
+
() => Object.values(styleItems).sort(sortByProviderPriority2).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
|
|
634
739
|
// eslint-disable-next-line
|
|
635
740
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
636
741
|
[styleItems, breakpointsOrder.join("-")]
|
|
637
742
|
);
|
|
638
743
|
}
|
|
639
|
-
function
|
|
744
|
+
function sortByProviderPriority2({ provider: providerA }, { provider: providerB }) {
|
|
640
745
|
return providerA.priority - providerB.priority;
|
|
641
746
|
}
|
|
642
747
|
function sortByBreakpoint(breakpointsOrder) {
|
|
@@ -651,7 +756,7 @@ function sortByStateType({ state: stateA }, { state: stateB }) {
|
|
|
651
756
|
}
|
|
652
757
|
return 0;
|
|
653
758
|
}
|
|
654
|
-
function
|
|
759
|
+
function createProviderSubscriber2({ provider, renderStyles, setStyleItems }) {
|
|
655
760
|
return abortPreviousRuns(
|
|
656
761
|
(abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
|
|
657
762
|
const styles = provider.actions.all().map((__5, index, items) => {
|
|
@@ -697,16 +802,16 @@ function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
|
|
|
697
802
|
|
|
698
803
|
// src/components/style-renderer.tsx
|
|
699
804
|
function StyleRenderer() {
|
|
700
|
-
const container =
|
|
805
|
+
const container = usePortalContainer2();
|
|
701
806
|
const styleItems = useStyleItems();
|
|
702
807
|
const linksAttrs = useDocumentsCssLinks();
|
|
703
808
|
if (!container) {
|
|
704
809
|
return null;
|
|
705
810
|
}
|
|
706
|
-
return /* @__PURE__ */
|
|
811
|
+
return /* @__PURE__ */ React4.createElement(import_ui3.Portal, { container }, styleItems.map((item, i) => /* @__PURE__ */ React4.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React4.createElement("link", { ...attrs, key: attrs.id })));
|
|
707
812
|
}
|
|
708
|
-
function
|
|
709
|
-
return (0,
|
|
813
|
+
function usePortalContainer2() {
|
|
814
|
+
return (0, import_editor_v1_adapters6.__privateUseListenTo)((0, import_editor_v1_adapters6.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
|
|
710
815
|
}
|
|
711
816
|
|
|
712
817
|
// src/settings-transformers-registry.ts
|
|
@@ -1127,7 +1232,7 @@ function initStyleTransformers() {
|
|
|
1127
1232
|
|
|
1128
1233
|
// src/legacy/init-legacy-views.ts
|
|
1129
1234
|
var import_editor_elements2 = require("@elementor/editor-elements");
|
|
1130
|
-
var
|
|
1235
|
+
var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
|
|
1131
1236
|
|
|
1132
1237
|
// src/renderers/create-dom-renderer.ts
|
|
1133
1238
|
var import_twing = require("@elementor/twing");
|
|
@@ -1354,7 +1459,7 @@ function registerElementType(type, elementTypeGenerator) {
|
|
|
1354
1459
|
elementsLegacyTypes[type] = elementTypeGenerator;
|
|
1355
1460
|
}
|
|
1356
1461
|
function initLegacyViews() {
|
|
1357
|
-
(0,
|
|
1462
|
+
(0, import_editor_v1_adapters7.__privateListenTo)((0, import_editor_v1_adapters7.v1ReadyEvent)(), () => {
|
|
1358
1463
|
const config = (0, import_editor_elements2.getWidgetsCache)() ?? {};
|
|
1359
1464
|
const legacyWindow = window;
|
|
1360
1465
|
const renderer = createDomRenderer();
|
|
@@ -1378,14 +1483,14 @@ function initLegacyViews() {
|
|
|
1378
1483
|
// src/prevent-link-in-link-commands.ts
|
|
1379
1484
|
var import_editor_elements3 = require("@elementor/editor-elements");
|
|
1380
1485
|
var import_editor_notifications = require("@elementor/editor-notifications");
|
|
1381
|
-
var
|
|
1486
|
+
var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
|
|
1382
1487
|
var import_i18n = require("@wordpress/i18n");
|
|
1383
1488
|
function initLinkInLinkPrevention() {
|
|
1384
|
-
(0,
|
|
1489
|
+
(0, import_editor_v1_adapters8.blockCommand)({
|
|
1385
1490
|
command: "document/elements/paste",
|
|
1386
1491
|
condition: blockLinkInLinkPaste
|
|
1387
1492
|
});
|
|
1388
|
-
(0,
|
|
1493
|
+
(0, import_editor_v1_adapters8.blockCommand)({
|
|
1389
1494
|
command: "document/elements/move",
|
|
1390
1495
|
condition: blockLinkInLinkMove
|
|
1391
1496
|
});
|
|
@@ -1459,12 +1564,12 @@ function shouldBlock(sourceElements, targetElements) {
|
|
|
1459
1564
|
}
|
|
1460
1565
|
|
|
1461
1566
|
// src/style-commands/paste-style.ts
|
|
1462
|
-
var
|
|
1567
|
+
var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
|
|
1463
1568
|
|
|
1464
1569
|
// src/style-commands/undoable-actions/paste-element-style.ts
|
|
1465
1570
|
var import_editor_elements5 = require("@elementor/editor-elements");
|
|
1466
1571
|
var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
|
|
1467
|
-
var
|
|
1572
|
+
var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
|
|
1468
1573
|
var import_i18n3 = require("@wordpress/i18n");
|
|
1469
1574
|
|
|
1470
1575
|
// src/style-commands/utils.ts
|
|
@@ -1510,7 +1615,7 @@ function getTitleForContainers(containers) {
|
|
|
1510
1615
|
}
|
|
1511
1616
|
|
|
1512
1617
|
// src/style-commands/undoable-actions/paste-element-style.ts
|
|
1513
|
-
var undoablePasteElementStyle = () => (0,
|
|
1618
|
+
var undoablePasteElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
|
|
1514
1619
|
{
|
|
1515
1620
|
do: ({ containers, newStyle }) => {
|
|
1516
1621
|
return containers.map((container) => {
|
|
@@ -1586,12 +1691,12 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters7.undoable)(
|
|
|
1586
1691
|
// src/style-commands/paste-style.ts
|
|
1587
1692
|
function initPasteStyleCommand() {
|
|
1588
1693
|
const pasteElementStyleCommand = undoablePasteElementStyle();
|
|
1589
|
-
(0,
|
|
1694
|
+
(0, import_editor_v1_adapters10.blockCommand)({
|
|
1590
1695
|
command: "document/elements/paste-style",
|
|
1591
1696
|
condition: hasAtomicWidgets
|
|
1592
1697
|
});
|
|
1593
|
-
(0,
|
|
1594
|
-
(0,
|
|
1698
|
+
(0, import_editor_v1_adapters10.__privateListenTo)(
|
|
1699
|
+
(0, import_editor_v1_adapters10.commandStartEvent)("document/elements/paste-style"),
|
|
1595
1700
|
(e) => pasteStyles(e.args, pasteElementStyleCommand)
|
|
1596
1701
|
);
|
|
1597
1702
|
}
|
|
@@ -1615,14 +1720,14 @@ function pasteStyles(args, pasteCallback) {
|
|
|
1615
1720
|
}
|
|
1616
1721
|
|
|
1617
1722
|
// src/style-commands/reset-style.ts
|
|
1618
|
-
var
|
|
1723
|
+
var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
|
|
1619
1724
|
|
|
1620
1725
|
// src/style-commands/undoable-actions/reset-element-style.ts
|
|
1621
1726
|
var import_editor_elements6 = require("@elementor/editor-elements");
|
|
1622
1727
|
var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
|
|
1623
|
-
var
|
|
1728
|
+
var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
|
|
1624
1729
|
var import_i18n4 = require("@wordpress/i18n");
|
|
1625
|
-
var undoableResetElementStyle = () => (0,
|
|
1730
|
+
var undoableResetElementStyle = () => (0, import_editor_v1_adapters11.undoable)(
|
|
1626
1731
|
{
|
|
1627
1732
|
do: ({ containers }) => {
|
|
1628
1733
|
return containers.map((container) => {
|
|
@@ -1666,12 +1771,12 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
|
|
|
1666
1771
|
// src/style-commands/reset-style.ts
|
|
1667
1772
|
function initResetStyleCommand() {
|
|
1668
1773
|
const resetElementStyles = undoableResetElementStyle();
|
|
1669
|
-
(0,
|
|
1774
|
+
(0, import_editor_v1_adapters12.blockCommand)({
|
|
1670
1775
|
command: "document/elements/reset-style",
|
|
1671
1776
|
condition: hasAtomicWidgets
|
|
1672
1777
|
});
|
|
1673
|
-
(0,
|
|
1674
|
-
(0,
|
|
1778
|
+
(0, import_editor_v1_adapters12.__privateListenTo)(
|
|
1779
|
+
(0, import_editor_v1_adapters12.commandStartEvent)("document/elements/reset-style"),
|
|
1675
1780
|
(e) => resetStyles(e.args, resetElementStyles)
|
|
1676
1781
|
);
|
|
1677
1782
|
}
|
|
@@ -1697,6 +1802,7 @@ function init() {
|
|
|
1697
1802
|
initLinkInLinkPrevention();
|
|
1698
1803
|
initLegacyViews();
|
|
1699
1804
|
initSettingsTransformers();
|
|
1805
|
+
(0, import_editor_interactions2.init)();
|
|
1700
1806
|
(0, import_editor.injectIntoTop)({
|
|
1701
1807
|
id: "elements-overlays",
|
|
1702
1808
|
component: ElementsOverlays
|
|
@@ -1705,6 +1811,10 @@ function init() {
|
|
|
1705
1811
|
id: "canvas-style-render",
|
|
1706
1812
|
component: StyleRenderer
|
|
1707
1813
|
});
|
|
1814
|
+
(0, import_editor.injectIntoTop)({
|
|
1815
|
+
id: "canvas-interactions-render",
|
|
1816
|
+
component: InteractionsRenderer
|
|
1817
|
+
});
|
|
1708
1818
|
(0, import_editor.injectIntoLogic)({
|
|
1709
1819
|
id: "classes-rename",
|
|
1710
1820
|
component: ClassesRename
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/init.tsx
|
|
2
2
|
import { injectIntoLogic, injectIntoTop } from "@elementor/editor";
|
|
3
|
+
import { init as initInteractionsRepository } from "@elementor/editor-interactions";
|
|
3
4
|
|
|
4
5
|
// src/components/classes-rename.tsx
|
|
5
6
|
import { useEffect } from "react";
|
|
@@ -199,13 +200,100 @@ function useElementsDom() {
|
|
|
199
200
|
);
|
|
200
201
|
}
|
|
201
202
|
|
|
202
|
-
// src/components/
|
|
203
|
+
// src/components/interactions-renderer.tsx
|
|
203
204
|
import * as React3 from "react";
|
|
204
|
-
import { __privateUseListenTo as
|
|
205
|
+
import { __privateUseListenTo as useListenTo2, commandEndEvent } from "@elementor/editor-v1-adapters";
|
|
205
206
|
import { Portal } from "@elementor/ui";
|
|
206
207
|
|
|
207
|
-
// src/hooks/use-
|
|
208
|
-
import {
|
|
208
|
+
// src/hooks/use-interactions-items.ts
|
|
209
|
+
import { useEffect as useEffect5, useMemo, useState as useState2 } from "react";
|
|
210
|
+
import { interactionsRepository } from "@elementor/editor-interactions";
|
|
211
|
+
import { registerDataHook } from "@elementor/editor-v1-adapters";
|
|
212
|
+
|
|
213
|
+
// src/hooks/use-on-mount.ts
|
|
214
|
+
import { useEffect as useEffect4, useRef } from "react";
|
|
215
|
+
function useOnMount(cb) {
|
|
216
|
+
const mounted = useRef(false);
|
|
217
|
+
useEffect4(() => {
|
|
218
|
+
if (!mounted.current) {
|
|
219
|
+
mounted.current = true;
|
|
220
|
+
cb();
|
|
221
|
+
}
|
|
222
|
+
}, []);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// src/hooks/use-interactions-items.ts
|
|
226
|
+
function useInteractionsItems() {
|
|
227
|
+
const [interactionItems, setInteractionItems] = useState2({});
|
|
228
|
+
const providerAndSubscribers = useMemo(() => {
|
|
229
|
+
try {
|
|
230
|
+
const providers = interactionsRepository.getProviders();
|
|
231
|
+
const mapped = providers.map((provider) => {
|
|
232
|
+
return {
|
|
233
|
+
provider,
|
|
234
|
+
subscriber: createProviderSubscriber({
|
|
235
|
+
provider,
|
|
236
|
+
setInteractionItems
|
|
237
|
+
})
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
return mapped;
|
|
241
|
+
} catch {
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
}, []);
|
|
245
|
+
useEffect5(() => {
|
|
246
|
+
if (providerAndSubscribers.length === 0) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const unsubscribes = providerAndSubscribers.map(({ provider, subscriber }) => {
|
|
250
|
+
const safeSubscriber = () => {
|
|
251
|
+
try {
|
|
252
|
+
subscriber();
|
|
253
|
+
} catch {
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
const unsubscribe = provider.subscribe(safeSubscriber);
|
|
257
|
+
return unsubscribe;
|
|
258
|
+
});
|
|
259
|
+
return () => {
|
|
260
|
+
unsubscribes.forEach((unsubscribe) => unsubscribe());
|
|
261
|
+
};
|
|
262
|
+
}, [providerAndSubscribers]);
|
|
263
|
+
useOnMount(() => {
|
|
264
|
+
if (providerAndSubscribers.length === 0) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
registerDataHook("after", "editor/documents/attach-preview", async () => {
|
|
268
|
+
providerAndSubscribers.forEach(({ subscriber }) => {
|
|
269
|
+
try {
|
|
270
|
+
subscriber();
|
|
271
|
+
} catch {
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
return useMemo(
|
|
277
|
+
() => Object.values(interactionItems).sort(sortByProviderPriority).flatMap(({ items }) => items),
|
|
278
|
+
[interactionItems]
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
|
|
282
|
+
return providerA.priority - providerB.priority;
|
|
283
|
+
}
|
|
284
|
+
function createProviderSubscriber({ provider, setInteractionItems }) {
|
|
285
|
+
return () => {
|
|
286
|
+
try {
|
|
287
|
+
const items = provider.actions.all();
|
|
288
|
+
const providerKey = provider.getKey();
|
|
289
|
+
setInteractionItems((prev) => ({
|
|
290
|
+
...prev,
|
|
291
|
+
[providerKey]: { provider, items }
|
|
292
|
+
}));
|
|
293
|
+
} catch {
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
}
|
|
209
297
|
|
|
210
298
|
// src/sync/get-canvas-iframe-document.ts
|
|
211
299
|
function getCanvasIframeDocument() {
|
|
@@ -213,13 +301,42 @@ function getCanvasIframeDocument() {
|
|
|
213
301
|
return extendedWindow.elementor?.$preview?.[0]?.contentDocument;
|
|
214
302
|
}
|
|
215
303
|
|
|
304
|
+
// src/components/interactions-renderer.tsx
|
|
305
|
+
function InteractionsRenderer() {
|
|
306
|
+
const container = usePortalContainer();
|
|
307
|
+
const interactionItems = useInteractionsItems();
|
|
308
|
+
if (!container) {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
const interactionsData = JSON.stringify(interactionItems);
|
|
312
|
+
return /* @__PURE__ */ React3.createElement(Portal, { container }, /* @__PURE__ */ React3.createElement(
|
|
313
|
+
"script",
|
|
314
|
+
{
|
|
315
|
+
type: "application/json",
|
|
316
|
+
"data-e-interactions": "true",
|
|
317
|
+
dangerouslySetInnerHTML: {
|
|
318
|
+
__html: interactionsData
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
));
|
|
322
|
+
}
|
|
323
|
+
function usePortalContainer() {
|
|
324
|
+
return useListenTo2(commandEndEvent("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// src/components/style-renderer.tsx
|
|
328
|
+
import * as React4 from "react";
|
|
329
|
+
import { __privateUseListenTo as useListenTo4, commandEndEvent as commandEndEvent3 } from "@elementor/editor-v1-adapters";
|
|
330
|
+
import { Portal as Portal2 } from "@elementor/ui";
|
|
331
|
+
|
|
216
332
|
// src/hooks/use-documents-css-links.ts
|
|
333
|
+
import { __privateUseListenTo as useListenTo3, commandEndEvent as commandEndEvent2 } from "@elementor/editor-v1-adapters";
|
|
217
334
|
var REMOVED_ATTR = "data-e-removed";
|
|
218
335
|
var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
|
|
219
336
|
var CSS_LINK_ID_PREFIX = "elementor-post-";
|
|
220
337
|
var CSS_LINK_ID_SUFFIX = "-css";
|
|
221
338
|
function useDocumentsCssLinks() {
|
|
222
|
-
return
|
|
339
|
+
return useListenTo3(commandEndEvent2("editor/documents/attach-preview"), () => {
|
|
223
340
|
const iframeDocument = getCanvasIframeDocument();
|
|
224
341
|
if (!iframeDocument) {
|
|
225
342
|
return [];
|
|
@@ -260,11 +377,11 @@ function getLinkAttrs(el) {
|
|
|
260
377
|
}
|
|
261
378
|
|
|
262
379
|
// src/hooks/use-style-items.ts
|
|
263
|
-
import { useEffect as
|
|
380
|
+
import { useEffect as useEffect6, useMemo as useMemo4, useState as useState3 } from "react";
|
|
264
381
|
import { getBreakpoints } from "@elementor/editor-responsive";
|
|
265
382
|
import { isClassState as isClassState2 } from "@elementor/editor-styles";
|
|
266
383
|
import { stylesRepository as stylesRepository2 } from "@elementor/editor-styles-repository";
|
|
267
|
-
import { registerDataHook } from "@elementor/editor-v1-adapters";
|
|
384
|
+
import { registerDataHook as registerDataHook2 } from "@elementor/editor-v1-adapters";
|
|
268
385
|
|
|
269
386
|
// src/utils/abort-previous-runs.ts
|
|
270
387
|
function abortPreviousRuns(cb) {
|
|
@@ -297,20 +414,8 @@ function signalizedProcess(signal, steps = []) {
|
|
|
297
414
|
};
|
|
298
415
|
}
|
|
299
416
|
|
|
300
|
-
// src/hooks/use-on-mount.ts
|
|
301
|
-
import { useEffect as useEffect4, useRef } from "react";
|
|
302
|
-
function useOnMount(cb) {
|
|
303
|
-
const mounted = useRef(false);
|
|
304
|
-
useEffect4(() => {
|
|
305
|
-
if (!mounted.current) {
|
|
306
|
-
mounted.current = true;
|
|
307
|
-
cb();
|
|
308
|
-
}
|
|
309
|
-
}, []);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
417
|
// src/hooks/use-style-prop-resolver.ts
|
|
313
|
-
import { useMemo } from "react";
|
|
418
|
+
import { useMemo as useMemo2 } from "react";
|
|
314
419
|
import { getStylesSchema } from "@elementor/editor-styles";
|
|
315
420
|
|
|
316
421
|
// src/renderers/create-props-resolver.ts
|
|
@@ -434,7 +539,7 @@ var enqueueFont = (fontFamily, context = "preview") => {
|
|
|
434
539
|
|
|
435
540
|
// src/hooks/use-style-prop-resolver.ts
|
|
436
541
|
function useStylePropResolver() {
|
|
437
|
-
return
|
|
542
|
+
return useMemo2(() => {
|
|
438
543
|
return createPropsResolver({
|
|
439
544
|
transformers: styleTransformersRegistry,
|
|
440
545
|
schema: getStylesSchema(),
|
|
@@ -449,7 +554,7 @@ function useStylePropResolver() {
|
|
|
449
554
|
}
|
|
450
555
|
|
|
451
556
|
// src/hooks/use-style-renderer.ts
|
|
452
|
-
import { useMemo as
|
|
557
|
+
import { useMemo as useMemo3 } from "react";
|
|
453
558
|
import { useBreakpointsMap } from "@elementor/editor-responsive";
|
|
454
559
|
|
|
455
560
|
// src/renderers/create-styles-renderer.ts
|
|
@@ -553,7 +658,7 @@ function customCssToString(customCss) {
|
|
|
553
658
|
var SELECTOR_PREFIX = ".elementor";
|
|
554
659
|
function useStyleRenderer(resolve) {
|
|
555
660
|
const breakpoints = useBreakpointsMap();
|
|
556
|
-
return
|
|
661
|
+
return useMemo3(() => {
|
|
557
662
|
return createStylesRenderer({
|
|
558
663
|
selectorPrefix: SELECTOR_PREFIX,
|
|
559
664
|
breakpoints,
|
|
@@ -566,12 +671,12 @@ function useStyleRenderer(resolve) {
|
|
|
566
671
|
function useStyleItems() {
|
|
567
672
|
const resolve = useStylePropResolver();
|
|
568
673
|
const renderStyles = useStyleRenderer(resolve);
|
|
569
|
-
const [styleItems, setStyleItems] =
|
|
570
|
-
const providerAndSubscribers =
|
|
674
|
+
const [styleItems, setStyleItems] = useState3({});
|
|
675
|
+
const providerAndSubscribers = useMemo4(() => {
|
|
571
676
|
return stylesRepository2.getProviders().map((provider) => {
|
|
572
677
|
return {
|
|
573
678
|
provider,
|
|
574
|
-
subscriber:
|
|
679
|
+
subscriber: createProviderSubscriber2({
|
|
575
680
|
provider,
|
|
576
681
|
renderStyles,
|
|
577
682
|
setStyleItems
|
|
@@ -579,7 +684,7 @@ function useStyleItems() {
|
|
|
579
684
|
};
|
|
580
685
|
});
|
|
581
686
|
}, [renderStyles]);
|
|
582
|
-
|
|
687
|
+
useEffect6(() => {
|
|
583
688
|
const unsubscribes = providerAndSubscribers.map(
|
|
584
689
|
({ provider, subscriber }) => provider.subscribe(subscriber)
|
|
585
690
|
);
|
|
@@ -588,20 +693,20 @@ function useStyleItems() {
|
|
|
588
693
|
};
|
|
589
694
|
}, [providerAndSubscribers]);
|
|
590
695
|
useOnMount(() => {
|
|
591
|
-
|
|
696
|
+
registerDataHook2("after", "editor/documents/attach-preview", async () => {
|
|
592
697
|
const promises = providerAndSubscribers.map(async ({ subscriber }) => subscriber());
|
|
593
698
|
await Promise.all(promises);
|
|
594
699
|
});
|
|
595
700
|
});
|
|
596
701
|
const breakpointsOrder = getBreakpoints().map((breakpoint) => breakpoint.id);
|
|
597
|
-
return
|
|
598
|
-
() => Object.values(styleItems).sort(
|
|
702
|
+
return useMemo4(
|
|
703
|
+
() => Object.values(styleItems).sort(sortByProviderPriority2).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
|
|
599
704
|
// eslint-disable-next-line
|
|
600
705
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
601
706
|
[styleItems, breakpointsOrder.join("-")]
|
|
602
707
|
);
|
|
603
708
|
}
|
|
604
|
-
function
|
|
709
|
+
function sortByProviderPriority2({ provider: providerA }, { provider: providerB }) {
|
|
605
710
|
return providerA.priority - providerB.priority;
|
|
606
711
|
}
|
|
607
712
|
function sortByBreakpoint(breakpointsOrder) {
|
|
@@ -616,7 +721,7 @@ function sortByStateType({ state: stateA }, { state: stateB }) {
|
|
|
616
721
|
}
|
|
617
722
|
return 0;
|
|
618
723
|
}
|
|
619
|
-
function
|
|
724
|
+
function createProviderSubscriber2({ provider, renderStyles, setStyleItems }) {
|
|
620
725
|
return abortPreviousRuns(
|
|
621
726
|
(abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
|
|
622
727
|
const styles = provider.actions.all().map((__5, index, items) => {
|
|
@@ -662,16 +767,16 @@ function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
|
|
|
662
767
|
|
|
663
768
|
// src/components/style-renderer.tsx
|
|
664
769
|
function StyleRenderer() {
|
|
665
|
-
const container =
|
|
770
|
+
const container = usePortalContainer2();
|
|
666
771
|
const styleItems = useStyleItems();
|
|
667
772
|
const linksAttrs = useDocumentsCssLinks();
|
|
668
773
|
if (!container) {
|
|
669
774
|
return null;
|
|
670
775
|
}
|
|
671
|
-
return /* @__PURE__ */
|
|
776
|
+
return /* @__PURE__ */ React4.createElement(Portal2, { container }, styleItems.map((item, i) => /* @__PURE__ */ React4.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React4.createElement("link", { ...attrs, key: attrs.id })));
|
|
672
777
|
}
|
|
673
|
-
function
|
|
674
|
-
return
|
|
778
|
+
function usePortalContainer2() {
|
|
779
|
+
return useListenTo4(commandEndEvent3("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
|
|
675
780
|
}
|
|
676
781
|
|
|
677
782
|
// src/settings-transformers-registry.ts
|
|
@@ -1679,6 +1784,7 @@ function init() {
|
|
|
1679
1784
|
initLinkInLinkPrevention();
|
|
1680
1785
|
initLegacyViews();
|
|
1681
1786
|
initSettingsTransformers();
|
|
1787
|
+
initInteractionsRepository();
|
|
1682
1788
|
injectIntoTop({
|
|
1683
1789
|
id: "elements-overlays",
|
|
1684
1790
|
component: ElementsOverlays
|
|
@@ -1687,6 +1793,10 @@ function init() {
|
|
|
1687
1793
|
id: "canvas-style-render",
|
|
1688
1794
|
component: StyleRenderer
|
|
1689
1795
|
});
|
|
1796
|
+
injectIntoTop({
|
|
1797
|
+
id: "canvas-interactions-render",
|
|
1798
|
+
component: InteractionsRenderer
|
|
1799
|
+
});
|
|
1690
1800
|
injectIntoLogic({
|
|
1691
1801
|
id: "classes-rename",
|
|
1692
1802
|
component: ClassesRename
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-canvas",
|
|
3
3
|
"description": "Elementor Editor Canvas",
|
|
4
|
-
"version": "3.33.0-
|
|
4
|
+
"version": "3.33.0-235",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -37,20 +37,21 @@
|
|
|
37
37
|
"react-dom": "^18.3.1"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@elementor/editor": "3.33.0-
|
|
41
|
-
"@elementor/editor-controls": "3.33.0-
|
|
42
|
-
"@elementor/editor-documents": "3.33.0-
|
|
43
|
-
"@elementor/editor-elements": "3.33.0-
|
|
44
|
-
"@elementor/editor-
|
|
45
|
-
"@elementor/editor-
|
|
46
|
-
"@elementor/editor-
|
|
47
|
-
"@elementor/editor-
|
|
48
|
-
"@elementor/editor-styles
|
|
49
|
-
"@elementor/editor-
|
|
50
|
-
"@elementor/
|
|
40
|
+
"@elementor/editor": "3.33.0-235",
|
|
41
|
+
"@elementor/editor-controls": "3.33.0-235",
|
|
42
|
+
"@elementor/editor-documents": "3.33.0-235",
|
|
43
|
+
"@elementor/editor-elements": "3.33.0-235",
|
|
44
|
+
"@elementor/editor-interactions": "3.33.0-235",
|
|
45
|
+
"@elementor/editor-notifications": "3.33.0-235",
|
|
46
|
+
"@elementor/editor-props": "3.33.0-235",
|
|
47
|
+
"@elementor/editor-responsive": "3.33.0-235",
|
|
48
|
+
"@elementor/editor-styles": "3.33.0-235",
|
|
49
|
+
"@elementor/editor-styles-repository": "3.33.0-235",
|
|
50
|
+
"@elementor/editor-v1-adapters": "3.33.0-235",
|
|
51
|
+
"@elementor/twing": "3.33.0-235",
|
|
51
52
|
"@elementor/ui": "1.36.12",
|
|
52
|
-
"@elementor/utils": "3.33.0-
|
|
53
|
-
"@elementor/wp-media": "3.33.0-
|
|
53
|
+
"@elementor/utils": "3.33.0-235",
|
|
54
|
+
"@elementor/wp-media": "3.33.0-235",
|
|
54
55
|
"@floating-ui/react": "^0.27.5",
|
|
55
56
|
"@wordpress/i18n": "^5.13.0"
|
|
56
57
|
},
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';
|
|
3
|
+
import { Portal } from '@elementor/ui';
|
|
4
|
+
|
|
5
|
+
import { useInteractionsItems } from '../hooks/use-interactions-items';
|
|
6
|
+
import { getCanvasIframeDocument } from '../sync/get-canvas-iframe-document';
|
|
7
|
+
|
|
8
|
+
export function InteractionsRenderer() {
|
|
9
|
+
const container = usePortalContainer();
|
|
10
|
+
const interactionItems = useInteractionsItems();
|
|
11
|
+
|
|
12
|
+
if ( ! container ) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const interactionsData = JSON.stringify( interactionItems );
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<Portal container={ container }>
|
|
20
|
+
<script
|
|
21
|
+
type="application/json"
|
|
22
|
+
data-e-interactions="true"
|
|
23
|
+
dangerouslySetInnerHTML={ {
|
|
24
|
+
__html: interactionsData,
|
|
25
|
+
} }
|
|
26
|
+
/>
|
|
27
|
+
</Portal>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function usePortalContainer() {
|
|
32
|
+
return useListenTo( commandEndEvent( 'editor/documents/attach-preview' ), () => getCanvasIframeDocument()?.head );
|
|
33
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type Dispatch, type SetStateAction, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { type InteractionItem, interactionsRepository } from '@elementor/editor-interactions';
|
|
3
|
+
import { registerDataHook } from '@elementor/editor-v1-adapters';
|
|
4
|
+
|
|
5
|
+
import { useOnMount } from './use-on-mount';
|
|
6
|
+
|
|
7
|
+
type ProviderAndInteractionItems = {
|
|
8
|
+
provider: ReturnType< typeof interactionsRepository.getProviders >[ 0 ];
|
|
9
|
+
items: InteractionItem[];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type ProviderAndSubscriber = {
|
|
13
|
+
provider: ReturnType< typeof interactionsRepository.getProviders >[ 0 ];
|
|
14
|
+
subscriber: () => void;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type ProviderAndInteractionItemsMap = Record< string, ProviderAndInteractionItems >;
|
|
18
|
+
|
|
19
|
+
export function useInteractionsItems() {
|
|
20
|
+
const [ interactionItems, setInteractionItems ] = useState< ProviderAndInteractionItemsMap >( {} );
|
|
21
|
+
|
|
22
|
+
const providerAndSubscribers = useMemo( () => {
|
|
23
|
+
try {
|
|
24
|
+
const providers = interactionsRepository.getProviders();
|
|
25
|
+
const mapped = providers.map( ( provider ): ProviderAndSubscriber => {
|
|
26
|
+
return {
|
|
27
|
+
provider,
|
|
28
|
+
subscriber: createProviderSubscriber( {
|
|
29
|
+
provider,
|
|
30
|
+
setInteractionItems,
|
|
31
|
+
} ),
|
|
32
|
+
};
|
|
33
|
+
} );
|
|
34
|
+
return mapped;
|
|
35
|
+
} catch {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
}, [] );
|
|
39
|
+
|
|
40
|
+
useEffect( () => {
|
|
41
|
+
if ( providerAndSubscribers.length === 0 ) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const unsubscribes = providerAndSubscribers.map( ( { provider, subscriber } ) => {
|
|
46
|
+
const safeSubscriber = () => {
|
|
47
|
+
try {
|
|
48
|
+
subscriber();
|
|
49
|
+
} catch {}
|
|
50
|
+
};
|
|
51
|
+
const unsubscribe = provider.subscribe( safeSubscriber );
|
|
52
|
+
return unsubscribe;
|
|
53
|
+
} );
|
|
54
|
+
|
|
55
|
+
return () => {
|
|
56
|
+
unsubscribes.forEach( ( unsubscribe ) => unsubscribe() );
|
|
57
|
+
};
|
|
58
|
+
}, [ providerAndSubscribers ] );
|
|
59
|
+
|
|
60
|
+
useOnMount( () => {
|
|
61
|
+
if ( providerAndSubscribers.length === 0 ) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
registerDataHook( 'after', 'editor/documents/attach-preview', async () => {
|
|
66
|
+
providerAndSubscribers.forEach( ( { subscriber } ) => {
|
|
67
|
+
try {
|
|
68
|
+
subscriber();
|
|
69
|
+
} catch {}
|
|
70
|
+
} );
|
|
71
|
+
} );
|
|
72
|
+
} );
|
|
73
|
+
|
|
74
|
+
return useMemo(
|
|
75
|
+
() =>
|
|
76
|
+
Object.values( interactionItems )
|
|
77
|
+
.sort( sortByProviderPriority )
|
|
78
|
+
.flatMap( ( { items } ) => items ),
|
|
79
|
+
[ interactionItems ]
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function sortByProviderPriority(
|
|
84
|
+
{ provider: providerA }: ProviderAndInteractionItems,
|
|
85
|
+
{ provider: providerB }: ProviderAndInteractionItems
|
|
86
|
+
) {
|
|
87
|
+
return providerA.priority - providerB.priority;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
type CreateProviderSubscriberArgs = {
|
|
91
|
+
provider: ReturnType< typeof interactionsRepository.getProviders >[ 0 ];
|
|
92
|
+
setInteractionItems: Dispatch< SetStateAction< ProviderAndInteractionItemsMap > >;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
function createProviderSubscriber( { provider, setInteractionItems }: CreateProviderSubscriberArgs ) {
|
|
96
|
+
return () => {
|
|
97
|
+
try {
|
|
98
|
+
const items = provider.actions.all();
|
|
99
|
+
const providerKey = provider.getKey();
|
|
100
|
+
|
|
101
|
+
setInteractionItems( ( prev ) => ( {
|
|
102
|
+
...prev,
|
|
103
|
+
[ providerKey ]: { provider, items },
|
|
104
|
+
} ) );
|
|
105
|
+
} catch {}
|
|
106
|
+
};
|
|
107
|
+
}
|
package/src/init.tsx
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { injectIntoLogic, injectIntoTop } from '@elementor/editor';
|
|
2
|
+
import { init as initInteractionsRepository } from '@elementor/editor-interactions';
|
|
2
3
|
|
|
3
4
|
import { ClassesRename } from './components/classes-rename';
|
|
4
5
|
import { ElementsOverlays } from './components/elements-overlays';
|
|
6
|
+
import { InteractionsRenderer } from './components/interactions-renderer';
|
|
5
7
|
import { StyleRenderer } from './components/style-renderer';
|
|
6
8
|
import { initSettingsTransformers } from './init-settings-transformers';
|
|
7
9
|
import { initStyleTransformers } from './init-style-transformers';
|
|
@@ -19,6 +21,8 @@ export function init() {
|
|
|
19
21
|
|
|
20
22
|
initSettingsTransformers();
|
|
21
23
|
|
|
24
|
+
initInteractionsRepository();
|
|
25
|
+
|
|
22
26
|
injectIntoTop( {
|
|
23
27
|
id: 'elements-overlays',
|
|
24
28
|
component: ElementsOverlays,
|
|
@@ -29,6 +33,11 @@ export function init() {
|
|
|
29
33
|
component: StyleRenderer,
|
|
30
34
|
} );
|
|
31
35
|
|
|
36
|
+
injectIntoTop( {
|
|
37
|
+
id: 'canvas-interactions-render',
|
|
38
|
+
component: InteractionsRenderer,
|
|
39
|
+
} );
|
|
40
|
+
|
|
32
41
|
injectIntoLogic( {
|
|
33
42
|
id: 'classes-rename',
|
|
34
43
|
component: ClassesRename,
|