@thoughtspot/visual-embed-sdk 1.52.0 → 1.52.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 (279) hide show
  1. package/cjs/package.json +9 -1
  2. package/cjs/src/contracts/contracts.spec.d.ts +2 -0
  3. package/cjs/src/contracts/contracts.spec.d.ts.map +1 -0
  4. package/cjs/src/contracts/contracts.spec.js +345 -0
  5. package/cjs/src/contracts/contracts.spec.js.map +1 -0
  6. package/cjs/src/contracts/embed-event-payloads.d.ts +73 -0
  7. package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -0
  8. package/cjs/src/contracts/embed-event-payloads.js +3 -0
  9. package/cjs/src/contracts/embed-event-payloads.js.map +1 -0
  10. package/cjs/src/contracts/host-event-contracts.d.ts +378 -0
  11. package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -0
  12. package/cjs/src/contracts/host-event-contracts.js +3 -0
  13. package/cjs/src/contracts/host-event-contracts.js.map +1 -0
  14. package/cjs/src/contracts/index.d.ts +22 -0
  15. package/cjs/src/contracts/index.d.ts.map +1 -0
  16. package/cjs/src/contracts/index.js +33 -0
  17. package/cjs/src/contracts/index.js.map +1 -0
  18. package/cjs/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  19. package/cjs/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  20. package/cjs/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  21. package/cjs/src/contracts/ui-passthrough-contracts.js.map +1 -0
  22. package/cjs/src/embed/app.d.ts +17 -140
  23. package/cjs/src/embed/app.d.ts.map +1 -1
  24. package/cjs/src/embed/app.js +20 -120
  25. package/cjs/src/embed/app.js.map +1 -1
  26. package/cjs/src/embed/app.spec.js +70 -26
  27. package/cjs/src/embed/app.spec.js.map +1 -1
  28. package/cjs/src/embed/events.spec.js +12 -2
  29. package/cjs/src/embed/events.spec.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  31. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/host-event-client.js +23 -18
  33. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +36 -36
  35. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  36. package/cjs/src/embed/hostEventClient/utils.d.ts +1 -1
  37. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  38. package/cjs/src/embed/hostEventClient/utils.js +3 -3
  39. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  40. package/cjs/src/embed/liveboard.d.ts +9 -161
  41. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  42. package/cjs/src/embed/liveboard.js +66 -134
  43. package/cjs/src/embed/liveboard.js.map +1 -1
  44. package/cjs/src/embed/liveboard.spec.js +211 -28
  45. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  46. package/cjs/src/embed/search.d.ts +14 -0
  47. package/cjs/src/embed/search.d.ts.map +1 -1
  48. package/cjs/src/embed/search.js +4 -1
  49. package/cjs/src/embed/search.js.map +1 -1
  50. package/cjs/src/embed/search.spec.js +65 -0
  51. package/cjs/src/embed/search.spec.js.map +1 -1
  52. package/cjs/src/embed/ts-embed.d.ts +17 -22
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +82 -56
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.js +325 -17
  57. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  58. package/cjs/src/full-height.d.ts +137 -0
  59. package/cjs/src/full-height.d.ts.map +1 -0
  60. package/cjs/src/full-height.js +272 -0
  61. package/cjs/src/full-height.js.map +1 -0
  62. package/cjs/src/full-height.spec.d.ts +2 -0
  63. package/cjs/src/full-height.spec.d.ts.map +1 -0
  64. package/cjs/src/full-height.spec.js +835 -0
  65. package/cjs/src/full-height.spec.js.map +1 -0
  66. package/cjs/src/index.d.ts +4 -3
  67. package/cjs/src/index.d.ts.map +1 -1
  68. package/cjs/src/index.js +3 -3
  69. package/cjs/src/index.js.map +1 -1
  70. package/cjs/src/react/all-types-export.d.ts +1 -1
  71. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  72. package/cjs/src/react/all-types-export.js.map +1 -1
  73. package/cjs/src/react/all-types-export.parity.spec.js +55 -3
  74. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
  75. package/cjs/src/types.d.ts +540 -3
  76. package/cjs/src/types.d.ts.map +1 -1
  77. package/cjs/src/types.js +326 -1
  78. package/cjs/src/types.js.map +1 -1
  79. package/cjs/src/utils/processTrigger.d.ts +3 -1
  80. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  81. package/cjs/src/utils/processTrigger.js +19 -51
  82. package/cjs/src/utils/processTrigger.js.map +1 -1
  83. package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
  84. package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
  85. package/cjs/src/utils/transport/iframe-transport.js +108 -0
  86. package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
  87. package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  88. package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  89. package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
  90. package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
  91. package/cjs/src/utils.d.ts +18 -0
  92. package/cjs/src/utils.d.ts.map +1 -1
  93. package/cjs/src/utils.js +39 -1
  94. package/cjs/src/utils.js.map +1 -1
  95. package/cjs/src/utils.spec.js +62 -0
  96. package/cjs/src/utils.spec.js.map +1 -1
  97. package/dist/{index-BMppCU63.js → index-C1pmYb5H.js} +1 -1
  98. package/dist/src/contracts/contracts.spec.d.ts +2 -0
  99. package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
  100. package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
  101. package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
  102. package/dist/src/contracts/host-event-contracts.d.ts +378 -0
  103. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
  104. package/dist/src/contracts/index.d.ts +22 -0
  105. package/dist/src/contracts/index.d.ts.map +1 -0
  106. package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  107. package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  108. package/dist/src/embed/app.d.ts +17 -140
  109. package/dist/src/embed/app.d.ts.map +1 -1
  110. package/dist/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  111. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  112. package/dist/src/embed/hostEventClient/utils.d.ts +1 -1
  113. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  114. package/dist/src/embed/liveboard.d.ts +9 -161
  115. package/dist/src/embed/liveboard.d.ts.map +1 -1
  116. package/dist/src/embed/search.d.ts +14 -0
  117. package/dist/src/embed/search.d.ts.map +1 -1
  118. package/dist/src/embed/ts-embed.d.ts +17 -22
  119. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  120. package/dist/src/full-height.d.ts +137 -0
  121. package/dist/src/full-height.d.ts.map +1 -0
  122. package/dist/src/full-height.spec.d.ts +2 -0
  123. package/dist/src/full-height.spec.d.ts.map +1 -0
  124. package/dist/src/index.d.ts +4 -3
  125. package/dist/src/index.d.ts.map +1 -1
  126. package/dist/src/react/all-types-export.d.ts +1 -1
  127. package/dist/src/react/all-types-export.d.ts.map +1 -1
  128. package/dist/src/types.d.ts +540 -3
  129. package/dist/src/types.d.ts.map +1 -1
  130. package/dist/src/utils/processTrigger.d.ts +3 -1
  131. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  132. package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
  133. package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
  134. package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  135. package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  136. package/dist/src/utils.d.ts +18 -0
  137. package/dist/src/utils.d.ts.map +1 -1
  138. package/dist/tsembed-react.es.js +925 -363
  139. package/dist/tsembed-react.js +924 -362
  140. package/dist/tsembed.es.js +925 -363
  141. package/dist/tsembed.js +924 -362
  142. package/dist/visual-embed-sdk-react-full.d.ts +1357 -656
  143. package/dist/visual-embed-sdk-react.d.ts +1257 -606
  144. package/dist/visual-embed-sdk.d.ts +1320 -642
  145. package/lib/package.json +9 -1
  146. package/lib/src/contracts/contracts.spec.d.ts +2 -0
  147. package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
  148. package/lib/src/contracts/contracts.spec.js +342 -0
  149. package/lib/src/contracts/contracts.spec.js.map +1 -0
  150. package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
  151. package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
  152. package/lib/src/contracts/embed-event-payloads.js +2 -0
  153. package/lib/src/contracts/embed-event-payloads.js.map +1 -0
  154. package/lib/src/contracts/host-event-contracts.d.ts +378 -0
  155. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
  156. package/lib/src/contracts/host-event-contracts.js +2 -0
  157. package/lib/src/contracts/host-event-contracts.js.map +1 -0
  158. package/lib/src/contracts/index.d.ts +22 -0
  159. package/lib/src/contracts/index.d.ts.map +1 -0
  160. package/lib/src/contracts/index.js +22 -0
  161. package/lib/src/contracts/index.js.map +1 -0
  162. package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  163. package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  164. package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  165. package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
  166. package/lib/src/embed/app.d.ts +17 -140
  167. package/lib/src/embed/app.d.ts.map +1 -1
  168. package/lib/src/embed/app.js +22 -122
  169. package/lib/src/embed/app.js.map +1 -1
  170. package/lib/src/embed/app.spec.js +70 -26
  171. package/lib/src/embed/app.spec.js.map +1 -1
  172. package/lib/src/embed/events.spec.js +12 -2
  173. package/lib/src/embed/events.spec.js.map +1 -1
  174. package/lib/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  175. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  176. package/lib/src/embed/hostEventClient/host-event-client.js +6 -1
  177. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  178. package/lib/src/embed/hostEventClient/host-event-client.spec.js +1 -1
  179. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  180. package/lib/src/embed/hostEventClient/utils.d.ts +1 -1
  181. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  182. package/lib/src/embed/hostEventClient/utils.js +1 -1
  183. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  184. package/lib/src/embed/liveboard.d.ts +9 -161
  185. package/lib/src/embed/liveboard.d.ts.map +1 -1
  186. package/lib/src/embed/liveboard.js +67 -135
  187. package/lib/src/embed/liveboard.js.map +1 -1
  188. package/lib/src/embed/liveboard.spec.js +211 -28
  189. package/lib/src/embed/liveboard.spec.js.map +1 -1
  190. package/lib/src/embed/search.d.ts +14 -0
  191. package/lib/src/embed/search.d.ts.map +1 -1
  192. package/lib/src/embed/search.js +4 -1
  193. package/lib/src/embed/search.js.map +1 -1
  194. package/lib/src/embed/search.spec.js +65 -0
  195. package/lib/src/embed/search.spec.js.map +1 -1
  196. package/lib/src/embed/ts-embed.d.ts +17 -22
  197. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  198. package/lib/src/embed/ts-embed.js +82 -56
  199. package/lib/src/embed/ts-embed.js.map +1 -1
  200. package/lib/src/embed/ts-embed.spec.js +322 -14
  201. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  202. package/lib/src/full-height.d.ts +137 -0
  203. package/lib/src/full-height.d.ts.map +1 -0
  204. package/lib/src/full-height.js +268 -0
  205. package/lib/src/full-height.js.map +1 -0
  206. package/lib/src/full-height.spec.d.ts +2 -0
  207. package/lib/src/full-height.spec.d.ts.map +1 -0
  208. package/lib/src/full-height.spec.js +833 -0
  209. package/lib/src/full-height.spec.js.map +1 -0
  210. package/lib/src/index.d.ts +4 -3
  211. package/lib/src/index.d.ts.map +1 -1
  212. package/lib/src/index.js +1 -1
  213. package/lib/src/index.js.map +1 -1
  214. package/lib/src/react/all-types-export.d.ts +1 -1
  215. package/lib/src/react/all-types-export.d.ts.map +1 -1
  216. package/lib/src/react/all-types-export.js.map +1 -1
  217. package/lib/src/react/all-types-export.parity.spec.js +55 -3
  218. package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
  219. package/lib/src/types.d.ts +540 -3
  220. package/lib/src/types.d.ts.map +1 -1
  221. package/lib/src/types.js +326 -1
  222. package/lib/src/types.js.map +1 -1
  223. package/lib/src/utils/processTrigger.d.ts +3 -1
  224. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  225. package/lib/src/utils/processTrigger.js +19 -51
  226. package/lib/src/utils/processTrigger.js.map +1 -1
  227. package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
  228. package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
  229. package/lib/src/utils/transport/iframe-transport.js +101 -0
  230. package/lib/src/utils/transport/iframe-transport.js.map +1 -0
  231. package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  232. package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  233. package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
  234. package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
  235. package/lib/src/utils.d.ts +18 -0
  236. package/lib/src/utils.d.ts.map +1 -1
  237. package/lib/src/utils.js +37 -0
  238. package/lib/src/utils.js.map +1 -1
  239. package/lib/src/utils.spec.js +63 -1
  240. package/lib/src/utils.spec.js.map +1 -1
  241. package/lib/src/visual-embed-sdk.d.ts +1320 -642
  242. package/package.json +9 -1
  243. package/src/contracts/contracts.spec.ts +392 -0
  244. package/src/contracts/embed-event-payloads.ts +83 -0
  245. package/src/contracts/host-event-contracts.ts +456 -0
  246. package/src/contracts/index.ts +53 -0
  247. package/src/contracts/ui-passthrough-contracts.ts +301 -0
  248. package/src/embed/app.spec.ts +86 -34
  249. package/src/embed/app.ts +37 -264
  250. package/src/embed/events.spec.ts +14 -2
  251. package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
  252. package/src/embed/hostEventClient/host-event-client.ts +18 -5
  253. package/src/embed/hostEventClient/utils.ts +2 -1
  254. package/src/embed/liveboard.spec.ts +257 -38
  255. package/src/embed/liveboard.ts +75 -296
  256. package/src/embed/search.spec.ts +80 -0
  257. package/src/embed/search.ts +20 -0
  258. package/src/embed/ts-embed.spec.ts +448 -15
  259. package/src/embed/ts-embed.ts +109 -66
  260. package/src/full-height.spec.ts +1008 -0
  261. package/src/full-height.ts +361 -0
  262. package/src/index.ts +93 -5
  263. package/src/react/all-types-export.parity.spec.ts +63 -3
  264. package/src/react/all-types-export.ts +45 -0
  265. package/src/types.ts +540 -1
  266. package/src/utils/processTrigger.ts +28 -58
  267. package/src/utils/transport/iframe-transport.spec.ts +177 -0
  268. package/src/utils/transport/iframe-transport.ts +122 -0
  269. package/src/utils.spec.ts +71 -0
  270. package/src/utils.ts +38 -0
  271. package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
  272. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  273. package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
  274. package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
  275. package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  276. package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
  277. package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  278. package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
  279. package/src/embed/hostEventClient/contracts.ts +0 -262
@@ -10,20 +10,26 @@ import isEqual from 'lodash/isEqual';
10
10
  import isEmpty from 'lodash/isEmpty';
11
11
  import isObject from 'lodash/isObject';
12
12
  import {
13
- HostEventRequest,
14
- TriggerPayload,
15
- TriggerResponse,
16
13
  UIPassthroughArrayResponse,
17
14
  UIPassthroughEvent,
18
15
  UIPassthroughRequest,
19
- } from './hostEventClient/contracts';
16
+ } from '../contracts/ui-passthrough-contracts';
17
+ // Contract resolution comes from the shared contracts module (the single
18
+ // source of truth for event payload shapes) rather than the legacy
19
+ // UI-passthrough-only mapping.
20
+ import {
21
+ HostEventRequest,
22
+ TriggerData,
23
+ TriggerResponse,
24
+ } from '../contracts/host-event-contracts';
25
+ import { EmbedEventPayload } from '../contracts/embed-event-payloads';
26
+ import { isMessageFromIframe } from '../utils/transport/iframe-transport';
20
27
  import { logger } from '../utils/logger';
21
28
  import { getAuthenticationToken } from '../authToken';
22
29
  import { AnswerService } from '../utils/graphql/answerService/answerService';
23
30
  import {
24
31
  getEncodedQueryParamsString,
25
32
  getCssDimension,
26
- getOffsetTop,
27
33
  embedEventStatus,
28
34
  setAttributes,
29
35
  getCustomisations,
@@ -110,6 +116,14 @@ const TS_EMBED_ID = '_thoughtspot-embed';
110
116
  const PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY = 'tsEmbedOriginalPosition';
111
117
  const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
112
118
 
119
+ // The container applies UpdateEmbedParams through React state, so a delivered
120
+ // post is not the same as the params being in effect.
121
+ const UPDATE_EMBED_PARAMS_SETTLE_MS = 200;
122
+
123
+ // The container ignores runtimeFilterParams/runtimeParameterParams unless truthy, so
124
+ // null or '' leaves the previous embed's values in place. '&' is truthy and parses to {}.
125
+ const NO_RUNTIME_PARAMS = '&';
126
+
113
127
  /**
114
128
  * The event id map from v2 event names to v1 event id
115
129
  * v1 events are the classic embed events implemented in Blink v1
@@ -142,6 +156,8 @@ export class TsEmbed {
142
156
  */
143
157
  protected embedNodeKey = '__tsEmbed';
144
158
 
159
+ protected embedContainerLoadedKey = '__tsEmbedContainerLoaded';
160
+
145
161
  protected isAppInitialized = false;
146
162
 
147
163
  /**
@@ -439,7 +455,7 @@ export class TsEmbed {
439
455
  const eventType = this.getEventType(event);
440
456
  const eventPort = this.getEventPort(event);
441
457
  const eventData = this.formatEventData(event, eventType);
442
- if (event.source === this.iFrame.contentWindow) {
458
+ if (isMessageFromIframe(event, this.iFrame, this.thoughtSpotHost)) {
443
459
  const processedEventData = processEventData(
444
460
  eventType,
445
461
  eventData,
@@ -720,7 +736,18 @@ export class TsEmbed {
720
736
  queryParams[key] = deserializeParam(queryParams[key]);
721
737
  });
722
738
  const appInitData = await this.getAppInitData();
723
- return { ...this.viewConfig, ...queryParams, ...appInitData };
739
+ return {
740
+ ...this.viewConfig,
741
+ ...queryParams,
742
+ ...appInitData,
743
+ // A show cycle has no URL to carry these, so the payload always states them
744
+ // — including "none", which is the case that leaks the previous filters.
745
+ runtimeFilterParams:
746
+ getFilterQuery(this.viewConfig.runtimeFilters ?? []) || NO_RUNTIME_PARAMS,
747
+ runtimeParameterParams:
748
+ getRuntimeParameters(this.viewConfig.runtimeParameters ?? [])
749
+ || NO_RUNTIME_PARAMS,
750
+ };
724
751
  }
725
752
 
726
753
  /**
@@ -1125,6 +1152,8 @@ export class TsEmbed {
1125
1152
  return preRenderWrapper;
1126
1153
  }
1127
1154
 
1155
+ // TODO(SCAL-338011): move the pre-render code out to its own file, the way
1156
+ // full height did. It is spread across this class and getting messy.
1128
1157
  protected preRenderWrapper: HTMLElement;
1129
1158
 
1130
1159
  protected preRenderChild: HTMLElement;
@@ -1470,41 +1499,6 @@ export class TsEmbed {
1470
1499
  return V1EventMap[eventType] || eventType;
1471
1500
  }
1472
1501
 
1473
- /**
1474
- * Calculates the iframe center for the current visible viewPort
1475
- * of iframe using Scroll position of Host App, offsetTop for iframe
1476
- * in Host app. ViewPort height of the tab.
1477
- * @returns iframe Center in visible viewport,
1478
- * Iframe height,
1479
- * View port height.
1480
- */
1481
- protected getIframeCenter() {
1482
- const offsetTopClient = getOffsetTop(this.iFrame);
1483
- const scrollTopClient = window.scrollY;
1484
- const viewPortHeight = window.innerHeight;
1485
- const iframeHeight = this.iFrame.offsetHeight;
1486
- const iframeScrolled = scrollTopClient - offsetTopClient;
1487
- let iframeVisibleViewPort;
1488
- let iframeOffset;
1489
-
1490
- if (iframeScrolled < 0) {
1491
- iframeVisibleViewPort = viewPortHeight - (offsetTopClient - scrollTopClient);
1492
- iframeVisibleViewPort = Math.min(iframeHeight, iframeVisibleViewPort);
1493
- iframeOffset = 0;
1494
- } else {
1495
- iframeVisibleViewPort = Math.min(iframeHeight - iframeScrolled, viewPortHeight);
1496
- iframeOffset = iframeScrolled;
1497
- }
1498
- const iframeCenter = iframeOffset + iframeVisibleViewPort / 2;
1499
- return {
1500
- iframeCenter,
1501
- iframeScrolled,
1502
- iframeHeight,
1503
- viewPortHeight,
1504
- iframeVisibleViewPort,
1505
- };
1506
- }
1507
-
1508
1502
  /**
1509
1503
  * Registers an event listener to trigger an alert when the ThoughtSpot app
1510
1504
  * sends an event of a particular message type to the host application.
@@ -1528,9 +1522,12 @@ export class TsEmbed {
1528
1522
  * });
1529
1523
  * ```
1530
1524
  */
1531
- public on(
1532
- messageType: EmbedEvent,
1533
- callback: MessageCallback,
1525
+ public on<EmbedEventT extends EmbedEvent>(
1526
+ messageType: EmbedEventT,
1527
+ callback: (
1528
+ payload: EmbedEventPayload<EmbedEventT>,
1529
+ responder?: (data: any) => void,
1530
+ ) => void,
1534
1531
  options: MessageOptions = { start: false },
1535
1532
  isRegisteredBySDK = false,
1536
1533
  ): typeof TsEmbed.prototype {
@@ -1608,14 +1605,34 @@ export class TsEmbed {
1608
1605
  protected getPreRenderObj<T extends TsEmbed>(): T {
1609
1606
  const embedObj = (this.preRenderWrapper as any)?.[this.embedNodeKey] as T;
1610
1607
  if (embedObj === (this as any)) {
1611
- logger.info('embedObj is same as this');
1608
+ logger.debug('embedObj is same as this');
1612
1609
  }
1613
1610
  return embedObj;
1614
1611
  }
1615
1612
 
1613
+ protected takeOverPreRender(): void {
1614
+ if (!this.preRenderWrapper) return;
1615
+ (this.preRenderWrapper as any)[this.embedNodeKey] = this;
1616
+ }
1617
+
1618
+ // The flag lives on the wrapper because it describes the iframe: an instance
1619
+ // hidden when the container announced itself would otherwise report false forever.
1620
+ private markEmbedContainerLoaded() {
1621
+ this.isEmbedContainerLoaded = true;
1622
+ if (this.preRenderWrapper) {
1623
+ (this.preRenderWrapper as any)[this.embedContainerLoadedKey] = true;
1624
+ }
1625
+ }
1626
+
1616
1627
  private checkEmbedContainerLoaded() {
1617
1628
  if (this.isEmbedContainerLoaded) return true;
1618
1629
 
1630
+ if ((this.preRenderWrapper as any)?.[this.embedContainerLoadedKey]) {
1631
+ this.isEmbedContainerLoaded = true;
1632
+ return true;
1633
+ }
1634
+
1635
+ // Older builds stamped the flag on the instance, not the wrapper.
1619
1636
  const preRenderObj = this.getPreRenderObj<TsEmbed>();
1620
1637
  if (preRenderObj && preRenderObj.isEmbedContainerLoaded) {
1621
1638
  this.isEmbedContainerLoaded = true;
@@ -1648,7 +1665,7 @@ export class TsEmbed {
1648
1665
  (source: EmbedEvent.AuthInit | EmbedEvent.EmbedListenerReady) => () => {
1649
1666
  const processEmbedContainerReady = () => {
1650
1667
  logger.debug('processEmbedContainerReady');
1651
- this.isEmbedContainerLoaded = true;
1668
+ this.markEmbedContainerLoaded();
1652
1669
  this.executeEmbedContainerReadyCallbacks();
1653
1670
  };
1654
1671
  if (source === EmbedEvent.AuthInit) {
@@ -1664,8 +1681,12 @@ export class TsEmbed {
1664
1681
 
1665
1682
  /**
1666
1683
  * Triggers an event to the embedded app
1684
+ *
1685
+ * Payload typing: from SDK 1.52.0 (ThoughtSpot Cloud 26.9.0.cl), unknown fields
1686
+ * on a known event's payload fail to compile. From SDK 1.54.0 (26.11.0.cl) the
1687
+ * payload is checked strictly against the event contract — update call sites now.
1667
1688
  * @param {HostEvent} messageType The event type
1668
- * @param {any} data The payload to send with the message
1689
+ * @param {TriggerData} data The payload, typed against the event's contract
1669
1690
  * @param {ContextType} context Optional context type to specify the context from which the event is triggered.
1670
1691
  * Use ContextType.Search for search answer context, ContextType.Answer for answer/explore context,
1671
1692
  * ContextType.Liveboard for liveboard context, or ContextType.Spotter for spotter context.
@@ -1688,7 +1709,10 @@ export class TsEmbed {
1688
1709
  ContextT extends ContextType = ContextType,
1689
1710
  >(
1690
1711
  messageType: HostEventT,
1691
- data: TriggerPayload<PayloadT, HostEventT> = {} as any,
1712
+ // Contract shape is the contextual type: payload fields autocomplete
1713
+ // and unknown fields on object literals are flagged. Strict checks
1714
+ // land in SDK 1.54.0 — see TriggerData.
1715
+ data: TriggerData<HostEventT> = {} as any,
1692
1716
  context?: ContextT,
1693
1717
  ): Promise<TriggerResponse<PayloadT, HostEventT, ContextT>> {
1694
1718
  uploadMixpanelEvent(`${MIXPANEL_EVENT.VISUAL_SDK_TRIGGER}-${messageType}`);
@@ -2015,24 +2039,34 @@ export class TsEmbed {
2015
2039
  return this.renderIFrame(prerenderFrameSrc);
2016
2040
  }
2017
2041
 
2042
+ // Subclasses that navigate the pre-render on show must await this before
2043
+ // triggering Navigate. Resolves even on failure, so navigation is never blocked.
2044
+ protected preRenderParamsApplied: Promise<void> = Promise.resolve();
2045
+
2018
2046
  protected beforePrerenderVisible(): void {
2019
2047
  // We can ignore this as its a bit expensive and the newer customers
2020
2048
  // have moved on to UpdateEmbedParams supported clusters
2021
2049
  // this.validatePreRenderViewConfig(this.viewConfig); removed in #517
2022
2050
  logger.debug('triggering UpdateEmbedParams', this.viewConfig);
2023
- this.executeAfterEmbedContainerLoaded(async () => {
2024
- try {
2025
- const params = await this.getUpdateEmbedParamsObject();
2026
- this.trigger(HostEvent.UpdateEmbedParams, params);
2027
- } catch (error) {
2028
- logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
2029
- this.handleError({
2030
- errorType: ErrorDetailsTypes.API,
2031
- message: error?.message || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
2032
- code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
2033
- error: error?.message || error,
2034
- });
2035
- }
2051
+ // Created synchronously: a queued navigation needs something to await
2052
+ // whether the container is already loaded or not.
2053
+ this.preRenderParamsApplied = new Promise<void>((resolve) => {
2054
+ this.executeAfterEmbedContainerLoaded(async () => {
2055
+ try {
2056
+ const params = await this.getUpdateEmbedParamsObject();
2057
+ this.trigger(HostEvent.UpdateEmbedParams, params);
2058
+ } catch (error) {
2059
+ logger.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
2060
+ this.handleError({
2061
+ errorType: ErrorDetailsTypes.API,
2062
+ message: error?.message || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
2063
+ code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
2064
+ error: error?.message || error,
2065
+ });
2066
+ } finally {
2067
+ setTimeout(resolve, UPDATE_EMBED_PARAMS_SETTLE_MS);
2068
+ }
2069
+ });
2036
2070
  });
2037
2071
  }
2038
2072
 
@@ -2119,6 +2153,9 @@ export class TsEmbed {
2119
2153
  this.setupFullscreenChangeHandler();
2120
2154
  }
2121
2155
 
2156
+ // Last, so everything above still sees the instance being taken over from.
2157
+ this.takeOverPreRender();
2158
+
2122
2159
  return this;
2123
2160
  }
2124
2161
 
@@ -2339,12 +2376,18 @@ export class V1Embed extends TsEmbed {
2339
2376
  * });
2340
2377
  * ```
2341
2378
  */
2342
- public on(
2343
- messageType: EmbedEvent,
2344
- callback: MessageCallback,
2379
+ public on<EmbedEventT extends EmbedEvent>(
2380
+ messageType: EmbedEventT,
2381
+ callback: (
2382
+ payload: EmbedEventPayload<EmbedEventT>,
2383
+ responder?: (data: any) => void,
2384
+ ) => void,
2345
2385
  options: MessageOptions = { start: false },
2346
2386
  ): typeof TsEmbed.prototype {
2347
- const eventType = this.getCompatibleEventType(messageType);
2387
+ // Mirror the base TsEmbed.on generic signature so the enriched
2388
+ // EmbedEventPayload (e.g. CustomAction's answerService) flows through
2389
+ // the override too, and the class hierarchy stays assignable.
2390
+ const eventType = this.getCompatibleEventType(messageType) as EmbedEventT;
2348
2391
  return super.on(eventType, callback, options);
2349
2392
  }
2350
2393