@elementor/editor-v1-adapters 0.1.0

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.
@@ -0,0 +1,81 @@
1
+ declare function runCommand(command: string, args?: object): Promise<any>;
2
+ declare function openRoute(route: string): Promise<void>;
3
+
4
+ declare function useIsPreviewMode(): boolean;
5
+
6
+ type ExtendedWindow = Window & {
7
+ __elementorEditorV1LoadingPromise?: Promise<void>;
8
+ };
9
+ type CommandEventDescriptor = {
10
+ type: 'command';
11
+ name: string;
12
+ state: 'before' | 'after';
13
+ };
14
+ type RouteEventDescriptor = {
15
+ type: 'route';
16
+ name: string;
17
+ state: 'open' | 'close';
18
+ };
19
+ type WindowEventDescriptor = {
20
+ type: 'window-event';
21
+ name: string;
22
+ };
23
+ type CommandEvent<TArgs extends object = object> = {
24
+ type: CommandEventDescriptor['type'];
25
+ command: string;
26
+ args: TArgs;
27
+ originalEvent: CustomEvent;
28
+ };
29
+ type RouteEvent = {
30
+ type: RouteEventDescriptor['type'];
31
+ route: string;
32
+ originalEvent: CustomEvent;
33
+ };
34
+ type WindowEvent = {
35
+ type: WindowEventDescriptor['type'];
36
+ event: string;
37
+ originalEvent: Event;
38
+ };
39
+ type EventDescriptor = CommandEventDescriptor | WindowEventDescriptor | RouteEventDescriptor;
40
+ type ListenerEvent = WindowEvent | CommandEvent | RouteEvent;
41
+ type ListenerCallback = (e: ListenerEvent) => void;
42
+
43
+ declare const commandStartEvent: (command: CommandEventDescriptor['name']) => CommandEventDescriptor;
44
+ declare const commandEndEvent: (command: CommandEventDescriptor['name']) => CommandEventDescriptor;
45
+ declare const routeOpenEvent: (route: RouteEventDescriptor['name']) => RouteEventDescriptor;
46
+ declare const routeCloseEvent: (route: RouteEventDescriptor['name']) => RouteEventDescriptor;
47
+ declare const windowEvent: (event: WindowEventDescriptor['name']) => WindowEventDescriptor;
48
+ declare const v1ReadyEvent: () => WindowEventDescriptor;
49
+ declare const editModeChangeEvent: () => WindowEventDescriptor;
50
+
51
+ declare function listenTo(eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback): () => void;
52
+ declare function flushListeners(): void;
53
+
54
+ /**
55
+ * This file is used to store the state of the isReady variable, which is used to determine
56
+ * if the adapter is ready to receive events (editor v1 and v2 are loaded).
57
+ */
58
+ declare function isReady(): boolean;
59
+ declare function setReady(value: boolean): void;
60
+
61
+ declare function dispatchReadyEvent(): Promise<void>;
62
+
63
+ declare function useIsRouteActive(route: RouteEventDescriptor['name']): boolean;
64
+
65
+ declare function useListenTo<T>(event: EventDescriptor | EventDescriptor[], getSnapshot: () => T, deps?: unknown[]): T;
66
+
67
+ type Options = {
68
+ blockOnKitRoutes?: boolean;
69
+ blockOnPreviewMode?: boolean;
70
+ };
71
+ declare function useRouteStatus(route: RouteEventDescriptor['name'], { blockOnKitRoutes, blockOnPreviewMode, }?: Options): {
72
+ isActive: boolean;
73
+ isBlocked: boolean;
74
+ };
75
+
76
+ type EditMode = 'edit' | 'preview' | 'picker';
77
+
78
+ declare function isRouteActive(route: string): boolean;
79
+ declare function getCurrentEditMode(): EditMode;
80
+
81
+ export { CommandEvent, CommandEventDescriptor, EventDescriptor, ExtendedWindow, ListenerCallback, ListenerEvent, RouteEvent, RouteEventDescriptor, WindowEvent, WindowEventDescriptor, commandEndEvent, commandStartEvent, dispatchReadyEvent, editModeChangeEvent, flushListeners, getCurrentEditMode, isReady, isRouteActive, listenTo, openRoute, routeCloseEvent, routeOpenEvent, runCommand, setReady, useIsPreviewMode, useIsRouteActive, useListenTo, useRouteStatus, v1ReadyEvent, windowEvent };
package/dist/index.js ADDED
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ commandEndEvent: () => commandEndEvent,
24
+ commandStartEvent: () => commandStartEvent,
25
+ dispatchReadyEvent: () => dispatchReadyEvent,
26
+ editModeChangeEvent: () => editModeChangeEvent,
27
+ flushListeners: () => flushListeners,
28
+ getCurrentEditMode: () => getCurrentEditMode,
29
+ isReady: () => isReady,
30
+ isRouteActive: () => isRouteActive,
31
+ listenTo: () => listenTo,
32
+ openRoute: () => openRoute,
33
+ routeCloseEvent: () => routeCloseEvent,
34
+ routeOpenEvent: () => routeOpenEvent,
35
+ runCommand: () => runCommand,
36
+ setReady: () => setReady,
37
+ useIsPreviewMode: () => useIsPreviewMode,
38
+ useIsRouteActive: () => useIsRouteActive,
39
+ useListenTo: () => useListenTo,
40
+ useRouteStatus: () => useRouteStatus,
41
+ v1ReadyEvent: () => v1ReadyEvent,
42
+ windowEvent: () => windowEvent
43
+ });
44
+ module.exports = __toCommonJS(src_exports);
45
+
46
+ // src/dispatchers/utils.ts
47
+ function isJQueryDeferred(value) {
48
+ return !!value && "object" === typeof value && Object.hasOwn(value, "promise") && Object.hasOwn(value, "then") && Object.hasOwn(value, "fail");
49
+ }
50
+ function promisifyJQueryDeferred(deferred) {
51
+ return new Promise((resolve, reject) => {
52
+ deferred.then(resolve, reject);
53
+ });
54
+ }
55
+
56
+ // src/dispatchers/dispatchers.ts
57
+ function runCommand(command, args) {
58
+ const extendedWindow = window;
59
+ if (!extendedWindow.$e?.run) {
60
+ return Promise.reject("`$e.run()` is not available");
61
+ }
62
+ const result = extendedWindow.$e.run(command, args);
63
+ if (result instanceof Promise) {
64
+ return result;
65
+ }
66
+ if (isJQueryDeferred(result)) {
67
+ return promisifyJQueryDeferred(result);
68
+ }
69
+ return Promise.resolve(result);
70
+ }
71
+ function openRoute(route) {
72
+ const extendedWindow = window;
73
+ if (!extendedWindow.$e?.route) {
74
+ return Promise.reject("`$e.route()` is not available");
75
+ }
76
+ try {
77
+ return Promise.resolve(
78
+ extendedWindow.$e.route(route)
79
+ );
80
+ } catch (e) {
81
+ return Promise.reject(e);
82
+ }
83
+ }
84
+
85
+ // src/hooks/use-listen-to.ts
86
+ var import_react = require("react");
87
+
88
+ // src/listeners/event-creators.ts
89
+ var commandStartEvent = (command) => {
90
+ return {
91
+ type: "command",
92
+ name: command,
93
+ state: "before"
94
+ };
95
+ };
96
+ var commandEndEvent = (command) => {
97
+ return {
98
+ type: "command",
99
+ name: command,
100
+ state: "after"
101
+ };
102
+ };
103
+ var routeOpenEvent = (route) => {
104
+ return {
105
+ type: "route",
106
+ name: route,
107
+ state: "open"
108
+ };
109
+ };
110
+ var routeCloseEvent = (route) => {
111
+ return {
112
+ type: "route",
113
+ name: route,
114
+ state: "close"
115
+ };
116
+ };
117
+ var windowEvent = (event) => {
118
+ return {
119
+ type: "window-event",
120
+ name: event
121
+ };
122
+ };
123
+ var v1ReadyEvent = () => {
124
+ return windowEvent("elementor/initialized");
125
+ };
126
+ var editModeChangeEvent = () => {
127
+ return windowEvent("elementor/edit-mode/change");
128
+ };
129
+
130
+ // src/listeners/is-ready.ts
131
+ var ready = false;
132
+ function isReady() {
133
+ return ready;
134
+ }
135
+ function setReady(value) {
136
+ ready = value;
137
+ }
138
+
139
+ // src/listeners/utils.ts
140
+ function dispatchReadyEvent() {
141
+ return getV1LoadingPromise().then(() => {
142
+ setReady(true);
143
+ window.dispatchEvent(new CustomEvent("elementor/initialized"));
144
+ });
145
+ }
146
+ function getV1LoadingPromise() {
147
+ const v1LoadingPromise = window.__elementorEditorV1LoadingPromise;
148
+ if (!v1LoadingPromise) {
149
+ return Promise.reject("Elementor Editor V1 is not loaded");
150
+ }
151
+ return v1LoadingPromise;
152
+ }
153
+ function normalizeEvent(e) {
154
+ if (e instanceof CustomEvent && e.detail?.command) {
155
+ return {
156
+ type: "command",
157
+ command: e.detail.command,
158
+ args: e.detail.args,
159
+ originalEvent: e
160
+ };
161
+ }
162
+ if (e instanceof CustomEvent && e.detail?.route) {
163
+ return {
164
+ type: "route",
165
+ route: e.detail.route,
166
+ originalEvent: e
167
+ };
168
+ }
169
+ return {
170
+ type: "window-event",
171
+ event: e.type,
172
+ originalEvent: e
173
+ };
174
+ }
175
+
176
+ // src/listeners/listeners.ts
177
+ var callbacksByEvent = /* @__PURE__ */ new Map();
178
+ var abortController = new AbortController();
179
+ function listenTo(eventDescriptors, callback) {
180
+ if (!Array.isArray(eventDescriptors)) {
181
+ eventDescriptors = [eventDescriptors];
182
+ }
183
+ const cleanups = eventDescriptors.map((event) => {
184
+ const { type, name } = event;
185
+ switch (type) {
186
+ case "command":
187
+ return registerCommandListener(name, event.state, callback);
188
+ case "route":
189
+ return registerRouteListener(name, event.state, callback);
190
+ case "window-event":
191
+ return registerWindowEventListener(name, callback);
192
+ }
193
+ });
194
+ return () => {
195
+ cleanups.forEach((cleanup) => cleanup());
196
+ };
197
+ }
198
+ function flushListeners() {
199
+ abortController.abort();
200
+ callbacksByEvent.clear();
201
+ setReady(false);
202
+ abortController = new AbortController();
203
+ }
204
+ function registerCommandListener(command, state, callback) {
205
+ return registerWindowEventListener(`elementor/commands/run/${state}`, (e) => {
206
+ const shouldRunCallback = e.type === "command" && e.command === command;
207
+ if (shouldRunCallback) {
208
+ callback(e);
209
+ }
210
+ });
211
+ }
212
+ function registerRouteListener(route, state, callback) {
213
+ return registerWindowEventListener(`elementor/routes/${state}`, (e) => {
214
+ const shouldRunCallback = e.type === "route" && e.route.startsWith(route);
215
+ if (shouldRunCallback) {
216
+ callback(e);
217
+ }
218
+ });
219
+ }
220
+ function registerWindowEventListener(event, callback) {
221
+ const isFirstListener = !callbacksByEvent.has(event);
222
+ if (isFirstListener) {
223
+ callbacksByEvent.set(event, []);
224
+ addListener(event);
225
+ }
226
+ callbacksByEvent.get(event)?.push(callback);
227
+ return () => {
228
+ const callbacks = callbacksByEvent.get(event);
229
+ if (!callbacks?.length) {
230
+ return;
231
+ }
232
+ const filtered = callbacks.filter((cb) => cb !== callback);
233
+ callbacksByEvent.set(event, filtered);
234
+ };
235
+ }
236
+ function addListener(event) {
237
+ window.addEventListener(
238
+ event,
239
+ makeEventHandler(event),
240
+ { signal: abortController.signal }
241
+ );
242
+ }
243
+ function makeEventHandler(event) {
244
+ return (e) => {
245
+ if (!isReady()) {
246
+ return;
247
+ }
248
+ const normalizedEvent = normalizeEvent(e);
249
+ callbacksByEvent.get(event)?.forEach((callback) => {
250
+ callback(normalizedEvent);
251
+ });
252
+ };
253
+ }
254
+
255
+ // src/hooks/use-listen-to.ts
256
+ function useListenTo(event, getSnapshot, deps = []) {
257
+ const [snapshot, setSnapshot] = (0, import_react.useState)(() => getSnapshot());
258
+ (0, import_react.useEffect)(() => {
259
+ const updateState = () => setSnapshot(getSnapshot());
260
+ updateState();
261
+ return listenTo(event, updateState);
262
+ }, deps);
263
+ return snapshot;
264
+ }
265
+
266
+ // src/readers/index.ts
267
+ function isRouteActive(route) {
268
+ const extendedWindow = window;
269
+ return !!extendedWindow.$e?.routes?.isPartOf(route);
270
+ }
271
+ function getCurrentEditMode() {
272
+ const extendedWindow = window;
273
+ return extendedWindow.elementor?.channels?.dataEditMode?.request?.("activeMode");
274
+ }
275
+
276
+ // src/hooks/use-is-preview-mode.ts
277
+ function useIsPreviewMode() {
278
+ return useListenTo(
279
+ editModeChangeEvent(),
280
+ () => getCurrentEditMode() === "preview"
281
+ );
282
+ }
283
+
284
+ // src/hooks/use-is-route-active.ts
285
+ function useIsRouteActive(route) {
286
+ return useListenTo(
287
+ [
288
+ routeOpenEvent(route),
289
+ routeCloseEvent(route)
290
+ ],
291
+ () => isRouteActive(route),
292
+ [route]
293
+ );
294
+ }
295
+
296
+ // src/hooks/use-route-status.ts
297
+ function useRouteStatus(route, {
298
+ blockOnKitRoutes = true,
299
+ blockOnPreviewMode = true
300
+ } = {}) {
301
+ const isRouteActive2 = useIsRouteActive(route);
302
+ const isKitRouteActive = useIsRouteActive("panel/global");
303
+ const isPreviewMode = useIsPreviewMode();
304
+ const isActive = isRouteActive2 && !(blockOnPreviewMode && isPreviewMode);
305
+ const isBlocked = blockOnPreviewMode && isPreviewMode || blockOnKitRoutes && isKitRouteActive;
306
+ return {
307
+ isActive,
308
+ isBlocked
309
+ };
310
+ }
311
+ // Annotate the CommonJS export names for ESM import in node:
312
+ 0 && (module.exports = {
313
+ commandEndEvent,
314
+ commandStartEvent,
315
+ dispatchReadyEvent,
316
+ editModeChangeEvent,
317
+ flushListeners,
318
+ getCurrentEditMode,
319
+ isReady,
320
+ isRouteActive,
321
+ listenTo,
322
+ openRoute,
323
+ routeCloseEvent,
324
+ routeOpenEvent,
325
+ runCommand,
326
+ setReady,
327
+ useIsPreviewMode,
328
+ useIsRouteActive,
329
+ useListenTo,
330
+ useRouteStatus,
331
+ v1ReadyEvent,
332
+ windowEvent
333
+ });
334
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/dispatchers/utils.ts","../src/dispatchers/dispatchers.ts","../src/hooks/use-listen-to.ts","../src/listeners/event-creators.ts","../src/listeners/is-ready.ts","../src/listeners/utils.ts","../src/listeners/listeners.ts","../src/readers/index.ts","../src/hooks/use-is-preview-mode.ts","../src/hooks/use-is-route-active.ts","../src/hooks/use-route-status.ts"],"sourcesContent":["export * from './dispatchers';\nexport * from './hooks';\nexport * from './listeners';\nexport * from './readers';\n","import { jQueryDeferred } from './types';\n\nexport function isJQueryDeferred<T>( value: unknown ): value is jQueryDeferred<T> {\n\t// TODO: Copied from:\n\t// https://github.com/elementor/elementor/blob/6a74fc9/modules/web-cli/assets/js/core/commands.js#L410\n\n\treturn ( !! value ) &&\n\t\t'object' === typeof value &&\n\t\tObject.hasOwn( value, 'promise' ) &&\n\t\tObject.hasOwn( value, 'then' ) &&\n\t\tObject.hasOwn( value, 'fail' );\n}\n\nexport function promisifyJQueryDeferred<T>( deferred: jQueryDeferred<T> ): Promise<T> {\n\treturn new Promise( ( resolve, reject ) => {\n\t\tdeferred.then( resolve, reject );\n\t} );\n}\n","import { ExtendedWindow } from './types';\nimport { isJQueryDeferred, promisifyJQueryDeferred } from './utils';\n\nexport function runCommand( command: string, args?: object ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tif ( ! extendedWindow.$e?.run ) {\n\t\treturn Promise.reject( '`$e.run()` is not available' );\n\t}\n\n\tconst result = extendedWindow.$e.run( command, args );\n\n\tif ( result instanceof Promise ) {\n\t\treturn result;\n\t}\n\n\tif ( isJQueryDeferred( result ) ) {\n\t\treturn promisifyJQueryDeferred( result );\n\t}\n\n\treturn Promise.resolve( result );\n}\n\nexport function openRoute( route: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tif ( ! extendedWindow.$e?.route ) {\n\t\treturn Promise.reject( '`$e.route()` is not available' );\n\t}\n\n\ttry {\n\t\treturn Promise.resolve(\n\t\t\textendedWindow.$e.route( route )\n\t\t);\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n","import { useEffect, useState } from 'react';\nimport { EventDescriptor, listenTo } from '../listeners';\n\nexport default function useListenTo<T>(\n\tevent: EventDescriptor | EventDescriptor[],\n\tgetSnapshot: () => T,\n\tdeps: unknown[] = []\n) {\n\tconst [ snapshot, setSnapshot ] = useState( () => getSnapshot() );\n\n\tuseEffect( () => {\n\t\tconst updateState = () => setSnapshot( getSnapshot() );\n\n\t\t// Ensure the state is re-calculated when the dependencies have been changed.\n\t\tupdateState();\n\n\t\treturn listenTo( event, updateState );\n\t}, deps ); // eslint-disable-line react-hooks/exhaustive-deps\n\n\treturn snapshot;\n}\n","import { CommandEventDescriptor, RouteEventDescriptor, WindowEventDescriptor } from './types';\n\nexport const commandStartEvent = ( command: CommandEventDescriptor['name'] ): CommandEventDescriptor => {\n\treturn {\n\t\ttype: 'command',\n\t\tname: command,\n\t\tstate: 'before',\n\t};\n};\n\nexport const commandEndEvent = ( command: CommandEventDescriptor['name'] ): CommandEventDescriptor => {\n\treturn {\n\t\ttype: 'command',\n\t\tname: command,\n\t\tstate: 'after',\n\t};\n};\n\nexport const routeOpenEvent = ( route: RouteEventDescriptor['name'] ): RouteEventDescriptor => {\n\treturn {\n\t\ttype: 'route',\n\t\tname: route,\n\t\tstate: 'open',\n\t};\n};\n\nexport const routeCloseEvent = ( route: RouteEventDescriptor['name'] ): RouteEventDescriptor => {\n\treturn {\n\t\ttype: 'route',\n\t\tname: route,\n\t\tstate: 'close',\n\t};\n};\n\nexport const windowEvent = ( event: WindowEventDescriptor['name'] ): WindowEventDescriptor => {\n\treturn {\n\t\ttype: 'window-event',\n\t\tname: event,\n\t};\n};\n\nexport const v1ReadyEvent = () => {\n\treturn windowEvent( 'elementor/initialized' );\n};\n\nexport const editModeChangeEvent = () => {\n\treturn windowEvent( 'elementor/edit-mode/change' );\n};\n","/**\n * This file is used to store the state of the isReady variable, which is used to determine\n * if the adapter is ready to receive events (editor v1 and v2 are loaded).\n */\n\nlet ready = false;\n\nexport function isReady() {\n\treturn ready;\n}\n\nexport function setReady( value: boolean ) {\n\tready = value;\n}\n","import { ExtendedWindow, ListenerEvent } from './types';\nimport { setReady } from './is-ready';\n\nexport function dispatchReadyEvent() {\n\treturn getV1LoadingPromise().then( () => {\n\t\tsetReady( true );\n\t\twindow.dispatchEvent( new CustomEvent( 'elementor/initialized' ) );\n\t} );\n}\n\nfunction getV1LoadingPromise() {\n\tconst v1LoadingPromise = ( window as unknown as ExtendedWindow ).__elementorEditorV1LoadingPromise;\n\n\tif ( ! v1LoadingPromise ) {\n\t\treturn Promise.reject( 'Elementor Editor V1 is not loaded' );\n\t}\n\n\treturn v1LoadingPromise;\n}\n\nexport function normalizeEvent( e: ListenerEvent['originalEvent'] ): ListenerEvent {\n\tif ( e instanceof CustomEvent && e.detail?.command ) {\n\t\treturn {\n\t\t\ttype: 'command',\n\t\t\tcommand: e.detail.command,\n\t\t\targs: e.detail.args,\n\t\t\toriginalEvent: e,\n\t\t};\n\t}\n\n\tif ( e instanceof CustomEvent && e.detail?.route ) {\n\t\treturn {\n\t\t\ttype: 'route',\n\t\t\troute: e.detail.route,\n\t\t\toriginalEvent: e,\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'window-event',\n\t\tevent: e.type,\n\t\toriginalEvent: e,\n\t};\n}\n","import { normalizeEvent } from './utils';\nimport {\n\tCommandEventDescriptor,\n\tEventDescriptor,\n\tListenerCallback,\n\tRouteEventDescriptor,\n\tWindowEventDescriptor,\n} from './types';\nimport { isReady, setReady } from './is-ready';\n\nconst callbacksByEvent = new Map<EventDescriptor['name'], ListenerCallback[]>();\nlet abortController = new AbortController();\n\nexport function listenTo(\n\teventDescriptors: EventDescriptor | EventDescriptor[],\n\tcallback: ListenerCallback\n) {\n\tif ( ! Array.isArray( eventDescriptors ) ) {\n\t\teventDescriptors = [ eventDescriptors ];\n\t}\n\n\t// @see https://github.com/typescript-eslint/typescript-eslint/issues/2841\n\t// eslint-disable-next-line array-callback-return -- Clashes with typescript.\n\tconst cleanups = eventDescriptors.map( ( event ) => {\n\t\tconst { type, name } = event;\n\n\t\tswitch ( type ) {\n\t\t\tcase 'command':\n\t\t\t\treturn registerCommandListener( name, event.state, callback );\n\n\t\t\tcase 'route':\n\t\t\t\treturn registerRouteListener( name, event.state, callback );\n\n\t\t\tcase 'window-event':\n\t\t\t\treturn registerWindowEventListener( name, callback );\n\t\t}\n\t} );\n\n\treturn () => {\n\t\tcleanups.forEach( ( cleanup ) => cleanup() );\n\t};\n}\n\nexport function flushListeners() {\n\tabortController.abort();\n\tcallbacksByEvent.clear();\n\tsetReady( false );\n\n\tabortController = new AbortController();\n}\n\nfunction registerCommandListener(\n\tcommand: CommandEventDescriptor['name'],\n\tstate: CommandEventDescriptor['state'],\n\tcallback: ListenerCallback\n) {\n\treturn registerWindowEventListener( `elementor/commands/run/${ state }`, ( e ) => {\n\t\tconst shouldRunCallback = e.type === 'command' && e.command === command;\n\n\t\tif ( shouldRunCallback ) {\n\t\t\tcallback( e );\n\t\t}\n\t} );\n}\n\nfunction registerRouteListener(\n\troute: RouteEventDescriptor['name'],\n\tstate: RouteEventDescriptor['state'],\n\tcallback: ListenerCallback\n) {\n\treturn registerWindowEventListener( `elementor/routes/${ state }`, ( e ) => {\n\t\tconst shouldRunCallback = e.type === 'route' && e.route.startsWith( route );\n\n\t\tif ( shouldRunCallback ) {\n\t\t\tcallback( e );\n\t\t}\n\t} );\n}\n\nfunction registerWindowEventListener( event: WindowEventDescriptor['name'], callback: ListenerCallback ) {\n\tconst isFirstListener = ! callbacksByEvent.has( event );\n\n\tif ( isFirstListener ) {\n\t\tcallbacksByEvent.set( event, [] );\n\n\t\taddListener( event );\n\t}\n\n\tcallbacksByEvent.get( event )?.push( callback );\n\n\treturn () => {\n\t\tconst callbacks = callbacksByEvent.get( event );\n\n\t\tif ( ! callbacks?.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst filtered = callbacks.filter( ( cb ) => cb !== callback );\n\n\t\tcallbacksByEvent.set( event, filtered );\n\t};\n}\n\nfunction addListener( event: EventDescriptor['name'] ) {\n\twindow.addEventListener(\n\t\tevent,\n\t\tmakeEventHandler( event ),\n\t\t{ signal: abortController.signal }\n\t);\n}\n\nfunction makeEventHandler( event: EventDescriptor['name'] ): EventListener {\n\treturn ( e ) => {\n\t\tif ( ! isReady() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedEvent = normalizeEvent( e );\n\n\t\tcallbacksByEvent.get( event )?.forEach( ( callback ) => {\n\t\t\tcallback( normalizedEvent );\n\t\t} );\n\t};\n}\n","import { ExtendedWindow } from './types';\n\nexport function isRouteActive( route: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn !! extendedWindow.$e?.routes?.isPartOf( route );\n}\n\nexport function getCurrentEditMode() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor?.channels?.dataEditMode?.request?.( 'activeMode' );\n}\n","import useListenTo from './use-listen-to';\nimport { getCurrentEditMode } from '../readers';\nimport { editModeChangeEvent } from '../listeners';\n\nexport default function useIsPreviewMode() {\n\treturn useListenTo(\n\t\teditModeChangeEvent(),\n\t\t() => getCurrentEditMode() === 'preview'\n\t);\n}\n","import useListenTo from './use-listen-to';\nimport { isRouteActive } from '../readers';\nimport { routeCloseEvent, routeOpenEvent, RouteEventDescriptor } from '../listeners';\n\nexport default function useIsRouteActive( route: RouteEventDescriptor['name'] ) {\n\treturn useListenTo(\n\t\t[\n\t\t\trouteOpenEvent( route ),\n\t\t\trouteCloseEvent( route ),\n\t\t],\n\t\t() => isRouteActive( route ),\n\t\t[ route ]\n\t);\n}\n","import useIsPreviewMode from './use-is-preview-mode';\nimport useIsRouteActive from './use-is-route-active';\nimport { RouteEventDescriptor } from '../listeners';\n\ntype Options = {\n\tblockOnKitRoutes?: boolean,\n\tblockOnPreviewMode?: boolean,\n}\n\nexport default function useRouteStatus(\n\troute: RouteEventDescriptor['name'],\n\t{\n\t\tblockOnKitRoutes = true,\n\t\tblockOnPreviewMode = true,\n\t}: Options = {}\n) {\n\tconst isRouteActive = useIsRouteActive( route );\n\tconst isKitRouteActive = useIsRouteActive( 'panel/global' );\n\tconst isPreviewMode = useIsPreviewMode();\n\n\tconst isActive = isRouteActive && ! ( blockOnPreviewMode && isPreviewMode );\n\n\tconst isBlocked = (\n\t\t( blockOnPreviewMode && isPreviewMode ) ||\n\t\t( blockOnKitRoutes && isKitRouteActive )\n\t);\n\n\treturn {\n\t\tisActive,\n\t\tisBlocked,\n\t};\n}\n"],"mappings":"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","names":["isRouteActive"]}