@solucx/react-native-solucx-widget 0.2.2 → 0.2.4

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.
package/README.intern.md CHANGED
@@ -259,25 +259,6 @@ export const getWidgetStyles = (type: WidgetType) => {
259
259
  - **Modal**: Overlay com background semitransparente
260
260
  - **Inline**: Integrado ao fluxo normal do layout
261
261
 
262
- ## 🔧 Utilitários
263
-
264
- ### Construção de URLs
265
-
266
- O [`urlUtils.ts`](src/utils/urlUtils.ts) gerencia a construção de URLs da pesquisa:
267
-
268
- ```typescript
269
- export function buildWidgetURL(key: string, data: WidgetData): string {
270
- const params = new URLSearchParams(data as Record<string, string>);
271
- const baseURL = `${BASE_URL}/${key}/?mode=widget`;
272
-
273
- if (data.transaction_id) {
274
- return `${baseURL}&${params.toString()}`;
275
- }
276
-
277
- return `${baseURL}&transaction_id=&${params.toString()}`;
278
- }
279
- ```
280
-
281
262
  ## 🧪 Testes
282
263
 
283
264
  ### Executando Testes
@@ -477,10 +458,6 @@ console.log('Widget event received:', processedKey, value);
477
458
  // Verificar dados persistidos
478
459
  const data = await storageService.read();
479
460
  console.log('Stored data:', data);
480
-
481
- // Verificar URL construída
482
- const url = buildWidgetURL(soluCXKey, data);
483
- console.log('Widget URL:', url);
484
461
  ```
485
462
 
486
463
  ## 📚 Dependências
package/lib/index.d.ts CHANGED
@@ -4,7 +4,6 @@ export { WidgetEventService } from './services/widgetEventService';
4
4
  export { StorageService } from './services/storage';
5
5
  export { getDeviceInfo, type DeviceInfo } from './hooks/useDeviceInfoCollector';
6
6
  export { requestWidgetUrl } from './services/widgetBootstrapService';
7
- export { buildWidgetURL } from './utils/urlUtils';
8
7
  export { ModalWidget } from './components/ModalWidget';
9
8
  export { getWidgetStyles, styles } from './styles/widgetStyles';
10
9
  export { SDK_NAME, SDK_VERSION } from './constants/Constants';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,cAAc,cAAc,CAAC"}
package/lib/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.getClientVersion = exports.SDK_VERSION = exports.SDK_NAME = exports.styles = exports.getWidgetStyles = exports.ModalWidget = exports.buildWidgetURL = exports.requestWidgetUrl = exports.getDeviceInfo = exports.StorageService = exports.WidgetEventService = exports.useWidgetState = exports.SoluCXWidget = void 0;
17
+ exports.getClientVersion = exports.SDK_VERSION = exports.SDK_NAME = exports.styles = exports.getWidgetStyles = exports.ModalWidget = exports.requestWidgetUrl = exports.getDeviceInfo = exports.StorageService = exports.WidgetEventService = exports.useWidgetState = exports.SoluCXWidget = void 0;
18
18
  var SoluCXWidget_1 = require("./SoluCXWidget");
19
19
  Object.defineProperty(exports, "SoluCXWidget", { enumerable: true, get: function () { return SoluCXWidget_1.SoluCXWidget; } });
20
20
  var useWidgetState_1 = require("./hooks/useWidgetState");
@@ -27,8 +27,6 @@ var useDeviceInfoCollector_1 = require("./hooks/useDeviceInfoCollector");
27
27
  Object.defineProperty(exports, "getDeviceInfo", { enumerable: true, get: function () { return useDeviceInfoCollector_1.getDeviceInfo; } });
28
28
  var widgetBootstrapService_1 = require("./services/widgetBootstrapService");
29
29
  Object.defineProperty(exports, "requestWidgetUrl", { enumerable: true, get: function () { return widgetBootstrapService_1.requestWidgetUrl; } });
30
- var urlUtils_1 = require("./utils/urlUtils");
31
- Object.defineProperty(exports, "buildWidgetURL", { enumerable: true, get: function () { return urlUtils_1.buildWidgetURL; } });
32
30
  var ModalWidget_1 = require("./components/ModalWidget");
33
31
  Object.defineProperty(exports, "ModalWidget", { enumerable: true, get: function () { return ModalWidget_1.ModalWidget; } });
34
32
  var widgetStyles_1 = require("./styles/widgetStyles");
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,yDAAwD;AAA/C,gHAAA,cAAc,OAAA;AACvB,oEAAmE;AAA1D,wHAAA,kBAAkB,OAAA;AAC3B,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,yEAAgF;AAAvE,uHAAA,aAAa,OAAA;AACtB,4EAAqE;AAA5D,0HAAA,gBAAgB,OAAA;AACzB,6CAAkD;AAAzC,0GAAA,cAAc,OAAA;AACvB,wDAAuD;AAA9C,0GAAA,WAAW,OAAA;AACpB,sDAAgE;AAAvD,+GAAA,eAAe,OAAA;AAAE,sGAAA,MAAM,OAAA;AAChC,mDAA8D;AAArD,qGAAA,QAAQ,OAAA;AAAE,wGAAA,WAAW,OAAA;AAC9B,4EAAqE;AAA5D,0HAAA,gBAAgB,OAAA;AACzB,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,yDAAwD;AAA/C,gHAAA,cAAc,OAAA;AACvB,oEAAmE;AAA1D,wHAAA,kBAAkB,OAAA;AAC3B,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,yEAAgF;AAAvE,uHAAA,aAAa,OAAA;AACtB,4EAAqE;AAA5D,0HAAA,gBAAgB,OAAA;AACzB,wDAAuD;AAA9C,0GAAA,WAAW,OAAA;AACpB,sDAAgE;AAAvD,+GAAA,eAAe,OAAA;AAAE,sGAAA,MAAM,OAAA;AAChC,mDAA8D;AAArD,qGAAA,QAAQ,OAAA;AAAE,wGAAA,WAAW,OAAA;AAC9B,4EAAqE;AAA5D,0HAAA,gBAAgB,OAAA;AACzB,+CAA6B"}
@@ -1,4 +1,5 @@
1
1
  import type { SoluCXKey, WidgetData } from "../interfaces";
2
+ import { URLSearchParams } from 'react-native-url-polyfill';
2
3
  declare const buildRequestParams: (requestParams: WidgetData) => URLSearchParams;
3
4
  export declare function requestWidgetUrl(instanceKey: SoluCXKey, requestParams: WidgetData, userId: string): Promise<string>;
4
5
  export { buildRequestParams };
@@ -1 +1 @@
1
- {"version":3,"file":"widgetBootstrapService.d.ts","sourceRoot":"","sources":["../../src/services/widgetBootstrapService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAU3D,QAAA,MAAM,kBAAkB,GAAI,eAAe,UAAU,KAAG,eAYvD,CAAC;AA0BF,wBAAsB,gBAAgB,CAClC,WAAW,EAAE,SAAS,EACtB,aAAa,EAAE,UAAU,EACzB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"widgetBootstrapService.d.ts","sourceRoot":"","sources":["../../src/services/widgetBootstrapService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM5D,QAAA,MAAM,kBAAkB,GAAI,eAAe,UAAU,KAAG,eAYvD,CAAC;AA0BF,wBAAsB,gBAAgB,CAClC,WAAW,EAAE,SAAS,EACtB,aAAa,EAAE,UAAU,EACzB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -6,8 +6,9 @@ const webViewConstants_1 = require("../constants/webViewConstants");
6
6
  const ClientVersionCollector_1 = require("../services/ClientVersionCollector");
7
7
  const useDeviceInfoCollector_1 = require("../hooks/useDeviceInfoCollector");
8
8
  const Constants_1 = require("../constants/Constants");
9
+ const react_native_url_polyfill_1 = require("react-native-url-polyfill");
9
10
  const buildRequestParams = (requestParams) => {
10
- const params = new URLSearchParams();
11
+ const params = new react_native_url_polyfill_1.URLSearchParams();
11
12
  Object.entries(requestParams).forEach(([key, value]) => {
12
13
  if (value === undefined || value === null)
13
14
  return;
@@ -49,11 +50,14 @@ async function requestWidgetUrl(instanceKey, requestParams, userId) {
49
50
  const headers = buildRequestHeaders(instanceKey, userId);
50
51
  const response = await fetch(url, { method: "GET", headers });
51
52
  if (!response.ok) {
52
- throw new Error(`Failed to fetch widget URL: ${response.status} ${response.statusText}`);
53
+ if (!response.json)
54
+ throw new Error(`Failed to get error response: ${response?.status} ${response.statusText}`);
55
+ const errorPayload = await response?.json();
56
+ throw new Error(`status=${response?.status} message=${errorPayload?.message}`);
53
57
  }
54
- const payload = await response.json();
58
+ const payload = await response?.json();
55
59
  if (!payload?.url) {
56
- throw new Error("Widget URL not found in response");
60
+ throw new Error("Failed to get the widget api response.");
57
61
  }
58
62
  return payload.url;
59
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"widgetBootstrapService.js","sourceRoot":"","sources":["../../src/services/widgetBootstrapService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"widgetBootstrapService.js","sourceRoot":"","sources":["../../src/services/widgetBootstrapService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solucx/react-native-solucx-widget",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "The React Native SDK for Solucx Widget",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -16,6 +16,9 @@
16
16
  "src/",
17
17
  "README.md"
18
18
  ],
19
+ "dependencies": {
20
+ "react-native-url-polyfill": "^2.0.0"
21
+ },
19
22
  "peerDependencies": {
20
23
  "@react-native-async-storage/async-storage": "^2.2.0",
21
24
  "react": ">=18.0.0",
@@ -505,7 +505,7 @@ describe("SoluCXWidget callbacks", () => {
505
505
 
506
506
  describe("SoluCXWidget error handling from requestWidgetUrl", () => {
507
507
  it("calls onError when requestWidgetUrl throws error for non-ok response (404)", async () => {
508
- mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to fetch widget URL: 404 Not Found"));
508
+ mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to get error response: 404 Not Found"));
509
509
  const onError = jest.fn();
510
510
 
511
511
  const props = {
@@ -519,14 +519,14 @@ describe("SoluCXWidget error handling from requestWidgetUrl", () => {
519
519
  await waitFor(() => {
520
520
  expect(mockRequestWidgetUrl).toHaveBeenCalledTimes(1);
521
521
  expect(onError).toHaveBeenCalledTimes(1);
522
- expect(onError).toHaveBeenCalledWith("Failed to fetch widget URL: 404 Not Found");
522
+ expect(onError).toHaveBeenCalledWith("Failed to get error response: 404 Not Found");
523
523
  expect(mockSetIsWidgetVisible).toHaveBeenCalledWith(false);
524
524
  expect(queryByTestId("webview")).toBeNull();
525
525
  });
526
526
  });
527
527
 
528
528
  it("calls onError when requestWidgetUrl throws error for non-ok response (500)", async () => {
529
- mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to fetch widget URL: 500 Internal Server Error"));
529
+ mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to get error response: 500 Internal Server Error"));
530
530
  const onError = jest.fn();
531
531
 
532
532
  const props = {
@@ -540,7 +540,7 @@ describe("SoluCXWidget error handling from requestWidgetUrl", () => {
540
540
  await waitFor(() => {
541
541
  expect(mockRequestWidgetUrl).toHaveBeenCalledTimes(1);
542
542
  expect(onError).toHaveBeenCalledTimes(1);
543
- expect(onError).toHaveBeenCalledWith("Failed to fetch widget URL: 500 Internal Server Error");
543
+ expect(onError).toHaveBeenCalledWith("Failed to get error response: 500 Internal Server Error");
544
544
  expect(mockSetIsWidgetVisible).toHaveBeenCalledWith(false);
545
545
  expect(queryByTestId("webview")).toBeNull();
546
546
  });
@@ -568,7 +568,7 @@ describe("SoluCXWidget error handling from requestWidgetUrl", () => {
568
568
  });
569
569
 
570
570
  it("calls onError when requestWidgetUrl throws error for missing URL in response", async () => {
571
- mockRequestWidgetUrl.mockRejectedValue(new Error("Widget URL not found in response"));
571
+ mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to get the widget api response."));
572
572
  const onError = jest.fn();
573
573
 
574
574
  const props = {
@@ -582,7 +582,7 @@ describe("SoluCXWidget error handling from requestWidgetUrl", () => {
582
582
  await waitFor(() => {
583
583
  expect(mockRequestWidgetUrl).toHaveBeenCalledTimes(1);
584
584
  expect(onError).toHaveBeenCalledTimes(1);
585
- expect(onError).toHaveBeenCalledWith("Widget URL not found in response");
585
+ expect(onError).toHaveBeenCalledWith("Failed to get the widget api response.");
586
586
  expect(mockSetIsWidgetVisible).toHaveBeenCalledWith(false);
587
587
  expect(queryByTestId("webview")).toBeNull();
588
588
  });
@@ -631,7 +631,7 @@ describe("SoluCXWidget error handling from requestWidgetUrl", () => {
631
631
  });
632
632
 
633
633
  it("widget remains hidden when requestWidgetUrl fails with 404", async () => {
634
- mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to fetch widget URL: 404 Not Found"));
634
+ mockRequestWidgetUrl.mockRejectedValue(new Error("Failed to get error response: 404 Not Found"));
635
635
 
636
636
  const props = {
637
637
  ...baseProps,
@@ -53,10 +53,6 @@ jest.mock('react-native-webview', () => {
53
53
  };
54
54
  });
55
55
 
56
- jest.mock('../../utils/urlUtils', () => ({
57
- buildWidgetURL: jest.fn().mockReturnValue('https://widget.solucx.com/form/123'),
58
- }));
59
-
60
56
  jest.mock('../../services/widgetBootstrapService', () => ({
61
57
  requestWidgetUrl: jest.fn().mockResolvedValue('https://widget.solucx.com/survey/456'),
62
58
  }));
@@ -27,10 +27,6 @@ jest.mock('react-native-webview', () => {
27
27
  };
28
28
  });
29
29
 
30
- jest.mock('../../utils/urlUtils', () => ({
31
- buildWidgetURL: jest.fn().mockReturnValue('https://form.url/test'),
32
- }));
33
-
34
30
  jest.mock('../../services/widgetBootstrapService', () => ({
35
31
  requestWidgetUrl: jest.fn().mockResolvedValue('https://survey.url/test'),
36
32
  }));
@@ -44,10 +44,6 @@ jest.mock('../../services/widgetBootstrapService', () => ({
44
44
  requestWidgetUrl: jest.fn().mockResolvedValue('https://mock.widget.url/form123'),
45
45
  }));
46
46
 
47
- jest.mock('../../utils/urlUtils', () => ({
48
- buildWidgetURL: jest.fn().mockReturnValue('https://mock.widget.url/form123'),
49
- }));
50
-
51
47
  jest.mock('../../services/widgetValidationService', () => ({
52
48
  WidgetValidationService: jest.fn().mockImplementation(() => ({
53
49
  shouldDisplayWidget: jest.fn().mockResolvedValue({ canDisplay: true }),
@@ -166,7 +166,7 @@ describe('widgetBootstrapService', () => {
166
166
 
167
167
  await expect(
168
168
  requestWidgetUrl('api-key', { customer_id: 'cust' }, 'user-id')
169
- ).rejects.toThrow('Failed to fetch widget URL: 404 Not Found');
169
+ ).rejects.toThrow('Failed to get error response: 404 Not Found');
170
170
  });
171
171
 
172
172
  it('should throw error with status 500', async () => {
@@ -179,7 +179,7 @@ describe('widgetBootstrapService', () => {
179
179
 
180
180
  await expect(
181
181
  requestWidgetUrl('api-key', { customer_id: 'cust' }, 'user-id')
182
- ).rejects.toThrow('Failed to fetch widget URL: 500 Internal Server Error');
182
+ ).rejects.toThrow('Failed to get error response: 500 Internal Server Error');
183
183
  });
184
184
 
185
185
  it('should throw error when fetch is not available', async () => {
@@ -199,7 +199,7 @@ describe('widgetBootstrapService', () => {
199
199
 
200
200
  await expect(
201
201
  requestWidgetUrl('api-key', { customer_id: 'cust' }, 'user-id')
202
- ).rejects.toThrow('Widget URL not found in response');
202
+ ).rejects.toThrow('Failed to get the widget api response.');
203
203
  });
204
204
 
205
205
  it('should throw error when response payload url is null', async () => {
@@ -211,7 +211,7 @@ describe('widgetBootstrapService', () => {
211
211
 
212
212
  await expect(
213
213
  requestWidgetUrl('api-key', { customer_id: 'cust' }, 'user-id')
214
- ).rejects.toThrow('Widget URL not found in response');
214
+ ).rejects.toThrow('Failed to get the widget api response.');
215
215
  });
216
216
  });
217
217
  });
package/src/index.ts CHANGED
@@ -4,7 +4,6 @@ export { WidgetEventService } from './services/widgetEventService';
4
4
  export { StorageService } from './services/storage';
5
5
  export { getDeviceInfo, type DeviceInfo } from './hooks/useDeviceInfoCollector';
6
6
  export { requestWidgetUrl } from './services/widgetBootstrapService';
7
- export { buildWidgetURL } from './utils/urlUtils';
8
7
  export { ModalWidget } from './components/ModalWidget';
9
8
  export { getWidgetStyles, styles } from './styles/widgetStyles';
10
9
  export { SDK_NAME, SDK_VERSION } from './constants/Constants';
@@ -3,6 +3,7 @@ import { RATING_FORM_ENDPOINT } from "../constants/webViewConstants";
3
3
  import { getClientVersion } from "../services/ClientVersionCollector";
4
4
  import { getDeviceInfo } from "../hooks/useDeviceInfoCollector";
5
5
  import { SDK_NAME, SDK_VERSION } from "../constants/Constants";
6
+ import { URLSearchParams } from 'react-native-url-polyfill';
6
7
 
7
8
  type Payload = {
8
9
  url: string;
@@ -61,15 +62,16 @@ export async function requestWidgetUrl(
61
62
  const response = await fetch(url, { method: "GET", headers });
62
63
 
63
64
  if (!response.ok) {
64
- throw new Error(`Failed to fetch widget URL: ${response.status} ${response.statusText}`);
65
+ if (!response.json) throw new Error(`Failed to get error response: ${response?.status} ${response.statusText}`);
66
+ const errorPayload: { error: string; message: string; statusCode: number } = await response?.json();
67
+ throw new Error(`status=${response?.status} message=${errorPayload?.message}`);
65
68
  }
66
69
 
67
- const payload: Payload = await response.json();
68
-
70
+ const payload: Payload = await response?.json();
69
71
  if (!payload?.url) {
70
- throw new Error("Widget URL not found in response");
72
+ throw new Error("Failed to get the widget api response.");
71
73
  }
72
-
74
+
73
75
  return payload.url;
74
76
  }
75
77
 
@@ -1,3 +0,0 @@
1
- import type { WidgetData, SoluCXKey } from "../interfaces";
2
- export declare function buildWidgetURL(key: SoluCXKey, data: WidgetData): string;
3
- //# sourceMappingURL=urlUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/urlUtils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CASvE"}
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildWidgetURL = buildWidgetURL;
4
- const webViewConstants_1 = require("../constants/webViewConstants");
5
- function buildWidgetURL(key, data) {
6
- const params = new URLSearchParams(data);
7
- const baseURL = `${webViewConstants_1.BASE_URL}/${key}/?mode=widget`;
8
- if (data.transaction_id) {
9
- return `${baseURL}&${params.toString()}`;
10
- }
11
- return `${baseURL}&transaction_id=&${params.toString()}`;
12
- }
13
- //# sourceMappingURL=urlUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../src/utils/urlUtils.ts"],"names":[],"mappings":";;AAGA,wCASC;AAZD,oEAAyD;AAGzD,SAAgB,cAAc,CAAC,GAAc,EAAE,IAAgB;IAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAA8B,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,GAAG,2BAAQ,IAAI,GAAG,eAAe,CAAC;IAElD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,OAAO,oBAAoB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC7D,CAAC"}
@@ -1,56 +0,0 @@
1
- import { buildWidgetURL } from '../utils/urlUtils';
2
-
3
- describe('urlUtils', () => {
4
- describe('buildWidgetURL', () => {
5
- const mockKey = 'test-widget-key';
6
-
7
- it('should build URL with transaction_id when provided', () => {
8
- const data = {
9
- customer_id: 'customer123',
10
- form_id: 'form456',
11
- transaction_id: 'trans789'
12
- };
13
-
14
- const result = buildWidgetURL(mockKey, data);
15
-
16
- expect(result).toContain('https://survey-link.solucx.com.br/link/test-widget-key/?mode=widget');
17
- expect(result).toContain('customer_id=customer123');
18
- expect(result).toContain('form_id=form456');
19
- expect(result).toContain('transaction_id=trans789');
20
- });
21
-
22
- it('should build URL with empty transaction_id when not provided', () => {
23
- const data = {
24
- customer_id: 'customer123',
25
- form_id: 'form456'
26
- };
27
-
28
- const result = buildWidgetURL(mockKey, data);
29
-
30
- expect(result).toContain('https://survey-link.solucx.com.br/link/test-widget-key/?mode=widget');
31
- expect(result).toContain('transaction_id=&');
32
- expect(result).toContain('customer_id=customer123');
33
- expect(result).toContain('form_id=form456');
34
- });
35
-
36
- it('should handle empty data object', () => {
37
- const data = {};
38
-
39
- const result = buildWidgetURL(mockKey, data);
40
-
41
- expect(result).toBe('https://survey-link.solucx.com.br/link/test-widget-key/?mode=widget&transaction_id=&');
42
- });
43
-
44
- it('should encode URL parameters correctly', () => {
45
- const data = {
46
- email: 'test@example.com',
47
- name: 'John Doe'
48
- };
49
-
50
- const result = buildWidgetURL(mockKey, data);
51
-
52
- expect(result).toContain('email=test%40example.com');
53
- expect(result).toContain('name=John+Doe');
54
- });
55
- });
56
- });
@@ -1,13 +0,0 @@
1
- import { BASE_URL } from "../constants/webViewConstants";
2
- import type { WidgetData, SoluCXKey } from "../interfaces";
3
-
4
- export function buildWidgetURL(key: SoluCXKey, data: WidgetData): string {
5
- const params = new URLSearchParams(data as Record<string, string>);
6
- const baseURL = `${BASE_URL}/${key}/?mode=widget`;
7
-
8
- if (data.transaction_id) {
9
- return `${baseURL}&${params.toString()}`;
10
- }
11
-
12
- return `${baseURL}&transaction_id=&${params.toString()}`;
13
- }