@elementor/editor-v1-adapters 0.10.0 → 0.10.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.10.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 959e02c: Disable canvas and app bar buttons when opening the class manager panel
8
+
9
+ ## 0.10.1
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [571ff75]
14
+ - @elementor/utils@0.4.0
15
+
3
16
  ## 0.10.0
4
17
 
5
18
  ### Minor Changes
package/dist/index.d.mts CHANGED
@@ -6,8 +6,6 @@ declare function runCommandSync(command: string, args?: object, { internal }?: R
6
6
  declare function openRoute(route: string): Promise<unknown>;
7
7
  declare function registerRoute(route: string): Promise<unknown>;
8
8
 
9
- declare function useIsPreviewMode(): boolean;
10
-
11
9
  type ExtendedWindow = Window & {
12
10
  __elementorEditorV1LoadingPromise?: Promise<void>;
13
11
  };
@@ -51,7 +49,6 @@ declare const routeOpenEvent: (route: RouteEventDescriptor["name"]) => RouteEven
51
49
  declare const routeCloseEvent: (route: RouteEventDescriptor["name"]) => RouteEventDescriptor;
52
50
  declare const windowEvent: (event: WindowEventDescriptor["name"]) => WindowEventDescriptor;
53
51
  declare const v1ReadyEvent: () => WindowEventDescriptor;
54
- declare const editModeChangeEvent: () => WindowEventDescriptor;
55
52
 
56
53
  declare function listenTo(eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback): () => void;
57
54
  declare function flushListeners(): void;
@@ -69,19 +66,20 @@ declare function useIsRouteActive(route: RouteEventDescriptor['name']): boolean;
69
66
 
70
67
  declare function useListenTo<T>(event: EventDescriptor | EventDescriptor[], getSnapshot: () => T, deps?: unknown[]): T;
71
68
 
72
- type Options$1 = {
69
+ type EditMode = 'edit' | 'preview' | 'picker' | (string & {});
70
+ declare function useEditMode(): EditMode;
71
+ declare function changeEditMode(newMode: EditMode): void;
72
+
73
+ type UseRouteStatusOptions = {
73
74
  blockOnKitRoutes?: boolean;
74
- blockOnPreviewMode?: boolean;
75
+ allowedEditModes?: EditMode[];
75
76
  };
76
- declare function useRouteStatus(route: RouteEventDescriptor['name'], { blockOnKitRoutes, blockOnPreviewMode }?: Options$1): {
77
+ declare function useRouteStatus(route: RouteEventDescriptor['name'], { blockOnKitRoutes, allowedEditModes }?: UseRouteStatusOptions): {
77
78
  isActive: boolean;
78
79
  isBlocked: boolean;
79
80
  };
80
81
 
81
- type EditMode = 'edit' | 'preview' | 'picker';
82
-
83
82
  declare function isRouteActive(route: string): boolean;
84
- declare function getCurrentEditMode(): EditMode;
85
83
 
86
84
  type Payload = Record<string, any> | undefined;
87
85
  type LabelGenerator<TPayload extends Payload, TDoReturn> = (payload: TPayload, doReturn: TDoReturn) => string;
@@ -136,4 +134,4 @@ declare function blockCommand({ command, condition }: BlockCommandArgs): {
136
134
  register(): void;
137
135
  };
138
136
 
139
- export { type CommandEvent, type CommandEventDescriptor, type EventDescriptor, type ExtendedWindow, type HistoryItem, type ListenerCallback, type ListenerEvent, type RouteEvent, type RouteEventDescriptor, type WindowEvent, type WindowEventDescriptor, type WindowWithHistoryManager, dispatchReadyEvent as __privateDispatchReadyEvent, flushListeners as __privateFlushListeners, getCurrentEditMode as __privateGetCurrentEditMode, isRouteActive as __privateIsRouteActive, listenTo as __privateListenTo, openRoute as __privateOpenRoute, registerRoute as __privateRegisterRoute, runCommand as __privateRunCommand, runCommandSync as __privateRunCommandSync, setReady as __privateSetReady, useIsPreviewMode as __privateUseIsPreviewMode, useIsRouteActive as __privateUseIsRouteActive, useListenTo as __privateUseListenTo, useRouteStatus as __privateUseRouteStatus, blockCommand, commandEndEvent, commandStartEvent, dispatchReadyEvent, editModeChangeEvent, flushListeners, isReady, listenTo, registerDataHook, routeCloseEvent, routeOpenEvent, setReady, undoable, v1ReadyEvent, windowEvent };
137
+ export { type CommandEvent, type CommandEventDescriptor, type EditMode, type EventDescriptor, type ExtendedWindow, type HistoryItem, type ListenerCallback, type ListenerEvent, type RouteEvent, type RouteEventDescriptor, type UseRouteStatusOptions, type WindowEvent, type WindowEventDescriptor, type WindowWithHistoryManager, dispatchReadyEvent as __privateDispatchReadyEvent, flushListeners as __privateFlushListeners, isRouteActive as __privateIsRouteActive, listenTo as __privateListenTo, openRoute as __privateOpenRoute, registerRoute as __privateRegisterRoute, runCommand as __privateRunCommand, runCommandSync as __privateRunCommandSync, setReady as __privateSetReady, useIsRouteActive as __privateUseIsRouteActive, useListenTo as __privateUseListenTo, useRouteStatus as __privateUseRouteStatus, blockCommand, changeEditMode, commandEndEvent, commandStartEvent, dispatchReadyEvent, flushListeners, isReady, listenTo, registerDataHook, routeCloseEvent, routeOpenEvent, setReady, undoable, useEditMode, v1ReadyEvent, windowEvent };
package/dist/index.d.ts CHANGED
@@ -6,8 +6,6 @@ declare function runCommandSync(command: string, args?: object, { internal }?: R
6
6
  declare function openRoute(route: string): Promise<unknown>;
7
7
  declare function registerRoute(route: string): Promise<unknown>;
8
8
 
9
- declare function useIsPreviewMode(): boolean;
10
-
11
9
  type ExtendedWindow = Window & {
12
10
  __elementorEditorV1LoadingPromise?: Promise<void>;
13
11
  };
@@ -51,7 +49,6 @@ declare const routeOpenEvent: (route: RouteEventDescriptor["name"]) => RouteEven
51
49
  declare const routeCloseEvent: (route: RouteEventDescriptor["name"]) => RouteEventDescriptor;
52
50
  declare const windowEvent: (event: WindowEventDescriptor["name"]) => WindowEventDescriptor;
53
51
  declare const v1ReadyEvent: () => WindowEventDescriptor;
54
- declare const editModeChangeEvent: () => WindowEventDescriptor;
55
52
 
56
53
  declare function listenTo(eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback): () => void;
57
54
  declare function flushListeners(): void;
@@ -69,19 +66,20 @@ declare function useIsRouteActive(route: RouteEventDescriptor['name']): boolean;
69
66
 
70
67
  declare function useListenTo<T>(event: EventDescriptor | EventDescriptor[], getSnapshot: () => T, deps?: unknown[]): T;
71
68
 
72
- type Options$1 = {
69
+ type EditMode = 'edit' | 'preview' | 'picker' | (string & {});
70
+ declare function useEditMode(): EditMode;
71
+ declare function changeEditMode(newMode: EditMode): void;
72
+
73
+ type UseRouteStatusOptions = {
73
74
  blockOnKitRoutes?: boolean;
74
- blockOnPreviewMode?: boolean;
75
+ allowedEditModes?: EditMode[];
75
76
  };
76
- declare function useRouteStatus(route: RouteEventDescriptor['name'], { blockOnKitRoutes, blockOnPreviewMode }?: Options$1): {
77
+ declare function useRouteStatus(route: RouteEventDescriptor['name'], { blockOnKitRoutes, allowedEditModes }?: UseRouteStatusOptions): {
77
78
  isActive: boolean;
78
79
  isBlocked: boolean;
79
80
  };
80
81
 
81
- type EditMode = 'edit' | 'preview' | 'picker';
82
-
83
82
  declare function isRouteActive(route: string): boolean;
84
- declare function getCurrentEditMode(): EditMode;
85
83
 
86
84
  type Payload = Record<string, any> | undefined;
87
85
  type LabelGenerator<TPayload extends Payload, TDoReturn> = (payload: TPayload, doReturn: TDoReturn) => string;
@@ -136,4 +134,4 @@ declare function blockCommand({ command, condition }: BlockCommandArgs): {
136
134
  register(): void;
137
135
  };
138
136
 
139
- export { type CommandEvent, type CommandEventDescriptor, type EventDescriptor, type ExtendedWindow, type HistoryItem, type ListenerCallback, type ListenerEvent, type RouteEvent, type RouteEventDescriptor, type WindowEvent, type WindowEventDescriptor, type WindowWithHistoryManager, dispatchReadyEvent as __privateDispatchReadyEvent, flushListeners as __privateFlushListeners, getCurrentEditMode as __privateGetCurrentEditMode, isRouteActive as __privateIsRouteActive, listenTo as __privateListenTo, openRoute as __privateOpenRoute, registerRoute as __privateRegisterRoute, runCommand as __privateRunCommand, runCommandSync as __privateRunCommandSync, setReady as __privateSetReady, useIsPreviewMode as __privateUseIsPreviewMode, useIsRouteActive as __privateUseIsRouteActive, useListenTo as __privateUseListenTo, useRouteStatus as __privateUseRouteStatus, blockCommand, commandEndEvent, commandStartEvent, dispatchReadyEvent, editModeChangeEvent, flushListeners, isReady, listenTo, registerDataHook, routeCloseEvent, routeOpenEvent, setReady, undoable, v1ReadyEvent, windowEvent };
137
+ export { type CommandEvent, type CommandEventDescriptor, type EditMode, type EventDescriptor, type ExtendedWindow, type HistoryItem, type ListenerCallback, type ListenerEvent, type RouteEvent, type RouteEventDescriptor, type UseRouteStatusOptions, type WindowEvent, type WindowEventDescriptor, type WindowWithHistoryManager, dispatchReadyEvent as __privateDispatchReadyEvent, flushListeners as __privateFlushListeners, isRouteActive as __privateIsRouteActive, listenTo as __privateListenTo, openRoute as __privateOpenRoute, registerRoute as __privateRegisterRoute, runCommand as __privateRunCommand, runCommandSync as __privateRunCommandSync, setReady as __privateSetReady, useIsRouteActive as __privateUseIsRouteActive, useListenTo as __privateUseListenTo, useRouteStatus as __privateUseRouteStatus, blockCommand, changeEditMode, commandEndEvent, commandStartEvent, dispatchReadyEvent, flushListeners, isReady, listenTo, registerDataHook, routeCloseEvent, routeOpenEvent, setReady, undoable, useEditMode, v1ReadyEvent, windowEvent };
package/dist/index.js CHANGED
@@ -22,7 +22,6 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  __privateDispatchReadyEvent: () => dispatchReadyEvent,
24
24
  __privateFlushListeners: () => flushListeners,
25
- __privateGetCurrentEditMode: () => getCurrentEditMode,
26
25
  __privateIsRouteActive: () => isRouteActive,
27
26
  __privateListenTo: () => listenTo,
28
27
  __privateOpenRoute: () => openRoute,
@@ -30,18 +29,18 @@ __export(index_exports, {
30
29
  __privateRunCommand: () => runCommand,
31
30
  __privateRunCommandSync: () => runCommandSync,
32
31
  __privateSetReady: () => setReady,
33
- __privateUseIsPreviewMode: () => useIsPreviewMode,
34
32
  __privateUseIsRouteActive: () => useIsRouteActive,
35
33
  __privateUseListenTo: () => useListenTo,
36
34
  __privateUseRouteStatus: () => useRouteStatus,
37
35
  blockCommand: () => blockCommand,
36
+ changeEditMode: () => changeEditMode,
38
37
  commandEndEvent: () => commandEndEvent,
39
38
  commandStartEvent: () => commandStartEvent,
40
- editModeChangeEvent: () => editModeChangeEvent,
41
39
  registerDataHook: () => registerDataHook,
42
40
  routeCloseEvent: () => routeCloseEvent,
43
41
  routeOpenEvent: () => routeOpenEvent,
44
42
  undoable: () => undoable,
43
+ useEditMode: () => useEditMode,
45
44
  v1ReadyEvent: () => v1ReadyEvent,
46
45
  windowEvent: () => windowEvent
47
46
  });
@@ -144,9 +143,6 @@ var windowEvent = (event) => {
144
143
  var v1ReadyEvent = () => {
145
144
  return windowEvent("elementor/initialized");
146
145
  };
147
- var editModeChangeEvent = () => {
148
- return windowEvent("elementor/edit-mode/change");
149
- };
150
146
 
151
147
  // src/listeners/is-ready.ts
152
148
  var ready = false;
@@ -274,10 +270,6 @@ function isRouteActive(route) {
274
270
  const extendedWindow = window;
275
271
  return !!extendedWindow.$e?.routes?.isPartOf(route);
276
272
  }
277
- function getCurrentEditMode() {
278
- const extendedWindow = window;
279
- return extendedWindow.elementor?.channels?.dataEditMode?.request?.("activeMode");
280
- }
281
273
 
282
274
  // src/hooks/use-listen-to.ts
283
275
  var import_react = require("react");
@@ -291,11 +283,6 @@ function useListenTo(event, getSnapshot, deps = []) {
291
283
  return snapshot;
292
284
  }
293
285
 
294
- // src/hooks/use-is-preview-mode.ts
295
- function useIsPreviewMode() {
296
- return useListenTo(editModeChangeEvent(), () => getCurrentEditMode() === "preview");
297
- }
298
-
299
286
  // src/hooks/use-is-route-active.ts
300
287
  function useIsRouteActive(route) {
301
288
  return useListenTo([routeOpenEvent(route), routeCloseEvent(route)], () => isRouteActive(route), [
@@ -303,13 +290,28 @@ function useIsRouteActive(route) {
303
290
  ]);
304
291
  }
305
292
 
293
+ // src/edit-mode.ts
294
+ function useEditMode() {
295
+ return useListenTo(windowEvent("elementor/edit-mode/change"), getCurrentEditMode);
296
+ }
297
+ function getCurrentEditMode() {
298
+ const extendedWindow = window;
299
+ return extendedWindow.elementor.channels.dataEditMode.request("activeMode");
300
+ }
301
+ function changeEditMode(newMode) {
302
+ const extendedWindow = window;
303
+ return extendedWindow.elementor.changeEditMode(newMode);
304
+ }
305
+
306
306
  // src/hooks/use-route-status.ts
307
- function useRouteStatus(route, { blockOnKitRoutes = true, blockOnPreviewMode = true } = {}) {
307
+ function useRouteStatus(route, { blockOnKitRoutes = true, allowedEditModes = ["edit"] } = {}) {
308
308
  const isRouteActive2 = useIsRouteActive(route);
309
309
  const isKitRouteActive = useIsRouteActive("panel/global");
310
- const isPreviewMode = useIsPreviewMode();
311
- const isActive = isRouteActive2 && !(blockOnPreviewMode && isPreviewMode);
312
- const isBlocked = blockOnPreviewMode && isPreviewMode || blockOnKitRoutes && isKitRouteActive;
310
+ const currentEditMode = useEditMode();
311
+ const isBlockedByEditMode = !allowedEditModes.includes(currentEditMode);
312
+ const isBlockedByKit = blockOnKitRoutes && isKitRouteActive;
313
+ const isActive = isRouteActive2 && !isBlockedByEditMode;
314
+ const isBlocked = isBlockedByEditMode || isBlockedByKit;
313
315
  return {
314
316
  isActive,
315
317
  isBlocked
@@ -398,7 +400,6 @@ function blockCommand({ command, condition }) {
398
400
  0 && (module.exports = {
399
401
  __privateDispatchReadyEvent,
400
402
  __privateFlushListeners,
401
- __privateGetCurrentEditMode,
402
403
  __privateIsRouteActive,
403
404
  __privateListenTo,
404
405
  __privateOpenRoute,
@@ -406,18 +407,18 @@ function blockCommand({ command, condition }) {
406
407
  __privateRunCommand,
407
408
  __privateRunCommandSync,
408
409
  __privateSetReady,
409
- __privateUseIsPreviewMode,
410
410
  __privateUseIsRouteActive,
411
411
  __privateUseListenTo,
412
412
  __privateUseRouteStatus,
413
413
  blockCommand,
414
+ changeEditMode,
414
415
  commandEndEvent,
415
416
  commandStartEvent,
416
- editModeChangeEvent,
417
417
  registerDataHook,
418
418
  routeCloseEvent,
419
419
  routeOpenEvent,
420
420
  undoable,
421
+ useEditMode,
421
422
  v1ReadyEvent,
422
423
  windowEvent
423
424
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/dispatchers/utils.ts","../src/dispatchers/dispatchers.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-listen-to.ts","../src/hooks/use-is-preview-mode.ts","../src/hooks/use-is-route-active.ts","../src/hooks/use-route-status.ts","../src/undoable/get-history-manager.ts","../src/undoable/undoable.ts","../src/data-hooks/register-data-hook.ts","../src/data-hooks/block-command.ts"],"sourcesContent":["export {\n\trunCommand as __privateRunCommand,\n\trunCommandSync as __privateRunCommandSync,\n\topenRoute as __privateOpenRoute,\n\tregisterRoute as __privateRegisterRoute,\n} from './dispatchers/dispatchers';\n\nexport {\n\tuseIsPreviewMode as __privateUseIsPreviewMode,\n\tuseIsRouteActive as __privateUseIsRouteActive,\n\tuseListenTo as __privateUseListenTo,\n\tuseRouteStatus as __privateUseRouteStatus,\n} from './hooks';\n\nexport {\n\tsetReady as __privateSetReady,\n\tlistenTo as __privateListenTo,\n\tflushListeners as __privateFlushListeners,\n\tdispatchReadyEvent as __privateDispatchReadyEvent,\n\twindowEvent,\n\tv1ReadyEvent,\n\tcommandStartEvent,\n\tcommandEndEvent,\n\trouteOpenEvent,\n\trouteCloseEvent,\n\teditModeChangeEvent,\n} from './listeners';\n\nexport type * from './listeners';\n\nexport { isRouteActive as __privateIsRouteActive, getCurrentEditMode as __privateGetCurrentEditMode } from './readers';\n\nexport { undoable } from './undoable';\n\nexport type { HistoryItem, WindowWithHistoryManager } from './undoable/get-history-manager';\n\nexport { registerDataHook } from './data-hooks/register-data-hook';\nexport { blockCommand } from './data-hooks/block-command';\n","import { type 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 (\n\t\t!! 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\t);\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 { type ExtendedWindow } from './types';\nimport { isJQueryDeferred, promisifyJQueryDeferred } from './utils';\n\ntype RunCommandOptions = {\n\tinternal?: boolean;\n};\n\nexport async function runCommand( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst result = runCommandSync( command, args, { internal } );\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 runCommandSync( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tconst run = internal ? extendedWindow.$e?.internal : extendedWindow.$e?.run;\n\n\tif ( ! run ) {\n\t\tconst runnerName = internal ? '$e.internal' : '$e.run';\n\n\t\tthrow new Error( `\\`${ runnerName }()\\` is not available` );\n\t}\n\n\treturn run( command, args );\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( extendedWindow.$e.route( route ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n\nexport function registerRoute( route: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tif ( ! extendedWindow.$e?.routes?.register ) {\n\t\treturn Promise.reject( '`$e.routes.register()` is not available' );\n\t}\n\n\tconst routeParts = route.split( '/' );\n\n\tif ( routeParts.length < 2 ) {\n\t\treturn Promise.reject( `\\`${ route }\\` is an invalid route` );\n\t}\n\n\tconst componentRoute = routeParts.pop() as string; // routeParts.length must be >= 2\n\tconst component = routeParts.join( '/' );\n\n\ttry {\n\t\treturn Promise.resolve( extendedWindow.$e.routes.register( component, componentRoute, () => null ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n","import { type CommandEventDescriptor, type RouteEventDescriptor, type 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 { setReady } from './is-ready';\nimport { type ExtendedWindow, type ListenerEvent } from './types';\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 { isReady, setReady } from './is-ready';\nimport {\n\ttype CommandEventDescriptor,\n\ttype EventDescriptor,\n\ttype ListenerCallback,\n\ttype RouteEventDescriptor,\n\ttype WindowEventDescriptor,\n} from './types';\nimport { normalizeEvent } from './utils';\n\nconst callbacksByEvent = new Map< EventDescriptor[ 'name' ], ListenerCallback[] >();\nlet abortController = new AbortController();\n\nexport function listenTo( eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback ) {\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( event, makeEventHandler( event ), { signal: abortController.signal } );\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 { type 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 { useEffect, useState } from 'react';\n\nimport { type 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 { editModeChangeEvent } from '../listeners';\nimport { getCurrentEditMode } from '../readers';\nimport useListenTo from './use-listen-to';\n\nexport default function useIsPreviewMode() {\n\treturn useListenTo( editModeChangeEvent(), () => getCurrentEditMode() === 'preview' );\n}\n","import { routeCloseEvent, type RouteEventDescriptor, routeOpenEvent } from '../listeners';\nimport { isRouteActive } from '../readers';\nimport useListenTo from './use-listen-to';\n\nexport default function useIsRouteActive( route: RouteEventDescriptor[ 'name' ] ) {\n\treturn useListenTo( [ routeOpenEvent( route ), routeCloseEvent( route ) ], () => isRouteActive( route ), [\n\t\troute,\n\t] );\n}\n","import { type RouteEventDescriptor } from '../listeners';\nimport useIsPreviewMode from './use-is-preview-mode';\nimport useIsRouteActive from './use-is-route-active';\n\ntype Options = {\n\tblockOnKitRoutes?: boolean;\n\tblockOnPreviewMode?: boolean;\n};\n\nexport default function useRouteStatus(\n\troute: RouteEventDescriptor[ 'name' ],\n\t{ blockOnKitRoutes = true, blockOnPreviewMode = true }: 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 = ( blockOnPreviewMode && isPreviewMode ) || ( blockOnKitRoutes && isKitRouteActive );\n\n\treturn {\n\t\tisActive,\n\t\tisBlocked,\n\t};\n}\n","import { createError } from '@elementor/utils';\n\nexport type HistoryItem = {\n\ttitle: string;\n\tsubTitle: string;\n\ttype: string;\n\trestore: ( item: HistoryItem, isRedo: boolean ) => void;\n};\n\ntype AddHistoryItem = ( item: HistoryItem ) => void;\n\nexport type WindowWithHistoryManager = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\tgetCurrent?: () => {\n\t\t\t\thistory?: {\n\t\t\t\t\taddItem: AddHistoryItem;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst HistoryManagerNotAvailable = createError( {\n\tcode: 'history_manager_not_available',\n\tmessage: 'Cannot access History manager.',\n} );\n\nexport function getHistoryManager() {\n\tconst extendedWindow = window as unknown as WindowWithHistoryManager;\n\n\tconst historyManger = extendedWindow.elementor?.documents?.getCurrent?.()?.history;\n\n\tif ( ! historyManger ) {\n\t\tthrow new HistoryManagerNotAvailable();\n\t}\n\n\treturn historyManger;\n}\n","import { getHistoryManager } from './get-history-manager';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Payload = Record< string, any > | undefined;\n\ntype LabelGenerator< TPayload extends Payload, TDoReturn > = ( payload: TPayload, doReturn: TDoReturn ) => string;\n\ntype Actions< TPayload extends Payload, TDoReturn, TUndoReturn > = {\n\tdo: ( payload: TPayload ) => Awaited< TDoReturn >;\n\tundo: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TUndoReturn >;\n\tredo?: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TDoReturn >;\n};\n\ntype Options< TPayload extends Payload, TDoReturn > = {\n\ttitle: string | LabelGenerator< TPayload, TDoReturn >;\n\tsubtitle?: string | LabelGenerator< TPayload, TDoReturn >;\n};\n\n// Action WITHOUT a payload.\nexport function undoable< TDoReturn, TUndoReturn >(\n\tactions: Actions< undefined, TDoReturn, TUndoReturn >,\n\toptions: Options< undefined, NoInfer< TDoReturn > >\n): () => TDoReturn;\n\n// Action WITH a payload.\nexport function undoable< TPayload extends NonNullable< Payload >, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload: TPayload ) => TDoReturn;\n\nexport function undoable< TPayload extends Payload, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload?: Payload ) => TDoReturn {\n\tactions.redo ??= actions.do;\n\n\treturn ( payload ) => {\n\t\tconst _payload = payload as TPayload;\n\t\tconst _actions = actions as Required< Actions< TPayload, TDoReturn, TUndoReturn > >;\n\n\t\tconst history = getHistoryManager();\n\n\t\tlet result = _actions.do( _payload );\n\n\t\thistory.addItem( {\n\t\t\ttitle: normalizeToGenerator( options.title )( _payload, result ),\n\t\t\tsubTitle: normalizeToGenerator( options.subtitle )( _payload, result ),\n\t\t\ttype: '',\n\t\t\trestore: ( _, isRedo ) => {\n\t\t\t\tif ( isRedo ) {\n\t\t\t\t\tresult = _actions.redo( _payload, result );\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_actions.undo( _payload, result );\n\t\t\t},\n\t\t} );\n\n\t\treturn result;\n\t};\n}\n\nfunction normalizeToGenerator< TPayload extends Payload, TDoReturn >(\n\tvalue: string | undefined | LabelGenerator< TPayload, TDoReturn >\n) {\n\treturn typeof value === 'function' ? value : () => value ?? '';\n}\n","export type WindowWithDataHooks = Window & {\n\t$e: {\n\t\tmodules?: {\n\t\t\thookData?: {\n\t\t\t\t[ K in keyof HooksMap as Capitalize< K > ]: HooksMap[ K ];\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype HooksMap = Record< HookType, typeof DataHook | undefined >;\n\nexport type HookType = 'after' | 'dependency';\n\nexport type Args = Record< string, unknown >;\n\nexport declare class DataHook {\n\tgetCommand(): string;\n\tgetId(): string;\n\tapply( args: Args ): unknown;\n\tregister(): void;\n}\n\nlet hookId = 0;\n\nexport function registerDataHook( type: HookType, command: string, callback: ( args: Args ) => unknown ) {\n\tconst eWindow = window as unknown as WindowWithDataHooks;\n\tconst hooksClasses = eWindow.$e?.modules?.hookData;\n\n\tconst hooksMap = {\n\t\tafter: hooksClasses?.After,\n\t\tdependency: hooksClasses?.Dependency,\n\t} satisfies HooksMap;\n\n\tconst HookClass = hooksMap[ type ];\n\n\tif ( ! HookClass ) {\n\t\tthrow new Error( `Data hook '${ type }' is not available` );\n\t}\n\n\tconst currentHookId = ++hookId;\n\n\tconst hook = new ( class extends HookClass {\n\t\tgetCommand() {\n\t\t\treturn command;\n\t\t}\n\n\t\tgetId() {\n\t\t\treturn `${ command }--data--${ currentHookId }`;\n\t\t}\n\n\t\tapply( args: Args ) {\n\t\t\treturn callback( args );\n\t\t}\n\t} )();\n\n\thook.register();\n\n\treturn hook;\n}\n","import { type Args, registerDataHook } from './register-data-hook';\n\ntype BlockCommandArgs = {\n\tcommand: string;\n\tcondition: ( args: Args ) => boolean;\n};\n\nexport function blockCommand( { command, condition }: BlockCommandArgs ) {\n\treturn registerDataHook( 'dependency', command, ( args ) => {\n\t\tconst shouldBlock = condition( args );\n\n\t\t// Should return `false` to prevent the command from running.\n\t\treturn ! shouldBlock;\n\t} );\n}\n"],"mappings":"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","names":["isRouteActive","import_utils"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/dispatchers/utils.ts","../src/dispatchers/dispatchers.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-listen-to.ts","../src/hooks/use-is-route-active.ts","../src/edit-mode.ts","../src/hooks/use-route-status.ts","../src/undoable/get-history-manager.ts","../src/undoable/undoable.ts","../src/data-hooks/register-data-hook.ts","../src/data-hooks/block-command.ts"],"sourcesContent":["export {\n\trunCommand as __privateRunCommand,\n\trunCommandSync as __privateRunCommandSync,\n\topenRoute as __privateOpenRoute,\n\tregisterRoute as __privateRegisterRoute,\n} from './dispatchers/dispatchers';\n\nexport {\n\tuseIsRouteActive as __privateUseIsRouteActive,\n\tuseListenTo as __privateUseListenTo,\n\tuseRouteStatus as __privateUseRouteStatus,\n\ttype UseRouteStatusOptions,\n} from './hooks';\n\nexport {\n\tsetReady as __privateSetReady,\n\tlistenTo as __privateListenTo,\n\tflushListeners as __privateFlushListeners,\n\tdispatchReadyEvent as __privateDispatchReadyEvent,\n\twindowEvent,\n\tv1ReadyEvent,\n\tcommandStartEvent,\n\tcommandEndEvent,\n\trouteOpenEvent,\n\trouteCloseEvent,\n} from './listeners';\n\nexport type * from './listeners';\n\nexport { isRouteActive as __privateIsRouteActive } from './readers';\n\nexport { undoable } from './undoable';\n\nexport type { HistoryItem, WindowWithHistoryManager } from './undoable/get-history-manager';\n\nexport { useEditMode, changeEditMode, type EditMode } from './edit-mode';\n\nexport { registerDataHook } from './data-hooks/register-data-hook';\nexport { blockCommand } from './data-hooks/block-command';\n","import { type 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 (\n\t\t!! 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\t);\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 { type ExtendedWindow } from './types';\nimport { isJQueryDeferred, promisifyJQueryDeferred } from './utils';\n\ntype RunCommandOptions = {\n\tinternal?: boolean;\n};\n\nexport async function runCommand( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst result = runCommandSync( command, args, { internal } );\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 runCommandSync( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tconst run = internal ? extendedWindow.$e?.internal : extendedWindow.$e?.run;\n\n\tif ( ! run ) {\n\t\tconst runnerName = internal ? '$e.internal' : '$e.run';\n\n\t\tthrow new Error( `\\`${ runnerName }()\\` is not available` );\n\t}\n\n\treturn run( command, args );\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( extendedWindow.$e.route( route ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n\nexport function registerRoute( route: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tif ( ! extendedWindow.$e?.routes?.register ) {\n\t\treturn Promise.reject( '`$e.routes.register()` is not available' );\n\t}\n\n\tconst routeParts = route.split( '/' );\n\n\tif ( routeParts.length < 2 ) {\n\t\treturn Promise.reject( `\\`${ route }\\` is an invalid route` );\n\t}\n\n\tconst componentRoute = routeParts.pop() as string; // routeParts.length must be >= 2\n\tconst component = routeParts.join( '/' );\n\n\ttry {\n\t\treturn Promise.resolve( extendedWindow.$e.routes.register( component, componentRoute, () => null ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n","import { type CommandEventDescriptor, type RouteEventDescriptor, type 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","/**\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 { setReady } from './is-ready';\nimport { type ExtendedWindow, type ListenerEvent } from './types';\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 { isReady, setReady } from './is-ready';\nimport {\n\ttype CommandEventDescriptor,\n\ttype EventDescriptor,\n\ttype ListenerCallback,\n\ttype RouteEventDescriptor,\n\ttype WindowEventDescriptor,\n} from './types';\nimport { normalizeEvent } from './utils';\n\nconst callbacksByEvent = new Map< EventDescriptor[ 'name' ], ListenerCallback[] >();\nlet abortController = new AbortController();\n\nexport function listenTo( eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback ) {\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( event, makeEventHandler( event ), { signal: abortController.signal } );\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 { type 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","import { useEffect, useState } from 'react';\n\nimport { type 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 { routeCloseEvent, type RouteEventDescriptor, routeOpenEvent } from '../listeners';\nimport { isRouteActive } from '../readers';\nimport useListenTo from './use-listen-to';\n\nexport default function useIsRouteActive( route: RouteEventDescriptor[ 'name' ] ) {\n\treturn useListenTo( [ routeOpenEvent( route ), routeCloseEvent( route ) ], () => isRouteActive( route ), [\n\t\troute,\n\t] );\n}\n","import useListenTo from './hooks/use-listen-to';\nimport { windowEvent } from './listeners';\n\nexport type EditMode = 'edit' | 'preview' | 'picker' | ( string & {} );\n\nexport type ExtendedWindow = Window & {\n\telementor: {\n\t\tchangeEditMode: ( newMode: EditMode ) => void;\n\t\tchannels: {\n\t\t\tdataEditMode: {\n\t\t\t\trequest: ( key: 'activeMode' ) => EditMode;\n\t\t\t};\n\t\t};\n\t};\n};\n\nexport function useEditMode() {\n\treturn useListenTo( windowEvent( 'elementor/edit-mode/change' ), getCurrentEditMode );\n}\n\nfunction getCurrentEditMode() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor.channels.dataEditMode.request( 'activeMode' );\n}\n\nexport function changeEditMode( newMode: EditMode ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor.changeEditMode( newMode );\n}\n","import { type EditMode, useEditMode } from '../edit-mode';\nimport { type RouteEventDescriptor } from '../listeners';\nimport useIsRouteActive from './use-is-route-active';\n\nexport type UseRouteStatusOptions = {\n\tblockOnKitRoutes?: boolean;\n\tallowedEditModes?: EditMode[];\n};\n\nexport default function useRouteStatus(\n\troute: RouteEventDescriptor[ 'name' ],\n\t{ blockOnKitRoutes = true, allowedEditModes = [ 'edit' ] }: UseRouteStatusOptions = {}\n) {\n\tconst isRouteActive = useIsRouteActive( route );\n\tconst isKitRouteActive = useIsRouteActive( 'panel/global' );\n\tconst currentEditMode = useEditMode();\n\n\tconst isBlockedByEditMode = ! allowedEditModes.includes( currentEditMode );\n\n\tconst isBlockedByKit = blockOnKitRoutes && isKitRouteActive;\n\n\tconst isActive = isRouteActive && ! isBlockedByEditMode;\n\n\tconst isBlocked = isBlockedByEditMode || isBlockedByKit;\n\n\treturn {\n\t\tisActive,\n\t\tisBlocked,\n\t};\n}\n","import { createError } from '@elementor/utils';\n\nexport type HistoryItem = {\n\ttitle: string;\n\tsubTitle: string;\n\ttype: string;\n\trestore: ( item: HistoryItem, isRedo: boolean ) => void;\n};\n\ntype AddHistoryItem = ( item: HistoryItem ) => void;\n\nexport type WindowWithHistoryManager = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\tgetCurrent?: () => {\n\t\t\t\thistory?: {\n\t\t\t\t\taddItem: AddHistoryItem;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst HistoryManagerNotAvailable = createError( {\n\tcode: 'history_manager_not_available',\n\tmessage: 'Cannot access History manager.',\n} );\n\nexport function getHistoryManager() {\n\tconst extendedWindow = window as unknown as WindowWithHistoryManager;\n\n\tconst historyManger = extendedWindow.elementor?.documents?.getCurrent?.()?.history;\n\n\tif ( ! historyManger ) {\n\t\tthrow new HistoryManagerNotAvailable();\n\t}\n\n\treturn historyManger;\n}\n","import { getHistoryManager } from './get-history-manager';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Payload = Record< string, any > | undefined;\n\ntype LabelGenerator< TPayload extends Payload, TDoReturn > = ( payload: TPayload, doReturn: TDoReturn ) => string;\n\ntype Actions< TPayload extends Payload, TDoReturn, TUndoReturn > = {\n\tdo: ( payload: TPayload ) => Awaited< TDoReturn >;\n\tundo: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TUndoReturn >;\n\tredo?: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TDoReturn >;\n};\n\ntype Options< TPayload extends Payload, TDoReturn > = {\n\ttitle: string | LabelGenerator< TPayload, TDoReturn >;\n\tsubtitle?: string | LabelGenerator< TPayload, TDoReturn >;\n};\n\n// Action WITHOUT a payload.\nexport function undoable< TDoReturn, TUndoReturn >(\n\tactions: Actions< undefined, TDoReturn, TUndoReturn >,\n\toptions: Options< undefined, NoInfer< TDoReturn > >\n): () => TDoReturn;\n\n// Action WITH a payload.\nexport function undoable< TPayload extends NonNullable< Payload >, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload: TPayload ) => TDoReturn;\n\nexport function undoable< TPayload extends Payload, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload?: Payload ) => TDoReturn {\n\tactions.redo ??= actions.do;\n\n\treturn ( payload ) => {\n\t\tconst _payload = payload as TPayload;\n\t\tconst _actions = actions as Required< Actions< TPayload, TDoReturn, TUndoReturn > >;\n\n\t\tconst history = getHistoryManager();\n\n\t\tlet result = _actions.do( _payload );\n\n\t\thistory.addItem( {\n\t\t\ttitle: normalizeToGenerator( options.title )( _payload, result ),\n\t\t\tsubTitle: normalizeToGenerator( options.subtitle )( _payload, result ),\n\t\t\ttype: '',\n\t\t\trestore: ( _, isRedo ) => {\n\t\t\t\tif ( isRedo ) {\n\t\t\t\t\tresult = _actions.redo( _payload, result );\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_actions.undo( _payload, result );\n\t\t\t},\n\t\t} );\n\n\t\treturn result;\n\t};\n}\n\nfunction normalizeToGenerator< TPayload extends Payload, TDoReturn >(\n\tvalue: string | undefined | LabelGenerator< TPayload, TDoReturn >\n) {\n\treturn typeof value === 'function' ? value : () => value ?? '';\n}\n","export type WindowWithDataHooks = Window & {\n\t$e: {\n\t\tmodules?: {\n\t\t\thookData?: {\n\t\t\t\t[ K in keyof HooksMap as Capitalize< K > ]: HooksMap[ K ];\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype HooksMap = Record< HookType, typeof DataHook | undefined >;\n\nexport type HookType = 'after' | 'dependency';\n\nexport type Args = Record< string, unknown >;\n\nexport declare class DataHook {\n\tgetCommand(): string;\n\tgetId(): string;\n\tapply( args: Args ): unknown;\n\tregister(): void;\n}\n\nlet hookId = 0;\n\nexport function registerDataHook( type: HookType, command: string, callback: ( args: Args ) => unknown ) {\n\tconst eWindow = window as unknown as WindowWithDataHooks;\n\tconst hooksClasses = eWindow.$e?.modules?.hookData;\n\n\tconst hooksMap = {\n\t\tafter: hooksClasses?.After,\n\t\tdependency: hooksClasses?.Dependency,\n\t} satisfies HooksMap;\n\n\tconst HookClass = hooksMap[ type ];\n\n\tif ( ! HookClass ) {\n\t\tthrow new Error( `Data hook '${ type }' is not available` );\n\t}\n\n\tconst currentHookId = ++hookId;\n\n\tconst hook = new ( class extends HookClass {\n\t\tgetCommand() {\n\t\t\treturn command;\n\t\t}\n\n\t\tgetId() {\n\t\t\treturn `${ command }--data--${ currentHookId }`;\n\t\t}\n\n\t\tapply( args: Args ) {\n\t\t\treturn callback( args );\n\t\t}\n\t} )();\n\n\thook.register();\n\n\treturn hook;\n}\n","import { type Args, registerDataHook } from './register-data-hook';\n\ntype BlockCommandArgs = {\n\tcommand: string;\n\tcondition: ( args: Args ) => boolean;\n};\n\nexport function blockCommand( { command, condition }: BlockCommandArgs ) {\n\treturn registerDataHook( 'dependency', command, ( args ) => {\n\t\tconst shouldBlock = condition( args );\n\n\t\t// Should return `false` to prevent the command from running.\n\t\treturn ! shouldBlock;\n\t} );\n}\n"],"mappings":"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","names":["isRouteActive","import_utils"]}
package/dist/index.mjs CHANGED
@@ -95,9 +95,6 @@ var windowEvent = (event) => {
95
95
  var v1ReadyEvent = () => {
96
96
  return windowEvent("elementor/initialized");
97
97
  };
98
- var editModeChangeEvent = () => {
99
- return windowEvent("elementor/edit-mode/change");
100
- };
101
98
 
102
99
  // src/listeners/is-ready.ts
103
100
  var ready = false;
@@ -225,10 +222,6 @@ function isRouteActive(route) {
225
222
  const extendedWindow = window;
226
223
  return !!extendedWindow.$e?.routes?.isPartOf(route);
227
224
  }
228
- function getCurrentEditMode() {
229
- const extendedWindow = window;
230
- return extendedWindow.elementor?.channels?.dataEditMode?.request?.("activeMode");
231
- }
232
225
 
233
226
  // src/hooks/use-listen-to.ts
234
227
  import { useEffect, useState } from "react";
@@ -242,11 +235,6 @@ function useListenTo(event, getSnapshot, deps = []) {
242
235
  return snapshot;
243
236
  }
244
237
 
245
- // src/hooks/use-is-preview-mode.ts
246
- function useIsPreviewMode() {
247
- return useListenTo(editModeChangeEvent(), () => getCurrentEditMode() === "preview");
248
- }
249
-
250
238
  // src/hooks/use-is-route-active.ts
251
239
  function useIsRouteActive(route) {
252
240
  return useListenTo([routeOpenEvent(route), routeCloseEvent(route)], () => isRouteActive(route), [
@@ -254,13 +242,28 @@ function useIsRouteActive(route) {
254
242
  ]);
255
243
  }
256
244
 
245
+ // src/edit-mode.ts
246
+ function useEditMode() {
247
+ return useListenTo(windowEvent("elementor/edit-mode/change"), getCurrentEditMode);
248
+ }
249
+ function getCurrentEditMode() {
250
+ const extendedWindow = window;
251
+ return extendedWindow.elementor.channels.dataEditMode.request("activeMode");
252
+ }
253
+ function changeEditMode(newMode) {
254
+ const extendedWindow = window;
255
+ return extendedWindow.elementor.changeEditMode(newMode);
256
+ }
257
+
257
258
  // src/hooks/use-route-status.ts
258
- function useRouteStatus(route, { blockOnKitRoutes = true, blockOnPreviewMode = true } = {}) {
259
+ function useRouteStatus(route, { blockOnKitRoutes = true, allowedEditModes = ["edit"] } = {}) {
259
260
  const isRouteActive2 = useIsRouteActive(route);
260
261
  const isKitRouteActive = useIsRouteActive("panel/global");
261
- const isPreviewMode = useIsPreviewMode();
262
- const isActive = isRouteActive2 && !(blockOnPreviewMode && isPreviewMode);
263
- const isBlocked = blockOnPreviewMode && isPreviewMode || blockOnKitRoutes && isKitRouteActive;
262
+ const currentEditMode = useEditMode();
263
+ const isBlockedByEditMode = !allowedEditModes.includes(currentEditMode);
264
+ const isBlockedByKit = blockOnKitRoutes && isKitRouteActive;
265
+ const isActive = isRouteActive2 && !isBlockedByEditMode;
266
+ const isBlocked = isBlockedByEditMode || isBlockedByKit;
264
267
  return {
265
268
  isActive,
266
269
  isBlocked
@@ -348,7 +351,6 @@ function blockCommand({ command, condition }) {
348
351
  export {
349
352
  dispatchReadyEvent as __privateDispatchReadyEvent,
350
353
  flushListeners as __privateFlushListeners,
351
- getCurrentEditMode as __privateGetCurrentEditMode,
352
354
  isRouteActive as __privateIsRouteActive,
353
355
  listenTo as __privateListenTo,
354
356
  openRoute as __privateOpenRoute,
@@ -356,18 +358,18 @@ export {
356
358
  runCommand as __privateRunCommand,
357
359
  runCommandSync as __privateRunCommandSync,
358
360
  setReady as __privateSetReady,
359
- useIsPreviewMode as __privateUseIsPreviewMode,
360
361
  useIsRouteActive as __privateUseIsRouteActive,
361
362
  useListenTo as __privateUseListenTo,
362
363
  useRouteStatus as __privateUseRouteStatus,
363
364
  blockCommand,
365
+ changeEditMode,
364
366
  commandEndEvent,
365
367
  commandStartEvent,
366
- editModeChangeEvent,
367
368
  registerDataHook,
368
369
  routeCloseEvent,
369
370
  routeOpenEvent,
370
371
  undoable,
372
+ useEditMode,
371
373
  v1ReadyEvent,
372
374
  windowEvent
373
375
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dispatchers/utils.ts","../src/dispatchers/dispatchers.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-listen-to.ts","../src/hooks/use-is-preview-mode.ts","../src/hooks/use-is-route-active.ts","../src/hooks/use-route-status.ts","../src/undoable/get-history-manager.ts","../src/undoable/undoable.ts","../src/data-hooks/register-data-hook.ts","../src/data-hooks/block-command.ts"],"sourcesContent":["import { type 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 (\n\t\t!! 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\t);\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 { type ExtendedWindow } from './types';\nimport { isJQueryDeferred, promisifyJQueryDeferred } from './utils';\n\ntype RunCommandOptions = {\n\tinternal?: boolean;\n};\n\nexport async function runCommand( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst result = runCommandSync( command, args, { internal } );\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 runCommandSync( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tconst run = internal ? extendedWindow.$e?.internal : extendedWindow.$e?.run;\n\n\tif ( ! run ) {\n\t\tconst runnerName = internal ? '$e.internal' : '$e.run';\n\n\t\tthrow new Error( `\\`${ runnerName }()\\` is not available` );\n\t}\n\n\treturn run( command, args );\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( extendedWindow.$e.route( route ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n\nexport function registerRoute( route: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tif ( ! extendedWindow.$e?.routes?.register ) {\n\t\treturn Promise.reject( '`$e.routes.register()` is not available' );\n\t}\n\n\tconst routeParts = route.split( '/' );\n\n\tif ( routeParts.length < 2 ) {\n\t\treturn Promise.reject( `\\`${ route }\\` is an invalid route` );\n\t}\n\n\tconst componentRoute = routeParts.pop() as string; // routeParts.length must be >= 2\n\tconst component = routeParts.join( '/' );\n\n\ttry {\n\t\treturn Promise.resolve( extendedWindow.$e.routes.register( component, componentRoute, () => null ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n","import { type CommandEventDescriptor, type RouteEventDescriptor, type 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 { setReady } from './is-ready';\nimport { type ExtendedWindow, type ListenerEvent } from './types';\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 { isReady, setReady } from './is-ready';\nimport {\n\ttype CommandEventDescriptor,\n\ttype EventDescriptor,\n\ttype ListenerCallback,\n\ttype RouteEventDescriptor,\n\ttype WindowEventDescriptor,\n} from './types';\nimport { normalizeEvent } from './utils';\n\nconst callbacksByEvent = new Map< EventDescriptor[ 'name' ], ListenerCallback[] >();\nlet abortController = new AbortController();\n\nexport function listenTo( eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback ) {\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( event, makeEventHandler( event ), { signal: abortController.signal } );\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 { type 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 { useEffect, useState } from 'react';\n\nimport { type 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 { editModeChangeEvent } from '../listeners';\nimport { getCurrentEditMode } from '../readers';\nimport useListenTo from './use-listen-to';\n\nexport default function useIsPreviewMode() {\n\treturn useListenTo( editModeChangeEvent(), () => getCurrentEditMode() === 'preview' );\n}\n","import { routeCloseEvent, type RouteEventDescriptor, routeOpenEvent } from '../listeners';\nimport { isRouteActive } from '../readers';\nimport useListenTo from './use-listen-to';\n\nexport default function useIsRouteActive( route: RouteEventDescriptor[ 'name' ] ) {\n\treturn useListenTo( [ routeOpenEvent( route ), routeCloseEvent( route ) ], () => isRouteActive( route ), [\n\t\troute,\n\t] );\n}\n","import { type RouteEventDescriptor } from '../listeners';\nimport useIsPreviewMode from './use-is-preview-mode';\nimport useIsRouteActive from './use-is-route-active';\n\ntype Options = {\n\tblockOnKitRoutes?: boolean;\n\tblockOnPreviewMode?: boolean;\n};\n\nexport default function useRouteStatus(\n\troute: RouteEventDescriptor[ 'name' ],\n\t{ blockOnKitRoutes = true, blockOnPreviewMode = true }: 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 = ( blockOnPreviewMode && isPreviewMode ) || ( blockOnKitRoutes && isKitRouteActive );\n\n\treturn {\n\t\tisActive,\n\t\tisBlocked,\n\t};\n}\n","import { createError } from '@elementor/utils';\n\nexport type HistoryItem = {\n\ttitle: string;\n\tsubTitle: string;\n\ttype: string;\n\trestore: ( item: HistoryItem, isRedo: boolean ) => void;\n};\n\ntype AddHistoryItem = ( item: HistoryItem ) => void;\n\nexport type WindowWithHistoryManager = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\tgetCurrent?: () => {\n\t\t\t\thistory?: {\n\t\t\t\t\taddItem: AddHistoryItem;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst HistoryManagerNotAvailable = createError( {\n\tcode: 'history_manager_not_available',\n\tmessage: 'Cannot access History manager.',\n} );\n\nexport function getHistoryManager() {\n\tconst extendedWindow = window as unknown as WindowWithHistoryManager;\n\n\tconst historyManger = extendedWindow.elementor?.documents?.getCurrent?.()?.history;\n\n\tif ( ! historyManger ) {\n\t\tthrow new HistoryManagerNotAvailable();\n\t}\n\n\treturn historyManger;\n}\n","import { getHistoryManager } from './get-history-manager';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Payload = Record< string, any > | undefined;\n\ntype LabelGenerator< TPayload extends Payload, TDoReturn > = ( payload: TPayload, doReturn: TDoReturn ) => string;\n\ntype Actions< TPayload extends Payload, TDoReturn, TUndoReturn > = {\n\tdo: ( payload: TPayload ) => Awaited< TDoReturn >;\n\tundo: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TUndoReturn >;\n\tredo?: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TDoReturn >;\n};\n\ntype Options< TPayload extends Payload, TDoReturn > = {\n\ttitle: string | LabelGenerator< TPayload, TDoReturn >;\n\tsubtitle?: string | LabelGenerator< TPayload, TDoReturn >;\n};\n\n// Action WITHOUT a payload.\nexport function undoable< TDoReturn, TUndoReturn >(\n\tactions: Actions< undefined, TDoReturn, TUndoReturn >,\n\toptions: Options< undefined, NoInfer< TDoReturn > >\n): () => TDoReturn;\n\n// Action WITH a payload.\nexport function undoable< TPayload extends NonNullable< Payload >, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload: TPayload ) => TDoReturn;\n\nexport function undoable< TPayload extends Payload, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload?: Payload ) => TDoReturn {\n\tactions.redo ??= actions.do;\n\n\treturn ( payload ) => {\n\t\tconst _payload = payload as TPayload;\n\t\tconst _actions = actions as Required< Actions< TPayload, TDoReturn, TUndoReturn > >;\n\n\t\tconst history = getHistoryManager();\n\n\t\tlet result = _actions.do( _payload );\n\n\t\thistory.addItem( {\n\t\t\ttitle: normalizeToGenerator( options.title )( _payload, result ),\n\t\t\tsubTitle: normalizeToGenerator( options.subtitle )( _payload, result ),\n\t\t\ttype: '',\n\t\t\trestore: ( _, isRedo ) => {\n\t\t\t\tif ( isRedo ) {\n\t\t\t\t\tresult = _actions.redo( _payload, result );\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_actions.undo( _payload, result );\n\t\t\t},\n\t\t} );\n\n\t\treturn result;\n\t};\n}\n\nfunction normalizeToGenerator< TPayload extends Payload, TDoReturn >(\n\tvalue: string | undefined | LabelGenerator< TPayload, TDoReturn >\n) {\n\treturn typeof value === 'function' ? value : () => value ?? '';\n}\n","export type WindowWithDataHooks = Window & {\n\t$e: {\n\t\tmodules?: {\n\t\t\thookData?: {\n\t\t\t\t[ K in keyof HooksMap as Capitalize< K > ]: HooksMap[ K ];\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype HooksMap = Record< HookType, typeof DataHook | undefined >;\n\nexport type HookType = 'after' | 'dependency';\n\nexport type Args = Record< string, unknown >;\n\nexport declare class DataHook {\n\tgetCommand(): string;\n\tgetId(): string;\n\tapply( args: Args ): unknown;\n\tregister(): void;\n}\n\nlet hookId = 0;\n\nexport function registerDataHook( type: HookType, command: string, callback: ( args: Args ) => unknown ) {\n\tconst eWindow = window as unknown as WindowWithDataHooks;\n\tconst hooksClasses = eWindow.$e?.modules?.hookData;\n\n\tconst hooksMap = {\n\t\tafter: hooksClasses?.After,\n\t\tdependency: hooksClasses?.Dependency,\n\t} satisfies HooksMap;\n\n\tconst HookClass = hooksMap[ type ];\n\n\tif ( ! HookClass ) {\n\t\tthrow new Error( `Data hook '${ type }' is not available` );\n\t}\n\n\tconst currentHookId = ++hookId;\n\n\tconst hook = new ( class extends HookClass {\n\t\tgetCommand() {\n\t\t\treturn command;\n\t\t}\n\n\t\tgetId() {\n\t\t\treturn `${ command }--data--${ currentHookId }`;\n\t\t}\n\n\t\tapply( args: Args ) {\n\t\t\treturn callback( args );\n\t\t}\n\t} )();\n\n\thook.register();\n\n\treturn hook;\n}\n","import { type Args, registerDataHook } from './register-data-hook';\n\ntype BlockCommandArgs = {\n\tcommand: string;\n\tcondition: ( args: Args ) => boolean;\n};\n\nexport function blockCommand( { command, condition }: BlockCommandArgs ) {\n\treturn registerDataHook( 'dependency', command, ( args ) => {\n\t\tconst shouldBlock = condition( args );\n\n\t\t// Should return `false` to prevent the command from running.\n\t\treturn ! shouldBlock;\n\t} );\n}\n"],"mappings":"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","names":["isRouteActive"]}
1
+ {"version":3,"sources":["../src/dispatchers/utils.ts","../src/dispatchers/dispatchers.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-listen-to.ts","../src/hooks/use-is-route-active.ts","../src/edit-mode.ts","../src/hooks/use-route-status.ts","../src/undoable/get-history-manager.ts","../src/undoable/undoable.ts","../src/data-hooks/register-data-hook.ts","../src/data-hooks/block-command.ts"],"sourcesContent":["import { type 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 (\n\t\t!! 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\t);\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 { type ExtendedWindow } from './types';\nimport { isJQueryDeferred, promisifyJQueryDeferred } from './utils';\n\ntype RunCommandOptions = {\n\tinternal?: boolean;\n};\n\nexport async function runCommand( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst result = runCommandSync( command, args, { internal } );\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 runCommandSync( command: string, args?: object, { internal = false }: RunCommandOptions = {} ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tconst run = internal ? extendedWindow.$e?.internal : extendedWindow.$e?.run;\n\n\tif ( ! run ) {\n\t\tconst runnerName = internal ? '$e.internal' : '$e.run';\n\n\t\tthrow new Error( `\\`${ runnerName }()\\` is not available` );\n\t}\n\n\treturn run( command, args );\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( extendedWindow.$e.route( route ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n\nexport function registerRoute( route: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tif ( ! extendedWindow.$e?.routes?.register ) {\n\t\treturn Promise.reject( '`$e.routes.register()` is not available' );\n\t}\n\n\tconst routeParts = route.split( '/' );\n\n\tif ( routeParts.length < 2 ) {\n\t\treturn Promise.reject( `\\`${ route }\\` is an invalid route` );\n\t}\n\n\tconst componentRoute = routeParts.pop() as string; // routeParts.length must be >= 2\n\tconst component = routeParts.join( '/' );\n\n\ttry {\n\t\treturn Promise.resolve( extendedWindow.$e.routes.register( component, componentRoute, () => null ) );\n\t} catch ( e ) {\n\t\treturn Promise.reject( e );\n\t}\n}\n","import { type CommandEventDescriptor, type RouteEventDescriptor, type 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","/**\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 { setReady } from './is-ready';\nimport { type ExtendedWindow, type ListenerEvent } from './types';\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 { isReady, setReady } from './is-ready';\nimport {\n\ttype CommandEventDescriptor,\n\ttype EventDescriptor,\n\ttype ListenerCallback,\n\ttype RouteEventDescriptor,\n\ttype WindowEventDescriptor,\n} from './types';\nimport { normalizeEvent } from './utils';\n\nconst callbacksByEvent = new Map< EventDescriptor[ 'name' ], ListenerCallback[] >();\nlet abortController = new AbortController();\n\nexport function listenTo( eventDescriptors: EventDescriptor | EventDescriptor[], callback: ListenerCallback ) {\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( event, makeEventHandler( event ), { signal: abortController.signal } );\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 { type 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","import { useEffect, useState } from 'react';\n\nimport { type 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 { routeCloseEvent, type RouteEventDescriptor, routeOpenEvent } from '../listeners';\nimport { isRouteActive } from '../readers';\nimport useListenTo from './use-listen-to';\n\nexport default function useIsRouteActive( route: RouteEventDescriptor[ 'name' ] ) {\n\treturn useListenTo( [ routeOpenEvent( route ), routeCloseEvent( route ) ], () => isRouteActive( route ), [\n\t\troute,\n\t] );\n}\n","import useListenTo from './hooks/use-listen-to';\nimport { windowEvent } from './listeners';\n\nexport type EditMode = 'edit' | 'preview' | 'picker' | ( string & {} );\n\nexport type ExtendedWindow = Window & {\n\telementor: {\n\t\tchangeEditMode: ( newMode: EditMode ) => void;\n\t\tchannels: {\n\t\t\tdataEditMode: {\n\t\t\t\trequest: ( key: 'activeMode' ) => EditMode;\n\t\t\t};\n\t\t};\n\t};\n};\n\nexport function useEditMode() {\n\treturn useListenTo( windowEvent( 'elementor/edit-mode/change' ), getCurrentEditMode );\n}\n\nfunction getCurrentEditMode() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor.channels.dataEditMode.request( 'activeMode' );\n}\n\nexport function changeEditMode( newMode: EditMode ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor.changeEditMode( newMode );\n}\n","import { type EditMode, useEditMode } from '../edit-mode';\nimport { type RouteEventDescriptor } from '../listeners';\nimport useIsRouteActive from './use-is-route-active';\n\nexport type UseRouteStatusOptions = {\n\tblockOnKitRoutes?: boolean;\n\tallowedEditModes?: EditMode[];\n};\n\nexport default function useRouteStatus(\n\troute: RouteEventDescriptor[ 'name' ],\n\t{ blockOnKitRoutes = true, allowedEditModes = [ 'edit' ] }: UseRouteStatusOptions = {}\n) {\n\tconst isRouteActive = useIsRouteActive( route );\n\tconst isKitRouteActive = useIsRouteActive( 'panel/global' );\n\tconst currentEditMode = useEditMode();\n\n\tconst isBlockedByEditMode = ! allowedEditModes.includes( currentEditMode );\n\n\tconst isBlockedByKit = blockOnKitRoutes && isKitRouteActive;\n\n\tconst isActive = isRouteActive && ! isBlockedByEditMode;\n\n\tconst isBlocked = isBlockedByEditMode || isBlockedByKit;\n\n\treturn {\n\t\tisActive,\n\t\tisBlocked,\n\t};\n}\n","import { createError } from '@elementor/utils';\n\nexport type HistoryItem = {\n\ttitle: string;\n\tsubTitle: string;\n\ttype: string;\n\trestore: ( item: HistoryItem, isRedo: boolean ) => void;\n};\n\ntype AddHistoryItem = ( item: HistoryItem ) => void;\n\nexport type WindowWithHistoryManager = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\tgetCurrent?: () => {\n\t\t\t\thistory?: {\n\t\t\t\t\taddItem: AddHistoryItem;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\nconst HistoryManagerNotAvailable = createError( {\n\tcode: 'history_manager_not_available',\n\tmessage: 'Cannot access History manager.',\n} );\n\nexport function getHistoryManager() {\n\tconst extendedWindow = window as unknown as WindowWithHistoryManager;\n\n\tconst historyManger = extendedWindow.elementor?.documents?.getCurrent?.()?.history;\n\n\tif ( ! historyManger ) {\n\t\tthrow new HistoryManagerNotAvailable();\n\t}\n\n\treturn historyManger;\n}\n","import { getHistoryManager } from './get-history-manager';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Payload = Record< string, any > | undefined;\n\ntype LabelGenerator< TPayload extends Payload, TDoReturn > = ( payload: TPayload, doReturn: TDoReturn ) => string;\n\ntype Actions< TPayload extends Payload, TDoReturn, TUndoReturn > = {\n\tdo: ( payload: TPayload ) => Awaited< TDoReturn >;\n\tundo: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TUndoReturn >;\n\tredo?: ( payload: TPayload, doReturn: Awaited< TDoReturn > ) => Awaited< TDoReturn >;\n};\n\ntype Options< TPayload extends Payload, TDoReturn > = {\n\ttitle: string | LabelGenerator< TPayload, TDoReturn >;\n\tsubtitle?: string | LabelGenerator< TPayload, TDoReturn >;\n};\n\n// Action WITHOUT a payload.\nexport function undoable< TDoReturn, TUndoReturn >(\n\tactions: Actions< undefined, TDoReturn, TUndoReturn >,\n\toptions: Options< undefined, NoInfer< TDoReturn > >\n): () => TDoReturn;\n\n// Action WITH a payload.\nexport function undoable< TPayload extends NonNullable< Payload >, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload: TPayload ) => TDoReturn;\n\nexport function undoable< TPayload extends Payload, TDoReturn, TUndoReturn >(\n\tactions: Actions< TPayload, TDoReturn, TUndoReturn >,\n\toptions: Options< TPayload, NoInfer< TDoReturn > >\n): ( payload?: Payload ) => TDoReturn {\n\tactions.redo ??= actions.do;\n\n\treturn ( payload ) => {\n\t\tconst _payload = payload as TPayload;\n\t\tconst _actions = actions as Required< Actions< TPayload, TDoReturn, TUndoReturn > >;\n\n\t\tconst history = getHistoryManager();\n\n\t\tlet result = _actions.do( _payload );\n\n\t\thistory.addItem( {\n\t\t\ttitle: normalizeToGenerator( options.title )( _payload, result ),\n\t\t\tsubTitle: normalizeToGenerator( options.subtitle )( _payload, result ),\n\t\t\ttype: '',\n\t\t\trestore: ( _, isRedo ) => {\n\t\t\t\tif ( isRedo ) {\n\t\t\t\t\tresult = _actions.redo( _payload, result );\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_actions.undo( _payload, result );\n\t\t\t},\n\t\t} );\n\n\t\treturn result;\n\t};\n}\n\nfunction normalizeToGenerator< TPayload extends Payload, TDoReturn >(\n\tvalue: string | undefined | LabelGenerator< TPayload, TDoReturn >\n) {\n\treturn typeof value === 'function' ? value : () => value ?? '';\n}\n","export type WindowWithDataHooks = Window & {\n\t$e: {\n\t\tmodules?: {\n\t\t\thookData?: {\n\t\t\t\t[ K in keyof HooksMap as Capitalize< K > ]: HooksMap[ K ];\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype HooksMap = Record< HookType, typeof DataHook | undefined >;\n\nexport type HookType = 'after' | 'dependency';\n\nexport type Args = Record< string, unknown >;\n\nexport declare class DataHook {\n\tgetCommand(): string;\n\tgetId(): string;\n\tapply( args: Args ): unknown;\n\tregister(): void;\n}\n\nlet hookId = 0;\n\nexport function registerDataHook( type: HookType, command: string, callback: ( args: Args ) => unknown ) {\n\tconst eWindow = window as unknown as WindowWithDataHooks;\n\tconst hooksClasses = eWindow.$e?.modules?.hookData;\n\n\tconst hooksMap = {\n\t\tafter: hooksClasses?.After,\n\t\tdependency: hooksClasses?.Dependency,\n\t} satisfies HooksMap;\n\n\tconst HookClass = hooksMap[ type ];\n\n\tif ( ! HookClass ) {\n\t\tthrow new Error( `Data hook '${ type }' is not available` );\n\t}\n\n\tconst currentHookId = ++hookId;\n\n\tconst hook = new ( class extends HookClass {\n\t\tgetCommand() {\n\t\t\treturn command;\n\t\t}\n\n\t\tgetId() {\n\t\t\treturn `${ command }--data--${ currentHookId }`;\n\t\t}\n\n\t\tapply( args: Args ) {\n\t\t\treturn callback( args );\n\t\t}\n\t} )();\n\n\thook.register();\n\n\treturn hook;\n}\n","import { type Args, registerDataHook } from './register-data-hook';\n\ntype BlockCommandArgs = {\n\tcommand: string;\n\tcondition: ( args: Args ) => boolean;\n};\n\nexport function blockCommand( { command, condition }: BlockCommandArgs ) {\n\treturn registerDataHook( 'dependency', command, ( args ) => {\n\t\tconst shouldBlock = condition( args );\n\n\t\t// Should return `false` to prevent the command from running.\n\t\treturn ! shouldBlock;\n\t} );\n}\n"],"mappings":"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","names":["isRouteActive"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elementor/editor-v1-adapters",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "private": false,
5
5
  "author": "Elementor Team",
6
6
  "homepage": "https://elementor.com/",
@@ -39,7 +39,7 @@
39
39
  "dev": "tsup --config=../../tsup.dev.ts"
40
40
  },
41
41
  "dependencies": {
42
- "@elementor/utils": "0.3.1"
42
+ "@elementor/utils": "0.4.0"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "react": "^18.3.1"
@@ -0,0 +1,31 @@
1
+ import useListenTo from './hooks/use-listen-to';
2
+ import { windowEvent } from './listeners';
3
+
4
+ export type EditMode = 'edit' | 'preview' | 'picker' | ( string & {} );
5
+
6
+ export type ExtendedWindow = Window & {
7
+ elementor: {
8
+ changeEditMode: ( newMode: EditMode ) => void;
9
+ channels: {
10
+ dataEditMode: {
11
+ request: ( key: 'activeMode' ) => EditMode;
12
+ };
13
+ };
14
+ };
15
+ };
16
+
17
+ export function useEditMode() {
18
+ return useListenTo( windowEvent( 'elementor/edit-mode/change' ), getCurrentEditMode );
19
+ }
20
+
21
+ function getCurrentEditMode() {
22
+ const extendedWindow = window as unknown as ExtendedWindow;
23
+
24
+ return extendedWindow.elementor.channels.dataEditMode.request( 'activeMode' );
25
+ }
26
+
27
+ export function changeEditMode( newMode: EditMode ) {
28
+ const extendedWindow = window as unknown as ExtendedWindow;
29
+
30
+ return extendedWindow.elementor.changeEditMode( newMode );
31
+ }
@@ -1,4 +1,3 @@
1
- export { default as useIsPreviewMode } from './use-is-preview-mode';
2
1
  export { default as useIsRouteActive } from './use-is-route-active';
3
2
  export { default as useListenTo } from './use-listen-to';
4
- export { default as useRouteStatus } from './use-route-status';
3
+ export { default as useRouteStatus, type UseRouteStatusOptions } from './use-route-status';
@@ -1,23 +1,27 @@
1
+ import { type EditMode, useEditMode } from '../edit-mode';
1
2
  import { type RouteEventDescriptor } from '../listeners';
2
- import useIsPreviewMode from './use-is-preview-mode';
3
3
  import useIsRouteActive from './use-is-route-active';
4
4
 
5
- type Options = {
5
+ export type UseRouteStatusOptions = {
6
6
  blockOnKitRoutes?: boolean;
7
- blockOnPreviewMode?: boolean;
7
+ allowedEditModes?: EditMode[];
8
8
  };
9
9
 
10
10
  export default function useRouteStatus(
11
11
  route: RouteEventDescriptor[ 'name' ],
12
- { blockOnKitRoutes = true, blockOnPreviewMode = true }: Options = {}
12
+ { blockOnKitRoutes = true, allowedEditModes = [ 'edit' ] }: UseRouteStatusOptions = {}
13
13
  ) {
14
14
  const isRouteActive = useIsRouteActive( route );
15
15
  const isKitRouteActive = useIsRouteActive( 'panel/global' );
16
- const isPreviewMode = useIsPreviewMode();
16
+ const currentEditMode = useEditMode();
17
17
 
18
- const isActive = isRouteActive && ! ( blockOnPreviewMode && isPreviewMode );
18
+ const isBlockedByEditMode = ! allowedEditModes.includes( currentEditMode );
19
19
 
20
- const isBlocked = ( blockOnPreviewMode && isPreviewMode ) || ( blockOnKitRoutes && isKitRouteActive );
20
+ const isBlockedByKit = blockOnKitRoutes && isKitRouteActive;
21
+
22
+ const isActive = isRouteActive && ! isBlockedByEditMode;
23
+
24
+ const isBlocked = isBlockedByEditMode || isBlockedByKit;
21
25
 
22
26
  return {
23
27
  isActive,
package/src/index.ts CHANGED
@@ -6,10 +6,10 @@ export {
6
6
  } from './dispatchers/dispatchers';
7
7
 
8
8
  export {
9
- useIsPreviewMode as __privateUseIsPreviewMode,
10
9
  useIsRouteActive as __privateUseIsRouteActive,
11
10
  useListenTo as __privateUseListenTo,
12
11
  useRouteStatus as __privateUseRouteStatus,
12
+ type UseRouteStatusOptions,
13
13
  } from './hooks';
14
14
 
15
15
  export {
@@ -23,16 +23,17 @@ export {
23
23
  commandEndEvent,
24
24
  routeOpenEvent,
25
25
  routeCloseEvent,
26
- editModeChangeEvent,
27
26
  } from './listeners';
28
27
 
29
28
  export type * from './listeners';
30
29
 
31
- export { isRouteActive as __privateIsRouteActive, getCurrentEditMode as __privateGetCurrentEditMode } from './readers';
30
+ export { isRouteActive as __privateIsRouteActive } from './readers';
32
31
 
33
32
  export { undoable } from './undoable';
34
33
 
35
34
  export type { HistoryItem, WindowWithHistoryManager } from './undoable/get-history-manager';
36
35
 
36
+ export { useEditMode, changeEditMode, type EditMode } from './edit-mode';
37
+
37
38
  export { registerDataHook } from './data-hooks/register-data-hook';
38
39
  export { blockCommand } from './data-hooks/block-command';
@@ -42,7 +42,3 @@ export const windowEvent = ( event: WindowEventDescriptor[ 'name' ] ): WindowEve
42
42
  export const v1ReadyEvent = () => {
43
43
  return windowEvent( 'elementor/initialized' );
44
44
  };
45
-
46
- export const editModeChangeEvent = () => {
47
- return windowEvent( 'elementor/edit-mode/change' );
48
- };
@@ -5,9 +5,3 @@ export function isRouteActive( route: string ) {
5
5
 
6
6
  return !! extendedWindow.$e?.routes?.isPartOf( route );
7
7
  }
8
-
9
- export function getCurrentEditMode() {
10
- const extendedWindow = window as unknown as ExtendedWindow;
11
-
12
- return extendedWindow.elementor?.channels?.dataEditMode?.request?.( 'activeMode' );
13
- }
@@ -1,16 +1,7 @@
1
- export type EditMode = 'edit' | 'preview' | 'picker';
2
-
3
1
  export type ExtendedWindow = Window & {
4
2
  $e: {
5
3
  routes: {
6
4
  isPartOf: ( route: string ) => boolean;
7
5
  };
8
6
  };
9
- elementor: {
10
- channels: {
11
- dataEditMode: {
12
- request: ( key: 'activeMode' ) => EditMode;
13
- };
14
- };
15
- };
16
7
  };
@@ -1,7 +0,0 @@
1
- import { editModeChangeEvent } from '../listeners';
2
- import { getCurrentEditMode } from '../readers';
3
- import useListenTo from './use-listen-to';
4
-
5
- export default function useIsPreviewMode() {
6
- return useListenTo( editModeChangeEvent(), () => getCurrentEditMode() === 'preview' );
7
- }