@thoughtspot/visual-embed-sdk 1.40.1-alpha.1 → 1.41.0-pre-render-1

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.
Files changed (150) hide show
  1. package/cjs/package.json +5 -4
  2. package/cjs/src/css-variables.d.ts +316 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts.map +1 -1
  5. package/cjs/src/embed/app.js +8 -0
  6. package/cjs/src/embed/app.js.map +1 -1
  7. package/cjs/src/embed/app.spec.js +12 -2
  8. package/cjs/src/embed/app.spec.js.map +1 -1
  9. package/cjs/src/embed/bodyless-conversation.d.ts +1 -0
  10. package/cjs/src/embed/bodyless-conversation.d.ts.map +1 -1
  11. package/cjs/src/embed/bodyless-conversation.js +7 -3
  12. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  13. package/cjs/src/embed/conversation.d.ts +64 -2
  14. package/cjs/src/embed/conversation.d.ts.map +1 -1
  15. package/cjs/src/embed/conversation.js +16 -3
  16. package/cjs/src/embed/conversation.js.map +1 -1
  17. package/cjs/src/embed/conversation.spec.js +102 -0
  18. package/cjs/src/embed/conversation.spec.js.map +1 -1
  19. package/cjs/src/embed/liveboard.d.ts +12 -2
  20. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  21. package/cjs/src/embed/liveboard.js +48 -18
  22. package/cjs/src/embed/liveboard.js.map +1 -1
  23. package/cjs/src/embed/liveboard.spec.js +211 -5
  24. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  25. package/cjs/src/embed/sage.d.ts +1 -0
  26. package/cjs/src/embed/sage.d.ts.map +1 -1
  27. package/cjs/src/embed/sage.js +10 -6
  28. package/cjs/src/embed/sage.js.map +1 -1
  29. package/cjs/src/embed/search-bar.d.ts +1 -0
  30. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  31. package/cjs/src/embed/search-bar.js +11 -7
  32. package/cjs/src/embed/search-bar.js.map +1 -1
  33. package/cjs/src/embed/search.d.ts +1 -0
  34. package/cjs/src/embed/search.d.ts.map +1 -1
  35. package/cjs/src/embed/search.js +7 -8
  36. package/cjs/src/embed/search.js.map +1 -1
  37. package/cjs/src/embed/ts-embed.d.ts +24 -7
  38. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  39. package/cjs/src/embed/ts-embed.js +87 -57
  40. package/cjs/src/embed/ts-embed.js.map +1 -1
  41. package/cjs/src/embed/ts-embed.spec.js +173 -1
  42. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  43. package/cjs/src/types.d.ts +152 -44
  44. package/cjs/src/types.d.ts.map +1 -1
  45. package/cjs/src/types.js +139 -42
  46. package/cjs/src/types.js.map +1 -1
  47. package/cjs/src/utils/liveboardService/liveboardService.d.ts +21 -6
  48. package/cjs/src/utils/liveboardService/liveboardService.d.ts.map +1 -1
  49. package/cjs/src/utils/liveboardService/liveboardService.js +21 -6
  50. package/cjs/src/utils/liveboardService/liveboardService.js.map +1 -1
  51. package/dist/index-BDlM0f0T.js +7371 -0
  52. package/dist/index-k7pkZMhx.js +7371 -0
  53. package/dist/src/css-variables.d.ts +316 -0
  54. package/dist/src/css-variables.d.ts.map +1 -1
  55. package/dist/src/embed/app.d.ts.map +1 -1
  56. package/dist/src/embed/bodyless-conversation.d.ts +5 -0
  57. package/dist/src/embed/bodyless-conversation.d.ts.map +1 -1
  58. package/dist/src/embed/conversation.d.ts +64 -2
  59. package/dist/src/embed/conversation.d.ts.map +1 -1
  60. package/dist/src/embed/liveboard.d.ts +11 -0
  61. package/dist/src/embed/liveboard.d.ts.map +1 -1
  62. package/dist/src/embed/sage.d.ts +1 -0
  63. package/dist/src/embed/sage.d.ts.map +1 -1
  64. package/dist/src/embed/search-bar.d.ts +1 -0
  65. package/dist/src/embed/search-bar.d.ts.map +1 -1
  66. package/dist/src/embed/search.d.ts +1 -0
  67. package/dist/src/embed/search.d.ts.map +1 -1
  68. package/dist/src/embed/ts-embed.d.ts +24 -0
  69. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  70. package/dist/src/react/index.d.ts +2 -0
  71. package/dist/src/react/index.d.ts.map +1 -1
  72. package/dist/src/types.d.ts +351 -30
  73. package/dist/src/types.d.ts.map +1 -1
  74. package/dist/src/utils/graphql/nlsService/conversation-service.d.ts.map +1 -1
  75. package/dist/src/utils/liveboardService/liveboardService.d.ts +21 -6
  76. package/dist/src/utils/liveboardService/liveboardService.d.ts.map +1 -1
  77. package/dist/tsembed-react.es.js +551 -80
  78. package/dist/tsembed-react.js +550 -79
  79. package/dist/tsembed.es.js +572 -86
  80. package/dist/tsembed.js +571 -85
  81. package/dist/visual-embed-sdk-react-full.d.ts +787 -37
  82. package/dist/visual-embed-sdk-react.d.ts +787 -37
  83. package/dist/visual-embed-sdk.d.ts +785 -37
  84. package/lib/package.json +5 -4
  85. package/lib/src/css-variables.d.ts +316 -0
  86. package/lib/src/css-variables.d.ts.map +1 -1
  87. package/lib/src/embed/app.d.ts.map +1 -1
  88. package/lib/src/embed/app.js +8 -0
  89. package/lib/src/embed/app.js.map +1 -1
  90. package/lib/src/embed/app.spec.js +12 -2
  91. package/lib/src/embed/app.spec.js.map +1 -1
  92. package/lib/src/embed/bodyless-conversation.d.ts +1 -0
  93. package/lib/src/embed/bodyless-conversation.d.ts.map +1 -1
  94. package/lib/src/embed/bodyless-conversation.js +7 -3
  95. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  96. package/lib/src/embed/conversation.d.ts +64 -2
  97. package/lib/src/embed/conversation.d.ts.map +1 -1
  98. package/lib/src/embed/conversation.js +17 -4
  99. package/lib/src/embed/conversation.js.map +1 -1
  100. package/lib/src/embed/conversation.spec.js +104 -2
  101. package/lib/src/embed/conversation.spec.js.map +1 -1
  102. package/lib/src/embed/liveboard.d.ts +12 -2
  103. package/lib/src/embed/liveboard.d.ts.map +1 -1
  104. package/lib/src/embed/liveboard.js +48 -18
  105. package/lib/src/embed/liveboard.js.map +1 -1
  106. package/lib/src/embed/liveboard.spec.js +211 -5
  107. package/lib/src/embed/liveboard.spec.js.map +1 -1
  108. package/lib/src/embed/sage.d.ts +1 -0
  109. package/lib/src/embed/sage.d.ts.map +1 -1
  110. package/lib/src/embed/sage.js +10 -6
  111. package/lib/src/embed/sage.js.map +1 -1
  112. package/lib/src/embed/search-bar.d.ts +1 -0
  113. package/lib/src/embed/search-bar.d.ts.map +1 -1
  114. package/lib/src/embed/search-bar.js +11 -7
  115. package/lib/src/embed/search-bar.js.map +1 -1
  116. package/lib/src/embed/search.d.ts +1 -0
  117. package/lib/src/embed/search.d.ts.map +1 -1
  118. package/lib/src/embed/search.js +7 -8
  119. package/lib/src/embed/search.js.map +1 -1
  120. package/lib/src/embed/ts-embed.d.ts +24 -7
  121. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  122. package/lib/src/embed/ts-embed.js +87 -57
  123. package/lib/src/embed/ts-embed.js.map +1 -1
  124. package/lib/src/embed/ts-embed.spec.js +173 -1
  125. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  126. package/lib/src/types.d.ts +152 -44
  127. package/lib/src/types.d.ts.map +1 -1
  128. package/lib/src/types.js +139 -42
  129. package/lib/src/types.js.map +1 -1
  130. package/lib/src/utils/liveboardService/liveboardService.d.ts +21 -6
  131. package/lib/src/utils/liveboardService/liveboardService.d.ts.map +1 -1
  132. package/lib/src/utils/liveboardService/liveboardService.js +21 -6
  133. package/lib/src/utils/liveboardService/liveboardService.js.map +1 -1
  134. package/lib/src/visual-embed-sdk.d.ts +786 -38
  135. package/package.json +6 -4
  136. package/src/css-variables.ts +396 -1
  137. package/src/embed/app.spec.ts +17 -2
  138. package/src/embed/app.ts +8 -0
  139. package/src/embed/bodyless-conversation.ts +8 -3
  140. package/src/embed/conversation.spec.ts +131 -5
  141. package/src/embed/conversation.ts +102 -12
  142. package/src/embed/liveboard.spec.ts +264 -5
  143. package/src/embed/liveboard.ts +55 -20
  144. package/src/embed/sage.ts +12 -7
  145. package/src/embed/search-bar.tsx +14 -7
  146. package/src/embed/search.ts +18 -7
  147. package/src/embed/ts-embed.spec.ts +345 -113
  148. package/src/embed/ts-embed.ts +97 -67
  149. package/src/types.ts +199 -91
  150. package/src/utils/liveboardService/liveboardService.ts +21 -6
@@ -185,10 +185,7 @@ export class TsEmbed {
185
185
  */
186
186
  private fullscreenChangeHandler: (() => void) | null = null;
187
187
 
188
- public id: string;
189
-
190
188
  constructor(domSelector: DOMSelector, viewConfig?: ViewConfig) {
191
- this.id = Date.now().toString();
192
189
  this.el = getDOMNode(domSelector);
193
190
  this.eventHandlerMap = new Map();
194
191
  this.isError = false;
@@ -201,11 +198,11 @@ export class TsEmbed {
201
198
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
202
199
  ...viewConfig,
203
200
  });
201
+ const embedConfig = getEmbedConfig();
202
+ this.embedConfig = embedConfig;
203
+
204
204
  this.hostEventClient = new HostEventClient(this.iFrame);
205
-
206
205
  this.isReadyForRenderPromise = getInitPromise().then(async () => {
207
- const embedConfig = getEmbedConfig();
208
- this.embedConfig = embedConfig;
209
206
  if (!embedConfig.authTriggerContainer && !embedConfig.useEventForSAMLPopup) {
210
207
  this.embedConfig.authTriggerContainer = domSelector;
211
208
  }
@@ -313,8 +310,6 @@ export class TsEmbed {
313
310
 
314
311
  private subscribedListeners: Record<string, any> = {};
315
312
 
316
- public isEmbedContainerLoaded = false;
317
-
318
313
  /**
319
314
  * Adds a global event listener to window for "message" events.
320
315
  * ThoughtSpot detects if a particular event is targeted to this
@@ -480,67 +475,19 @@ export class TsEmbed {
480
475
  notifyAuthFailure(AuthFailureType.IDLE_SESSION_TIMEOUT);
481
476
  };
482
477
 
483
- private pendingEvents: Array<{ eventType: HostEvent, data: TriggerPayload<any, HostEvent>, onEventTriggered?: () => void }> = [];
484
-
485
- protected getPreRenderObj<T extends TsEmbed>() {
486
- const embedObj = (this.insertedDomEl as any)?.[this.embedNodeKey] as T;
487
- if (embedObj === (this as any)) {
488
- console.log('embedObj is same as this');
489
- return null;
490
- }
491
- return (this.insertedDomEl as any)?.[this.embedNodeKey] as T;
492
- }
493
-
494
- private checkEmbedContainerLoaded() {
495
- if (this.isEmbedContainerLoaded) return true;
496
-
497
- const preRenderObj = this.getPreRenderObj<TsEmbed>();
498
- if (preRenderObj && preRenderObj.isEmbedContainerLoaded) {
499
- this.isEmbedContainerLoaded = true;
500
- }
501
-
502
- console.log('checkEmbedContainerLoaded', this.isEmbedContainerLoaded);
503
-
504
- return this.isEmbedContainerLoaded;
505
- }
506
-
507
- private executePendingEvents() {
508
- console.log('executePendingEvents', this.pendingEvents);
509
- setTimeout(() => {
510
- this.pendingEvents.forEach((event) => {
511
- console.log('executing event', event.eventType, event.data);
512
- this.trigger(event.eventType, event.data);
513
- event.onEventTriggered?.();
514
- });
515
- this.pendingEvents = [];
516
- }, 1000);
517
- }
518
- protected triggerAfterLoad(eventType: HostEvent, data: TriggerPayload<any, HostEvent>, onEventTriggered?: () => void) {
519
- if (this.checkEmbedContainerLoaded()) {
520
- console.log('triggerAfterLoad', eventType, data);
521
- this.trigger(eventType, data);
522
- onEventTriggered?.();
523
- } else {
524
- console.log('pushing to pendingEvents', eventType, data, this.getPreRenderObj());
525
- this.pendingEvents.push({ eventType, data, onEventTriggered });
526
- console.log('pendingEvents', this.pendingEvents);
527
- }
528
- }
529
-
530
478
  /**
531
479
  * Register APP_INIT event and sendback init payload
532
480
  */
533
481
  private registerAppInit = () => {
534
482
  this.on(EmbedEvent.APP_INIT, this.appInitCb, { start: false }, true);
535
- this.on(EmbedEvent.AuthInit, () => {
536
- console.log('AuthInit', this.getPreRenderObj());
537
- this.isEmbedContainerLoaded = true;
538
- console.log('isEmbedContainerLoaded', this.isEmbedContainerLoaded);
539
- console.log('executePendingEvents', this.pendingEvents);
540
- this.executePendingEvents();
541
- }, { start: false }, true);
542
483
  this.on(EmbedEvent.AuthExpire, this.updateAuthToken, { start: false }, true);
543
484
  this.on(EmbedEvent.IdleSessionTimeout, this.idleSessionTimeout, { start: false }, true);
485
+
486
+ const embedListenerReadyHandler = this.createEmbedContainerHandler(EmbedEvent.EmbedListenerReady);
487
+ this.on(EmbedEvent.EmbedListenerReady, embedListenerReadyHandler, { start: false }, true);
488
+
489
+ const authInitHandler = this.createEmbedContainerHandler(EmbedEvent.AuthInit);
490
+ this.on(EmbedEvent.AuthInit, authInitHandler, { start: false }, true);
544
491
  };
545
492
 
546
493
  /**
@@ -561,6 +508,12 @@ export class TsEmbed {
561
508
  return `${basePath}#`;
562
509
  }
563
510
 
511
+ protected getUpdateEmbedParamsObject() {
512
+ let queryParams = this.getEmbedParamsObject();
513
+ queryParams = { ...this.viewConfig, ...queryParams };
514
+ return queryParams;
515
+ }
516
+
564
517
  /**
565
518
  * Common query params set for all the embed modes.
566
519
  * @param queryParams
@@ -743,10 +696,15 @@ export class TsEmbed {
743
696
  }
744
697
 
745
698
  protected getEmbedParams() {
746
- const queryParams = this.getBaseQueryParams();
699
+ const queryParams = this.getEmbedParamsObject();
747
700
  return getQueryParamString(queryParams);
748
701
  }
749
702
 
703
+ protected getEmbedParamsObject() {
704
+ const params = this.getBaseQueryParams();
705
+ return params;
706
+ }
707
+
750
708
  protected getRootIframeSrc() {
751
709
  const query = this.getEmbedParams();
752
710
  return this.getEmbedBasePath(query);
@@ -1131,11 +1089,9 @@ export class TsEmbed {
1131
1089
  if (this.isRendered) {
1132
1090
  logger.warn('Please register event handlers before calling render');
1133
1091
  }
1134
-
1135
1092
  const callbacks = this.eventHandlerMap.get(messageType) || [];
1136
1093
  callbacks.push({ options, callback });
1137
1094
  this.eventHandlerMap.set(messageType, callbacks);
1138
-
1139
1095
  return this;
1140
1096
  }
1141
1097
 
@@ -1183,6 +1139,77 @@ export class TsEmbed {
1183
1139
  }
1184
1140
  }
1185
1141
 
1142
+ /**
1143
+ * @hidden
1144
+ * Internal state to track if the embed container is loaded.
1145
+ * This is used to trigger events after the embed container is loaded.
1146
+ */
1147
+ public isEmbedContainerLoaded = false;
1148
+
1149
+ /**
1150
+ * @hidden
1151
+ * Internal state to track the callbacks to be executed after the embed container
1152
+ * is loaded.
1153
+ * This is used to trigger events after the embed container is loaded.
1154
+ */
1155
+ private embedContainerReadyCallbacks: Array<() => void> = [];
1156
+
1157
+ protected getPreRenderObj<T extends TsEmbed>(): T {
1158
+ const embedObj = (this.insertedDomEl as any)?.[this.embedNodeKey] as T;
1159
+ if (embedObj === (this as any)) {
1160
+ logger.info('embedObj is same as this');
1161
+ }
1162
+ return embedObj;
1163
+ }
1164
+
1165
+ private checkEmbedContainerLoaded() {
1166
+ if (this.isEmbedContainerLoaded) return true;
1167
+
1168
+ const preRenderObj = this.getPreRenderObj<TsEmbed>();
1169
+ if (preRenderObj && preRenderObj.isEmbedContainerLoaded) {
1170
+ this.isEmbedContainerLoaded = true;
1171
+ }
1172
+
1173
+ return this.isEmbedContainerLoaded;
1174
+ }
1175
+ private executeEmbedContainerReadyCallbacks() {
1176
+ logger.debug('executePendingEvents', this.embedContainerReadyCallbacks);
1177
+ this.embedContainerReadyCallbacks.forEach((callback) => {
1178
+ callback?.();
1179
+ });
1180
+ this.embedContainerReadyCallbacks = [];
1181
+ }
1182
+
1183
+ /**
1184
+ * Executes a callback after the embed container is loaded.
1185
+ * @param callback The callback to execute
1186
+ */
1187
+ protected executeAfterEmbedContainerLoaded(callback: () => void) {
1188
+ if (this.checkEmbedContainerLoaded()) {
1189
+ callback?.();
1190
+ } else {
1191
+ logger.debug('pushing callback to embedContainerReadyCallbacks', callback);
1192
+ this.embedContainerReadyCallbacks.push(callback);
1193
+ }
1194
+ }
1195
+
1196
+ protected createEmbedContainerHandler = (source: EmbedEvent.AuthInit | EmbedEvent.EmbedListenerReady) => () => {
1197
+ const processEmbedContainerReady = () => {
1198
+ logger.debug('processEmbedContainerReady');
1199
+ this.isEmbedContainerLoaded = true;
1200
+ this.executeEmbedContainerReadyCallbacks();
1201
+ }
1202
+ if (source === EmbedEvent.AuthInit) {
1203
+ const AUTH_INIT_FALLBACK_DELAY = 1000;
1204
+ // Wait for 1 second to ensure the embed container is loaded
1205
+ // This is a workaround to ensure the embed container is loaded
1206
+ // this is needed until all clusters have EmbedListenerReady event
1207
+ setTimeout(processEmbedContainerReady, AUTH_INIT_FALLBACK_DELAY);
1208
+ } else if (source === EmbedEvent.EmbedListenerReady) {
1209
+ processEmbedContainerReady();
1210
+ }
1211
+ }
1212
+
1186
1213
  /**
1187
1214
  * Triggers an event to the embedded app
1188
1215
  * @param {HostEvent} messageType The event type
@@ -1251,7 +1278,7 @@ export class TsEmbed {
1251
1278
  * Creates the preRender shell
1252
1279
  * @param showPreRenderByDefault - Show the preRender after render, hidden by default
1253
1280
  */
1254
- public async preRender(showPreRenderByDefault = false): Promise<TsEmbed> {
1281
+ public async preRender(showPreRenderByDefault = false): Promise<TsEmbed> {
1255
1282
  if (!this.viewConfig.preRenderId) {
1256
1283
  logger.error(ERROR_MESSAGE.PRERENDER_ID_MISSING);
1257
1284
  return this;
@@ -1379,7 +1406,10 @@ export class TsEmbed {
1379
1406
  return this.preRender(true);
1380
1407
  }
1381
1408
  this.validatePreRenderViewConfig(this.viewConfig);
1382
- this.trigger(HostEvent.UpdateEmbedParams, this.viewConfig);
1409
+ logger.debug('triggering UpdateEmbedParams', this.viewConfig);
1410
+ this.executeAfterEmbedContainerLoaded(() => {
1411
+ this.trigger(HostEvent.UpdateEmbedParams, this.getUpdateEmbedParamsObject());
1412
+ });
1383
1413
  }
1384
1414
 
1385
1415
  this.beforePrerenderVisible();