@thoughtspot/visual-embed-sdk 1.35.0 → 1.35.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 (172) hide show
  1. package/cjs/package.json +15 -3
  2. package/cjs/src/embed/base.native.d.ts +1 -0
  3. package/cjs/src/embed/base.native.d.ts.map +1 -0
  4. package/cjs/src/embed/base.native.js +1 -0
  5. package/cjs/src/embed/base.native.js.map +1 -0
  6. package/cjs/src/embed/hello.d.ts +2 -0
  7. package/cjs/src/embed/hello.d.ts.map +1 -0
  8. package/cjs/src/embed/hello.js +6 -0
  9. package/cjs/src/embed/hello.js.map +1 -0
  10. package/cjs/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
  11. package/cjs/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
  12. package/cjs/src/embed/searchEmbed-basic-auth.spec.js +104 -0
  13. package/cjs/src/embed/searchEmbed-basic-auth.spec.js.map +1 -0
  14. package/cjs/src/native/LiveboardEmbed.d.ts +13 -0
  15. package/cjs/src/native/LiveboardEmbed.d.ts.map +1 -0
  16. package/cjs/src/native/LiveboardEmbed.js +146 -0
  17. package/cjs/src/native/LiveboardEmbed.js.map +1 -0
  18. package/cjs/src/native/commonUtils.d.ts +20 -0
  19. package/cjs/src/native/commonUtils.d.ts.map +1 -0
  20. package/cjs/src/native/commonUtils.js +175 -0
  21. package/cjs/src/native/commonUtils.js.map +1 -0
  22. package/cjs/src/native/commonUtils.spec.d.ts +2 -0
  23. package/cjs/src/native/commonUtils.spec.d.ts.map +1 -0
  24. package/cjs/src/native/commonUtils.spec.js +127 -0
  25. package/cjs/src/native/commonUtils.spec.js.map +1 -0
  26. package/cjs/src/native/embedConfig.d.ts +10 -0
  27. package/cjs/src/native/embedConfig.d.ts.map +1 -0
  28. package/cjs/src/native/embedConfig.js +12 -0
  29. package/cjs/src/native/embedConfig.js.map +1 -0
  30. package/cjs/src/native/index.d.ts +2 -0
  31. package/cjs/src/native/index.d.ts.map +1 -0
  32. package/cjs/src/native/index.js +7 -0
  33. package/cjs/src/native/index.js.map +1 -0
  34. package/cjs/src/native/types.d.ts +10 -0
  35. package/cjs/src/native/types.d.ts.map +1 -0
  36. package/cjs/src/native/types.js +3 -0
  37. package/cjs/src/native/types.js.map +1 -0
  38. package/cjs/src/parsers/filtersToRuntimeFilters.d.ts +6 -0
  39. package/cjs/src/parsers/filtersToRuntimeFilters.d.ts.map +1 -0
  40. package/cjs/src/parsers/filtersToRuntimeFilters.js +60 -0
  41. package/cjs/src/parsers/filtersToRuntimeFilters.js.map +1 -0
  42. package/cjs/src/parsers/filtersToRuntimeFilters.spec.d.ts +2 -0
  43. package/cjs/src/parsers/filtersToRuntimeFilters.spec.d.ts.map +1 -0
  44. package/cjs/src/parsers/filtersToRuntimeFilters.spec.js +205 -0
  45. package/cjs/src/parsers/filtersToRuntimeFilters.spec.js.map +1 -0
  46. package/cjs/src/parsers/index.d.ts +2 -0
  47. package/cjs/src/parsers/index.d.ts.map +1 -0
  48. package/cjs/src/parsers/index.js +6 -0
  49. package/cjs/src/parsers/index.js.map +1 -0
  50. package/cjs/src/parsers/index.spec.d.ts +2 -0
  51. package/cjs/src/parsers/index.spec.d.ts.map +1 -0
  52. package/cjs/src/parsers/index.spec.js +9 -0
  53. package/cjs/src/parsers/index.spec.js.map +1 -0
  54. package/cjs/src/react-native/Liveboard.d.ts +1 -0
  55. package/cjs/src/react-native/Liveboard.d.ts.map +1 -0
  56. package/cjs/src/react-native/Liveboard.js +1 -0
  57. package/cjs/src/react-native/Liveboard.js.map +1 -0
  58. package/cjs/src/utils/processData.spec.js +33 -0
  59. package/cjs/src/utils/processData.spec.js.map +1 -1
  60. package/cjs/src/utils.d.ts +15 -0
  61. package/cjs/src/utils.d.ts.map +1 -1
  62. package/cjs/src/utils.js +24 -3
  63. package/cjs/src/utils.js.map +1 -1
  64. package/cjs/src/utils.spec.js +132 -0
  65. package/cjs/src/utils.spec.js.map +1 -1
  66. package/dist/{index-A4UOqx43.js → index-BXczdQc7.js} +1 -1
  67. package/dist/index-Bh8kjZh8.js +7370 -0
  68. package/dist/src/embed/hello.d.ts +2 -0
  69. package/dist/src/embed/hello.d.ts.map +1 -0
  70. package/dist/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
  71. package/dist/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
  72. package/dist/src/native/LiveboardEmbed.d.ts +13 -0
  73. package/dist/src/native/LiveboardEmbed.d.ts.map +1 -0
  74. package/dist/src/native/commonUtils.d.ts +20 -0
  75. package/dist/src/native/commonUtils.d.ts.map +1 -0
  76. package/dist/src/native/commonUtils.spec.d.ts +2 -0
  77. package/dist/src/native/commonUtils.spec.d.ts.map +1 -0
  78. package/dist/src/native/embedConfig.d.ts +10 -0
  79. package/dist/src/native/embedConfig.d.ts.map +1 -0
  80. package/dist/src/native/index.d.ts +2 -0
  81. package/dist/src/native/index.d.ts.map +1 -0
  82. package/dist/src/native/types.d.ts +10 -0
  83. package/dist/src/native/types.d.ts.map +1 -0
  84. package/dist/src/parsers/filtersToRuntimeFilters.d.ts +6 -0
  85. package/dist/src/parsers/filtersToRuntimeFilters.d.ts.map +1 -0
  86. package/dist/src/parsers/filtersToRuntimeFilters.spec.d.ts +2 -0
  87. package/dist/src/parsers/filtersToRuntimeFilters.spec.d.ts.map +1 -0
  88. package/dist/src/parsers/index.d.ts +2 -0
  89. package/dist/src/parsers/index.d.ts.map +1 -0
  90. package/dist/src/parsers/index.spec.d.ts +2 -0
  91. package/dist/src/parsers/index.spec.d.ts.map +1 -0
  92. package/dist/src/utils.d.ts +15 -0
  93. package/dist/src/utils.d.ts.map +1 -1
  94. package/dist/tsembed-parsers.es.js +3831 -0
  95. package/dist/tsembed-parsers.js +3840 -0
  96. package/dist/tsembed-react.es.js +3 -3
  97. package/dist/tsembed-react.js +2 -2
  98. package/dist/tsembed.es.js +3 -3
  99. package/dist/tsembed.js +2 -2
  100. package/lib/package.json +15 -3
  101. package/lib/src/embed/base.native.d.ts +1 -0
  102. package/lib/src/embed/base.native.d.ts.map +1 -0
  103. package/lib/src/embed/base.native.js +1 -0
  104. package/lib/src/embed/base.native.js.map +1 -0
  105. package/lib/src/embed/hello.d.ts +2 -0
  106. package/lib/src/embed/hello.d.ts.map +1 -0
  107. package/lib/src/embed/hello.js +2 -0
  108. package/lib/src/embed/hello.js.map +1 -0
  109. package/lib/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
  110. package/lib/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
  111. package/lib/src/embed/searchEmbed-basic-auth.spec.js +101 -0
  112. package/lib/src/embed/searchEmbed-basic-auth.spec.js.map +1 -0
  113. package/lib/src/native/LiveboardEmbed.d.ts +13 -0
  114. package/lib/src/native/LiveboardEmbed.d.ts.map +1 -0
  115. package/lib/src/native/LiveboardEmbed.js +141 -0
  116. package/lib/src/native/LiveboardEmbed.js.map +1 -0
  117. package/lib/src/native/commonUtils.d.ts +20 -0
  118. package/lib/src/native/commonUtils.d.ts.map +1 -0
  119. package/lib/src/native/commonUtils.js +169 -0
  120. package/lib/src/native/commonUtils.js.map +1 -0
  121. package/lib/src/native/commonUtils.spec.d.ts +2 -0
  122. package/lib/src/native/commonUtils.spec.d.ts.map +1 -0
  123. package/lib/src/native/commonUtils.spec.js +124 -0
  124. package/lib/src/native/commonUtils.spec.js.map +1 -0
  125. package/lib/src/native/embedConfig.d.ts +10 -0
  126. package/lib/src/native/embedConfig.d.ts.map +1 -0
  127. package/lib/src/native/embedConfig.js +7 -0
  128. package/lib/src/native/embedConfig.js.map +1 -0
  129. package/lib/src/native/index.d.ts +2 -0
  130. package/lib/src/native/index.d.ts.map +1 -0
  131. package/lib/src/native/index.js +2 -0
  132. package/lib/src/native/index.js.map +1 -0
  133. package/lib/src/native/types.d.ts +10 -0
  134. package/lib/src/native/types.d.ts.map +1 -0
  135. package/lib/src/native/types.js +2 -0
  136. package/lib/src/native/types.js.map +1 -0
  137. package/lib/src/parsers/filtersToRuntimeFilters.d.ts +6 -0
  138. package/lib/src/parsers/filtersToRuntimeFilters.d.ts.map +1 -0
  139. package/lib/src/parsers/filtersToRuntimeFilters.js +55 -0
  140. package/lib/src/parsers/filtersToRuntimeFilters.js.map +1 -0
  141. package/lib/src/parsers/filtersToRuntimeFilters.spec.d.ts +2 -0
  142. package/lib/src/parsers/filtersToRuntimeFilters.spec.d.ts.map +1 -0
  143. package/lib/src/parsers/filtersToRuntimeFilters.spec.js +203 -0
  144. package/lib/src/parsers/filtersToRuntimeFilters.spec.js.map +1 -0
  145. package/lib/src/parsers/index.d.ts +2 -0
  146. package/lib/src/parsers/index.d.ts.map +1 -0
  147. package/lib/src/parsers/index.js +2 -0
  148. package/lib/src/parsers/index.js.map +1 -0
  149. package/lib/src/parsers/index.spec.d.ts +2 -0
  150. package/lib/src/parsers/index.spec.d.ts.map +1 -0
  151. package/lib/src/parsers/index.spec.js +7 -0
  152. package/lib/src/parsers/index.spec.js.map +1 -0
  153. package/lib/src/react-native/Liveboard.d.ts +1 -0
  154. package/lib/src/react-native/Liveboard.d.ts.map +1 -0
  155. package/lib/src/react-native/Liveboard.js +1 -0
  156. package/lib/src/react-native/Liveboard.js.map +1 -0
  157. package/lib/src/utils/processData.spec.js +33 -0
  158. package/lib/src/utils/processData.spec.js.map +1 -1
  159. package/lib/src/utils.d.ts +15 -0
  160. package/lib/src/utils.d.ts.map +1 -1
  161. package/lib/src/utils.js +20 -2
  162. package/lib/src/utils.js.map +1 -1
  163. package/lib/src/utils.spec.js +133 -1
  164. package/lib/src/utils.spec.js.map +1 -1
  165. package/package.json +15 -3
  166. package/src/native/commonUtils.spec.tsx +161 -0
  167. package/src/native/commonUtils.ts +183 -0
  168. package/src/native/index.ts +1 -0
  169. package/src/native/types.ts +10 -0
  170. package/src/utils/processData.spec.ts +42 -0
  171. package/src/utils.spec.ts +147 -1
  172. package/src/utils.ts +25 -2
@@ -1 +1 @@
1
- {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../src/utils.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../src/utils.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thoughtspot/visual-embed-sdk",
3
- "version": "1.35.0",
3
+ "version": "1.35.1",
4
4
  "description": "ThoughtSpot Embed SDK",
5
5
  "module": "lib/src/index.js",
6
6
  "main": "dist/tsembed.js",
@@ -26,6 +26,16 @@
26
26
  "import": "./lib/src/react/all-types-export.js",
27
27
  "require": "./cjs/src/react/all-types-export.js",
28
28
  "types": "./lib/src/react/all-types-export.d.ts"
29
+ },
30
+ "./native": {
31
+ "import": "./lib/src/native/index.js",
32
+ "require": "./cjs/src/native/index.js",
33
+ "types": "./lib/src/native/index.d.ts"
34
+ },
35
+ "./lib/src/native": {
36
+ "import": "./lib/src/native/index.js",
37
+ "require": "./cjs/src/native/index.js",
38
+ "types": "./lib/src/native/index.d.ts"
29
39
  }
30
40
  },
31
41
  "typesVersions": {
@@ -76,6 +86,8 @@
76
86
  "html-react-parser": "^1.4.12",
77
87
  "lodash": "^4.17.21",
78
88
  "mixpanel-browser": "2.47.0",
89
+ "react-native": "^0.76.3",
90
+ "react-native-webview": "^13.12.4",
79
91
  "ts-deepmerge": "^6.0.2",
80
92
  "tslib": "^2.5.3",
81
93
  "use-deep-compare-effect": "^1.8.1",
@@ -112,11 +124,11 @@
112
124
  "eslint-config-airbnb-base": "^14.2.0",
113
125
  "eslint-config-prettier": "^6.15.0",
114
126
  "eslint-import-resolver-typescript": "^2.3.0",
127
+ "eslint-plugin-comment-length": "1.7.3",
115
128
  "eslint-plugin-import": "^2.22.1",
129
+ "eslint-plugin-jsdoc": "^46.9.0",
116
130
  "eslint-plugin-prettier": "^3.1.4",
117
131
  "eslint-plugin-react-hooks": "^4.2.0",
118
- "eslint-plugin-comment-length": "1.7.3",
119
- "eslint-plugin-jsdoc": "^46.9.0",
120
132
  "fs-extra": "^10.0.0",
121
133
  "gh-pages": "^3.1.0",
122
134
  "highlight.js": "^10.6.0",
@@ -0,0 +1,161 @@
1
+ import { getWebViewUrl, setupWebViewMessageHandler } from './commonUtils'; // Adjust the import path
2
+ import { AuthType } from '../types';
3
+ import pkgInfo from '../../package.json';
4
+
5
+ jest.mock('../utils', () => ({
6
+ getQueryParamString: jest.fn((params) => Object.keys(params).map((key: any) => `${key}=${params[key]}`).join('&')),
7
+ getCustomisationsMobileEmbed: jest.fn(() => ({ customKey: 'customValue' })),
8
+ }));
9
+
10
+ describe('getWebViewUrl', () => {
11
+ const mockGetAuthToken = jest.fn();
12
+
13
+ beforeEach(() => {
14
+ jest.clearAllMocks();
15
+ });
16
+
17
+ test('should construct the WebView URL correctly', async () => {
18
+ mockGetAuthToken.mockResolvedValue('mock-token');
19
+ const config = {
20
+ host: 'https://lookat-webview.com',
21
+ authType: AuthType.TrustedAuthTokenCookieless,
22
+ liveboardId: 'test-liveboard-id',
23
+ getAuthToken: mockGetAuthToken,
24
+ };
25
+
26
+ const url = await getWebViewUrl(config);
27
+
28
+ expect(mockGetAuthToken).toHaveBeenCalledTimes(1);
29
+ expect(url).toContain('https://lookat-webview.com/embed');
30
+ expect(url).toContain(`authType=${AuthType.TrustedAuthTokenCookieless}`);
31
+ expect(url).toContain('test-liveboard-id');
32
+ expect(url).toContain(`sdkVersion=${pkgInfo.version}`);
33
+ });
34
+
35
+ test('should throw an error if getAuthToken is not a function', async () => {
36
+ const config = {
37
+ host: 'https://lookat-webview.com',
38
+ authType: AuthType.TrustedAuthTokenCookieless,
39
+ liveboardId: 'test-liveboard-id',
40
+ getAuthToken: undefined as any,
41
+ };
42
+
43
+ await expect(getWebViewUrl(config)).rejects.toThrow('`getAuthToken` must be a function that returns a Promise.');
44
+ });
45
+
46
+ test('should throw an error if `getAuthToken` resolves to a falsy value', async () => {
47
+ mockGetAuthToken.mockResolvedValue(null);
48
+ const config = {
49
+ host: 'https://lookat-webview.com',
50
+ authType: AuthType.TrustedAuthTokenCookieless,
51
+ liveboardId: 'test-liveboard-id',
52
+ getAuthToken: mockGetAuthToken,
53
+ };
54
+
55
+ await expect(getWebViewUrl(config)).rejects.toThrow('Failed to fetch initial authentication token.');
56
+ });
57
+
58
+ test('should encode localhost URLs correctly', async () => {
59
+ mockGetAuthToken.mockResolvedValue('mock-token');
60
+ const config = {
61
+ host: 'localhost',
62
+ authType: AuthType.TrustedAuthTokenCookieless,
63
+ liveboardId: 'test-liveboard-id',
64
+ getAuthToken: mockGetAuthToken,
65
+ };
66
+
67
+ const url = await getWebViewUrl(config);
68
+
69
+ expect(url).toContain('hostAppUrl=local-host');
70
+ });
71
+ });
72
+
73
+ describe('WebView Utilities', () => {
74
+ const mockConfig = {
75
+ host: 'https://example.com',
76
+ authType: AuthType.TrustedAuthTokenCookieless,
77
+ liveboardId: '1234',
78
+ getAuthToken: jest.fn(),
79
+ };
80
+
81
+ const mockWebViewRef = {
82
+ current: {
83
+ injectJavaScript: jest.fn(),
84
+ },
85
+ };
86
+
87
+ let mockEvent: any;
88
+
89
+ beforeEach(() => {
90
+ jest.clearAllMocks();
91
+ mockEvent = {
92
+ nativeEvent: {
93
+ data: JSON.stringify({ type: 'appInit' }),
94
+ },
95
+ };
96
+ });
97
+
98
+ describe('setupWebViewMessageHandler', () => {
99
+ test('should reply to and call injectJavaScript with appInit payload', async () => {
100
+ mockConfig.getAuthToken.mockResolvedValue('mockAuthToken');
101
+ await setupWebViewMessageHandler(mockConfig, mockEvent, mockWebViewRef);
102
+
103
+ expect(mockConfig.getAuthToken).toHaveBeenCalled();
104
+ expect(mockWebViewRef.current.injectJavaScript).toHaveBeenCalledWith(
105
+ expect.stringContaining('"type":"appInit"'),
106
+ );
107
+ });
108
+
109
+ test('should handle ThoughtspotAuthExpired and refresh the token', async () => {
110
+ mockEvent.nativeEvent.data = JSON.stringify({ type: 'ThoughtspotAuthExpired' });
111
+ mockConfig.getAuthToken.mockResolvedValue('bearer-token');
112
+
113
+ await setupWebViewMessageHandler(mockConfig, mockEvent, mockWebViewRef);
114
+
115
+ expect(mockConfig.getAuthToken).toHaveBeenCalled();
116
+ expect(mockWebViewRef.current.injectJavaScript).toHaveBeenCalledWith(
117
+ expect.stringContaining('"type":"ThoughtspotAuthExpired"'),
118
+ );
119
+ });
120
+
121
+ test('should handle ThoughtspotAuthFailure and refresh the token', async () => {
122
+ mockEvent.nativeEvent.data = JSON.stringify({ type: 'ThoughtspotAuthFailure' });
123
+ mockConfig.getAuthToken.mockResolvedValue('bearer-token');
124
+
125
+ await setupWebViewMessageHandler(mockConfig, mockEvent, mockWebViewRef);
126
+
127
+ expect(mockConfig.getAuthToken).toHaveBeenCalled();
128
+ expect(mockWebViewRef.current.injectJavaScript).toHaveBeenCalledWith(
129
+ expect.stringContaining('"type":"ThoughtspotAuthFailure"'),
130
+ );
131
+ });
132
+
133
+ test('should warn for unhandled message types', async () => {
134
+ mockEvent.nativeEvent.data = JSON.stringify({ type: 'unknownType' });
135
+
136
+ await setupWebViewMessageHandler(mockConfig, mockEvent, mockWebViewRef);
137
+ expect(mockWebViewRef.current.injectJavaScript).not.toHaveBeenCalled();
138
+ });
139
+
140
+ test('should throw if getAuthToken fails during appInit', async () => {
141
+ mockEvent.nativeEvent.data = JSON.stringify({ type: 'appInit' });
142
+ mockConfig.getAuthToken.mockRejectedValue(new Error('Token fetch error'));
143
+
144
+ await expect(setupWebViewMessageHandler(mockConfig, mockEvent, mockWebViewRef))
145
+ .rejects
146
+ .toThrow('Error handling appInit:');
147
+ });
148
+
149
+ test('should call config.handleMessage instead of default handler', async () => {
150
+ const handleMessageSpy = jest.fn();
151
+ const localConfig = { ...mockConfig, handleMessage: handleMessageSpy };
152
+ mockEvent.nativeEvent.data = JSON.stringify({ type: 'appInit' });
153
+
154
+ await setupWebViewMessageHandler(localConfig, mockEvent, mockWebViewRef);
155
+
156
+ expect(handleMessageSpy).toHaveBeenCalledWith(mockEvent);
157
+ // default logic never called
158
+ expect(mockWebViewRef.current.injectJavaScript).not.toHaveBeenCalled();
159
+ });
160
+ });
161
+ });
@@ -0,0 +1,183 @@
1
+ import { getCustomisationsMobileEmbed, getQueryParamString } from '../utils';
2
+ import { Param } from '../types';
3
+ import pkgInfo from '../../package.json';
4
+ import { WebViewConfig } from './types';
5
+ import { logger } from '../utils/logger';
6
+
7
+ /**
8
+ * This method constructs the webview URL with given config.
9
+ * @param config To get the webviewURL pass the necessary config options.
10
+ * host: string;
11
+ * authType: AuthType;
12
+ * liveboardId: string;
13
+ * getAuthToken: () => Promise<string>;
14
+ * These four are necessary arguments.
15
+ * @returns The Promise for WebView URL.
16
+ */
17
+ export const getWebViewUrl = async (config: WebViewConfig): Promise<string> => {
18
+ if (typeof config.getAuthToken !== 'function') {
19
+ throw new Error('`getAuthToken` must be a function that returns a Promise.');
20
+ }
21
+
22
+ const authToken = await config.getAuthToken();
23
+ if (!authToken) {
24
+ throw new Error('Failed to fetch initial authentication token.');
25
+ }
26
+
27
+ const hostAppUrl = encodeURIComponent(
28
+ config.host.includes('localhost')
29
+ || config.host.includes('127.0.0.1')
30
+ || config.host.includes('10.0.2.2')
31
+ ? 'local-host'
32
+ : config.host,
33
+ );
34
+
35
+ const queryParams = {
36
+ [Param.EmbedApp]: true,
37
+ [Param.HostAppUrl]: hostAppUrl,
38
+ [Param.Version]: pkgInfo.version,
39
+ [Param.AuthType]: config.authType,
40
+ [Param.livedBoardEmbed]: true,
41
+ [Param.EnableFlipTooltipToContextMenu]: true,
42
+ [Param.ContextMenuTrigger]: true,
43
+ };
44
+
45
+ const queryString = getQueryParamString(queryParams);
46
+ const webViewUrl = `${config.host}/embed?${queryString}#/embed/viz/${encodeURIComponent(config.liveboardId)}`;
47
+ return webViewUrl;
48
+ };
49
+
50
+ /**
51
+ * setting up message handling for the message replies to TS instances.
52
+ * @param config The webview config
53
+ * @param event The message event from the WebView.
54
+ * @param WebViewRef Ref to use and inject javascript
55
+ */
56
+ export const setupWebViewMessageHandler = async (
57
+ config: WebViewConfig,
58
+ event: any,
59
+ webViewRef: any,
60
+ ) => {
61
+ const message = JSON.parse(event.nativeEvent.data);
62
+
63
+ const injectJavaScript = (codeSnip: string) => {
64
+ if (webViewRef?.current) {
65
+ webViewRef.current.injectJavaScript(codeSnip);
66
+ } else {
67
+ logger.error('Reference for Webview not found!!');
68
+ }
69
+ };
70
+
71
+ const defaultHandleMessage = async () => {
72
+ switch (message.type) {
73
+ case 'appInit': {
74
+ try {
75
+ const authToken = await config.getAuthToken();
76
+ const initPayload = {
77
+ type: 'appInit',
78
+ data: {
79
+ host: config.host,
80
+ authToken,
81
+ customisations: getCustomisationsMobileEmbed(config),
82
+ },
83
+ };
84
+ injectJavaScript(jsCodeToHandleInteractionsForContextMenu);
85
+ injectJavaScript(`window.postMessage(${JSON.stringify(initPayload)}, '*');`);
86
+ } catch (error) {
87
+ console.error('Error handling appInit:', error);
88
+ }
89
+ break;
90
+ }
91
+
92
+ case 'ThoughtspotAuthExpired': {
93
+ try {
94
+ const newAuthToken = await config.getAuthToken();
95
+ if (newAuthToken) {
96
+ const authExpirePayload = {
97
+ type: 'ThoughtspotAuthExpired',
98
+ data: { authToken: newAuthToken },
99
+ };
100
+ injectJavaScript(`window.postMessage(${JSON.stringify(authExpirePayload)}, '*');`);
101
+ }
102
+ } catch (error) {
103
+ console.error('Error refreshing token on expiry:', error);
104
+ }
105
+ break;
106
+ }
107
+
108
+ case 'ThoughtspotAuthFailure': {
109
+ try {
110
+ const newAuthToken = await config.getAuthToken();
111
+ if (newAuthToken) {
112
+ const authFailurePayload = {
113
+ type: 'ThoughtspotAuthFailure',
114
+ data: { authToken: newAuthToken },
115
+ };
116
+ injectJavaScript(`window.postMessage(${JSON.stringify(authFailurePayload)}, '*');`);
117
+ }
118
+ } catch (error) {
119
+ console.error('Error refreshing token on failure:', error);
120
+ }
121
+ break;
122
+ }
123
+
124
+ default:
125
+ console.warn('Unhandled message type:', message.type);
126
+ }
127
+ };
128
+
129
+ if (config.handleMessage) {
130
+ await config.handleMessage(event);
131
+ } else {
132
+ await defaultHandleMessage();
133
+ }
134
+ };
135
+
136
+ const jsCodeToHandleInteractionsForContextMenu = `
137
+ // Disabling auofocus
138
+ document.querySelectorAll('input[autofocus], textarea[autofocus]').forEach(el => el.removeAttribute('autofocus'));
139
+
140
+ // adding meta tag to keep fixed viewport scalign
141
+ const meta = document.createElement('meta');
142
+ meta.name = 'viewport';
143
+ meta.content = 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no';
144
+ document.head.appendChild(meta);
145
+
146
+ // input focus problem. -> we can just force it inside our view.
147
+ document.addEventListener('focusin', (event) => {
148
+ const target = event.target;
149
+
150
+ if (
151
+ target.tagName === 'INPUT' ||
152
+ target.tagName === 'TEXTAREA'
153
+ ) {
154
+ const rect = target.getBoundingClientRect();
155
+ if (
156
+ rect.top < 0 ||
157
+ rect.bottom > window.innerHeight ||
158
+ rect.left < 0 ||
159
+ rect.right > window.innerWidth
160
+ ) {
161
+ event.preventDefault();
162
+ // target.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'end' });
163
+ const horizontalPadding = 10;
164
+
165
+ let scrollX = 0;
166
+
167
+ if (rect.left < horizontalPadding) {
168
+ scrollX = rect.left - horizontalPadding;
169
+ }
170
+ if (rect.right > window.innerWidth - horizontalPadding) {
171
+ scrollX = rect.right - window.innerWidth + horizontalPadding;
172
+ }
173
+ const scrollY = rect.top - (window.innerHeight / 2 - rect.height / 2);
174
+
175
+ window.scrollBy({
176
+ top: scrollY,
177
+ left: scrollX,
178
+ behavior: 'smooth',
179
+ })
180
+ }
181
+ }
182
+ });
183
+ `;
@@ -0,0 +1 @@
1
+ export { getWebViewUrl, setupWebViewMessageHandler } from './commonUtils';
@@ -0,0 +1,10 @@
1
+ import { AuthType, CustomisationsInterface } from 'src/types';
2
+
3
+ export interface WebViewConfig {
4
+ host: string;
5
+ authType: AuthType;
6
+ liveboardId: string;
7
+ getAuthToken: () => Promise<string>;
8
+ handleMessage?: (event: any) => void;
9
+ customizations?: CustomisationsInterface;
10
+ }
@@ -188,4 +188,46 @@ describe('Unit test for process data', () => {
188
188
  expect(base.notifyAuthFailure).not.toBeCalled();
189
189
  expect(el.innerHTML).not.toBe('Hello');
190
190
  });
191
+
192
+ test('should return the event if type is unknown (default branch)', () => {
193
+ const unknownEvent = { type: 'SomeRandomEvent' };
194
+ const result = processDataInstance.processEventData(
195
+ 'SomeRandomEvent' as any,
196
+ unknownEvent,
197
+ thoughtSpotHost,
198
+ null,
199
+ );
200
+ expect(result).toBe(unknownEvent);
201
+ });
202
+
203
+ test('processAuthInit uses e.payload.userGUID if e.data.userGUID is missing', () => {
204
+ const e = {
205
+ type: EmbedEvent.AuthInit,
206
+ payload: { userGUID: 'payload-guid' },
207
+ data: {},
208
+ };
209
+ jest.spyOn(base, 'notifyAuthSuccess').mockImplementation(() => {});
210
+ const result = processDataInstance.processEventData(e.type, e, '', null);
211
+ expect(result.data.userGUID).toBe('payload-guid');
212
+ expect(base.notifyAuthSuccess).toHaveBeenCalled();
213
+ });
214
+
215
+ test('NoCookieAccess with suppressErrorAlerts=true does not alert', () => {
216
+ const e = { type: EmbedEvent.NoCookieAccess };
217
+ const el: any = {};
218
+ jest.spyOn(embedConfigInstance, 'getEmbedConfig').mockReturnValue({
219
+ loginFailedMessage: 'Cookie blocked!',
220
+ suppressNoCookieAccessAlert: false,
221
+ suppressErrorAlerts: true,
222
+ ignoreNoCookieAccess: false,
223
+ });
224
+ jest.spyOn(window, 'alert').mockImplementation(() => {});
225
+ jest.spyOn(base, 'notifyAuthFailure');
226
+
227
+ const result = processDataInstance.processEventData(e.type, e, '', el);
228
+ expect(result).toEqual({ type: e.type });
229
+ expect(window.alert).not.toHaveBeenCalled();
230
+ expect(el.innerHTML).toBe('Cookie blocked!');
231
+ expect(base.notifyAuthFailure).toHaveBeenCalled();
232
+ });
191
233
  });
package/src/utils.spec.ts CHANGED
@@ -11,8 +11,10 @@ import {
11
11
  removeStyleProperties,
12
12
  setStyleProperties,
13
13
  isUndefined,
14
+ getCustomisationsMobileEmbed,
14
15
  } from './utils';
15
- import { RuntimeFilterOp } from './types';
16
+ import { CustomisationsInterface, RuntimeFilterOp } from './types';
17
+ import { WebViewConfig } from './native/types';
16
18
 
17
19
  describe('unit test for utils', () => {
18
20
  test('getQueryParamString', () => {
@@ -273,3 +275,147 @@ describe('unit test for utils', () => {
273
275
  expect(isUndefined({})).toBe(false);
274
276
  });
275
277
  });
278
+
279
+ describe('getCustomisationsMobileEmbed', () => {
280
+ it('should return empty style and content if no customizations are defined', () => {
281
+ const embedConfig: Partial<WebViewConfig> = {};
282
+
283
+ const result = getCustomisationsMobileEmbed(embedConfig as WebViewConfig);
284
+ expect(result).toEqual({
285
+ style: {
286
+ customCSS: {},
287
+ customCSSUrl: undefined,
288
+ },
289
+ content: {},
290
+ });
291
+ });
292
+
293
+ it('should use embedConfig.customizations when present', () => {
294
+ const embedConfig: Partial<WebViewConfig> = {
295
+ customizations: {
296
+ style: {
297
+ customCSS: {
298
+ rules_UNSTABLE: {
299
+ '.title': { fontSize: '20px' },
300
+ }
301
+ },
302
+ customCSSUrl: 'http://example.com/styles.css',
303
+ },
304
+ content: {
305
+ headerText: 'Hello World',
306
+ },
307
+ },
308
+ };
309
+
310
+ const result = getCustomisationsMobileEmbed(embedConfig as WebViewConfig);
311
+ expect(result).toEqual({
312
+ style: {
313
+ customCSS: {
314
+ rules_UNSTABLE: {
315
+ '.title': { fontSize: '20px' },
316
+ }
317
+ },
318
+ customCSSUrl: 'http://example.com/styles.css',
319
+ },
320
+ content: {
321
+ headerText: 'Hello World',
322
+ },
323
+ });
324
+ });
325
+
326
+ it('should fallback to embedConfig.customisations if customizations is undefined', () => {
327
+ const embedConfig: Partial<WebViewConfig> = {
328
+ customizations: {
329
+ style: {
330
+ backgroundColor: 'green',
331
+ customCSS: { '.anotherClass': { color: 'white' } },
332
+ },
333
+ content: {
334
+ footerText: 'Footer content',
335
+ },
336
+ } as CustomisationsInterface,
337
+ };
338
+
339
+ const result = getCustomisationsMobileEmbed(embedConfig as WebViewConfig);
340
+ expect(result).toEqual({
341
+ style: {
342
+ backgroundColor: 'green',
343
+ customCSS: { '.anotherClass': { color: 'white' } },
344
+ customCSSUrl: undefined,
345
+ },
346
+ content: {
347
+ footerText: 'Footer content',
348
+ },
349
+ });
350
+ });
351
+
352
+ it('should merge style objects correctly (customCSS stays as an object)', () => {
353
+ const embedConfig: Partial<WebViewConfig> = {
354
+ customizations: {
355
+ style: {
356
+ customCSS: {
357
+ rules_UNSTABLE: {
358
+ '.title': { fontSize: '20px' },
359
+ }
360
+ },
361
+ customCSSUrl: 'http://example.com/old-styles.css',
362
+ },
363
+ },
364
+ };
365
+
366
+ const result = getCustomisationsMobileEmbed(embedConfig as WebViewConfig);
367
+ expect(result).toEqual({
368
+ style: {
369
+ customCSS: {
370
+ rules_UNSTABLE: {
371
+ '.title': { fontSize: '20px' },
372
+ }
373
+ },
374
+ customCSSUrl: 'http://example.com/old-styles.css',
375
+ },
376
+ content: {},
377
+ });
378
+ });
379
+
380
+ it('should handle missing style or content keys gracefully', () => {
381
+ const embedConfig: Partial<WebViewConfig> = {
382
+ customizations: {
383
+ style: undefined, // style is missing
384
+ content: undefined, // content is missing
385
+ },
386
+ };
387
+
388
+ const result = getCustomisationsMobileEmbed(embedConfig as WebViewConfig);
389
+ expect(result).toEqual({
390
+ style: {
391
+ customCSS: {},
392
+ customCSSUrl: undefined,
393
+ },
394
+ content: {},
395
+ });
396
+ });
397
+
398
+ it('should override customCSSUrl with embedConfig.customizations.style.customCSSUrl if defined', () => {
399
+ const embedConfig: Partial<WebViewConfig> = {
400
+ customizations: {
401
+ style: {
402
+ customCSSUrl: 'http://example.com/custom.css',
403
+ customCSS: {
404
+ rules_UNSTABLE: {
405
+ '.title': { fontSize: '20px' },
406
+ }
407
+ },
408
+ },
409
+ },
410
+ };
411
+
412
+ const result = getCustomisationsMobileEmbed(embedConfig as WebViewConfig);
413
+ expect(result.style?.customCSSUrl).toBe('http://example.com/custom.css');
414
+ expect(result.style?.customCSS).toEqual({
415
+ rules_UNSTABLE: {
416
+ '.title': { fontSize: '20px' },
417
+ }
418
+ });
419
+ });
420
+ });
421
+