@xylabs/sdk-react 2.8.4 → 2.9.3

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 (107) hide show
  1. package/dist/components/BasePage/BasePage.js +2 -2
  2. package/dist/components/BasePage/BasePage.js.map +1 -1
  3. package/dist/components/BasePage/BasePage.stories.js +4 -0
  4. package/dist/components/BasePage/BasePage.stories.js.map +1 -1
  5. package/dist/components/BasePage/BasePageProps.d.ts +2 -0
  6. package/dist/components/Experiments/Experiment.d.ts +1 -0
  7. package/dist/components/Experiments/Experiment.js.map +1 -1
  8. package/dist/components/Experiments/Experiments.d.ts +3 -8
  9. package/dist/components/Experiments/Experiments.js +18 -2
  10. package/dist/components/Experiments/Experiments.js.map +1 -1
  11. package/dist/components/Experiments/Experiments.stories.d.ts +6 -0
  12. package/dist/components/Experiments/Experiments.stories.js +27 -0
  13. package/dist/components/Experiments/Experiments.stories.js.map +1 -0
  14. package/dist/components/Experiments/ExperimentsDebugger.d.ts +3 -0
  15. package/dist/components/Experiments/ExperimentsDebugger.js +37 -0
  16. package/dist/components/Experiments/ExperimentsDebugger.js.map +1 -0
  17. package/dist/components/Experiments/ExperimentsDebugger.stories.d.ts +6 -0
  18. package/dist/components/Experiments/ExperimentsDebugger.stories.js +20 -0
  19. package/dist/components/Experiments/ExperimentsDebugger.stories.js.map +1 -0
  20. package/dist/components/Experiments/ExperimentsProps.d.ts +7 -0
  21. package/dist/components/Experiments/ExperimentsProps.js +2 -0
  22. package/dist/components/Experiments/ExperimentsProps.js.map +1 -0
  23. package/dist/components/Experiments/index.d.ts +2 -1
  24. package/dist/components/Experiments/index.js +2 -1
  25. package/dist/components/Experiments/index.js.map +1 -1
  26. package/dist/components/Experiments/models/index.d.ts +12 -0
  27. package/dist/components/Experiments/models/index.js +3 -0
  28. package/dist/components/Experiments/models/index.js.map +1 -0
  29. package/dist/components/dialogs/ErrorDialog.d.ts +1 -1
  30. package/dist/components/dialogs/ErrorDialog.js.map +1 -1
  31. package/dist/esm2017/components/BasePage/BasePageProps.d.ts +2 -0
  32. package/dist/esm2017/components/Experiments/Experiment.d.ts +1 -0
  33. package/dist/esm2017/components/Experiments/Experiments.d.ts +3 -8
  34. package/dist/esm2017/components/Experiments/Experiments.stories.d.ts +6 -0
  35. package/dist/esm2017/components/Experiments/ExperimentsDebugger.d.ts +3 -0
  36. package/dist/esm2017/components/Experiments/ExperimentsDebugger.stories.d.ts +6 -0
  37. package/dist/esm2017/components/Experiments/ExperimentsProps.d.ts +7 -0
  38. package/dist/esm2017/components/Experiments/index.d.ts +2 -1
  39. package/dist/esm2017/components/Experiments/models/index.d.ts +12 -0
  40. package/dist/esm2017/components/dialogs/ErrorDialog.d.ts +1 -1
  41. package/dist/esm2017/hooks/index.d.ts +1 -0
  42. package/dist/esm2017/hooks/useLocalStorage.d.ts +1 -0
  43. package/dist/esm2017/index.js +84 -6
  44. package/dist/esm2017/index.js.map +1 -1
  45. package/dist/esm5/components/BasePage/BasePageProps.d.ts +2 -0
  46. package/dist/esm5/components/Experiments/Experiment.d.ts +1 -0
  47. package/dist/esm5/components/Experiments/Experiments.d.ts +3 -8
  48. package/dist/esm5/components/Experiments/Experiments.stories.d.ts +6 -0
  49. package/dist/esm5/components/Experiments/ExperimentsDebugger.d.ts +3 -0
  50. package/dist/esm5/components/Experiments/ExperimentsDebugger.stories.d.ts +6 -0
  51. package/dist/esm5/components/Experiments/ExperimentsProps.d.ts +7 -0
  52. package/dist/esm5/components/Experiments/index.d.ts +2 -1
  53. package/dist/esm5/components/Experiments/models/index.d.ts +12 -0
  54. package/dist/esm5/components/dialogs/ErrorDialog.d.ts +1 -1
  55. package/dist/esm5/hooks/index.d.ts +1 -0
  56. package/dist/esm5/hooks/useLocalStorage.d.ts +1 -0
  57. package/dist/esm5/index.js +84 -6
  58. package/dist/esm5/index.js.map +1 -1
  59. package/dist/hooks/index.d.ts +1 -0
  60. package/dist/hooks/index.js +1 -0
  61. package/dist/hooks/index.js.map +1 -1
  62. package/dist/hooks/useLocalStorage.d.ts +1 -0
  63. package/dist/hooks/useLocalStorage.js +23 -0
  64. package/dist/hooks/useLocalStorage.js.map +1 -0
  65. package/dist/node/components/BasePage/BasePageProps.d.ts +2 -0
  66. package/dist/node/components/Experiments/Experiment.d.ts +1 -0
  67. package/dist/node/components/Experiments/Experiments.d.ts +3 -8
  68. package/dist/node/components/Experiments/Experiments.stories.d.ts +6 -0
  69. package/dist/node/components/Experiments/ExperimentsDebugger.d.ts +3 -0
  70. package/dist/node/components/Experiments/ExperimentsDebugger.stories.d.ts +6 -0
  71. package/dist/node/components/Experiments/ExperimentsProps.d.ts +7 -0
  72. package/dist/node/components/Experiments/index.d.ts +2 -1
  73. package/dist/node/components/Experiments/models/index.d.ts +12 -0
  74. package/dist/node/components/dialogs/ErrorDialog.d.ts +1 -1
  75. package/dist/node/hooks/index.d.ts +1 -0
  76. package/dist/node/hooks/useLocalStorage.d.ts +1 -0
  77. package/dist/node/index.js +84 -4
  78. package/dist/node/index.js.map +1 -1
  79. package/dist/node-esm/components/BasePage/BasePageProps.d.ts +2 -0
  80. package/dist/node-esm/components/Experiments/Experiment.d.ts +1 -0
  81. package/dist/node-esm/components/Experiments/Experiments.d.ts +3 -8
  82. package/dist/node-esm/components/Experiments/Experiments.stories.d.ts +6 -0
  83. package/dist/node-esm/components/Experiments/ExperimentsDebugger.d.ts +3 -0
  84. package/dist/node-esm/components/Experiments/ExperimentsDebugger.stories.d.ts +6 -0
  85. package/dist/node-esm/components/Experiments/ExperimentsProps.d.ts +7 -0
  86. package/dist/node-esm/components/Experiments/index.d.ts +2 -1
  87. package/dist/node-esm/components/Experiments/models/index.d.ts +12 -0
  88. package/dist/node-esm/components/dialogs/ErrorDialog.d.ts +1 -1
  89. package/dist/node-esm/hooks/index.d.ts +1 -0
  90. package/dist/node-esm/hooks/useLocalStorage.d.ts +1 -0
  91. package/dist/node-esm/index.js +84 -6
  92. package/dist/node-esm/index.js.map +1 -1
  93. package/package.json +12 -13
  94. package/src/components/BasePage/BasePage.stories.tsx +5 -0
  95. package/src/components/BasePage/BasePage.tsx +3 -0
  96. package/src/components/BasePage/BasePageProps.ts +2 -0
  97. package/src/components/Experiments/Experiment.tsx +1 -0
  98. package/src/components/Experiments/Experiments.stories.tsx +35 -0
  99. package/src/components/Experiments/Experiments.tsx +21 -10
  100. package/src/components/Experiments/ExperimentsDebugger.stories.tsx +24 -0
  101. package/src/components/Experiments/ExperimentsDebugger.tsx +71 -0
  102. package/src/components/Experiments/ExperimentsProps.ts +9 -0
  103. package/src/components/Experiments/index.tsx +2 -1
  104. package/src/components/Experiments/models/index.ts +8 -0
  105. package/src/components/dialogs/ErrorDialog.tsx +0 -1
  106. package/src/hooks/index.ts +1 -0
  107. package/src/hooks/useLocalStorage.ts +24 -0
@@ -1,3 +1,4 @@
1
1
  import { Experiment } from './Experiment';
2
2
  import { Experiments } from './Experiments';
3
- export { Experiment, Experiments };
3
+ import { ExperimentsDebugger } from './ExperimentsDebugger';
4
+ export { Experiment, Experiments, ExperimentsDebugger };
@@ -0,0 +1,12 @@
1
+ export declare const OutcomesLocalStorageKey = "outcomes";
2
+ export declare const ExperimentsLocalStorageKey = "experiments";
3
+ export declare type OutcomesData = Record<string, number>;
4
+ export declare type ExperimentsData = Record<string, ExperimentData>;
5
+ export declare type ExperimentData = {
6
+ totalWeight: number;
7
+ variants: VariantData[];
8
+ };
9
+ export declare type VariantData = {
10
+ weight: number;
11
+ name?: string;
12
+ };
@@ -1,5 +1,5 @@
1
+ /// <reference types="react" />
1
2
  import { DialogProps } from '@mui/material';
2
- import React from 'react';
3
3
  export interface ErrorDialogProps extends DialogProps {
4
4
  error?: Error;
5
5
  onAction?: (retry: boolean) => void;
@@ -1,4 +1,5 @@
1
1
  export * from './useBreakpoint';
2
+ export * from './useLocalStorage';
2
3
  export * from './useMediaQuery';
3
4
  export * from './useMounted';
4
5
  export * from './useNavigateToEthAddress';
@@ -0,0 +1 @@
1
+ export declare const useLocalStorage: <T>(key: string, defaultValue: T) => [T, (value: T) => void];
@@ -144,6 +144,16 @@ function __read(o, n) {
144
144
  finally { if (e) throw e.error; }
145
145
  }
146
146
  return ar;
147
+ }
148
+
149
+ function __spreadArray(to, from, pack) {
150
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
151
+ if (ar || !(i in from)) {
152
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
153
+ ar[i] = from[i];
154
+ }
155
+ }
156
+ return to.concat(ar || Array.prototype.slice.call(from));
147
157
  }
148
158
 
149
159
  var BusyCircularProgress = function (_a) {
@@ -2155,10 +2165,10 @@ var InvertableThemeProvider = function (_a) {
2155
2165
  };
2156
2166
 
2157
2167
  var BasePage = function (_a) {
2158
- var disableGutters = _a.disableGutters, children = _a.children, beta = _a.beta, container = _a.container, hideFooter = _a.hideFooter, appFooter = _a.appFooter, appBar = _a.appBar, cookieConsent = _a.cookieConsent, hideAppBar = _a.hideAppBar, _b = _a.noindex, noindex = _b === void 0 ? false : _b, _c = _a.scrollToTopButton, scrollToTopButton = _c === void 0 ? false : _c, title = _a.title, props = __rest(_a, ["disableGutters", "children", "beta", "container", "hideFooter", "appFooter", "appBar", "cookieConsent", "hideAppBar", "noindex", "scrollToTopButton", "title"]);
2168
+ var disableGutters = _a.disableGutters, children = _a.children, beta = _a.beta, container = _a.container, hideFooter = _a.hideFooter, appFooter = _a.appFooter, appBar = _a.appBar, cookieConsent = _a.cookieConsent, filterBar = _a.filterBar, hideAppBar = _a.hideAppBar, hideFilterBar = _a.hideFilterBar, _b = _a.noindex, noindex = _b === void 0 ? false : _b, _c = _a.scrollToTopButton, scrollToTopButton = _c === void 0 ? false : _c, title = _a.title, props = __rest(_a, ["disableGutters", "children", "beta", "container", "hideFooter", "appFooter", "appBar", "cookieConsent", "filterBar", "hideAppBar", "hideFilterBar", "noindex", "scrollToTopButton", "title"]);
2159
2169
  var theme = material.useTheme();
2160
2170
  var scrollToTopAnchorId = 'scroll-to-top-anchor';
2161
- return (jsxRuntime.jsxs(FlexCol, __assign({ justifyContent: "flex-start", color: theme.palette.text.primary, alignItems: "stretch", width: "100%", maxWidth: "100vw", minHeight: "100vh" }, props, { children: [jsxRuntime.jsx(reactHelmet.Helmet, __assign({ title: title }, { children: noindex ? jsxRuntime.jsx("meta", { content: "noindex", name: "robots" }, void 0) : null }), void 0), scrollToTopButton ? jsxRuntime.jsx("div", { id: scrollToTopAnchorId }, void 0) : null, hideAppBar ? null : appBar, beta ? (jsxRuntime.jsx(FlexRow, __assign({ margin: 1, position: "absolute", top: 0, left: 0, bgcolor: "#cccccc88", paddingX: 1, style: { opacity: 0.5 } }, { children: jsxRuntime.jsx(material.Typography, __assign({ variant: "body2" }, { children: "Important: This page is a Beta page. It is possible that some information may not be correct." }), void 0) }), void 0)) : null, container ? (jsxRuntime.jsx(material.Container, __assign({ style: { alignItems: 'stretch', display: 'flex', flexDirection: 'column', flexGrow: 1 }, maxWidth: container, disableGutters: disableGutters }, { children: children }), void 0)) : (children), hideFooter ? null : jsxRuntime.jsx("footer", { children: appFooter }, void 0), cookieConsent !== null && cookieConsent !== void 0 ? cookieConsent : (jsxRuntime.jsx(material.ScopedCssBaseline, { children: jsxRuntime.jsx(InvertableThemeProvider, __assign({ invert: true }, { children: jsxRuntime.jsx(CookieConsent, { borderRadius: 0 }, void 0) }), void 0) }, void 0)), scrollToTopButton ? (jsxRuntime.jsx(ScrollToTopButton, __assign({ anchorId: scrollToTopAnchorId }, { children: jsxRuntime.jsx(material.Fab, __assign({ "aria-label": "scroll to top", color: "secondary", size: "small" }, { children: jsxRuntime.jsx(iconsMaterial.KeyboardArrowUp, {}, void 0) }), void 0) }), void 0)) : null] }), void 0));
2171
+ return (jsxRuntime.jsxs(FlexCol, __assign({ justifyContent: "flex-start", color: theme.palette.text.primary, alignItems: "stretch", width: "100%", maxWidth: "100vw", minHeight: "100vh" }, props, { children: [jsxRuntime.jsx(reactHelmet.Helmet, __assign({ title: title }, { children: noindex ? jsxRuntime.jsx("meta", { content: "noindex", name: "robots" }, void 0) : null }), void 0), scrollToTopButton ? jsxRuntime.jsx("div", { id: scrollToTopAnchorId }, void 0) : null, hideAppBar ? null : appBar, hideFilterBar ? null : filterBar, beta ? (jsxRuntime.jsx(FlexRow, __assign({ margin: 1, position: "absolute", top: 0, left: 0, bgcolor: "#cccccc88", paddingX: 1, style: { opacity: 0.5 } }, { children: jsxRuntime.jsx(material.Typography, __assign({ variant: "body2" }, { children: "Important: This page is a Beta page. It is possible that some information may not be correct." }), void 0) }), void 0)) : null, container ? (jsxRuntime.jsx(material.Container, __assign({ style: { alignItems: 'stretch', display: 'flex', flexDirection: 'column', flexGrow: 1 }, maxWidth: container, disableGutters: disableGutters }, { children: children }), void 0)) : (children), hideFooter ? null : jsxRuntime.jsx("footer", { children: appFooter }, void 0), cookieConsent !== null && cookieConsent !== void 0 ? cookieConsent : (jsxRuntime.jsx(material.ScopedCssBaseline, { children: jsxRuntime.jsx(InvertableThemeProvider, __assign({ invert: true }, { children: jsxRuntime.jsx(CookieConsent, { borderRadius: 0 }, void 0) }), void 0) }, void 0)), scrollToTopButton ? (jsxRuntime.jsx(ScrollToTopButton, __assign({ anchorId: scrollToTopAnchorId }, { children: jsxRuntime.jsx(material.Fab, __assign({ "aria-label": "scroll to top", color: "secondary", size: "small" }, { children: jsxRuntime.jsx(iconsMaterial.KeyboardArrowUp, {}, void 0) }), void 0) }), void 0)) : null] }), void 0));
2162
2172
  };
2163
2173
 
2164
2174
  var getPartialPath = function (pathParts, index) {
@@ -2238,6 +2248,26 @@ var useBreakpoint = function () {
2238
2248
  }
2239
2249
  };
2240
2250
 
2251
+ var useLocalStorage = function (key, defaultValue) {
2252
+ var _a = __read(react.useState(function () {
2253
+ try {
2254
+ var item = getLocalStorageObject(key);
2255
+ return item || defaultValue;
2256
+ }
2257
+ catch (ex) {
2258
+ //Error is already logged
2259
+ return defaultValue;
2260
+ }
2261
+ }), 2), storedValue = _a[0], setStoredValue = _a[1];
2262
+ var setValue = function (value) {
2263
+ console.log('setValue', value);
2264
+ setStoredValue(value);
2265
+ setLocalStorageObject(key, value);
2266
+ console.log('getValue from ls', getLocalStorageObject(key));
2267
+ };
2268
+ return [storedValue, setValue];
2269
+ };
2270
+
2241
2271
  var useMounted = function () {
2242
2272
  var _a = __read(react.useState(true), 2), mounted = _a[0], setMounted = _a[1];
2243
2273
  react.useEffect(function () {
@@ -2361,14 +2391,17 @@ var Experiment = function (props) {
2361
2391
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children }, void 0);
2362
2392
  };
2363
2393
 
2394
+ var OutcomesLocalStorageKey = 'outcomes';
2395
+ var ExperimentsLocalStorageKey = 'experiments';
2396
+
2364
2397
  var defaultLocalStorageKey = 'testData';
2365
2398
  var experimentsTestData = {};
2366
2399
  var outcomes = {}; //prevent multi-outcome
2367
2400
  var saveOutcomes = function () {
2368
- setLocalStorageObject('outcomes', outcomes);
2401
+ setLocalStorageObject(OutcomesLocalStorageKey, outcomes);
2369
2402
  };
2370
2403
  var loadOutcomes = function () {
2371
- outcomes = getLocalStorageObject('outcomes');
2404
+ outcomes = getLocalStorageObject(OutcomesLocalStorageKey);
2372
2405
  };
2373
2406
  var mergeData = function (data, log) {
2374
2407
  var dataArray = [];
@@ -2412,6 +2445,20 @@ var calcTotalWeight = function (childList) {
2412
2445
  }
2413
2446
  return totalWeight;
2414
2447
  };
2448
+ var saveExperimentDebugRanges = function (name, totalWeight, childList) {
2449
+ var experiments = getLocalStorageObject(ExperimentsLocalStorageKey) || {};
2450
+ experiments[name] = {
2451
+ totalWeight: totalWeight,
2452
+ variants: childList.map(function (child) {
2453
+ var _a;
2454
+ return ({
2455
+ name: (_a = child.key) === null || _a === void 0 ? void 0 : _a.toString(),
2456
+ weight: child.props.weight,
2457
+ });
2458
+ }),
2459
+ };
2460
+ setLocalStorageObject(ExperimentsLocalStorageKey, experiments);
2461
+ };
2415
2462
  var Experiments = function (props) {
2416
2463
  var e_2, _a;
2417
2464
  var _b, _c;
@@ -2422,6 +2469,7 @@ var Experiments = function (props) {
2422
2469
  var localStorageKey = buildLocalStorageKey(localStorageProp);
2423
2470
  var childList = makeChildrenArray(children);
2424
2471
  var totalWeight = calcTotalWeight(childList);
2472
+ saveExperimentDebugRanges(name, totalWeight, childList);
2425
2473
  var firstTime = outcomes[name] === undefined;
2426
2474
  var targetWeight = (_b = outcomes[name]) !== null && _b !== void 0 ? _b : Math.random() * totalWeight;
2427
2475
  outcomes[name] = targetWeight;
@@ -2457,6 +2505,36 @@ var Experiments = function (props) {
2457
2505
  throw new Error('Experiment Choice Failed');
2458
2506
  };
2459
2507
 
2508
+ var ExperimentsDebugger = function (_a) {
2509
+ var props = __rest(_a, []);
2510
+ var _b = __read(useLocalStorage(ExperimentsLocalStorageKey, {}), 1), experiments = _b[0];
2511
+ var _c = __read(useLocalStorage(OutcomesLocalStorageKey, {}), 2), outcomes = _c[0], setOutcomes = _c[1];
2512
+ var sumUpVariants = function (items) { return items.reduce(function (acc, curr) { return acc + curr.weight; }, 0); };
2513
+ var experimentEntries = Object.entries(experiments);
2514
+ if (!experiments || !experimentEntries.length) {
2515
+ return (jsxRuntime.jsxs(FlexCol, __assign({ alignItems: "stretch" }, props, { children: [jsxRuntime.jsx(material.Typography, __assign({ variant: "subtitle1" }, { children: "No Experiments loaded" }), void 0), jsxRuntime.jsx(material.Typography, __assign({ variant: "subtitle2" }, { children: "Visit a page with an experiment to load the data" }), void 0)] }), void 0));
2516
+ }
2517
+ return (jsxRuntime.jsx(FlexCol, __assign({ alignItems: "stretch" }, props, { children: Object.entries(experiments).map(function (data) {
2518
+ var _a = __read(data, 2), name = _a[0], experiment = _a[1];
2519
+ var outcome = (outcomes[name] || 0);
2520
+ var marks = __spreadArray([
2521
+ { label: "".concat(experiment.variants[0].name, " | ").concat(experiment.variants[0].weight), value: 0 }
2522
+ ], __read(experiment.variants.map(function (_a, index) {
2523
+ var weight = _a.weight;
2524
+ return ({
2525
+ label: index === experiment.variants.length - 1 ? 'End' : "".concat(experiment.variants[index + 1].name, " | ").concat(weight),
2526
+ value: index === 0 ? weight : sumUpVariants(experiment.variants.slice(0, index + 1)),
2527
+ });
2528
+ })), false);
2529
+ return (jsxRuntime.jsxs(FlexCol, __assign({ alignItems: "stretch", paddingX: 4, marginBottom: 4 }, props, { children: [jsxRuntime.jsxs(FlexRow, { children: [name, ":\u00A0", outcome] }, void 0), jsxRuntime.jsx(FlexRow, { children: jsxRuntime.jsx(material.Slider, { "aria-label": "Experiment ".concat(name), defaultValue: outcome, value: outcome, marks: marks, onChange: function (e, value) {
2530
+ var truncated = Number((Array.isArray(value) ? value[0] : value).toFixed(2));
2531
+ outcomes[name] = truncated;
2532
+ // Spread operator triggers rerender
2533
+ setOutcomes(__assign({}, outcomes));
2534
+ } }, void 0) }, void 0)] }), "experiment-".concat(name)));
2535
+ }) }), void 0));
2536
+ };
2537
+
2460
2538
  var LinkToEx = function (_a) {
2461
2539
  var to = _a.to, props = __rest(_a, ["to"]);
2462
2540
  return jsxRuntime.jsx(material.Link, __assign({ component: reactRouterDom.Link, to: to }, props), void 0);
@@ -2581,6 +2659,7 @@ exports.EthersContext = EthersContext;
2581
2659
  exports.EthersLoader = EthersLoader;
2582
2660
  exports.Experiment = Experiment;
2583
2661
  exports.Experiments = Experiments;
2662
+ exports.ExperimentsDebugger = ExperimentsDebugger;
2584
2663
  exports.FacebookCustomEvent = FacebookCustomEvent;
2585
2664
  exports.FacebookStandardEvents = FacebookStandardEvents;
2586
2665
  exports.Fbq = Fbq;
@@ -2634,6 +2713,7 @@ exports.setSessionStorageObject = setSessionStorageObject;
2634
2713
  exports.useAsyncEffect = useAsyncEffect;
2635
2714
  exports.useBreakpoint = useBreakpoint;
2636
2715
  exports.useCookieConsent = useCookieConsent;
2716
+ exports.useLocalStorage = useLocalStorage;
2637
2717
  exports.useMounted = useMounted;
2638
2718
  exports.useNavigateToEthAddress = useNavigateToEthAddress;
2639
2719
  exports.useSpacing = useSpacing;