Skip to content

Commit

Permalink
Fixed magic at on(...) function.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kuznietsov committed Jun 22, 2021
1 parent b9afc4a commit 7c95c90
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,37 @@
* Side Public License, v 1.
*/

import { DefaultInterpreterRenderHandlers, InterpreterRenderHandlers } from './types';
import { InterpreterRenderHandlers, RenderMode } from './types';

export function getDefaultHandlers<T = {}>(): InterpreterRenderHandlers<T> {
return new DefaultInterpreterRenderHandlers<T>() as InterpreterRenderHandlers<T>;
function on<T>(this: T, event: keyof T, fn: (...args: any) => void): void {
const eventCall = this[event];
if (typeof eventCall !== 'function') return;

const updatedEvent = (...args: unknown[]) => {
const preventFromCallingListener: void | boolean = eventCall(...args);
if (typeof fn === 'function' && !preventFromCallingListener) {
fn(...args);
}
return preventFromCallingListener;
};
this[event] = (updatedEvent as unknown) as typeof eventCall;
}

export function getDefaultHandlers<T>(): InterpreterRenderHandlers<T> {
const handlers = {
done() {},
onDestroy(fn: () => void) {},
reload() {},
update(params: any) {},
event(event: any) {},
getRenderMode() {
return 'noInteractivity' as RenderMode;
},
isSyncColorsEnabled() {
return false;
},
on,
} as InterpreterRenderHandlers<T>;

return handlers;
}
43 changes: 11 additions & 32 deletions src/plugins/expressions/common/expression_renderers/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export interface IInterpreterRenderHandlers {
hasCompatibleActions?: (event: any) => Promise<boolean>;
getRenderMode: () => RenderMode;
isSyncColorsEnabled: () => boolean;
on: (event: any, fn: (...args: any) => void) => void;
on: (this: any, event: any, fn: (...args: any) => void) => void;
/**
* This uiState interface is actually `PersistedState` from the visualizations plugin,
* but expressions cannot know about vis or it creates a mess of circular dependencies.
Expand All @@ -83,37 +83,16 @@ export interface IInterpreterRenderHandlers {

type DefaultEmitters<T extends IInterpreterRenderHandlers> = Pick<T, 'done' | 'reload' | 'update'>;

export class DefaultInterpreterRenderHandlers<Emitters = {}> implements IInterpreterRenderHandlers {
done() {}
onDestroy(fn: () => void) {}
reload() {}
update(params: any) {}
event(event: any) {}
getRenderMode() {
return 'noInteractivity' as RenderMode;
}
isSyncColorsEnabled() {
return false;
}
hasCompatibleActions?: (event: any) => Promise<boolean>;

on(event: keyof Emitters | keyof DefaultEmitters<this>, fn: (...args: any) => void): void {
const eventName = event as keyof this;
const eventCall = this[eventName];
if (typeof eventCall !== 'function') return;

const updatedEvent = (...args: unknown[]) => {
const preventFromCallingListener: void | boolean = eventCall(...args);
if (typeof fn === 'function' && !preventFromCallingListener) {
fn(...args);
}
return preventFromCallingListener;
};
this[eventName] = (updatedEvent as unknown) as typeof eventCall;
}

uiState?: unknown;
}
type DefaultInterpreterRenderHandlers<Emitters = {}> = IInterpreterRenderHandlers &
{
[K in keyof Emitters]: Emitters[K];
} & {
on: (
this: any,
event: keyof Emitters | keyof DefaultEmitters<IInterpreterRenderHandlers>,
fn: (...args: any) => void
) => void;
};

export type InterpreterRenderHandlers<Emitters = {}> = Emitters &
DefaultInterpreterRenderHandlers<Emitters>;
7 changes: 4 additions & 3 deletions src/plugins/expressions/public/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@ export class ExpressionRenderHandler {

this.updateSubject = new Rx.Subject();
this.update$ = this.updateSubject.asObservable();
this.handlers = getDefaultHandlers();
this.handlers = Object.assign(this.handlers, {
const handlers = getDefaultHandlers();
this.handlers = {
...handlers,
onDestroy: (fn: any) => {
this.destroyFn = fn;
},
Expand All @@ -102,7 +103,7 @@ export class ExpressionRenderHandler {
return syncColors || false;
},
hasCompatibleActions,
});
};
}

render = async (value: any, uiState?: any) => {
Expand Down
7 changes: 2 additions & 5 deletions x-pack/plugins/canvas/public/lib/create_handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@ import {

// We need to move towards only using these handlers and ditching our canvas specific ones
export const createHandlers = (): InterpreterRenderHandlers<CanvasSpecificRendererHandlers> => {
const defaultHandlers = getDefaultHandlers<CanvasSpecificRendererHandlers>();

const handlers: Partial<typeof defaultHandlers> = {
...defaultHandlers,
return {
...getDefaultHandlers<CanvasSpecificRendererHandlers>(),
destroy() {},
getElementId() {
return '';
Expand All @@ -46,7 +44,6 @@ export const createHandlers = (): InterpreterRenderHandlers<CanvasSpecificRender
embeddableInputChange() {},
resize(_size: { height: number; width: number }) {},
};
return Object.assign(defaultHandlers, handlers);
};

export const assignHandlers = (
Expand Down

0 comments on commit 7c95c90

Please sign in to comment.