@envive-ai/react-hooks 0.2.7-arthur-2 → 0.2.7

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 (170) hide show
  1. package/dist/{NewOrgConfig-CInGtTV6.cjs → NewOrgConfig-Bo1seKr6.cjs} +2 -2
  2. package/dist/{NewOrgConfig-BVByiYPp.js → NewOrgConfig-yptI2imS.js} +2 -2
  3. package/dist/{SystemSettingsContext-ei5B0dxO.js → SystemSettingsContext-BY1BFgAQ.js} +2 -2
  4. package/dist/{SystemSettingsContext-150LTxIk.cjs → SystemSettingsContext-EDpRMMt2.cjs} +2 -2
  5. package/dist/{TrackComponentVisibleEvent-CuwSLbug.js → TrackComponentVisibleEvent-qNE0dIL1.js} +2 -2
  6. package/dist/{TrackComponentVisibleEvent-C7-nnBks.cjs → TrackComponentVisibleEvent-tDRnrJi3.cjs} +2 -2
  7. package/dist/{amplitudeContext-C-0-DDk3.cjs → amplitudeContext-C6LHpqP_.cjs} +10 -7
  8. package/dist/{amplitudeContext-BBQ1ATA3.js → amplitudeContext-rEjGf57q.js} +10 -7
  9. package/dist/{app-XEFPotoH.cjs → app-BbPSHefQ.cjs} +4 -3
  10. package/dist/{app-C_Y-57U5.js → app-CflxT_xI.js} +4 -3
  11. package/dist/application/utils/index.cjs +8 -8
  12. package/dist/application/utils/index.d.cts +2 -2
  13. package/dist/application/utils/index.d.ts +2 -2
  14. package/dist/application/utils/index.js +8 -8
  15. package/dist/{atomStore-8ppNkJ_n.cjs → atomStore-CmZbgQHc.cjs} +1 -1
  16. package/dist/{atomStore-BLYJ2ZoQ.js → atomStore-DEcDhiLp.js} +1 -1
  17. package/dist/atoms/app/index.cjs +4 -4
  18. package/dist/atoms/app/index.d.cts +7 -7
  19. package/dist/atoms/app/index.d.ts +7 -7
  20. package/dist/atoms/app/index.js +4 -4
  21. package/dist/atoms/atomStore/index.cjs +1 -1
  22. package/dist/atoms/atomStore/index.js +1 -1
  23. package/dist/atoms/chat/index.cjs +9 -9
  24. package/dist/atoms/chat/index.d.cts +26 -26
  25. package/dist/atoms/chat/index.d.ts +26 -26
  26. package/dist/atoms/chat/index.js +9 -9
  27. package/dist/atoms/globalSearch/index.d.cts +6 -6
  28. package/dist/atoms/globalSearch/index.d.ts +6 -6
  29. package/dist/atoms/org/index.cjs +1 -1
  30. package/dist/atoms/org/index.d.cts +15 -15
  31. package/dist/atoms/org/index.d.ts +17 -17
  32. package/dist/atoms/org/index.js +1 -1
  33. package/dist/atoms/search/index.cjs +11 -11
  34. package/dist/atoms/search/index.d.cts +1 -1
  35. package/dist/atoms/search/index.d.ts +1 -1
  36. package/dist/atoms/search/index.js +11 -11
  37. package/dist/{cdnContext-CTC-zBtx.js → cdnContext-B8zWuGGT.js} +2 -2
  38. package/dist/{cdnContext-Bzqk0s2M.cjs → cdnContext-DzifgoNo.cjs} +2 -2
  39. package/dist/{chat-Bzay7QnI.js → chat-DChvXHjz.js} +6 -6
  40. package/dist/{chat-Ckd1b_z_.cjs → chat-L_N0qaqs.cjs} +6 -6
  41. package/dist/{chatSearch-Bev4ZI8Z.cjs → chatSearch-B5whqPLW.cjs} +3 -3
  42. package/dist/{chatSearch-DNaGtQyx.js → chatSearch-so-qeiEL.js} +3 -3
  43. package/dist/{chatState-OkYPVghN.cjs → chatState-D9_aA1_h.cjs} +2 -2
  44. package/dist/{chatState-CcCvgmSM.js → chatState-Dl5lyuKC.js} +2 -2
  45. package/dist/{commerce-api-ml5fkEuk.js → commerce-api-DEFd5HUH.js} +6 -6
  46. package/dist/{commerce-api-sQtLuwTh.cjs → commerce-api-DqVD4NH8.cjs} +6 -6
  47. package/dist/contexts/amplitudeContext/index.cjs +8 -8
  48. package/dist/contexts/amplitudeContext/index.js +8 -8
  49. package/dist/contexts/cdnContext/index.cjs +3 -3
  50. package/dist/contexts/cdnContext/index.js +3 -3
  51. package/dist/contexts/chatContext/index.cjs +16 -16
  52. package/dist/contexts/chatContext/index.d.cts +2 -2
  53. package/dist/contexts/chatContext/index.d.ts +2 -2
  54. package/dist/contexts/chatContext/index.js +16 -16
  55. package/dist/contexts/enviveConfigContext/index.cjs +3 -3
  56. package/dist/contexts/enviveConfigContext/index.js +3 -3
  57. package/dist/contexts/enviveCssContext/index.cjs +6 -6
  58. package/dist/contexts/enviveCssContext/index.js +6 -6
  59. package/dist/contexts/featureFlagContext/index.cjs +4 -4
  60. package/dist/contexts/featureFlagContext/index.js +4 -4
  61. package/dist/contexts/graphqlContext/index.cjs +3 -3
  62. package/dist/contexts/graphqlContext/index.d.ts +1 -1
  63. package/dist/contexts/graphqlContext/index.js +3 -3
  64. package/dist/contexts/localStorageContext/index.cjs +1 -1
  65. package/dist/contexts/localStorageContext/index.js +1 -1
  66. package/dist/contexts/newOrgConfigContext/index.cjs +5 -5
  67. package/dist/contexts/newOrgConfigContext/index.d.ts +2 -2
  68. package/dist/contexts/newOrgConfigContext/index.js +5 -5
  69. package/dist/contexts/searchContext/index.cjs +10 -10
  70. package/dist/contexts/searchContext/index.js +10 -10
  71. package/dist/contexts/sessionStorageContext/index.cjs +1 -1
  72. package/dist/contexts/sessionStorageContext/index.js +1 -1
  73. package/dist/contexts/shopifyUrlContext/index.cjs +1 -1
  74. package/dist/contexts/shopifyUrlContext/index.js +1 -1
  75. package/dist/contexts/systemSettingsContext/index.cjs +3 -3
  76. package/dist/contexts/systemSettingsContext/index.d.ts +2 -2
  77. package/dist/contexts/systemSettingsContext/index.js +3 -3
  78. package/dist/contexts/userIdentityContext/index.cjs +11 -11
  79. package/dist/contexts/userIdentityContext/index.js +11 -11
  80. package/dist/{enviveConfig-DV8F12B9.js → enviveConfig-DZBohDpc.js} +2 -2
  81. package/dist/{enviveConfig-DZHdtLsQ.cjs → enviveConfig-Dv9-esGV.cjs} +2 -2
  82. package/dist/{enviveConfigContext-CTcHUIFP.cjs → enviveConfigContext-D2OELZDR.cjs} +2 -2
  83. package/dist/{enviveConfigContext-BS7aNop5.js → enviveConfigContext-DrDjCems.js} +2 -2
  84. package/dist/frontendConfig-Cawh5iqv.d.ts +1 -1
  85. package/dist/{graphqlContext-DgkS-UX1.d.ts → graphqlContext-CXQl0hq2.d.ts} +3 -3
  86. package/dist/{graphqlContext-CVbYIftg.cjs → graphqlContext-DP8T3-Kd.cjs} +2 -2
  87. package/dist/{graphqlContext-DouNZbYo.js → graphqlContext-czH0kIZg.js} +2 -2
  88. package/dist/hooks/AmplitudeOperations/index.cjs +8 -8
  89. package/dist/hooks/AmplitudeOperations/index.js +8 -8
  90. package/dist/hooks/AppDetails/index.cjs +7 -7
  91. package/dist/hooks/AppDetails/index.js +7 -7
  92. package/dist/hooks/CdnOperations/index.cjs +3 -3
  93. package/dist/hooks/CdnOperations/index.js +3 -3
  94. package/dist/hooks/ChatToggle/index.cjs +9 -9
  95. package/dist/hooks/ChatToggle/index.js +9 -9
  96. package/dist/hooks/ChatToggleAnalytics/index.cjs +9 -9
  97. package/dist/hooks/ChatToggleAnalytics/index.js +9 -9
  98. package/dist/hooks/GrabAndScroll/index.d.ts +2 -2
  99. package/dist/hooks/GraphQLConfig/index.cjs +4 -4
  100. package/dist/hooks/GraphQLConfig/index.d.ts +1 -1
  101. package/dist/hooks/GraphQLConfig/index.js +4 -4
  102. package/dist/hooks/IdentifyUser/index.cjs +11 -11
  103. package/dist/hooks/IdentifyUser/index.js +11 -11
  104. package/dist/hooks/ImageResolver/index.cjs +2 -2
  105. package/dist/hooks/ImageResolver/index.js +2 -2
  106. package/dist/hooks/LocalStorageOperations/index.cjs +1 -1
  107. package/dist/hooks/LocalStorageOperations/index.js +1 -1
  108. package/dist/hooks/NewOrgConfig/index.cjs +6 -6
  109. package/dist/hooks/NewOrgConfig/index.d.ts +2 -2
  110. package/dist/hooks/NewOrgConfig/index.js +6 -6
  111. package/dist/hooks/Search/index.cjs +17 -17
  112. package/dist/hooks/Search/index.d.cts +1 -1
  113. package/dist/hooks/Search/index.d.ts +1 -1
  114. package/dist/hooks/Search/index.js +17 -17
  115. package/dist/hooks/SearchOperations/index.cjs +10 -10
  116. package/dist/hooks/SearchOperations/index.js +10 -10
  117. package/dist/hooks/SessionStorageOperations/index.cjs +1 -1
  118. package/dist/hooks/SessionStorageOperations/index.js +1 -1
  119. package/dist/hooks/ShopifyUrlOperations/index.cjs +1 -1
  120. package/dist/hooks/ShopifyUrlOperations/index.js +1 -1
  121. package/dist/hooks/SystemSettingsContext/index.cjs +4 -4
  122. package/dist/hooks/SystemSettingsContext/index.d.cts +2 -2
  123. package/dist/hooks/SystemSettingsContext/index.d.ts +2 -2
  124. package/dist/hooks/SystemSettingsContext/index.js +4 -4
  125. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +8 -8
  126. package/dist/hooks/TrackComponentVisibleEvent/index.js +8 -8
  127. package/dist/hooks/UpdateAnalyticsProps/index.cjs +7 -7
  128. package/dist/hooks/UpdateAnalyticsProps/index.js +7 -7
  129. package/dist/{index-DpJzjjpi.d.cts → index-BSd8767K.d.cts} +30 -30
  130. package/dist/{index-CMJM-3zV.d.ts → index-CUO68KG3.d.ts} +30 -30
  131. package/dist/{localStorageContext-CqcSvg2H.js → localStorageContext-BPZ82q-G.js} +1 -1
  132. package/dist/{localStorageContext-DiLfSsqL.cjs → localStorageContext-NRP-CdmF.cjs} +1 -1
  133. package/dist/{newOrgConfigContext-BIDz4ZuO.cjs → newOrgConfigContext-Bet9CgKP.cjs} +3 -3
  134. package/dist/{newOrgConfigContext-u_9UPNcX.js → newOrgConfigContext-Bi_dBNe5.js} +3 -3
  135. package/dist/{newOrgConfigContext-CKn7B2rj.d.ts → newOrgConfigContext-I2qceBB4.d.ts} +2 -2
  136. package/dist/{orgAnalyticsConfig-CGEQtAFs.cjs → orgAnalyticsConfig-Bm23fw4s.cjs} +1 -1
  137. package/dist/{orgAnalyticsConfig-i4jozLBB.js → orgAnalyticsConfig-CpBmga08.js} +1 -1
  138. package/dist/{search-CTVX9gC6.cjs → search-CneZkauD.cjs} +2 -2
  139. package/dist/{search-NgNrXNS9.js → search-DbZeJYdg.js} +2 -2
  140. package/dist/{searchContext-DtRmshTA.js → searchContext-BmgoAFMF.js} +5 -5
  141. package/dist/{searchContext-CnDXkawZ.cjs → searchContext-DksJfC1s.cjs} +5 -5
  142. package/dist/{sessionStorageContext-1Ks_d4Z0.cjs → sessionStorageContext-B6FsNKjj.cjs} +1 -1
  143. package/dist/{sessionStorageContext-CDcl7NVl.js → sessionStorageContext-CLYCm83p.js} +1 -1
  144. package/dist/{shopifyUrlContext-D2btP_lY.js → shopifyUrlContext-C-PkSgNC.js} +1 -1
  145. package/dist/{shopifyUrlContext-CxjV3qvH.cjs → shopifyUrlContext-ZOcARiMR.cjs} +1 -1
  146. package/dist/{systemSettingsContext-C4dtZ0uZ.js → systemSettingsContext-DF0jSq9m.js} +2 -2
  147. package/dist/{systemSettingsContext-BejoGzzB.cjs → systemSettingsContext-dmE1v6w8.cjs} +2 -2
  148. package/dist/types-BegmH0S1.d.ts +1 -1
  149. package/dist/{unsupportedProductExceptions-B0yx2bHK.cjs → unsupportedProductExceptions-DGENUnEA.cjs} +1 -1
  150. package/dist/{unsupportedProductExceptions-Cs66ngs3.js → unsupportedProductExceptions-uQuuelOs.js} +1 -1
  151. package/dist/{useAmplitudeOperations-Dym0Ker8.js → useAmplitudeOperations-B9HjVe6G.js} +2 -2
  152. package/dist/{useAmplitudeOperations-BJXD9v2u.cjs → useAmplitudeOperations-BdvxAzuI.cjs} +2 -2
  153. package/dist/{useAppDetails-Dmh16bWE.js → useAppDetails-B584gkCs.js} +4 -4
  154. package/dist/{useAppDetails-DsAZ1xQn.cjs → useAppDetails-DczgqeLG.cjs} +4 -4
  155. package/dist/{useGraphQLConfig-DSRaDTdT.js → useGraphQLConfig-7UxACM4n.js} +2 -2
  156. package/dist/{useGraphQLConfig-B3DlwmGg.cjs → useGraphQLConfig-D_rF2Sun.cjs} +2 -2
  157. package/dist/userIdentityContext-CPztaX6-.js +126 -0
  158. package/dist/userIdentityContext-DdySlQBz.cjs +143 -0
  159. package/dist/{utils-B7KTAEmV.js → utils-B4PvsKVY.js} +2 -2
  160. package/dist/{utils-CcC2jZRi.cjs → utils-BRVP7Mnu.cjs} +2 -2
  161. package/dist/utils-QKFAbPT6.d.ts +1 -1
  162. package/package.json +1 -1
  163. package/src/atoms/app/index.ts +1 -1
  164. package/src/contexts/amplitudeContext/amplitudeContext.tsx +1 -0
  165. package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +0 -162
  166. package/src/contexts/userIdentityContext/userIdentityContext.tsx +12 -5
  167. package/dist/userIdentityContext-DF3atBFE.js +0 -119
  168. package/dist/userIdentityContext-DpQTduhF.cjs +0 -136
  169. /package/dist/{amplitudeContext-BItT9HmT.js → amplitudeContext-DbicJUzl.js} +0 -0
  170. /package/dist/{amplitudeContext-DPtyVv3Q.cjs → amplitudeContext-q3mggFSE.cjs} +0 -0
@@ -496,168 +496,6 @@ describe("UserIdentityProvider", () => {
496
496
  { timeout: 3000 }
497
497
  );
498
498
  });
499
-
500
- it("should not call identifyUser when context is not ready", async () => {
501
- const identifySpy = vi.spyOn(CommerceApiClient, "identifyUser");
502
- const logWarnSpy = vi.spyOn(Logger, "logWarn");
503
-
504
- // Mock localStorage to be unavailable
505
- const originalLocalStorage = window.localStorage;
506
- Object.defineProperty(window, "localStorage", {
507
- value: undefined,
508
- writable: true,
509
- });
510
-
511
- renderWithProviders(<IdentifyUserComponent />);
512
-
513
- await waitFor(() => {
514
- expect(screen.getByTestId("identify-button")).toBeInTheDocument();
515
- });
516
-
517
- await act(async () => {
518
- screen.getByTestId("identify-button").click();
519
- });
520
-
521
- await waitFor(() => {
522
- expect(logWarnSpy).toHaveBeenCalledWith(
523
- "[UserIdentityContext] Context not ready, skipping identifyUser",
524
- undefined
525
- );
526
- expect(identifySpy).not.toHaveBeenCalled();
527
- });
528
-
529
- // Restore localStorage
530
- Object.defineProperty(window, "localStorage", {
531
- value: originalLocalStorage,
532
- writable: true,
533
- });
534
- });
535
-
536
- it("should handle errors when identifyUser fails", async () => {
537
- const identifySpy = vi
538
- .spyOn(CommerceApiClient, "identifyUser")
539
- .mockRejectedValueOnce(new Error("API Error"));
540
- const logErrorSpy = vi.spyOn(Logger, "logError");
541
-
542
- renderWithProviders(<IdentifyUserComponent />);
543
-
544
- await waitFor(() => {
545
- expect(screen.getByTestId("identify-button")).toBeInTheDocument();
546
- });
547
-
548
- await act(async () => {
549
- screen.getByTestId("identify-button").click();
550
- });
551
-
552
- await waitFor(() => {
553
- expect(identifySpy).toHaveBeenCalled();
554
- expect(logErrorSpy).toHaveBeenCalledWith(
555
- "[spiffy-ai] Error identifying user",
556
- expect.any(Error)
557
- );
558
- });
559
- });
560
-
561
- it("should skip identifyUser when cdpUserId is not available", async () => {
562
- const identifySpy = vi.spyOn(CommerceApiClient, "identifyUser");
563
- const logWarnSpy = vi.spyOn(Logger, "logWarn");
564
-
565
- // The current implementation uses "UNKNOWN_CDP_USER_ID" as placeholder
566
- // and checks if cdpUserId is falsy, so it will skip
567
- renderWithProviders(<IdentifyUserComponent />);
568
-
569
- await waitFor(() => {
570
- expect(screen.getByTestId("identify-button")).toBeInTheDocument();
571
- });
572
-
573
- await act(async () => {
574
- screen.getByTestId("identify-button").click();
575
- });
576
-
577
- // Note: The current implementation checks `if (!cdpUserId)` but uses "UNKNOWN_CDP_USER_ID"
578
- // which is truthy, so this test may need adjustment based on actual behavior
579
- // For now, we'll verify the call was made (since "UNKNOWN_CDP_USER_ID" is truthy)
580
- await waitFor(() => {
581
- // The current code will call identifyUser because "UNKNOWN_CDP_USER_ID" is truthy
582
- // If the behavior changes, this test should be updated
583
- expect(identifySpy).toHaveBeenCalled();
584
- });
585
- });
586
- });
587
-
588
- describe("isReady state", () => {
589
- it("should be false when localStorage is not available", async () => {
590
- const originalLocalStorage = window.localStorage;
591
- Object.defineProperty(window, "localStorage", {
592
- value: undefined,
593
- writable: true,
594
- });
595
-
596
- renderWithProviders(<MockComponent />);
597
-
598
- await waitFor(() => {
599
- expect(screen.getByTestId("is-ready").textContent).toBe("false");
600
- });
601
-
602
- // Restore localStorage
603
- Object.defineProperty(window, "localStorage", {
604
- value: originalLocalStorage,
605
- writable: true,
606
- });
607
- });
608
-
609
- it("should be true when localStorage is available", async () => {
610
- renderWithProviders(<MockComponent />);
611
-
612
- await waitFor(() => {
613
- expect(screen.getByTestId("is-ready").textContent).toBe("true");
614
- });
615
- });
616
-
617
- it("should update when localStorage availability changes", async () => {
618
- renderWithProviders(<MockComponent />);
619
-
620
- await waitFor(() => {
621
- expect(screen.getByTestId("is-ready").textContent).toBe("true");
622
- });
623
-
624
- // Note: Testing localStorage becoming unavailable requires unmounting and remounting
625
- // the provider, which is complex. This test verifies the ready state is correct
626
- // when localStorage is available. The unavailable case is tested in the other test.
627
- });
628
- });
629
-
630
- describe("Context Value Memoization", () => {
631
- it("should maintain stable context value references", async () => {
632
- let contextValue1: UserIdentityContextType | undefined;
633
- let contextValue2: UserIdentityContextType | undefined;
634
-
635
- const Component1: React.FC = () => {
636
- const context = useUserIdentity();
637
- contextValue1 = context;
638
- return <div>Component1</div>;
639
- };
640
-
641
- const Component2: React.FC = () => {
642
- const context = useUserIdentity();
643
- contextValue2 = context;
644
- return <div>Component2</div>;
645
- };
646
-
647
- renderWithProviders(
648
- <>
649
- <Component1 />
650
- <Component2 />
651
- </>
652
- );
653
-
654
- await waitFor(() => {
655
- expect(contextValue1).toBeDefined();
656
- expect(contextValue2).toBeDefined();
657
- // Both components should receive the same context instance
658
- expect(contextValue1).toBe(contextValue2);
659
- });
660
- });
661
499
  });
662
500
  });
663
501
 
@@ -12,7 +12,7 @@ import CommerceApiClient from "src/application/commerce-api";
12
12
  import { v4 as uuid } from "uuid";
13
13
  import { ClientDetails } from "src/application/models/clientDetails";
14
14
  import { useLocalStorage } from "src/contexts/localStorageContext";
15
- import { useAtom } from "jotai";
15
+ import { useSetAtom } from "jotai";
16
16
  import { userIdAtom } from "src/atoms/app";
17
17
 
18
18
  // Helper function from the original service
@@ -50,7 +50,8 @@ const UserIdentityContext = createContext<UserIdentityContextType | undefined>(
50
50
  export const UserIdentityProvider: React.FC<{ children: React.ReactNode }> = ({
51
51
  children,
52
52
  }) => {
53
- const [userId, setUserId] = useAtom(userIdAtom);
53
+ const [localUserId, setLocalUserId] = useState<string | undefined>(undefined);
54
+ const setUserId = useSetAtom(userIdAtom);
54
55
  const {
55
56
  getItem,
56
57
  setItem,
@@ -182,11 +183,17 @@ export const UserIdentityProvider: React.FC<{ children: React.ReactNode }> = ({
182
183
  ]
183
184
  );
184
185
  useEffect(() => {
185
- if (isReady && !userId) {
186
- setUserId(getUserIdOrDefault() ?? "");
186
+ if (isReady && !localUserId) {
187
+ const newUserId = getUserIdOrDefault();
188
+ console.log("useUserIdentity useEffect - setting localUserId", newUserId);
189
+ setLocalUserId(newUserId);
190
+ setUserId(newUserId);
187
191
  }
188
- }, [isReady, userId, setUserId]);
192
+ }, [isReady, localUserId, setUserId]);
189
193
 
194
+ if (!localUserId) {
195
+ return null;
196
+ }
190
197
  return (
191
198
  <UserIdentityContext.Provider value={value}>
192
199
  {children}
@@ -1,119 +0,0 @@
1
- import { logger_default } from "./logger-W3lqg-4b.js";
2
- import { useLocalStorage } from "./localStorageContext-CqcSvg2H.js";
3
- import { userIdAtom } from "./app-C_Y-57U5.js";
4
- import { commerce_api_default } from "./commerce-api-ml5fkEuk.js";
5
- import { v4 } from "uuid";
6
- import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
7
- import { useAtom } from "jotai";
8
- import { jsx } from "react/jsx-runtime";
9
- import UAParser from "ua-parser-js";
10
-
11
- //#region src/contexts/userIdentityContext/userIdentityContext.tsx
12
- const getUserAgentDetails = () => {
13
- const result = new UAParser().getResult();
14
- return {
15
- os: result?.os?.name,
16
- osVersion: result?.os?.version,
17
- deviceBrand: result?.device?.vendor,
18
- deviceManufacturer: result?.device?.vendor,
19
- deviceModel: result?.device?.model,
20
- browser: result?.browser?.name,
21
- browserVersion: result?.browser?.version,
22
- userAgent: result?.ua
23
- };
24
- };
25
- const UserIdentityContext = createContext(void 0);
26
- const UserIdentityProvider = ({ children }) => {
27
- const [userId, setUserId] = useAtom(userIdAtom);
28
- const { getItem, setItem, isAvailable: localStorageIsReady } = useLocalStorage();
29
- const [isReady, setIsReady] = useState(false);
30
- useEffect(() => {
31
- setIsReady(localStorageIsReady);
32
- }, [localStorageIsReady]);
33
- const USER_ID_OVERRIDE_KEY = "v1-spiffy-user-id-override";
34
- const USER_ID_DEFAULT_KEY = "v1-spiffy-user-id-default";
35
- const getUserIdOverrideFromLocalStorage = useCallback(() => {
36
- return getItem(USER_ID_OVERRIDE_KEY) ?? void 0;
37
- }, [getItem]);
38
- const getUserIdDefaultFromLocalStorage = useCallback(() => {
39
- return getItem(USER_ID_DEFAULT_KEY) ?? void 0;
40
- }, [getItem]);
41
- const setUserIdDefaultInLocalStorage = useCallback((userId$1) => {
42
- logger_default.logInfo(`setUserIdDefaultInLocalStorage - Setting user_id=${userId$1}`);
43
- setItem(USER_ID_DEFAULT_KEY, userId$1);
44
- return userId$1;
45
- }, [setItem, USER_ID_DEFAULT_KEY]);
46
- const setUserIdOverrideInLocalStorage = useCallback((userId$1) => {
47
- logger_default.logInfo(`setUserIdOverrideInLocalStorage - Setting user_id=${userId$1}`);
48
- setItem(USER_ID_OVERRIDE_KEY, userId$1);
49
- return userId$1;
50
- }, [setItem, USER_ID_OVERRIDE_KEY]);
51
- const clearUserIdOverrideInLocalStorage = useCallback(() => {
52
- logger_default.logInfo(`clearUserIdOverrideInLocalStorage - Clearing user_id`);
53
- setItem(USER_ID_OVERRIDE_KEY, "");
54
- }, [setItem, USER_ID_OVERRIDE_KEY]);
55
- const getUserIdOrDefault = useCallback(() => {
56
- const userIdOverride = getUserIdOverrideFromLocalStorage();
57
- if (userIdOverride) return userIdOverride;
58
- const defaultUserId = getUserIdDefaultFromLocalStorage();
59
- if (defaultUserId) return defaultUserId;
60
- return setUserIdDefaultInLocalStorage(`spiffy-user-id-${v4()}`);
61
- }, [
62
- getUserIdOverrideFromLocalStorage,
63
- getUserIdDefaultFromLocalStorage,
64
- setUserIdDefaultInLocalStorage
65
- ]);
66
- const identifyUser = useCallback(async () => {
67
- if (!isReady) {
68
- logger_default.logWarn("[UserIdentityContext] Context not ready, skipping identifyUser", void 0);
69
- return;
70
- }
71
- try {
72
- const cdpUserId = "UNKNOWN_CDP_USER_ID";
73
- const userId$1 = getUserIdOrDefault();
74
- const userAgentDetails = getUserAgentDetails();
75
- await commerce_api_default.identifyUser(userId$1, cdpUserId, userAgentDetails);
76
- } catch (error) {
77
- logger_default.logError("[spiffy-ai] Error identifying user", error);
78
- }
79
- }, [isReady, getUserIdOrDefault]);
80
- const value = useMemo(() => ({
81
- identifyUser,
82
- getUserIdOrDefault,
83
- getUserIdOverrideFromLocalStorage,
84
- getUserIdDefaultFromLocalStorage,
85
- setUserIdDefaultInLocalStorage,
86
- setUserIdOverrideInLocalStorage,
87
- clearUserIdOverrideInLocalStorage,
88
- isReady
89
- }), [
90
- identifyUser,
91
- getUserIdOrDefault,
92
- getUserIdOverrideFromLocalStorage,
93
- getUserIdDefaultFromLocalStorage,
94
- setUserIdDefaultInLocalStorage,
95
- setUserIdOverrideInLocalStorage,
96
- clearUserIdOverrideInLocalStorage,
97
- isReady
98
- ]);
99
- useEffect(() => {
100
- if (isReady && !userId) setUserId(getUserIdOrDefault() ?? "");
101
- }, [
102
- isReady,
103
- userId,
104
- setUserId
105
- ]);
106
- return /* @__PURE__ */ jsx(UserIdentityContext.Provider, {
107
- value,
108
- children
109
- });
110
- };
111
- const useUserIdentity = () => {
112
- const context = useContext(UserIdentityContext);
113
- if (!context) throw new Error("useUserIdentity must be used within a UserIdentityProvider");
114
- return context;
115
- };
116
-
117
- //#endregion
118
- export { UserIdentityProvider, useUserIdentity };
119
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcklkZW50aXR5Q29udGV4dC1ERjNhdEJGRS5qcyIsIm5hbWVzIjpbIlVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4iLCJ1c2VySWQiLCJ1dWlkIiwiQ29tbWVyY2VBcGlDbGllbnQiXSwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB1c2VFZmZlY3QsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFVBUGFyc2VyIGZyb20gXCJ1YS1wYXJzZXItanNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IENvbW1lcmNlQXBpQ2xpZW50IGZyb20gXCJzcmMvYXBwbGljYXRpb24vY29tbWVyY2UtYXBpXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IENsaWVudERldGFpbHMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9jbGllbnREZXRhaWxzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbFN0b3JhZ2UgfSBmcm9tIFwic3JjL2NvbnRleHRzL2xvY2FsU3RvcmFnZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZUF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gZnJvbSB0aGUgb3JpZ2luYWwgc2VydmljZVxuY29uc3QgZ2V0VXNlckFnZW50RGV0YWlscyA9ICgpOiBDbGllbnREZXRhaWxzID0+IHtcbiAgY29uc3QgdWFQYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgY29uc3QgcmVzdWx0ID0gdWFQYXJzZXIuZ2V0UmVzdWx0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBvczogcmVzdWx0Py5vcz8ubmFtZSxcbiAgICBvc1ZlcnNpb246IHJlc3VsdD8ub3M/LnZlcnNpb24sXG4gICAgZGV2aWNlQnJhbmQ6IHJlc3VsdD8uZGV2aWNlPy52ZW5kb3IsXG4gICAgZGV2aWNlTWFudWZhY3R1cmVyOiByZXN1bHQ/LmRldmljZT8udmVuZG9yLFxuICAgIGRldmljZU1vZGVsOiByZXN1bHQ/LmRldmljZT8ubW9kZWwsXG4gICAgYnJvd3NlcjogcmVzdWx0Py5icm93c2VyPy5uYW1lLFxuICAgIGJyb3dzZXJWZXJzaW9uOiByZXN1bHQ/LmJyb3dzZXI/LnZlcnNpb24sXG4gICAgdXNlckFnZW50OiByZXN1bHQ/LnVhLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB7XG4gIGlkZW50aWZ5VXNlcjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZ2V0VXNlcklkT3JEZWZhdWx0OiAoKSA9PiBzdHJpbmc7XG4gIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2U6ICh1c2VySWQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAodXNlcklkOiBzdHJpbmcpID0+IHN0cmluZztcbiAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAoKSA9PiB2b2lkO1xuICBpc1JlYWR5OiBib29sZWFuO1xufVxuXG5jb25zdCBVc2VySWRlbnRpdHlDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxuZXhwb3J0IGNvbnN0IFVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4gPSAoe1xuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgW3VzZXJJZCwgc2V0VXNlcklkXSA9IHVzZUF0b20odXNlcklkQXRvbSk7XG4gIGNvbnN0IHtcbiAgICBnZXRJdGVtLFxuICAgIHNldEl0ZW0sXG4gICAgaXNBdmFpbGFibGU6IGxvY2FsU3RvcmFnZUlzUmVhZHksXG4gIH0gPSB1c2VMb2NhbFN0b3JhZ2UoKTtcblxuICBjb25zdCBbaXNSZWFkeSwgc2V0SXNSZWFkeV0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBBc3N1bWluZyBDb21tZXJjZUFwaUNsaWVudCBhbmQgb3RoZXIgZGVwZW5kZW5jaWVzIGFyZSByZWFkeSBpZiBsb2NhbFN0b3JhZ2UgaXMuXG4gICAgLy8gSW4gYSBtb3JlIGNvbXBsZXggc2NlbmFyaW8sIHlvdSBtaWdodCBoYXZlIG1vcmUgY2hlY2tzIGhlcmUuXG4gICAgc2V0SXNSZWFkeShsb2NhbFN0b3JhZ2VJc1JlYWR5KTtcbiAgfSwgW2xvY2FsU3RvcmFnZUlzUmVhZHldKTtcblxuICBjb25zdCBVU0VSX0lEX09WRVJSSURFX0tFWSA9IFwidjEtc3BpZmZ5LXVzZXItaWQtb3ZlcnJpZGVcIjtcbiAgY29uc3QgVVNFUl9JRF9ERUZBVUxUX0tFWSA9IFwidjEtc3BpZmZ5LXVzZXItaWQtZGVmYXVsdFwiO1xuXG4gIGNvbnN0IGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKCgpOlxuICAgIHwgc3RyaW5nXG4gICAgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBnZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZKSA/PyB1bmRlZmluZWQ7XG4gIH0sIFtnZXRJdGVtXSk7XG5cbiAgY29uc3QgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKTpcbiAgICB8IHN0cmluZ1xuICAgIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gZ2V0SXRlbShVU0VSX0lEX0RFRkFVTFRfS0VZKSA/PyB1bmRlZmluZWQ7XG4gIH0sIFtnZXRJdGVtXSk7XG5cbiAgY29uc3Qgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHVzZXJJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFxuICAgICAgICBgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlIC0gU2V0dGluZyB1c2VyX2lkPSR7dXNlcklkfWBcbiAgICAgICk7XG4gICAgICBzZXRJdGVtKFVTRVJfSURfREVGQVVMVF9LRVksIHVzZXJJZCk7XG4gICAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICAgIHJldHVybiB1c2VySWQ7XG4gICAgfSxcbiAgICBbc2V0SXRlbSwgVVNFUl9JRF9ERUZBVUxUX0tFWV1cbiAgKTtcblxuICBjb25zdCBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHVzZXJJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFxuICAgICAgICBgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSAtIFNldHRpbmcgdXNlcl9pZD0ke3VzZXJJZH1gXG4gICAgICApO1xuICAgICAgc2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSwgdXNlcklkKTtcbiAgICAgIC8vIHdpbmRvdy5kaXNwYXRjaEV2ZW50IGlzIGhhbmRsZWQgYnkgdXNlTG9jYWxTdG9yYWdlIG5vd1xuICAgICAgcmV0dXJuIHVzZXJJZDtcbiAgICB9LFxuICAgIFtzZXRJdGVtLCBVU0VSX0lEX09WRVJSSURFX0tFWV1cbiAgKTtcblxuICBjb25zdCBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oYGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSAtIENsZWFyaW5nIHVzZXJfaWRgKTtcbiAgICAvLyBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldExvY2FsU3RvcmFnZSgpPy5yZW1vdmVJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZKTtcbiAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICBzZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZLCBcIlwiKTsgLy8gU2V0IHRvIGVtcHR5IHN0cmluZyB0byBjbGVhclxuICB9LCBbc2V0SXRlbSwgVVNFUl9JRF9PVkVSUklERV9LRVldKTtcblxuICBjb25zdCBnZXRVc2VySWRPckRlZmF1bHQgPSB1c2VDYWxsYmFjaygoKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCB1c2VySWRPdmVycmlkZSA9IGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgIGlmICh1c2VySWRPdmVycmlkZSkge1xuICAgICAgcmV0dXJuIHVzZXJJZE92ZXJyaWRlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRVc2VySWQgPSBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgIGlmIChkZWZhdWx0VXNlcklkKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFVzZXJJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlKGBzcGlmZnktdXNlci1pZC0ke3V1aWQoKX1gKTtcbiAgfSwgW1xuICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UsXG4gIF0pO1xuXG4gIGNvbnN0IGlkZW50aWZ5VXNlciA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIWlzUmVhZHkpIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICBcIltVc2VySWRlbnRpdHlDb250ZXh0XSBDb250ZXh0IG5vdCByZWFkeSwgc2tpcHBpbmcgaWRlbnRpZnlVc2VyXCIsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCB1bnRpbCBXaW5kb3dEYXRhTGF5ZXJTZXJ2aWNlIGlzIHJlc29sdmVkXG4gICAgICAvLyBjb25zdCBjZHBVc2VySWQgPSBXaW5kb3dEYXRhTGF5ZXJTZXJ2aWNlLmdldEdvb2dsZUFuYWx5dGljc0NsaWVudElkKCk7XG4gICAgICBjb25zdCBjZHBVc2VySWQgPSBcIlVOS05PV05fQ0RQX1VTRVJfSURcIjsgLy8gUGxhY2Vob2xkZXJcbiAgICAgIGNvbnN0IHVzZXJJZCA9IGdldFVzZXJJZE9yRGVmYXVsdCgpO1xuICAgICAgY29uc3QgdXNlckFnZW50RGV0YWlscyA9IGdldFVzZXJBZ2VudERldGFpbHMoKTtcblxuICAgICAgaWYgKCFjZHBVc2VySWQpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAgICAgXCJbc3BpZmZ5LWFpXSBObyBHQSBDbGllbnQgSUQgZm91bmQsIHNraXBwaW5nIGlkZW50aWZ5VXNlclwiLFxuICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmlkZW50aWZ5VXNlcih1c2VySWQsIGNkcFVzZXJJZCwgdXNlckFnZW50RGV0YWlscyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcIltzcGlmZnktYWldIEVycm9yIGlkZW50aWZ5aW5nIHVzZXJcIiwgZXJyb3IpO1xuICAgIH1cbiAgfSwgW2lzUmVhZHksIGdldFVzZXJJZE9yRGVmYXVsdF0pO1xuXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgaWRlbnRpZnlVc2VyLFxuICAgICAgZ2V0VXNlcklkT3JEZWZhdWx0LFxuICAgICAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgaXNSZWFkeSxcbiAgICB9KSxcbiAgICBbXG4gICAgICBpZGVudGlmeVVzZXIsXG4gICAgICBnZXRVc2VySWRPckRlZmF1bHQsXG4gICAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBpc1JlYWR5LFxuICAgIF1cbiAgKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNSZWFkeSAmJiAhdXNlcklkKSB7XG4gICAgICBzZXRVc2VySWQoZ2V0VXNlcklkT3JEZWZhdWx0KCkgPz8gXCJcIik7XG4gICAgfVxuICB9LCBbaXNSZWFkeSwgdXNlcklkLCBzZXRVc2VySWRdKTtcblxuICByZXR1cm4gKFxuICAgIDxVc2VySWRlbnRpdHlDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Vc2VySWRlbnRpdHlDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJJZGVudGl0eSA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoVXNlcklkZW50aXR5Q29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwidXNlVXNlcklkZW50aXR5IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBVc2VySWRlbnRpdHlQcm92aWRlclwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBa0JBLE1BQU0sNEJBQTJDO0NBRS9DLE1BQU0sU0FEVyxJQUFJLFVBQVUsQ0FDUCxXQUFXO0FBRW5DLFFBQU87RUFDTCxJQUFJLFFBQVEsSUFBSTtFQUNoQixXQUFXLFFBQVEsSUFBSTtFQUN2QixhQUFhLFFBQVEsUUFBUTtFQUM3QixvQkFBb0IsUUFBUSxRQUFRO0VBQ3BDLGFBQWEsUUFBUSxRQUFRO0VBQzdCLFNBQVMsUUFBUSxTQUFTO0VBQzFCLGdCQUFnQixRQUFRLFNBQVM7RUFDakMsV0FBVyxRQUFRO0VBQ3BCOztBQWNILE1BQU0sc0JBQXNCLGNBQzFCLE9BQ0Q7QUFFRCxNQUFhQSx3QkFBaUUsRUFDNUUsZUFDSTtDQUNKLE1BQU0sQ0FBQyxRQUFRLGFBQWEsUUFBUSxXQUFXO0NBQy9DLE1BQU0sRUFDSixTQUNBLFNBQ0EsYUFBYSx3QkFDWCxpQkFBaUI7Q0FFckIsTUFBTSxDQUFDLFNBQVMsY0FBYyxTQUFTLE1BQU07QUFFN0MsaUJBQWdCO0FBR2QsYUFBVyxvQkFBb0I7SUFDOUIsQ0FBQyxvQkFBb0IsQ0FBQztDQUV6QixNQUFNLHVCQUF1QjtDQUM3QixNQUFNLHNCQUFzQjtDQUU1QixNQUFNLG9DQUFvQyxrQkFFekI7QUFDZixTQUFPLFFBQVEscUJBQXFCLElBQUk7SUFDdkMsQ0FBQyxRQUFRLENBQUM7Q0FFYixNQUFNLG1DQUFtQyxrQkFFeEI7QUFDZixTQUFPLFFBQVEsb0JBQW9CLElBQUk7SUFDdEMsQ0FBQyxRQUFRLENBQUM7Q0FFYixNQUFNLGlDQUFpQyxhQUNwQyxhQUEyQjtBQUMxQixpQkFBTyxRQUNMLG9EQUFvREMsV0FDckQ7QUFDRCxVQUFRLHFCQUFxQkEsU0FBTztBQUVwQyxTQUFPQTtJQUVULENBQUMsU0FBUyxvQkFBb0IsQ0FDL0I7Q0FFRCxNQUFNLGtDQUFrQyxhQUNyQyxhQUEyQjtBQUMxQixpQkFBTyxRQUNMLHFEQUFxREEsV0FDdEQ7QUFDRCxVQUFRLHNCQUFzQkEsU0FBTztBQUVyQyxTQUFPQTtJQUVULENBQUMsU0FBUyxxQkFBcUIsQ0FDaEM7Q0FFRCxNQUFNLG9DQUFvQyxrQkFBa0I7QUFDMUQsaUJBQU8sUUFBUSx1REFBdUQ7QUFHdEUsVUFBUSxzQkFBc0IsR0FBRztJQUNoQyxDQUFDLFNBQVMscUJBQXFCLENBQUM7Q0FFbkMsTUFBTSxxQkFBcUIsa0JBQTBCO0VBQ25ELE1BQU0saUJBQWlCLG1DQUFtQztBQUMxRCxNQUFJLGVBQ0YsUUFBTztFQUdULE1BQU0sZ0JBQWdCLGtDQUFrQztBQUN4RCxNQUFJLGNBQ0YsUUFBTztBQUdULFNBQU8sK0JBQStCLGtCQUFrQkMsSUFBTSxHQUFHO0lBQ2hFO0VBQ0Q7RUFDQTtFQUNBO0VBQ0QsQ0FBQztDQUVGLE1BQU0sZUFBZSxZQUFZLFlBQTJCO0FBQzFELE1BQUksQ0FBQyxTQUFTO0FBQ1osa0JBQU8sUUFDTCxrRUFDQSxPQUNEO0FBQ0Q7O0FBR0YsTUFBSTtHQUdGLE1BQU0sWUFBWTtHQUNsQixNQUFNRCxXQUFTLG9CQUFvQjtHQUNuQyxNQUFNLG1CQUFtQixxQkFBcUI7QUFVOUMsU0FBTUUscUJBQWtCLGFBQWFGLFVBQVEsV0FBVyxpQkFBaUI7V0FDbEUsT0FBTztBQUNkLGtCQUFPLFNBQVMsc0NBQXNDLE1BQU07O0lBRTdELENBQUMsU0FBUyxtQkFBbUIsQ0FBQztDQUVqQyxNQUFNLFFBQVEsZUFDTDtFQUNMO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRCxHQUNEO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNELENBQ0Y7QUFDRCxpQkFBZ0I7QUFDZCxNQUFJLFdBQVcsQ0FBQyxPQUNkLFdBQVUsb0JBQW9CLElBQUksR0FBRztJQUV0QztFQUFDO0VBQVM7RUFBUTtFQUFVLENBQUM7QUFFaEMsUUFDRSxvQkFBQyxvQkFBb0I7RUFBZ0I7RUFDbEM7R0FDNEI7O0FBSW5DLE1BQWEsd0JBQXdCO0NBQ25DLE1BQU0sVUFBVSxXQUFXLG9CQUFvQjtBQUMvQyxLQUFJLENBQUMsUUFDSCxPQUFNLElBQUksTUFDUiw2REFDRDtBQUVILFFBQU8ifQ==
@@ -1,136 +0,0 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_logger = require('./logger-TBIl4uIH.cjs');
3
- const require_localStorageContext = require('./localStorageContext-DiLfSsqL.cjs');
4
- const require_app = require('./app-XEFPotoH.cjs');
5
- const require_commerce_api = require('./commerce-api-sQtLuwTh.cjs');
6
- let uuid = require("uuid");
7
- uuid = require_chunk.__toESM(uuid);
8
- let react = require("react");
9
- react = require_chunk.__toESM(react);
10
- let jotai = require("jotai");
11
- jotai = require_chunk.__toESM(jotai);
12
- let react_jsx_runtime = require("react/jsx-runtime");
13
- react_jsx_runtime = require_chunk.__toESM(react_jsx_runtime);
14
- let ua_parser_js = require("ua-parser-js");
15
- ua_parser_js = require_chunk.__toESM(ua_parser_js);
16
-
17
- //#region src/contexts/userIdentityContext/userIdentityContext.tsx
18
- const getUserAgentDetails = () => {
19
- const result = new ua_parser_js.default().getResult();
20
- return {
21
- os: result?.os?.name,
22
- osVersion: result?.os?.version,
23
- deviceBrand: result?.device?.vendor,
24
- deviceManufacturer: result?.device?.vendor,
25
- deviceModel: result?.device?.model,
26
- browser: result?.browser?.name,
27
- browserVersion: result?.browser?.version,
28
- userAgent: result?.ua
29
- };
30
- };
31
- const UserIdentityContext = (0, react.createContext)(void 0);
32
- const UserIdentityProvider = ({ children }) => {
33
- const [userId, setUserId] = (0, jotai.useAtom)(require_app.userIdAtom);
34
- const { getItem, setItem, isAvailable: localStorageIsReady } = require_localStorageContext.useLocalStorage();
35
- const [isReady, setIsReady] = (0, react.useState)(false);
36
- (0, react.useEffect)(() => {
37
- setIsReady(localStorageIsReady);
38
- }, [localStorageIsReady]);
39
- const USER_ID_OVERRIDE_KEY = "v1-spiffy-user-id-override";
40
- const USER_ID_DEFAULT_KEY = "v1-spiffy-user-id-default";
41
- const getUserIdOverrideFromLocalStorage = (0, react.useCallback)(() => {
42
- return getItem(USER_ID_OVERRIDE_KEY) ?? void 0;
43
- }, [getItem]);
44
- const getUserIdDefaultFromLocalStorage = (0, react.useCallback)(() => {
45
- return getItem(USER_ID_DEFAULT_KEY) ?? void 0;
46
- }, [getItem]);
47
- const setUserIdDefaultInLocalStorage = (0, react.useCallback)((userId$1) => {
48
- require_logger.logger_default.logInfo(`setUserIdDefaultInLocalStorage - Setting user_id=${userId$1}`);
49
- setItem(USER_ID_DEFAULT_KEY, userId$1);
50
- return userId$1;
51
- }, [setItem, USER_ID_DEFAULT_KEY]);
52
- const setUserIdOverrideInLocalStorage = (0, react.useCallback)((userId$1) => {
53
- require_logger.logger_default.logInfo(`setUserIdOverrideInLocalStorage - Setting user_id=${userId$1}`);
54
- setItem(USER_ID_OVERRIDE_KEY, userId$1);
55
- return userId$1;
56
- }, [setItem, USER_ID_OVERRIDE_KEY]);
57
- const clearUserIdOverrideInLocalStorage = (0, react.useCallback)(() => {
58
- require_logger.logger_default.logInfo(`clearUserIdOverrideInLocalStorage - Clearing user_id`);
59
- setItem(USER_ID_OVERRIDE_KEY, "");
60
- }, [setItem, USER_ID_OVERRIDE_KEY]);
61
- const getUserIdOrDefault = (0, react.useCallback)(() => {
62
- const userIdOverride = getUserIdOverrideFromLocalStorage();
63
- if (userIdOverride) return userIdOverride;
64
- const defaultUserId = getUserIdDefaultFromLocalStorage();
65
- if (defaultUserId) return defaultUserId;
66
- return setUserIdDefaultInLocalStorage(`spiffy-user-id-${(0, uuid.v4)()}`);
67
- }, [
68
- getUserIdOverrideFromLocalStorage,
69
- getUserIdDefaultFromLocalStorage,
70
- setUserIdDefaultInLocalStorage
71
- ]);
72
- const identifyUser = (0, react.useCallback)(async () => {
73
- if (!isReady) {
74
- require_logger.logger_default.logWarn("[UserIdentityContext] Context not ready, skipping identifyUser", void 0);
75
- return;
76
- }
77
- try {
78
- const cdpUserId = "UNKNOWN_CDP_USER_ID";
79
- const userId$1 = getUserIdOrDefault();
80
- const userAgentDetails = getUserAgentDetails();
81
- await require_commerce_api.commerce_api_default.identifyUser(userId$1, cdpUserId, userAgentDetails);
82
- } catch (error) {
83
- require_logger.logger_default.logError("[spiffy-ai] Error identifying user", error);
84
- }
85
- }, [isReady, getUserIdOrDefault]);
86
- const value = (0, react.useMemo)(() => ({
87
- identifyUser,
88
- getUserIdOrDefault,
89
- getUserIdOverrideFromLocalStorage,
90
- getUserIdDefaultFromLocalStorage,
91
- setUserIdDefaultInLocalStorage,
92
- setUserIdOverrideInLocalStorage,
93
- clearUserIdOverrideInLocalStorage,
94
- isReady
95
- }), [
96
- identifyUser,
97
- getUserIdOrDefault,
98
- getUserIdOverrideFromLocalStorage,
99
- getUserIdDefaultFromLocalStorage,
100
- setUserIdDefaultInLocalStorage,
101
- setUserIdOverrideInLocalStorage,
102
- clearUserIdOverrideInLocalStorage,
103
- isReady
104
- ]);
105
- (0, react.useEffect)(() => {
106
- if (isReady && !userId) setUserId(getUserIdOrDefault() ?? "");
107
- }, [
108
- isReady,
109
- userId,
110
- setUserId
111
- ]);
112
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UserIdentityContext.Provider, {
113
- value,
114
- children
115
- });
116
- };
117
- const useUserIdentity = () => {
118
- const context = (0, react.useContext)(UserIdentityContext);
119
- if (!context) throw new Error("useUserIdentity must be used within a UserIdentityProvider");
120
- return context;
121
- };
122
-
123
- //#endregion
124
- Object.defineProperty(exports, 'UserIdentityProvider', {
125
- enumerable: true,
126
- get: function () {
127
- return UserIdentityProvider;
128
- }
129
- });
130
- Object.defineProperty(exports, 'useUserIdentity', {
131
- enumerable: true,
132
- get: function () {
133
- return useUserIdentity;
134
- }
135
- });
136
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcklkZW50aXR5Q29udGV4dC1EcFFUZHVoRi5janMiLCJuYW1lcyI6WyJVQVBhcnNlciIsIlVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4iLCJ1c2VySWRBdG9tIiwidXNlTG9jYWxTdG9yYWdlIiwidXNlcklkIiwiQ29tbWVyY2VBcGlDbGllbnQiXSwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB1c2VFZmZlY3QsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFVBUGFyc2VyIGZyb20gXCJ1YS1wYXJzZXItanNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IENvbW1lcmNlQXBpQ2xpZW50IGZyb20gXCJzcmMvYXBwbGljYXRpb24vY29tbWVyY2UtYXBpXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IENsaWVudERldGFpbHMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9jbGllbnREZXRhaWxzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbFN0b3JhZ2UgfSBmcm9tIFwic3JjL2NvbnRleHRzL2xvY2FsU3RvcmFnZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZUF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gZnJvbSB0aGUgb3JpZ2luYWwgc2VydmljZVxuY29uc3QgZ2V0VXNlckFnZW50RGV0YWlscyA9ICgpOiBDbGllbnREZXRhaWxzID0+IHtcbiAgY29uc3QgdWFQYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgY29uc3QgcmVzdWx0ID0gdWFQYXJzZXIuZ2V0UmVzdWx0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBvczogcmVzdWx0Py5vcz8ubmFtZSxcbiAgICBvc1ZlcnNpb246IHJlc3VsdD8ub3M/LnZlcnNpb24sXG4gICAgZGV2aWNlQnJhbmQ6IHJlc3VsdD8uZGV2aWNlPy52ZW5kb3IsXG4gICAgZGV2aWNlTWFudWZhY3R1cmVyOiByZXN1bHQ/LmRldmljZT8udmVuZG9yLFxuICAgIGRldmljZU1vZGVsOiByZXN1bHQ/LmRldmljZT8ubW9kZWwsXG4gICAgYnJvd3NlcjogcmVzdWx0Py5icm93c2VyPy5uYW1lLFxuICAgIGJyb3dzZXJWZXJzaW9uOiByZXN1bHQ/LmJyb3dzZXI/LnZlcnNpb24sXG4gICAgdXNlckFnZW50OiByZXN1bHQ/LnVhLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB7XG4gIGlkZW50aWZ5VXNlcjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZ2V0VXNlcklkT3JEZWZhdWx0OiAoKSA9PiBzdHJpbmc7XG4gIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2U6ICh1c2VySWQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAodXNlcklkOiBzdHJpbmcpID0+IHN0cmluZztcbiAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAoKSA9PiB2b2lkO1xuICBpc1JlYWR5OiBib29sZWFuO1xufVxuXG5jb25zdCBVc2VySWRlbnRpdHlDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxuZXhwb3J0IGNvbnN0IFVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4gPSAoe1xuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgW3VzZXJJZCwgc2V0VXNlcklkXSA9IHVzZUF0b20odXNlcklkQXRvbSk7XG4gIGNvbnN0IHtcbiAgICBnZXRJdGVtLFxuICAgIHNldEl0ZW0sXG4gICAgaXNBdmFpbGFibGU6IGxvY2FsU3RvcmFnZUlzUmVhZHksXG4gIH0gPSB1c2VMb2NhbFN0b3JhZ2UoKTtcblxuICBjb25zdCBbaXNSZWFkeSwgc2V0SXNSZWFkeV0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBBc3N1bWluZyBDb21tZXJjZUFwaUNsaWVudCBhbmQgb3RoZXIgZGVwZW5kZW5jaWVzIGFyZSByZWFkeSBpZiBsb2NhbFN0b3JhZ2UgaXMuXG4gICAgLy8gSW4gYSBtb3JlIGNvbXBsZXggc2NlbmFyaW8sIHlvdSBtaWdodCBoYXZlIG1vcmUgY2hlY2tzIGhlcmUuXG4gICAgc2V0SXNSZWFkeShsb2NhbFN0b3JhZ2VJc1JlYWR5KTtcbiAgfSwgW2xvY2FsU3RvcmFnZUlzUmVhZHldKTtcblxuICBjb25zdCBVU0VSX0lEX09WRVJSSURFX0tFWSA9IFwidjEtc3BpZmZ5LXVzZXItaWQtb3ZlcnJpZGVcIjtcbiAgY29uc3QgVVNFUl9JRF9ERUZBVUxUX0tFWSA9IFwidjEtc3BpZmZ5LXVzZXItaWQtZGVmYXVsdFwiO1xuXG4gIGNvbnN0IGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKCgpOlxuICAgIHwgc3RyaW5nXG4gICAgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBnZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZKSA/PyB1bmRlZmluZWQ7XG4gIH0sIFtnZXRJdGVtXSk7XG5cbiAgY29uc3QgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKTpcbiAgICB8IHN0cmluZ1xuICAgIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gZ2V0SXRlbShVU0VSX0lEX0RFRkFVTFRfS0VZKSA/PyB1bmRlZmluZWQ7XG4gIH0sIFtnZXRJdGVtXSk7XG5cbiAgY29uc3Qgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHVzZXJJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFxuICAgICAgICBgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlIC0gU2V0dGluZyB1c2VyX2lkPSR7dXNlcklkfWBcbiAgICAgICk7XG4gICAgICBzZXRJdGVtKFVTRVJfSURfREVGQVVMVF9LRVksIHVzZXJJZCk7XG4gICAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICAgIHJldHVybiB1c2VySWQ7XG4gICAgfSxcbiAgICBbc2V0SXRlbSwgVVNFUl9JRF9ERUZBVUxUX0tFWV1cbiAgKTtcblxuICBjb25zdCBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHVzZXJJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFxuICAgICAgICBgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSAtIFNldHRpbmcgdXNlcl9pZD0ke3VzZXJJZH1gXG4gICAgICApO1xuICAgICAgc2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSwgdXNlcklkKTtcbiAgICAgIC8vIHdpbmRvdy5kaXNwYXRjaEV2ZW50IGlzIGhhbmRsZWQgYnkgdXNlTG9jYWxTdG9yYWdlIG5vd1xuICAgICAgcmV0dXJuIHVzZXJJZDtcbiAgICB9LFxuICAgIFtzZXRJdGVtLCBVU0VSX0lEX09WRVJSSURFX0tFWV1cbiAgKTtcblxuICBjb25zdCBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oYGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSAtIENsZWFyaW5nIHVzZXJfaWRgKTtcbiAgICAvLyBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldExvY2FsU3RvcmFnZSgpPy5yZW1vdmVJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZKTtcbiAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICBzZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZLCBcIlwiKTsgLy8gU2V0IHRvIGVtcHR5IHN0cmluZyB0byBjbGVhclxuICB9LCBbc2V0SXRlbSwgVVNFUl9JRF9PVkVSUklERV9LRVldKTtcblxuICBjb25zdCBnZXRVc2VySWRPckRlZmF1bHQgPSB1c2VDYWxsYmFjaygoKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCB1c2VySWRPdmVycmlkZSA9IGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgIGlmICh1c2VySWRPdmVycmlkZSkge1xuICAgICAgcmV0dXJuIHVzZXJJZE92ZXJyaWRlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRVc2VySWQgPSBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgIGlmIChkZWZhdWx0VXNlcklkKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFVzZXJJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlKGBzcGlmZnktdXNlci1pZC0ke3V1aWQoKX1gKTtcbiAgfSwgW1xuICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UsXG4gIF0pO1xuXG4gIGNvbnN0IGlkZW50aWZ5VXNlciA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIWlzUmVhZHkpIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICBcIltVc2VySWRlbnRpdHlDb250ZXh0XSBDb250ZXh0IG5vdCByZWFkeSwgc2tpcHBpbmcgaWRlbnRpZnlVc2VyXCIsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCB1bnRpbCBXaW5kb3dEYXRhTGF5ZXJTZXJ2aWNlIGlzIHJlc29sdmVkXG4gICAgICAvLyBjb25zdCBjZHBVc2VySWQgPSBXaW5kb3dEYXRhTGF5ZXJTZXJ2aWNlLmdldEdvb2dsZUFuYWx5dGljc0NsaWVudElkKCk7XG4gICAgICBjb25zdCBjZHBVc2VySWQgPSBcIlVOS05PV05fQ0RQX1VTRVJfSURcIjsgLy8gUGxhY2Vob2xkZXJcbiAgICAgIGNvbnN0IHVzZXJJZCA9IGdldFVzZXJJZE9yRGVmYXVsdCgpO1xuICAgICAgY29uc3QgdXNlckFnZW50RGV0YWlscyA9IGdldFVzZXJBZ2VudERldGFpbHMoKTtcblxuICAgICAgaWYgKCFjZHBVc2VySWQpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAgICAgXCJbc3BpZmZ5LWFpXSBObyBHQSBDbGllbnQgSUQgZm91bmQsIHNraXBwaW5nIGlkZW50aWZ5VXNlclwiLFxuICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmlkZW50aWZ5VXNlcih1c2VySWQsIGNkcFVzZXJJZCwgdXNlckFnZW50RGV0YWlscyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcIltzcGlmZnktYWldIEVycm9yIGlkZW50aWZ5aW5nIHVzZXJcIiwgZXJyb3IpO1xuICAgIH1cbiAgfSwgW2lzUmVhZHksIGdldFVzZXJJZE9yRGVmYXVsdF0pO1xuXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgaWRlbnRpZnlVc2VyLFxuICAgICAgZ2V0VXNlcklkT3JEZWZhdWx0LFxuICAgICAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgaXNSZWFkeSxcbiAgICB9KSxcbiAgICBbXG4gICAgICBpZGVudGlmeVVzZXIsXG4gICAgICBnZXRVc2VySWRPckRlZmF1bHQsXG4gICAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBpc1JlYWR5LFxuICAgIF1cbiAgKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNSZWFkeSAmJiAhdXNlcklkKSB7XG4gICAgICBzZXRVc2VySWQoZ2V0VXNlcklkT3JEZWZhdWx0KCkgPz8gXCJcIik7XG4gICAgfVxuICB9LCBbaXNSZWFkeSwgdXNlcklkLCBzZXRVc2VySWRdKTtcblxuICByZXR1cm4gKFxuICAgIDxVc2VySWRlbnRpdHlDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Vc2VySWRlbnRpdHlDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJJZGVudGl0eSA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoVXNlcklkZW50aXR5Q29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwidXNlVXNlcklkZW50aXR5IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBVc2VySWRlbnRpdHlQcm92aWRlclwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLE1BQU0sNEJBQTJDO0NBRS9DLE1BQU0sU0FEVyxJQUFJQSxzQkFBVSxDQUNQLFdBQVc7QUFFbkMsUUFBTztFQUNMLElBQUksUUFBUSxJQUFJO0VBQ2hCLFdBQVcsUUFBUSxJQUFJO0VBQ3ZCLGFBQWEsUUFBUSxRQUFRO0VBQzdCLG9CQUFvQixRQUFRLFFBQVE7RUFDcEMsYUFBYSxRQUFRLFFBQVE7RUFDN0IsU0FBUyxRQUFRLFNBQVM7RUFDMUIsZ0JBQWdCLFFBQVEsU0FBUztFQUNqQyxXQUFXLFFBQVE7RUFDcEI7O0FBY0gsTUFBTSwrQ0FDSixPQUNEO0FBRUQsTUFBYUMsd0JBQWlFLEVBQzVFLGVBQ0k7Q0FDSixNQUFNLENBQUMsUUFBUSxnQ0FBcUJDLHVCQUFXO0NBQy9DLE1BQU0sRUFDSixTQUNBLFNBQ0EsYUFBYSx3QkFDWEMsNkNBQWlCO0NBRXJCLE1BQU0sQ0FBQyxTQUFTLGtDQUF1QixNQUFNO0FBRTdDLDRCQUFnQjtBQUdkLGFBQVcsb0JBQW9CO0lBQzlCLENBQUMsb0JBQW9CLENBQUM7Q0FFekIsTUFBTSx1QkFBdUI7Q0FDN0IsTUFBTSxzQkFBc0I7Q0FFNUIsTUFBTSxpRUFFVztBQUNmLFNBQU8sUUFBUSxxQkFBcUIsSUFBSTtJQUN2QyxDQUFDLFFBQVEsQ0FBQztDQUViLE1BQU0sZ0VBRVc7QUFDZixTQUFPLFFBQVEsb0JBQW9CLElBQUk7SUFDdEMsQ0FBQyxRQUFRLENBQUM7Q0FFYixNQUFNLHlEQUNILGFBQTJCO0FBQzFCLGdDQUFPLFFBQ0wsb0RBQW9EQyxXQUNyRDtBQUNELFVBQVEscUJBQXFCQSxTQUFPO0FBRXBDLFNBQU9BO0lBRVQsQ0FBQyxTQUFTLG9CQUFvQixDQUMvQjtDQUVELE1BQU0sMERBQ0gsYUFBMkI7QUFDMUIsZ0NBQU8sUUFDTCxxREFBcURBLFdBQ3REO0FBQ0QsVUFBUSxzQkFBc0JBLFNBQU87QUFFckMsU0FBT0E7SUFFVCxDQUFDLFNBQVMscUJBQXFCLENBQ2hDO0NBRUQsTUFBTSxpRUFBc0Q7QUFDMUQsZ0NBQU8sUUFBUSx1REFBdUQ7QUFHdEUsVUFBUSxzQkFBc0IsR0FBRztJQUNoQyxDQUFDLFNBQVMscUJBQXFCLENBQUM7Q0FFbkMsTUFBTSxrREFBK0M7RUFDbkQsTUFBTSxpQkFBaUIsbUNBQW1DO0FBQzFELE1BQUksZUFDRixRQUFPO0VBR1QsTUFBTSxnQkFBZ0Isa0NBQWtDO0FBQ3hELE1BQUksY0FDRixRQUFPO0FBR1QsU0FBTywrQkFBK0IsZ0NBQXdCLEdBQUc7SUFDaEU7RUFDRDtFQUNBO0VBQ0E7RUFDRCxDQUFDO0NBRUYsTUFBTSxzQ0FBMkIsWUFBMkI7QUFDMUQsTUFBSSxDQUFDLFNBQVM7QUFDWixpQ0FBTyxRQUNMLGtFQUNBLE9BQ0Q7QUFDRDs7QUFHRixNQUFJO0dBR0YsTUFBTSxZQUFZO0dBQ2xCLE1BQU1BLFdBQVMsb0JBQW9CO0dBQ25DLE1BQU0sbUJBQW1CLHFCQUFxQjtBQVU5QyxTQUFNQywwQ0FBa0IsYUFBYUQsVUFBUSxXQUFXLGlCQUFpQjtXQUNsRSxPQUFPO0FBQ2QsaUNBQU8sU0FBUyxzQ0FBc0MsTUFBTTs7SUFFN0QsQ0FBQyxTQUFTLG1CQUFtQixDQUFDO0NBRWpDLE1BQU0sa0NBQ0c7RUFDTDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0QsR0FDRDtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRCxDQUNGO0FBQ0QsNEJBQWdCO0FBQ2QsTUFBSSxXQUFXLENBQUMsT0FDZCxXQUFVLG9CQUFvQixJQUFJLEdBQUc7SUFFdEM7RUFBQztFQUFTO0VBQVE7RUFBVSxDQUFDO0FBRWhDLFFBQ0UsMkNBQUMsb0JBQW9CO0VBQWdCO0VBQ2xDO0dBQzRCOztBQUluQyxNQUFhLHdCQUF3QjtDQUNuQyxNQUFNLGdDQUFxQixvQkFBb0I7QUFDL0MsS0FBSSxDQUFDLFFBQ0gsT0FBTSxJQUFJLE1BQ1IsNkRBQ0Q7QUFFSCxRQUFPIn0=