Skip to content

Commit 0e3604f

Browse files
committed
♻️ [OP-3163] refactor: create EventTypes const
1 parent cc76033 commit 0e3604f

File tree

2 files changed

+257
-32
lines changed

2 files changed

+257
-32
lines changed

src/Ubidots.js

+45-32
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
import { Widget } from './Widget';
22
import { Ubidots as UJL } from '@ubidots/ubidots-javascript-library';
33

4+
const EventsTypes = {
5+
IS_REALTIME_ACTIVE: 'isRealTimeActive',
6+
OPEN_DRAWER: 'openDrawer',
7+
RECEIVED_HEADERS: 'receivedHeaders',
8+
RECEIVED_JWT_TOKEN: 'receivedJWTToken',
9+
RECEIVED_TOKEN: 'receivedToken',
10+
REFRESH_DASHBOARD: 'refreshDashboard',
11+
SELECTED_DASHBOARD_DATE_RANGE: 'selectedDashboardDateRange',
12+
SELECTED_DASHBOARD_OBJECT: 'selectedDashboardObject',
13+
SELECTED_DEVICE: 'selectedDevice',
14+
SELECTED_DEVICES: 'selectedDevices',
15+
SELECTED_DEVICE_OBJECT: 'selectedDeviceObject',
16+
SELECTED_DEVICE_OBJECTS: 'selectedDeviceObjects',
17+
SET_DASHBOARD_DATE_RANGE: 'setDashboardDateRange',
18+
SET_DASHBOARD_DEVICE: 'setDashboardDevice',
19+
SET_DASHBOARD_MULTIPLE_DEVICES: 'setDashboardMultipleDevices',
20+
SET_FULL_SCREEN: 'setFullScreen',
21+
SET_REAL_TIME: 'setRealTime',
22+
};
23+
424
/**
525
* Create a listener to be able to listen to the Ubidots messages.
626
* @class Ubidots
@@ -47,7 +67,7 @@ class Ubidots {
4767
* @memberOf Ubidots
4868
*/
4969
setDashboardDevice(deviceId) {
50-
this._sendPostMessage({ event: 'setDashboardDevice', payload: deviceId });
70+
this._sendPostMessage({ event: EventsTypes.SET_DASHBOARD_DEVICE, payload: deviceId });
5171
}
5272

5373
/**
@@ -56,7 +76,7 @@ class Ubidots {
5676
* @memberOf Ubidots
5777
*/
5878
setDashboardMultipleDevices(deviceIds) {
59-
this._sendPostMessage({ event: 'setDashboardMultipleDevices', payload: deviceIds });
79+
this._sendPostMessage({ event: EventsTypes.SET_DASHBOARD_MULTIPLE_DEVICES, payload: deviceIds });
6080
}
6181

6282
/**
@@ -67,10 +87,7 @@ class Ubidots {
6787
* @memberOf Ubidots
6888
*/
6989
setDashboardDateRange(range) {
70-
this._sendPostMessage({
71-
event: 'setDashboardDateRange',
72-
payload: range,
73-
});
90+
this._sendPostMessage({ event: EventsTypes.SET_DASHBOARD_DATE_RANGE, payload: range });
7491
}
7592

7693
/**
@@ -79,15 +96,15 @@ class Ubidots {
7996
* @memberOf Ubidots
8097
*/
8198
setRealTime(enableRealTime) {
82-
this._sendPostMessage({ event: 'setRealTime', payload: enableRealTime });
99+
this._sendPostMessage({ event: EventsTypes.SET_REAL_TIME, payload: enableRealTime });
83100
}
84101

85102
/**
86103
* Refresh the Dashboard
87104
* @memberOf Ubidots
88105
*/
89106
refreshDashboard() {
90-
this._sendPostMessage({ event: 'refreshDashboard' });
107+
this._sendPostMessage({ event: EventsTypes.REFRESH_DASHBOARD });
91108
}
92109

93110
/**
@@ -96,10 +113,7 @@ class Ubidots {
96113
* @memberOf Ubidots
97114
*/
98115
setFullScreen(fullScreenAction) {
99-
this._sendPostMessage({
100-
event: 'setFullScreen',
101-
payload: fullScreenAction,
102-
});
116+
this._sendPostMessage({ event: EventsTypes.SET_FULL_SCREEN, payload: fullScreenAction });
103117
}
104118

105119
/**
@@ -110,7 +124,7 @@ class Ubidots {
110124
* @memberOf Ubidots
111125
*/
112126
openDrawer(drawerInfo) {
113-
this._sendPostMessage({ event: 'openDrawer', payload: { drawerInfo, id: this.widget.getId() } });
127+
this._sendPostMessage({ event: EventsTypes.OPEN_DRAWER, payload: { drawerInfo, id: this.widget.getId() } });
114128
}
115129

116130
/**
@@ -356,7 +370,7 @@ class Ubidots {
356370
*
357371
* @memberOf Ubidots
358372
*/
359-
on = (eventName, callback = undefined) => {
373+
on = (eventName, callback) => {
360374
if (Object.keys(this._eventsCallback).includes(eventName)) {
361375
this._eventsCallback[eventName] = callback;
362376
}
@@ -371,26 +385,25 @@ class Ubidots {
371385
* @memberOf Ubidots
372386
*/
373387
_listenMessage = event => {
374-
if (event.origin !== window.location.origin || !Object.keys(this._eventsCallback).includes(event.data.event))
375-
return;
376-
377-
const eventsData = {
378-
isRealTimeActive: this._setRealTime,
379-
receivedHeaders: this._setHeaders,
380-
receivedJWTToken: this._setJWTToken,
381-
receivedToken: this._setToken,
382-
selectedDashboardDateRange: this._setDashboardDateRange,
383-
selectedDashboardObject: this._setDashboardObject,
384-
selectedDevice: this._setSelectedDevice,
385-
selectedDeviceObject: this._setDeviceObject,
386-
selectedDevices: this._setSelectedDevices,
387-
selectedDeviceObjects: this._setSelectedDeviceObjects,
388-
selectedFilters: this._setSelectedFilters,
388+
if (event.origin !== window.location.origin) return;
389+
const { event: eventName, payload } = event.data;
390+
391+
const eventHandlers = {
392+
[EventsTypes.IS_REALTIME_ACTIVE]: this._setRealTime,
393+
[EventsTypes.RECEIVED_HEADERS]: this._setHeaders,
394+
[EventsTypes.RECEIVED_JWT_TOKEN]: this._setJWTToken,
395+
[EventsTypes.RECEIVED_TOKEN]: this._setToken,
396+
[EventsTypes.SELECTED_DASHBOARD_DATE_RANGE]: this._setDashboardDateRange,
397+
[EventsTypes.SELECTED_DASHBOARD_OBJECT]: this._setDashboardObject,
398+
[EventsTypes.SELECTED_DEVICE]: this._setSelectedDevice,
399+
[EventsTypes.SELECTED_DEVICE_OBJECT]: this._setDeviceObject,
400+
[EventsTypes.SELECTED_DEVICES]: this._setSelectedDevices,
401+
[EventsTypes.SELECTED_DEVICE_OBJECTS]: this._setSelectedDeviceObjects,
402+
[EventsTypes.SELECTED_FILTERS]: this._setSelectedFilters,
389403
};
390404

391-
if (Object.keys(eventsData).includes(event.data.event)) {
392-
eventsData[event.data.event](event.data.payload);
393-
}
405+
const handler = eventHandlers[eventName];
406+
if (handler) handler(payload);
394407

395408
if (typeof this._eventsCallback[event.data.event] === 'function') {
396409
this._eventsCallback[event.data.event](event.data.payload);

src/Ubidots.ts

+212
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
import { Widget } from './Widget';
2+
import { Ubidots as UJL } from '@ubidots/ubidots-javascript-library';
3+
4+
const logger = (...args) => console.log('[HTMLCanvas]', ...args);
5+
6+
enum EventTypes {
7+
DASHBOARD_REFRESHED = 'dashboardRefreshed',
8+
IS_REAL_TIME_ACTIVE = 'isRealTimeActive',
9+
READY = 'ready',
10+
RECEIVED_HEADERS = 'receivedHeaders',
11+
RECEIVED_JWT_TOKEN = 'receivedJWTToken',
12+
RECEIVED_TOKEN = 'receivedToken',
13+
SELECTED_DATE_RANGE = 'selectedDashboardDateRange',
14+
SELECTED_DASHBOARD_OBJECT = 'selectedDashboardObject',
15+
SELECTED_DEVICE = 'selectedDevice',
16+
SELECTED_DEVICE_OBJECT = 'selectedDeviceObject',
17+
SELECTED_DEVICES = 'selectedDevices',
18+
SELECTED_DEVICE_OBJECTS = 'selectedDeviceObjects',
19+
SELECTED_FILTERS = 'selectedFilters',
20+
SET_FULL_SCREEN = 'setFullScreen',
21+
OPEN_DRAWER = 'openDrawer',
22+
}
23+
24+
type DashboardDateRange = {
25+
start: number;
26+
end: number;
27+
};
28+
29+
type DrawerInfo = {
30+
url: string;
31+
width: number;
32+
};
33+
34+
class MessageHandler {
35+
static sendMessage(event: EventTypes, payload?: unknown, targetOrigin: string = window.location.origin): void {
36+
logger('Sending message', { event, payload });
37+
window.parent.postMessage({ event, payload }, targetOrigin);
38+
}
39+
}
40+
41+
class EventManager {
42+
private callbacks: Record<EventTypes, Function | null>;
43+
44+
register(eventName: EventTypes, callback: Function): void {
45+
logger('Registering event', { eventName, callback });
46+
if (!Object.values(EventTypes).includes(eventName)) {
47+
throw new Error(`Invalid event name: ${eventName}`);
48+
}
49+
this.callbacks[eventName] = callback;
50+
}
51+
52+
trigger(eventName: EventTypes, payload: unknown): void {
53+
logger('Triggering event', { eventName, payload });
54+
const callback = this.callbacks[eventName];
55+
if (typeof callback === 'function') {
56+
callback(payload);
57+
}
58+
}
59+
}
60+
61+
class Ubidots {
62+
private eventManager = new EventManager();
63+
private headers: Record<string, string> = {};
64+
private token?: string;
65+
private jwtToken?: string;
66+
private selectedDevice?: string;
67+
private selectedDevices: string[] = [];
68+
private dashboardDateRange?: DashboardDateRange;
69+
private dashboardObject?: object;
70+
private realTime = false;
71+
72+
widget: Widget;
73+
api: typeof UJL;
74+
75+
constructor() {
76+
this.widget = new Widget(window.widgetId);
77+
this.api = UJL;
78+
window.addEventListener('message', this.listenMessage.bind(this));
79+
}
80+
81+
initialize(): void {
82+
console.log('Ubidots initialized.');
83+
}
84+
85+
// Public API Methods
86+
setDashboardDevice(deviceId: string): void {
87+
MessageHandler.sendMessage(EventTypes.SELECTED_DEVICE, deviceId);
88+
}
89+
90+
setDashboardMultipleDevices(deviceIds: string[]): void {
91+
MessageHandler.sendMessage(EventTypes.SELECTED_DEVICES, deviceIds);
92+
}
93+
94+
setDashboardDateRange(range: DashboardDateRange): void {
95+
MessageHandler.sendMessage(EventTypes.SELECTED_DATE_RANGE, range);
96+
}
97+
98+
setRealTime(enableRealTime: boolean): void {
99+
MessageHandler.sendMessage(EventTypes.IS_REAL_TIME_ACTIVE, enableRealTime);
100+
}
101+
102+
refreshDashboard(): void {
103+
MessageHandler.sendMessage(EventTypes.DASHBOARD_REFRESHED);
104+
}
105+
106+
setFullScreen(fullScreenAction: string): void {
107+
MessageHandler.sendMessage(EventTypes.SET_FULL_SCREEN, fullScreenAction);
108+
}
109+
110+
openDrawer(drawerInfo: DrawerInfo): void {
111+
MessageHandler.sendMessage(EventTypes.OPEN_DRAWER, {
112+
drawerInfo,
113+
id: this.widget.getId(),
114+
});
115+
}
116+
117+
get tokenValue(): string | undefined {
118+
return this.token;
119+
}
120+
121+
get headersValue(): Record<string, string> {
122+
const baseHeaders: Record<string, string> = {
123+
'Content-Type': 'application/json',
124+
};
125+
126+
if (this.jwtToken) {
127+
baseHeaders['Authorization'] = `Bearer ${this.jwtToken}`;
128+
} else if (this.token) {
129+
baseHeaders['X-Auth-Token'] = this.token;
130+
}
131+
132+
return { ...baseHeaders, ...this.headers };
133+
}
134+
135+
// Private Methods
136+
private listenMessage(event: MessageEvent): void {
137+
if (event.origin !== window.location.origin) return;
138+
139+
const { event: eventName, payload } = event.data;
140+
141+
const EVENT_HANDLERS: Record<string, (payload: unknown) => void> = {
142+
[EventTypes.IS_REAL_TIME_ACTIVE]: this.setRealTimeValue.bind(this),
143+
[EventTypes.RECEIVED_HEADERS]: this.setHeaders.bind(this),
144+
[EventTypes.RECEIVED_JWT_TOKEN]: this.setJWTToken.bind(this),
145+
[EventTypes.RECEIVED_TOKEN]: this.setToken.bind(this),
146+
[EventTypes.SELECTED_DATE_RANGE]: this.setDashboardDateRangeValue.bind(this),
147+
[EventTypes.SELECTED_DASHBOARD_OBJECT]: this.setDashboardObject.bind(this),
148+
[EventTypes.SELECTED_DEVICE]: this.setSelectedDevice.bind(this),
149+
[EventTypes.SELECTED_DEVICES]: this.setSelectedDevices.bind(this),
150+
};
151+
152+
const handler = EVENT_HANDLERS[eventName];
153+
if (handler) handler(payload);
154+
155+
this.eventManager.trigger(eventName as EventTypes, payload);
156+
this.triggerReadyIfNecessary();
157+
}
158+
159+
private setToken(token: string): void {
160+
this.token = token;
161+
}
162+
163+
private setJWTToken(jwt: string): void {
164+
this.jwtToken = jwt;
165+
}
166+
167+
private setHeaders(headers: Record<string, string> = {}): void {
168+
this.headers = headers;
169+
}
170+
171+
private setSelectedDevice(deviceId: string): void {
172+
this.selectedDevice = deviceId;
173+
}
174+
175+
private setSelectedDevices(deviceIds: string[]): void {
176+
this.selectedDevices = deviceIds;
177+
}
178+
179+
private setDashboardDateRangeValue(range: DashboardDateRange): void {
180+
this.dashboardDateRange = range;
181+
}
182+
183+
private setDashboardObject(dashboardObject: object): void {
184+
this.dashboardObject = dashboardObject;
185+
}
186+
187+
private setRealTimeValue(realTime: boolean): void {
188+
this.realTime = realTime;
189+
}
190+
191+
private isReady(): boolean {
192+
return (
193+
(this.token || this.jwtToken) !== undefined &&
194+
this.selectedDevice !== undefined &&
195+
this.dashboardDateRange !== undefined &&
196+
this.dashboardObject !== undefined
197+
);
198+
}
199+
200+
private triggerReadyIfNecessary(): void {
201+
if (this.isReady()) {
202+
this.eventManager.trigger(EventTypes.READY, null);
203+
}
204+
}
205+
206+
// Event API
207+
on(eventName: EventTypes, callback: Function): void {
208+
this.eventManager.register(eventName, callback);
209+
}
210+
}
211+
212+
export default Ubidots;

0 commit comments

Comments
 (0)