@envive-ai/react-hooks 0.3.64 → 0.3.65

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 (83) hide show
  1. package/dist/application/models/featureGates.cjs +1 -2
  2. package/dist/application/models/featureGates.d.cts +1 -2
  3. package/dist/application/models/featureGates.d.ts +1 -2
  4. package/dist/application/models/featureGates.js +1 -2
  5. package/dist/atoms/app/index.d.cts +6 -6
  6. package/dist/atoms/app/index.d.ts +1 -1
  7. package/dist/atoms/app/variant.d.cts +6 -6
  8. package/dist/atoms/app/variant.d.ts +6 -6
  9. package/dist/atoms/chat/chatState.d.cts +1 -1
  10. package/dist/atoms/chat/chatState.d.ts +19 -19
  11. package/dist/atoms/chat/form.d.cts +2 -2
  12. package/dist/atoms/chat/form.d.ts +3 -3
  13. package/dist/atoms/chat/index.d.cts +2 -2
  14. package/dist/atoms/chat/index.d.ts +2 -2
  15. package/dist/atoms/chat/lastMessage.d.cts +2 -2
  16. package/dist/atoms/chat/lastMessage.d.ts +2 -2
  17. package/dist/atoms/chat/messageQueue.d.cts +7 -7
  18. package/dist/atoms/chat/messageQueue.d.ts +7 -7
  19. package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
  20. package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
  21. package/dist/atoms/chat/renderedWidgetRefs.d.cts +3 -3
  22. package/dist/atoms/chat/renderedWidgetRefs.d.ts +3 -3
  23. package/dist/atoms/chat/replies.d.cts +3 -3
  24. package/dist/atoms/chat/replies.d.ts +3 -3
  25. package/dist/atoms/chat/suggestions.d.cts +3 -3
  26. package/dist/atoms/chat/suggestions.d.ts +3 -3
  27. package/dist/atoms/envive/enviveConfig.d.cts +13 -13
  28. package/dist/atoms/envive/enviveConfig.d.ts +14 -14
  29. package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
  30. package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
  31. package/dist/atoms/org/customerService.d.cts +6 -6
  32. package/dist/atoms/org/customerService.d.ts +6 -6
  33. package/dist/atoms/org/graphqlConfig.d.cts +4 -4
  34. package/dist/atoms/org/graphqlConfig.d.ts +4 -4
  35. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  36. package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
  37. package/dist/atoms/org/orgAnalyticsConfig.d.cts +4 -4
  38. package/dist/atoms/org/orgAnalyticsConfig.d.ts +4 -4
  39. package/dist/atoms/search/chatSearch.d.cts +17 -17
  40. package/dist/atoms/search/chatSearch.d.ts +17 -17
  41. package/dist/atoms/search/searchAPI.d.cts +13 -13
  42. package/dist/atoms/search/searchAPI.d.ts +13 -13
  43. package/dist/atoms/widget/chatPreviewLoading.d.cts +2 -2
  44. package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
  45. package/dist/contexts/pageContext/pageContext.cjs +12 -24
  46. package/dist/contexts/pageContext/pageContext.js +12 -24
  47. package/dist/contexts/types.d.cts +1 -1
  48. package/dist/contexts/types.d.ts +1 -1
  49. package/dist/contexts/typesV3.cjs +8 -1
  50. package/dist/contexts/typesV3.d.cts +23 -6
  51. package/dist/contexts/typesV3.d.ts +23 -6
  52. package/dist/contexts/typesV3.js +8 -2
  53. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +2 -2
  54. package/dist/hooks/utils.d.cts +1 -1
  55. package/dist/hooks/utils.d.ts +1 -1
  56. package/dist/services/enviveConfigService/enviveConfigService.cjs +21 -35
  57. package/dist/services/enviveConfigService/enviveConfigService.d.cts +1 -2
  58. package/dist/services/enviveConfigService/enviveConfigService.d.ts +1 -2
  59. package/dist/services/enviveConfigService/enviveConfigService.js +21 -35
  60. package/dist/services/enviveConfigService/fetchBootstrapConfig.cjs +15 -16
  61. package/dist/services/enviveConfigService/fetchBootstrapConfig.js +15 -16
  62. package/dist/services/enviveConfigService/fetchGraphQLConfig.cjs +1 -69
  63. package/dist/services/enviveConfigService/fetchGraphQLConfig.js +2 -69
  64. package/dist/services/featureFlagService/index.cjs +7 -5
  65. package/dist/services/featureFlagService/index.d.cts +2 -1
  66. package/dist/services/featureFlagService/index.d.ts +2 -1
  67. package/dist/services/featureFlagService/index.js +7 -5
  68. package/package.json +1 -1
  69. package/src/application/models/featureGates.ts +5 -8
  70. package/src/contexts/pageContext/__tests__/pageContext.test.tsx +4 -59
  71. package/src/contexts/pageContext/pageContext.tsx +20 -41
  72. package/src/contexts/typesV3.ts +22 -4
  73. package/src/services/enviveConfigService/__tests__/enviveConfigService.test.ts +72 -158
  74. package/src/services/enviveConfigService/__tests__/fetchBootstrapConfig.test.ts +111 -13
  75. package/src/services/enviveConfigService/__tests__/fetchGraphQLConfig.test.ts +161 -490
  76. package/src/services/enviveConfigService/enviveConfigService.ts +51 -87
  77. package/src/services/enviveConfigService/fetchBootstrapConfig.ts +74 -66
  78. package/src/services/enviveConfigService/fetchGraphQLConfig.ts +0 -120
  79. package/src/services/featureFlagService/__tests__/getFeatureFlagOverrides.test.ts +54 -0
  80. package/src/services/featureFlagService/index.ts +19 -6
  81. package/dist/application/models/graphql/queries/getWidgetConfigQuery.cjs +0 -42
  82. package/dist/application/models/graphql/queries/getWidgetConfigQuery.js +0 -41
  83. package/src/application/models/graphql/queries/getWidgetConfigQuery.ts +0 -55
@@ -21,8 +21,9 @@ declare class FeatureFlagService {
21
21
  getFeatureFlags: () => Record<string, boolean>;
22
22
  getFullFlagValue: (featureGate: FeatureGates) => FullFlagValue;
23
23
  getFullFlagValues: () => Record<string, FullFlagValue>;
24
+ static getFeatureFlagOverrides(): Record<string, boolean>;
24
25
  static persistFeatureGateOverrides(): void;
25
26
  }
26
27
  //#endregion
27
28
  export { FeatureFlagService, FullFlagValue };
28
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZmVhdHVyZUZsYWdTZXJ2aWNlL2luZGV4LmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JnQ29uZmlnRmVhdHVyZUdhdGUgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9vcmdDb25maWdSZXN1bHRzJztcbmltcG9ydCB7IEZlYXR1cmVHYXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZmVhdHVyZUdhdGVzJztcbmV4cG9ydCBpbnRlcmZhY2UgRnVsbEZsYWdWYWx1ZSB7XG4gICAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gICAgaW5pdGlhbDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBxdWVyeV9wYXJhbV9vdmVycmlkZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICB3aW5kb3dfcGFyYW1fb3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgc3RvcmVkX292ZXJyaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmVhdHVyZUZsYWdTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGZlYXR1cmVHYXRlcztcbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlR2F0ZXM6IE9yZ0NvbmZpZ0ZlYXR1cmVHYXRlW10pO1xuICAgIHN0YXRpYyBnZXRRdWVyeVBhcmFtRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgc3RhdGljIGdldFdpbmRvd0ZlYXR1cmVHYXRlT3ZlcnJpZGVzKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHN0YXRpYyBnZXRTdG9yZWRGZWF0dXJlR2F0ZU92ZXJyaWRlcyhmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBzdGF0aWMgZ2V0RmVhdHVyZUZsYWdPdmVycmlkZShmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpc0ZlYXR1cmVHYXRlRW5hYmxlZDogKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpID0+IGJvb2xlYW47XG4gICAgaXNDbGllbnRTZXNzaW9uRW5hYmxlZDogKCkgPT4gYm9vbGVhbjtcbiAgICBnZXRGZWF0dXJlRmxhZ3M6ICgpID0+IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICAgIGdldEZ1bGxGbGFnVmFsdWU6IChmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKSA9PiBGdWxsRmxhZ1ZhbHVlO1xuICAgIGdldEZ1bGxGbGFnVmFsdWVzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBGdWxsRmxhZ1ZhbHVlPjtcbiAgICBzdGF0aWMgcGVyc2lzdEZlYXR1cmVHYXRlT3ZlcnJpZGVzKCk6IHZvaWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFQSxJQUFXLGdCQUFnQixDQUFDLElBQUc7QUFDL0IsSUFBVyxxQkFBVTtDQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtDQUFBIn0=
29
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZmVhdHVyZUZsYWdTZXJ2aWNlL2luZGV4LmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JnQ29uZmlnRmVhdHVyZUdhdGUgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9vcmdDb25maWdSZXN1bHRzJztcbmltcG9ydCB7IEZlYXR1cmVHYXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZmVhdHVyZUdhdGVzJztcbmV4cG9ydCBpbnRlcmZhY2UgRnVsbEZsYWdWYWx1ZSB7XG4gICAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gICAgaW5pdGlhbDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBxdWVyeV9wYXJhbV9vdmVycmlkZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICB3aW5kb3dfcGFyYW1fb3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgc3RvcmVkX292ZXJyaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmVhdHVyZUZsYWdTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGZlYXR1cmVHYXRlcztcbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlR2F0ZXM6IE9yZ0NvbmZpZ0ZlYXR1cmVHYXRlW10pO1xuICAgIHN0YXRpYyBnZXRRdWVyeVBhcmFtRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgc3RhdGljIGdldFdpbmRvd0ZlYXR1cmVHYXRlT3ZlcnJpZGVzKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHN0YXRpYyBnZXRTdG9yZWRGZWF0dXJlR2F0ZU92ZXJyaWRlcyhmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBzdGF0aWMgZ2V0RmVhdHVyZUZsYWdPdmVycmlkZShmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpc0ZlYXR1cmVHYXRlRW5hYmxlZDogKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpID0+IGJvb2xlYW47XG4gICAgaXNDbGllbnRTZXNzaW9uRW5hYmxlZDogKCkgPT4gYm9vbGVhbjtcbiAgICBnZXRGZWF0dXJlRmxhZ3M6ICgpID0+IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICAgIGdldEZ1bGxGbGFnVmFsdWU6IChmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKSA9PiBGdWxsRmxhZ1ZhbHVlO1xuICAgIGdldEZ1bGxGbGFnVmFsdWVzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBGdWxsRmxhZ1ZhbHVlPjtcbiAgICBzdGF0aWMgZ2V0RmVhdHVyZUZsYWdPdmVycmlkZXMoKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgc3RhdGljIHBlcnNpc3RGZWF0dXJlR2F0ZU92ZXJyaWRlcygpOiB2b2lkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBRUEsSUFBVyxnQkFBZ0IsQ0FBQyxJQUFHO0FBQy9CLElBQVcscUJBQVU7Q0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtDQUFBIn0=
@@ -86,16 +86,18 @@ var FeatureFlagService = class FeatureFlagService {
86
86
  return storedOverride;
87
87
  }
88
88
  }
89
- static persistFeatureGateOverrides() {
90
- if (typeof window === "undefined" || typeof window.localStorage === "undefined") return;
91
- const overrides = Object.values(FeatureGates).map((featureGate) => [featureGate, FeatureFlagService.getFeatureFlagOverride(featureGate)]).filter(([, value]) => value !== void 0).reduce((acc, [key, value]) => ({
89
+ static getFeatureFlagOverrides() {
90
+ return Object.values(FeatureGates).map((featureGate) => [featureGate, FeatureFlagService.getFeatureFlagOverride(featureGate)]).filter(([, value]) => value !== void 0).reduce((acc, [key, value]) => ({
92
91
  ...acc,
93
92
  [key]: value
94
93
  }), {});
95
- window.localStorage.setItem(FEATURE_FLAGS_STORAGE_KEY, JSON.stringify(overrides));
94
+ }
95
+ static persistFeatureGateOverrides() {
96
+ if (typeof window === "undefined" || typeof window.localStorage === "undefined") return;
97
+ window.localStorage.setItem(FEATURE_FLAGS_STORAGE_KEY, JSON.stringify(FeatureFlagService.getFeatureFlagOverrides()));
96
98
  }
97
99
  };
98
100
 
99
101
  //#endregion
100
102
  export { FeatureFlagService };
101
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJMb2dnZXIiLCJmZWF0dXJlR2F0ZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZmVhdHVyZUZsYWdTZXJ2aWNlL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ0NvbmZpZ0ZlYXR1cmVHYXRlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlcyc7XG5pbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5cbmNvbnN0IEZFQVRVUkVfRkxBR1NfU1RPUkFHRV9LRVkgPSAnc3BpZmZ5LWZlYXR1cmUtZmxhZ3MnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdmZWF0dXJlRmxhZ1NlcnZpY2UnKTtcblxuZXhwb3J0IGludGVyZmFjZSBGdWxsRmxhZ1ZhbHVlIHtcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIGluaXRpYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHF1ZXJ5X3BhcmFtX292ZXJyaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICB3aW5kb3dfcGFyYW1fb3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHN0b3JlZF9vdmVycmlkZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLy8gS2VwdCBmcmVlIG9mIFJlYWN0IGltcG9ydHM6IHRoZSBpbmplY3Rpb24gYnVuZGxlIGNvbnN0cnVjdHMgdGhpcyBzZXJ2aWNlXG4vLyBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBsb2FkIHRoZSBSZWFjdCBhcHAsIGFuZCBwdWxsaW5nIFJlYWN0IGludG9cbi8vIHRoYXQgcHJlLWNvbmZpZyBjb2RlIHBhdGggd291bGQgcHV0IGl0IG9uIHRoZSBlYWdlciBjcml0aWNhbCBjaHVuay5cbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ1NlcnZpY2Uge1xuICBwcml2YXRlIGZlYXR1cmVHYXRlczogT3JnQ29uZmlnRmVhdHVyZUdhdGVbXTtcblxuICBjb25zdHJ1Y3RvcihmZWF0dXJlR2F0ZXM6IE9yZ0NvbmZpZ0ZlYXR1cmVHYXRlW10pIHtcbiAgICB0aGlzLmZlYXR1cmVHYXRlcyA9IGZlYXR1cmVHYXRlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXRRdWVyeVBhcmFtRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbj8uaHJlZiA/PyAnJztcbiAgICBpZiAodXJsLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsT2JqLnNlYXJjaCk7XG4gICAgICBjb25zdCBwYXJhbXNPYmogPSBPYmplY3QuZnJvbUVudHJpZXMocGFyYW1zLmVudHJpZXMoKSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtc09ialtmZWF0dXJlR2F0ZV07XG5cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0V2luZG93RmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgd2luZG93T3ZlcnJpZGUgPSB3aW5kb3cgYXMgV2luZG93ICYge1xuICAgICAgX2Vudml2ZT86IHsgZmVhdHVyZU92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IH07XG4gICAgICBfc3BpZmZ5PzogeyBmZWF0dXJlT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfTtcbiAgICB9O1xuICAgIGNvbnN0IGZlYXR1cmVPdmVycmlkZXMgPVxuICAgICAgd2luZG93T3ZlcnJpZGU/Ll9lbnZpdmU/LmZlYXR1cmVPdmVycmlkZXMgPz8gd2luZG93T3ZlcnJpZGU/Ll9zcGlmZnk/LmZlYXR1cmVPdmVycmlkZXM7XG4gICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlT3ZlcnJpZGVzPy5bU3RyaW5nKGZlYXR1cmVHYXRlKV07XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdG9yZWRGZWF0dXJlR2F0ZU92ZXJyaWRlcyhmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZlYXR1cmVGbGFncyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShGRUFUVVJFX0ZMQUdTX1NUT1JBR0VfS0VZKTtcbiAgICAgIGlmICghZmVhdHVyZUZsYWdzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBmZWF0dXJlRmxhZ3NPYmogPSBKU09OLnBhcnNlKGZlYXR1cmVGbGFncykgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgICByZXR1cm4gZmVhdHVyZUZsYWdzT2JqW2ZlYXR1cmVHYXRlXTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignZ2V0U3RvcmVkRmVhdHVyZUdhdGVPdmVycmlkZXM6IGVycm9yIHBhcnNpbmcgZmVhdHVyZSBmbGFncycsIGVycik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRGZWF0dXJlRmxhZ092ZXJyaWRlKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBxdWVyeU92ZXJyaWRlID0gRmVhdHVyZUZsYWdTZXJ2aWNlLmdldFF1ZXJ5UGFyYW1GZWF0dXJlR2F0ZU92ZXJyaWRlcyhmZWF0dXJlR2F0ZSk7XG4gICAgaWYgKHF1ZXJ5T3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgaXNGZWF0dXJlR2F0ZUVuYWJsZWQgZmVhdHVyZUdhdGU6JHtmZWF0dXJlR2F0ZX0gb3ZlcnJpZGRlbiBieSBVUkwgcGFyYW0uIE5ldyB2YWx1ZTogJHtxdWVyeU92ZXJyaWRlfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHF1ZXJ5T3ZlcnJpZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgd2luZG93T3ZlcnJpZGUgPSBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0V2luZG93RmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpO1xuICAgIGlmICh3aW5kb3dPdmVycmlkZSAhPSBudWxsKSB7XG4gICAgICBsb2dnZXIubG9nRGVidWcoXG4gICAgICAgIGBpc0ZlYXR1cmVHYXRlRW5hYmxlZCBmZWF0dXJlR2F0ZToke2ZlYXR1cmVHYXRlfSBvdmVycmlkZGVuIGJ5IHdpbmRvdyBwYXJhbS4gTmV3IHZhbHVlOiAke3dpbmRvd092ZXJyaWRlfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdpbmRvd092ZXJyaWRlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZE92ZXJyaWRlID0gRmVhdHVyZUZsYWdTZXJ2aWNlLmdldFN0b3JlZEZlYXR1cmVHYXRlT3ZlcnJpZGVzKGZlYXR1cmVHYXRlKTtcbiAgICBpZiAoc3RvcmVkT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgaXNGZWF0dXJlR2F0ZUVuYWJsZWQgZmVhdHVyZUdhdGU6JHtmZWF0dXJlR2F0ZX0gb3ZlcnJpZGRlbiBieSBzdG9yZWQgdmFsdWUuIE5ldyB2YWx1ZTogJHtzdG9yZWRPdmVycmlkZX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yZWRPdmVycmlkZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNGZWF0dXJlR2F0ZUVuYWJsZWQgPSAoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGdhdGVWYWx1ZSA9IHRoaXMuZmVhdHVyZUdhdGVzLmZpbmQoZ2F0ZSA9PiBnYXRlLm5hbWUgPT09IGZlYXR1cmVHYXRlKTtcblxuICAgIGNvbnN0IGZlYXR1cmVGbGFnT3ZlcnJpZGUgPSBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0RmVhdHVyZUZsYWdPdmVycmlkZShmZWF0dXJlR2F0ZSk7XG4gICAgaWYgKGZlYXR1cmVGbGFnT3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZlYXR1cmVGbGFnT3ZlcnJpZGU7XG4gICAgfVxuXG4gICAgaWYgKGdhdGVWYWx1ZSA9PSBudWxsIHx8IGdhdGVWYWx1ZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBsb2dnZXIubG9nRGVidWcoXG4gICAgICAgIGBpc0ZlYXR1cmVHYXRlRW5hYmxlZCBmZWF0dXJlR2F0ZToke2ZlYXR1cmVHYXRlfSB2YWx1ZSBpcyB1bmRlZmluZWQgLSByZXR1cm5pbmcgZmFsc2VgLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGdhdGVWYWx1ZS52YWx1ZTtcbiAgfTtcblxuICAvLyBFbnN1cmUgdGhhdCBzdGFuZGFyZCBvdmVycmlkZXMgd29yayBhcyBleHBlY3RlZFxuICBpc0NsaWVudFNlc3Npb25FbmFibGVkID0gKCk6IGJvb2xlYW4gPT5cbiAgICB0aGlzLmlzRmVhdHVyZUdhdGVFbmFibGVkKEZlYXR1cmVHYXRlcy5Jc0NsaWVudFNlc3Npb25FbmFibGVkKTtcblxuICBnZXRGZWF0dXJlRmxhZ3MgPSAoKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPT4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QudmFsdWVzKEZlYXR1cmVHYXRlcykubWFwKChmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKSA9PiBbXG4gICAgICAgIGZlYXR1cmVHYXRlLFxuICAgICAgICB0aGlzLmlzRmVhdHVyZUdhdGVFbmFibGVkKGZlYXR1cmVHYXRlKSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH07XG5cbiAgZ2V0RnVsbEZsYWdWYWx1ZSA9IChmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogRnVsbEZsYWdWYWx1ZSA9PiB7XG4gICAgY29uc3QgZ2F0ZVZhbHVlID0gdGhpcy5mZWF0dXJlR2F0ZXMuZmluZChnYXRlID0+IGdhdGUubmFtZSA9PT0gZmVhdHVyZUdhdGUpO1xuICAgIHJldHVybiB7XG4gICAgICByZXNvbHZlZDogdGhpcy5pc0ZlYXR1cmVHYXRlRW5hYmxlZChmZWF0dXJlR2F0ZSksXG4gICAgICBpbml0aWFsOiBnYXRlVmFsdWU/LnZhbHVlLFxuICAgICAgcXVlcnlfcGFyYW1fb3ZlcnJpZGU6IEZlYXR1cmVGbGFnU2VydmljZS5nZXRRdWVyeVBhcmFtRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpLFxuICAgICAgd2luZG93X3BhcmFtX292ZXJyaWRlOiBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0V2luZG93RmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpLFxuICAgICAgc3RvcmVkX292ZXJyaWRlOiBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0U3RvcmVkRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpLFxuICAgIH07XG4gIH07XG5cbiAgZ2V0RnVsbEZsYWdWYWx1ZXMgPSAoKTogUmVjb3JkPHN0cmluZywgRnVsbEZsYWdWYWx1ZT4gPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVHYXRlcyA9IE9iamVjdC52YWx1ZXMoRmVhdHVyZUdhdGVzKS5tYXAoKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpID0+IFtcbiAgICAgIGZlYXR1cmVHYXRlLFxuICAgICAgdGhpcy5nZXRGdWxsRmxhZ1ZhbHVlKGZlYXR1cmVHYXRlKSxcbiAgICBdKTtcblxuICAgIHJldHVybiBmZWF0dXJlR2F0ZXMubGVuZ3RoID4gMFxuICAgICAgPyBmZWF0dXJlR2F0ZXMucmVkdWNlPFJlY29yZDxzdHJpbmcsIEZ1bGxGbGFnVmFsdWU+PigoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBlbnRyeSBhcyBbRmVhdHVyZUdhdGVzLCBGdWxsRmxhZ1ZhbHVlXTtcbiAgICAgICAgICBpZiAobmFtZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtgZmVhdHVyZV9nYXRlLiR7bmFtZX1gXTogdmFsdWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICA6IHt9O1xuICB9O1xuXG4gIHN0YXRpYyBwZXJzaXN0RmVhdHVyZUdhdGVPdmVycmlkZXMoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdmVycmlkZXMgPSBPYmplY3QudmFsdWVzKEZlYXR1cmVHYXRlcylcbiAgICAgIC5tYXAoXG4gICAgICAgIGZlYXR1cmVHYXRlID0+XG4gICAgICAgICAgW2ZlYXR1cmVHYXRlLCBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0RmVhdHVyZUZsYWdPdmVycmlkZShmZWF0dXJlR2F0ZSldIGFzIGNvbnN0LFxuICAgICAgKVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oKGFjYywgW2tleSwgdmFsdWVdKSA9PiAoeyAuLi5hY2MsIFtrZXldOiB2YWx1ZSEgfSksIHt9KTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oRkVBVFVSRV9GTEFHU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkob3ZlcnJpZGVzKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUlBLE1BQU0sNEJBQTRCO0FBRWxDLE1BQU0sU0FBUyxJQUFJQSxlQUFPLHFCQUFxQjtBQWEvQyxJQUFhLHFCQUFiLE1BQWEsbUJBQW1CO0NBRzlCLFlBQVksY0FBc0M7K0JBa0YxQixnQkFBdUM7R0FDN0QsTUFBTSxZQUFZLEtBQUssYUFBYSxNQUFLLFNBQVEsS0FBSyxTQUFTLFlBQVk7R0FFM0UsTUFBTSxzQkFBc0IsbUJBQW1CLHVCQUF1QixZQUFZO0FBQ2xGLE9BQUksd0JBQXdCLE9BQzFCLFFBQU87QUFHVCxPQUFJLGFBQWEsUUFBUSxVQUFVLFNBQVMsTUFBTTtBQUNoRCxXQUFPLFNBQ0wsb0NBQW9DLFlBQVksdUNBQ2pEO0FBQ0QsV0FBTzs7QUFFVCxVQUFPLFVBQVU7O3NDQUtqQixLQUFLLHFCQUFxQixhQUFhLHVCQUF1QjsrQkFFZjtBQUMvQyxVQUFPLE9BQU8sWUFDWixPQUFPLE9BQU8sYUFBYSxDQUFDLEtBQUssZ0JBQThCLENBQzdELGFBQ0EsS0FBSyxxQkFBcUIsWUFBWSxDQUN2QyxDQUFDLENBQ0g7OzJCQUdpQixnQkFBNkM7R0FDL0QsTUFBTSxZQUFZLEtBQUssYUFBYSxNQUFLLFNBQVEsS0FBSyxTQUFTLFlB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
103
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJMb2dnZXIiLCJmZWF0dXJlR2F0ZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZmVhdHVyZUZsYWdTZXJ2aWNlL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ0NvbmZpZ0ZlYXR1cmVHYXRlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlcyc7XG5pbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5cbmNvbnN0IEZFQVRVUkVfRkxBR1NfU1RPUkFHRV9LRVkgPSAnc3BpZmZ5LWZlYXR1cmUtZmxhZ3MnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdmZWF0dXJlRmxhZ1NlcnZpY2UnKTtcblxuZXhwb3J0IGludGVyZmFjZSBGdWxsRmxhZ1ZhbHVlIHtcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIGluaXRpYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHF1ZXJ5X3BhcmFtX292ZXJyaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICB3aW5kb3dfcGFyYW1fb3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHN0b3JlZF9vdmVycmlkZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLy8gS2VwdCBmcmVlIG9mIFJlYWN0IGltcG9ydHM6IHRoZSBpbmplY3Rpb24gYnVuZGxlIGNvbnN0cnVjdHMgdGhpcyBzZXJ2aWNlXG4vLyBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBsb2FkIHRoZSBSZWFjdCBhcHAsIGFuZCBwdWxsaW5nIFJlYWN0IGludG9cbi8vIHRoYXQgcHJlLWNvbmZpZyBjb2RlIHBhdGggd291bGQgcHV0IGl0IG9uIHRoZSBlYWdlciBjcml0aWNhbCBjaHVuay5cbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ1NlcnZpY2Uge1xuICBwcml2YXRlIGZlYXR1cmVHYXRlczogT3JnQ29uZmlnRmVhdHVyZUdhdGVbXTtcblxuICBjb25zdHJ1Y3RvcihmZWF0dXJlR2F0ZXM6IE9yZ0NvbmZpZ0ZlYXR1cmVHYXRlW10pIHtcbiAgICB0aGlzLmZlYXR1cmVHYXRlcyA9IGZlYXR1cmVHYXRlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXRRdWVyeVBhcmFtRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbj8uaHJlZiA/PyAnJztcbiAgICBpZiAodXJsLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsT2JqLnNlYXJjaCk7XG4gICAgICBjb25zdCBwYXJhbXNPYmogPSBPYmplY3QuZnJvbUVudHJpZXMocGFyYW1zLmVudHJpZXMoKSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtc09ialtmZWF0dXJlR2F0ZV07XG5cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0V2luZG93RmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgd2luZG93T3ZlcnJpZGUgPSB3aW5kb3cgYXMgV2luZG93ICYge1xuICAgICAgX2Vudml2ZT86IHsgZmVhdHVyZU92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IH07XG4gICAgICBfc3BpZmZ5PzogeyBmZWF0dXJlT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfTtcbiAgICB9O1xuICAgIGNvbnN0IGZlYXR1cmVPdmVycmlkZXMgPVxuICAgICAgd2luZG93T3ZlcnJpZGU/Ll9lbnZpdmU/LmZlYXR1cmVPdmVycmlkZXMgPz8gd2luZG93T3ZlcnJpZGU/Ll9zcGlmZnk/LmZlYXR1cmVPdmVycmlkZXM7XG4gICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlT3ZlcnJpZGVzPy5bU3RyaW5nKGZlYXR1cmVHYXRlKV07XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdG9yZWRGZWF0dXJlR2F0ZU92ZXJyaWRlcyhmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZlYXR1cmVGbGFncyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShGRUFUVVJFX0ZMQUdTX1NUT1JBR0VfS0VZKTtcbiAgICAgIGlmICghZmVhdHVyZUZsYWdzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBmZWF0dXJlRmxhZ3NPYmogPSBKU09OLnBhcnNlKGZlYXR1cmVGbGFncykgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgICByZXR1cm4gZmVhdHVyZUZsYWdzT2JqW2ZlYXR1cmVHYXRlXTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignZ2V0U3RvcmVkRmVhdHVyZUdhdGVPdmVycmlkZXM6IGVycm9yIHBhcnNpbmcgZmVhdHVyZSBmbGFncycsIGVycik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRGZWF0dXJlRmxhZ092ZXJyaWRlKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBxdWVyeU92ZXJyaWRlID0gRmVhdHVyZUZsYWdTZXJ2aWNlLmdldFF1ZXJ5UGFyYW1GZWF0dXJlR2F0ZU92ZXJyaWRlcyhmZWF0dXJlR2F0ZSk7XG4gICAgaWYgKHF1ZXJ5T3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgaXNGZWF0dXJlR2F0ZUVuYWJsZWQgZmVhdHVyZUdhdGU6JHtmZWF0dXJlR2F0ZX0gb3ZlcnJpZGRlbiBieSBVUkwgcGFyYW0uIE5ldyB2YWx1ZTogJHtxdWVyeU92ZXJyaWRlfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHF1ZXJ5T3ZlcnJpZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgd2luZG93T3ZlcnJpZGUgPSBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0V2luZG93RmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpO1xuICAgIGlmICh3aW5kb3dPdmVycmlkZSAhPSBudWxsKSB7XG4gICAgICBsb2dnZXIubG9nRGVidWcoXG4gICAgICAgIGBpc0ZlYXR1cmVHYXRlRW5hYmxlZCBmZWF0dXJlR2F0ZToke2ZlYXR1cmVHYXRlfSBvdmVycmlkZGVuIGJ5IHdpbmRvdyBwYXJhbS4gTmV3IHZhbHVlOiAke3dpbmRvd092ZXJyaWRlfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdpbmRvd092ZXJyaWRlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZE92ZXJyaWRlID0gRmVhdHVyZUZsYWdTZXJ2aWNlLmdldFN0b3JlZEZlYXR1cmVHYXRlT3ZlcnJpZGVzKGZlYXR1cmVHYXRlKTtcbiAgICBpZiAoc3RvcmVkT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgaXNGZWF0dXJlR2F0ZUVuYWJsZWQgZmVhdHVyZUdhdGU6JHtmZWF0dXJlR2F0ZX0gb3ZlcnJpZGRlbiBieSBzdG9yZWQgdmFsdWUuIE5ldyB2YWx1ZTogJHtzdG9yZWRPdmVycmlkZX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yZWRPdmVycmlkZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNGZWF0dXJlR2F0ZUVuYWJsZWQgPSAoZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlcyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGdhdGVWYWx1ZSA9IHRoaXMuZmVhdHVyZUdhdGVzLmZpbmQoZ2F0ZSA9PiBnYXRlLm5hbWUgPT09IGZlYXR1cmVHYXRlKTtcblxuICAgIGNvbnN0IGZlYXR1cmVGbGFnT3ZlcnJpZGUgPSBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0RmVhdHVyZUZsYWdPdmVycmlkZShmZWF0dXJlR2F0ZSk7XG4gICAgaWYgKGZlYXR1cmVGbGFnT3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZlYXR1cmVGbGFnT3ZlcnJpZGU7XG4gICAgfVxuXG4gICAgaWYgKGdhdGVWYWx1ZSA9PSBudWxsIHx8IGdhdGVWYWx1ZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBsb2dnZXIubG9nRGVidWcoXG4gICAgICAgIGBpc0ZlYXR1cmVHYXRlRW5hYmxlZCBmZWF0dXJlR2F0ZToke2ZlYXR1cmVHYXRlfSB2YWx1ZSBpcyB1bmRlZmluZWQgLSByZXR1cm5pbmcgZmFsc2VgLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGdhdGVWYWx1ZS52YWx1ZTtcbiAgfTtcblxuICAvLyBFbnN1cmUgdGhhdCBzdGFuZGFyZCBvdmVycmlkZXMgd29yayBhcyBleHBlY3RlZFxuICBpc0NsaWVudFNlc3Npb25FbmFibGVkID0gKCk6IGJvb2xlYW4gPT5cbiAgICB0aGlzLmlzRmVhdHVyZUdhdGVFbmFibGVkKEZlYXR1cmVHYXRlcy5Jc0NsaWVudFNlc3Npb25FbmFibGVkKTtcblxuICBnZXRGZWF0dXJlRmxhZ3MgPSAoKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPT4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QudmFsdWVzKEZlYXR1cmVHYXRlcykubWFwKChmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKSA9PiBbXG4gICAgICAgIGZlYXR1cmVHYXRlLFxuICAgICAgICB0aGlzLmlzRmVhdHVyZUdhdGVFbmFibGVkKGZlYXR1cmVHYXRlKSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH07XG5cbiAgZ2V0RnVsbEZsYWdWYWx1ZSA9IChmZWF0dXJlR2F0ZTogRmVhdHVyZUdhdGVzKTogRnVsbEZsYWdWYWx1ZSA9PiB7XG4gICAgY29uc3QgZ2F0ZVZhbHVlID0gdGhpcy5mZWF0dXJlR2F0ZXMuZmluZChnYXRlID0+IGdhdGUubmFtZSA9PT0gZmVhdHVyZUdhdGUpO1xuICAgIHJldHVybiB7XG4gICAgICByZXNvbHZlZDogdGhpcy5pc0ZlYXR1cmVHYXRlRW5hYmxlZChmZWF0dXJlR2F0ZSksXG4gICAgICBpbml0aWFsOiBnYXRlVmFsdWU/LnZhbHVlLFxuICAgICAgcXVlcnlfcGFyYW1fb3ZlcnJpZGU6IEZlYXR1cmVGbGFnU2VydmljZS5nZXRRdWVyeVBhcmFtRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpLFxuICAgICAgd2luZG93X3BhcmFtX292ZXJyaWRlOiBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0V2luZG93RmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpLFxuICAgICAgc3RvcmVkX292ZXJyaWRlOiBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0U3RvcmVkRmVhdHVyZUdhdGVPdmVycmlkZXMoZmVhdHVyZUdhdGUpLFxuICAgIH07XG4gIH07XG5cbiAgZ2V0RnVsbEZsYWdWYWx1ZXMgPSAoKTogUmVjb3JkPHN0cmluZywgRnVsbEZsYWdWYWx1ZT4gPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVHYXRlcyA9IE9iamVjdC52YWx1ZXMoRmVhdHVyZUdhdGVzKS5tYXAoKGZlYXR1cmVHYXRlOiBGZWF0dXJlR2F0ZXMpID0+IFtcbiAgICAgIGZlYXR1cmVHYXRlLFxuICAgICAgdGhpcy5nZXRGdWxsRmxhZ1ZhbHVlKGZlYXR1cmVHYXRlKSxcbiAgICBdKTtcblxuICAgIHJldHVybiBmZWF0dXJlR2F0ZXMubGVuZ3RoID4gMFxuICAgICAgPyBmZWF0dXJlR2F0ZXMucmVkdWNlPFJlY29yZDxzdHJpbmcsIEZ1bGxGbGFnVmFsdWU+PigoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBlbnRyeSBhcyBbRmVhdHVyZUdhdGVzLCBGdWxsRmxhZ1ZhbHVlXTtcbiAgICAgICAgICBpZiAobmFtZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtgZmVhdHVyZV9nYXRlLiR7bmFtZX1gXTogdmFsdWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICA6IHt9O1xuICB9O1xuXG4gIC8vIE9ubHkgdGhlIGdhdGVzIHRoZSBjbGllbnQgYWN0dWFsbHkgb3ZlcnJpZGVzIChxdWVyeSBwYXJhbSAvIHdpbmRvdyAvIHN0b3JlZCksXG4gIC8vIHdpdGggdGhlIHVuLW92ZXJyaWRkZW4gb25lcyBsZWZ0IG91dCBlbnRpcmVseSDigJQgTk9UIHJlc29sdmVkIHRvIGZhbHNlLiBUaGlzXG4gIC8vIGlzIHdoYXQgL3YxL3Nlc3Npb24vYm9vdHN0cmFwJ3MgdXJsX3Jlc29sdmluZyB3YW50czogdGhlIHNlcnZlciByZXNvbHZlcyB0aGVcbiAgLy8gcmVhbCBnYXRlIHZhbHVlcyBpdHNlbGYgYW5kIG1lcmdlcyB0aGlzIG1hcCBPVkVSIHRoZW0sIHNvIGEgZnVsbCBtYXAgb2ZcbiAgLy8gcmVzb2x2ZWQgdmFsdWVzIHdvdWxkIGNsb2JiZXIgdGhlIHNlcnZlcidzIGdhdGVzIHdpdGggdGhlIGNsaWVudCdzICh3aGljaCxcbiAgLy8gb24gdGhlIGJvb3RzdHJhcC1vbmx5IHBhdGgsIGhhcyBubyBzZXJ2ZXIgdmFsdWVzIHRvIHJlc29sdmUgZnJvbSkuIEFuIGVtcHR5XG4gIC8vIG1hcCAodGhlIGNvbW1vbiBjYXNlIOKAlCBubyBvdmVycmlkZXMpIGxlYXZlcyB0aGUgc2VydmVyJ3MgZ2F0ZXMgdW50b3VjaGVkLlxuICBzdGF0aWMgZ2V0RmVhdHVyZUZsYWdPdmVycmlkZXMoKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKEZlYXR1cmVHYXRlcylcbiAgICAgIC5tYXAoXG4gICAgICAgIGZlYXR1cmVHYXRlID0+XG4gICAgICAgICAgW2ZlYXR1cmVHYXRlLCBGZWF0dXJlRmxhZ1NlcnZpY2UuZ2V0RmVhdHVyZUZsYWdPdmVycmlkZShmZWF0dXJlR2F0ZSldIGFzIGNvbnN0LFxuICAgICAgKVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oKGFjYywgW2tleSwgdmFsdWVdKSA9PiAoeyAuLi5hY2MsIFtrZXldOiB2YWx1ZSEgfSksIHt9KTtcbiAgfVxuXG4gIHN0YXRpYyBwZXJzaXN0RmVhdHVyZUdhdGVPdmVycmlkZXMoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICBGRUFUVVJFX0ZMQUdTX1NUT1JBR0VfS0VZLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoRmVhdHVyZUZsYWdTZXJ2aWNlLmdldEZlYXR1cmVGbGFnT3ZlcnJpZGVzKCkpLFxuICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUlBLE1BQU0sNEJBQTRCO0FBRWxDLE1BQU0sU0FBUyxJQUFJQSxlQUFPLHFCQUFxQjtBQWEvQyxJQUFhLHFCQUFiLE1BQWEsbUJBQW1CO0NBRzlCLFlBQVksY0FBc0M7K0JBa0YxQixnQkFBdUM7R0FDN0QsTUFBTSxZQUFZLEtBQUssYUFBYSxNQUFLLFNBQVEsS0FBSyxTQUFTLFlBQVk7R0FFM0UsTUFBTSxzQkFBc0IsbUJBQW1CLHVCQUF1QixZQUFZO0FBQ2xGLE9BQUksd0JBQXdCLE9BQzFCLFFBQU87QUFHVCxPQUFJLGFBQWEsUUFBUSxVQUFVLFNBQVMsTUFBTTtBQUNoRCxXQUFPLFNBQ0wsb0NBQW9DLFlBQVksdUNBQ2pEO0FBQ0QsV0FBTzs7QUFFVCxVQUFPLFVBQVU7O3NDQUtqQixLQUFLLHFCQUFxQixhQUFhLHVCQUF1QjsrQkFFZjtBQUMvQyxVQUFPLE9BQU8sWUFDWixPQUFPLE9BQU8sYUFBYSxDQUFDLEtBQUssZ0JBQThCLENBQzdELGFBQ0EsS0FBSyxxQkFBcUIsWUFBWSxDQUN2QyxDQUFDLENBQ0g7OzJCQUdpQixnQkFBNkM7R0FDL0QsTUFBTSxZQUFZLEtBQUssYUFBYSxNQUFLLFNBQVEsS0FBSyxTQUFTLFlBQVk7QUFDM0UsVUFBTztJQUNMLFVBQVUsS0FBSyxxQkFBcUIsWUFBWTtJQUNoRCxTQUFTLFdBQVc7SUFDcEIsc0JBQXNCLG1CQUFtQixrQ0FBa0MsWUFBWTtJQUN2Rix1QkFBdUIsbUJBQW1CLDhCQUE4QixZQUFZO0lBQ3BGLGlCQUFpQixtQkFBbUIsOEJBQThCLFlBQVk7SUFDL0U7O2lDQUdzRDtHQUN2RCxNQUFNQyxpQkFBZSxPQUFPLE9BQU8sYUFBYSxDQUFDLEtBQUss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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@envive-ai/react-hooks",
3
- "version": "0.3.64",
3
+ "version": "0.3.65",
4
4
  "description": "React hooks for connecting to Envive AI services.",
5
5
  "keywords": [
6
6
  "react",
@@ -37,14 +37,11 @@ export enum FeatureGates {
37
37
  // ships, so an org can run the storefront without opting pdp/plp into variant_b.
38
38
  IsAiSuggestionsStorefrontEnabled = 'is_ai_suggestions_storefront_enabled',
39
39
  IsVoiceInputEnabled = 'is_voice_input_enabled',
40
- // Resets the chat/conversation context to the new product when a PDP variant/color change
41
- // updates the URL client-side (history.pushState/replaceState) without a full reload.
42
- // Default OFF; enabled per-org via Statsig (initially Naturalizer) to de-risk rollout.
43
- IsPdpVariantContextResetEnabled = 'is_pdp_variant_context_reset_enabled',
44
- // Statsig experiments / unified getWidgetConfig endpoint migration. When
45
- // true, EnviveConfigService calls getWidgetConfig (experiment-aware)
46
- // instead of the legacy getProductsConfigByVersion / getColorsAndFrontend
47
- // path.
40
+ // The unified-config endpoint migration. The FE no longer branches on this to
41
+ // pick a config path — EnviveConfigService always calls /v1/session/bootstrap.
42
+ // The gate still governs SERVER-SIDE behavior (experiment_assignments population
43
+ // + config-version resolution), and the FE forwards a client-side override of it
44
+ // to bootstrap's url_resolving as a page-variant lever.
48
45
  UseUnifiedConfig = 'use_unified_config',
49
46
  // Kill switch for the [Envive] Diagnostics widget-load events (mount / outcome / stall).
50
47
  // Diagnostics are ON by default for every org so we can gather a cross-merchant baseline and
@@ -4,17 +4,13 @@ import { Provider, useAtom } from 'jotai';
4
4
  import React from 'react';
5
5
  import CommerceApiClient from 'src/application/commerce-api';
6
6
  import Logger from 'src/application/logging/logger';
7
- import { FeatureGates, VariantTypeEnum } from 'src/application/models';
7
+ import { VariantTypeEnum } from 'src/application/models';
8
8
  import {
9
9
  UrlResolverResponse,
10
10
  pageUserEventAtom,
11
11
  pageVariantInfoAtom,
12
12
  urlResolverAtom,
13
13
  } from 'src/atoms/app/variant';
14
- import {
15
- FeatureFlagService,
16
- FeatureFlagServiceProvider,
17
- } from 'src/contexts/featureFlagServiceContext';
18
14
  import { mapUrlResolverResponseToVariantInfo } from '../mapping';
19
15
  import { PageProvider, usePage } from '../pageContext';
20
16
 
@@ -103,21 +99,6 @@ describe('PageProvider', () => {
103
99
  );
104
100
  };
105
101
 
106
- // Same as renderWithProviders but with the PDP variant-reset feature gate turned on, so the
107
- // client-side re-resolution behavior is exercised (it is gated off by default).
108
- const renderWithVariantResetEnabled = (children: React.ReactNode, previewMode = false) => {
109
- const featureFlagService = new FeatureFlagService([
110
- { name: FeatureGates.IsPdpVariantContextResetEnabled, value: true },
111
- ]);
112
- return render(
113
- <Provider>
114
- <FeatureFlagServiceProvider featureFlagService={featureFlagService}>
115
- <PageProvider previewMode={previewMode}>{children}</PageProvider>
116
- </FeatureFlagServiceProvider>
117
- </Provider>,
118
- );
119
- };
120
-
121
102
  describe('PageProvider Initialization', () => {
122
103
  it('should initialize with pageUrl from window.location.href', async () => {
123
104
  window.location.href = 'https://example.com/initial-page';
@@ -374,7 +355,7 @@ describe('PageProvider', () => {
374
355
  }) as UrlResolverResponse,
375
356
  );
376
357
 
377
- renderWithVariantResetEnabled(<NavComponent />, false);
358
+ renderWithProviders(<NavComponent />, false);
378
359
 
379
360
  // Initial resolution to product-a
380
361
  await waitFor(() => {
@@ -438,7 +419,7 @@ describe('PageProvider', () => {
438
419
  } as UrlResolverResponse;
439
420
  });
440
421
 
441
- renderWithVariantResetEnabled(<MultiNavComponent />, false);
422
+ renderWithProviders(<MultiNavComponent />, false);
442
423
 
443
424
  await waitFor(() => {
444
425
  expect(screen.getByTestId('variant-info').textContent).toContain('product-a');
@@ -502,7 +483,7 @@ describe('PageProvider', () => {
502
483
  );
503
484
  };
504
485
 
505
- renderWithVariantResetEnabled(<OutOfOrderComp />, false);
486
+ renderWithProviders(<OutOfOrderComp />, false);
506
487
 
507
488
  // Initial resolution of /a is in flight (aPromise pending).
508
489
  await waitFor(() => {
@@ -548,42 +529,6 @@ describe('PageProvider', () => {
548
529
  expect(screen.getByTestId('is-loading').textContent).toBe('false');
549
530
  });
550
531
  });
551
-
552
- it('does NOT re-resolve on a URL change when the feature gate is off (default)', async () => {
553
- window.location.href = 'https://example.com/product/variant-a';
554
-
555
- mockResolveUrl.mockImplementation(
556
- async (url: string) =>
557
- ({
558
- variant_type: VariantTypeEnum.Pdp,
559
- specific_details: {
560
- pdp_attributes: { product_id: url.includes('variant-b') ? 'product-b' : 'product-a' },
561
- },
562
- ready: true,
563
- }) as UrlResolverResponse,
564
- );
565
-
566
- // No FeatureFlagServiceProvider -> gate resolves to false -> original behavior.
567
- renderWithProviders(<NavComponent />, false);
568
-
569
- await waitFor(() => {
570
- expect(screen.getByTestId('variant-info').textContent).toContain('product-a');
571
- });
572
-
573
- await act(async () => {
574
- screen.getByTestId('navigate').click();
575
- });
576
- // Give any (unwanted) re-resolution time to happen.
577
- await act(async () => {
578
- await new Promise<void>(resolve => {
579
- setTimeout(resolve, 100);
580
- });
581
- });
582
-
583
- // The URL change must not have re-resolved; context stays on the original product.
584
- expect(mockResolveUrl).not.toHaveBeenCalledWith('https://example.com/product/variant-b');
585
- expect(screen.getByTestId('variant-info').textContent).toContain('product-a');
586
- });
587
532
  });
588
533
 
589
534
  describe('Variant Info Mapping', () => {
@@ -17,8 +17,7 @@ import {
17
17
  variantInfoAtom,
18
18
  } from 'src/atoms/app/variant';
19
19
  import { useAtom, useAtomValue } from 'jotai';
20
- import { FeatureGates, VariantTypeEnum } from 'src/application/models';
21
- import { FeatureFlagServiceContext } from 'src/contexts/featureFlagServiceContext';
20
+ import { VariantTypeEnum } from 'src/application/models';
22
21
  import CommerceApiClient from 'src/application/commerce-api';
23
22
  import Logger from 'src/application/logging/logger';
24
23
  import { PageVisitCategory, UserEventCategory } from '@spiffy-ai/commerce-api-client';
@@ -60,16 +59,6 @@ export const PageProvider: React.FC<{
60
59
  // next navigation misreading it as "atoms were seeded externally" and skipping the API call.
61
60
  const hasResolvedOnceRef = useRef(false);
62
61
 
63
- // Gate: re-resolving the URL on a client-side change (PDP variant reset) is opt-in per org
64
- // via Statsig. When off, keep the original behavior (resolve once, then short-circuit).
65
- // Read via useContext (not useFeatureFlagService) so a bare PageProvider — e.g. in unit
66
- // tests — does not throw; absent provider or gate resolves to false.
67
- const featureFlagContext = useContext(FeatureFlagServiceContext);
68
- const isVariantResetEnabled =
69
- featureFlagContext?.featureFlagService?.isFeatureGateEnabled(
70
- FeatureGates.IsPdpVariantContextResetEnabled,
71
- ) ?? false;
72
-
73
62
  useEffect(() => {
74
63
  setPageUrl(window.location.href);
75
64
  }, []);
@@ -123,36 +112,27 @@ export const PageProvider: React.FC<{
123
112
 
124
113
  const cleansedUrl = pageUrl.toLowerCase().trim();
125
114
 
126
- if (!isVariantResetEnabled) {
127
- // Gate off: original behavior — resolve once, then short-circuit forever while the
128
- // variant/userEvent atoms are set (a client-side URL change never re-resolves).
129
- if (previewMode || userEvent || variantInfo) {
130
- setIsLoading(false);
131
- return;
132
- }
133
- } else {
134
- // Gate on: re-resolve when the URL changes so a PDP variant swap follows to the new
135
- // product.
136
- //
137
- // Already resolved this exact URL — guards against the effect re-running once the
138
- // resolver writes the variant/userEvent atoms (they are effect dependencies).
139
- if (lastResolvedUrlRef.current === cleansedUrl) {
140
- setIsLoading(false);
141
- return;
142
- }
143
- // In preview mode, or when the atoms were seeded externally (e.g. by storybook)
144
- // before we ourselves resolved anything, honor those atoms and skip the API call.
145
- // Once we have resolved at least once (`hasResolvedOnceRef`), a changed URL should
146
- // re-resolve even though the previous variant/userEvent atoms are set.
147
- if (previewMode || ((userEvent || variantInfo) && !hasResolvedOnceRef.current)) {
148
- hasResolvedOnceRef.current = true;
149
- lastResolvedUrlRef.current = cleansedUrl;
150
- setIsLoading(false);
151
- return;
152
- }
115
+ // Re-resolve when the URL changes so a client-side PDP variant swap follows to the new
116
+ // product.
117
+ //
118
+ // Already resolved this exact URL — guards against the effect re-running once the
119
+ // resolver writes the variant/userEvent atoms (they are effect dependencies).
120
+ if (lastResolvedUrlRef.current === cleansedUrl) {
121
+ setIsLoading(false);
122
+ return;
123
+ }
124
+ // In preview mode, or when the atoms were seeded externally (e.g. by storybook)
125
+ // before we ourselves resolved anything, honor those atoms and skip the API call.
126
+ // Once we have resolved at least once (`hasResolvedOnceRef`), a changed URL should
127
+ // re-resolve even though the previous variant/userEvent atoms are set.
128
+ if (previewMode || ((userEvent || variantInfo) && !hasResolvedOnceRef.current)) {
153
129
  hasResolvedOnceRef.current = true;
154
130
  lastResolvedUrlRef.current = cleansedUrl;
131
+ setIsLoading(false);
132
+ return;
155
133
  }
134
+ hasResolvedOnceRef.current = true;
135
+ lastResolvedUrlRef.current = cleansedUrl;
156
136
 
157
137
  const response =
158
138
  urlResolverResponse[cleansedUrl] ??
@@ -165,7 +145,7 @@ export const PageProvider: React.FC<{
165
145
  // open a window where isLoading=false while variantInfo/isSupported still belong to
166
146
  // the previous product (causing widget flashes and a fire-once success ref — see
167
147
  // Widgets.tsx — to latch onto the wrong product's state).
168
- if (isVariantResetEnabled && lastResolvedUrlRef.current !== cleansedUrl) {
148
+ if (lastResolvedUrlRef.current !== cleansedUrl) {
169
149
  return;
170
150
  }
171
151
 
@@ -205,7 +185,6 @@ export const PageProvider: React.FC<{
205
185
  variantInfo,
206
186
  previewMode,
207
187
  onUrlResolverNotReady,
208
- isVariantResetEnabled,
209
188
  ]);
210
189
 
211
190
  const { trackEvent } = useAmplitude();
@@ -396,6 +396,12 @@ export enum ProductCarouselLayoutV3 {
396
396
  GRID_MOBILE_HORIZONTAL_DESKTOP = 'grid-mobile-horizontal-desktop',
397
397
  }
398
398
 
399
+ export enum PartialViewModeV3 {
400
+ ENABLED = 'enabled',
401
+ MOBILE_ONLY = 'mobile-only',
402
+ DISABLED = 'disabled',
403
+ }
404
+
399
405
  interface FullPageSalesAgentWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.FullPageSalesAgentV3> {
400
406
  headerContainer?: string;
401
407
  autoHeight?: boolean;
@@ -408,12 +414,24 @@ interface FullPageSalesAgentWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3
408
414
  suggestionButtonType?: PromptButtonVariant;
409
415
  productCarouselLayout?: ProductCarouselLayoutV3;
410
416
  /**
411
- * When true (or unset), asking a question opens the conversation in a
412
- * partial-height sheet that keeps the welcome overlay's product grid
413
- * visible above it. Set to false to fall back to the full-screen takeover.
414
- * Default true (undefined and true = partial view enabled).
417
+ * @deprecated Use `partialViewMode` instead. Kept only so a merchant who
418
+ * set this to `false` before `partialViewMode` existed doesn't silently
419
+ * revert to partial view enabled — see the fallback resolution in
420
+ * FullPageSalesAgent.tsx. Never written by the Hub UI anymore.
415
421
  */
416
422
  partialViewEnabled?: boolean;
423
+ /**
424
+ * Whether asking a question opens the conversation in a partial-height
425
+ * sheet that keeps the welcome overlay's product grid visible above it
426
+ * (mobile: a bottom sheet; desktop: a side panel), instead of a
427
+ * full-screen takeover.
428
+ * - `enabled` (default when unset): partial view on both mobile and desktop.
429
+ * - `mobile-only`: partial view on mobile; desktop still gets the
430
+ * full-screen takeover (the desktop panel doesn't suit every merchant's
431
+ * layout the way the mobile sheet does).
432
+ * - `disabled`: full-screen takeover on both.
433
+ */
434
+ partialViewMode?: PartialViewModeV3;
417
435
  }
418
436
 
419
437
  type WidgetConfigV3 =