@xylabs/sdk-react 2.12.7 → 2.12.10

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 (49) hide show
  1. package/dist/cjs/common/ExperimentsHelper.d.ts +20 -0
  2. package/dist/cjs/common/ExperimentsHelper.js +102 -0
  3. package/dist/cjs/common/ExperimentsHelper.js.map +1 -0
  4. package/dist/cjs/common/index.d.ts +1 -0
  5. package/dist/cjs/common/index.js +5 -0
  6. package/dist/cjs/common/index.js.map +1 -0
  7. package/dist/cjs/components/EthAccount/EthAccountBox.js +2 -2
  8. package/dist/cjs/components/EthAccount/EthAccountBox.js.map +1 -1
  9. package/dist/cjs/components/Experiments/index.d.ts +1 -0
  10. package/dist/cjs/components/Experiments/index.js +1 -0
  11. package/dist/cjs/components/Experiments/index.js.map +1 -1
  12. package/dist/cjs/hooks/useExperiment.d.ts +8 -0
  13. package/dist/cjs/hooks/useExperiment.js +30 -0
  14. package/dist/cjs/hooks/useExperiment.js.map +1 -0
  15. package/dist/cjs/lib/Tracking/Drip/BaseEvent.js +1 -0
  16. package/dist/cjs/lib/Tracking/Drip/BaseEvent.js.map +1 -1
  17. package/dist/cjs/lib/Tracking/Tapjoy/StandardEvents.d.ts +1 -1
  18. package/dist/cjs/lib/Tracking/Tapjoy/StandardEvents.js +2 -2
  19. package/dist/cjs/lib/Tracking/Tapjoy/StandardEvents.js.map +1 -1
  20. package/dist/docs.json +15694 -15421
  21. package/dist/esm/common/ExperimentsHelper.d.ts +20 -0
  22. package/dist/esm/common/ExperimentsHelper.js +98 -0
  23. package/dist/esm/common/ExperimentsHelper.js.map +1 -0
  24. package/dist/esm/common/index.d.ts +1 -0
  25. package/dist/esm/common/index.js +2 -0
  26. package/dist/esm/common/index.js.map +1 -0
  27. package/dist/esm/components/EthAccount/EthAccountBox.js +2 -2
  28. package/dist/esm/components/EthAccount/EthAccountBox.js.map +1 -1
  29. package/dist/esm/components/Experiments/index.d.ts +1 -0
  30. package/dist/esm/components/Experiments/index.js +1 -0
  31. package/dist/esm/components/Experiments/index.js.map +1 -1
  32. package/dist/esm/hooks/useExperiment.d.ts +8 -0
  33. package/dist/esm/hooks/useExperiment.js +25 -0
  34. package/dist/esm/hooks/useExperiment.js.map +1 -0
  35. package/dist/esm/lib/Tracking/Drip/BaseEvent.js +1 -0
  36. package/dist/esm/lib/Tracking/Drip/BaseEvent.js.map +1 -1
  37. package/dist/esm/lib/Tracking/Tapjoy/StandardEvents.d.ts +1 -1
  38. package/dist/esm/lib/Tracking/Tapjoy/StandardEvents.js +2 -2
  39. package/dist/esm/lib/Tracking/Tapjoy/StandardEvents.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/common/ExperimentsHelper.ts +111 -0
  42. package/src/common/index.ts +1 -0
  43. package/src/components/EthAccount/EthAccountBox.stories.tsx +1 -1
  44. package/src/components/EthAccount/EthAccountBox.tsx +6 -3
  45. package/src/components/Experiments/index.tsx +1 -0
  46. package/src/hooks/useExperiment.ts +31 -0
  47. package/src/hooks/useExperiments.stories.tsx +43 -0
  48. package/src/lib/Tracking/Drip/BaseEvent.ts +1 -0
  49. package/src/lib/Tracking/Tapjoy/StandardEvents.ts +2 -2
@@ -0,0 +1,20 @@
1
+ import { ReactElement } from 'react';
2
+ import { Log } from '@xylabs/sdk-js';
3
+ import { ExperimentProps, ExperimentsData, OutcomesData, VariantData } from '../components';
4
+ import { UserEventHandler } from '@xylabs/pixel';
5
+ import { UserEventsProps } from '../contexts';
6
+ declare const ExperimentsHelper: {
7
+ buildLocalStorageKey: (localStorageProp: boolean | string) => string;
8
+ calcTotalWeight: (variants: VariantData[]) => number;
9
+ calculateExperiment: (name: string, localStorageProp: string | boolean, variants: VariantData[], userEvents: UserEventHandler<UserEventsProps>) => VariantData | undefined;
10
+ getExperiment: (name: string) => import("../components").ExperimentData;
11
+ getSelectedVariant: (name: string) => VariantData | undefined;
12
+ loadOutcomes: () => OutcomesData;
13
+ makeChildrenArray: (children: ReactElement<ExperimentProps>[] | ReactElement<ExperimentProps>) => ReactElement<ExperimentProps, string | import("react").JSXElementConstructor<any>>[];
14
+ mergeData: (data: {
15
+ [index: string]: string;
16
+ }, log?: Log | undefined) => string;
17
+ saveExperimentRanges: (name: string, totalWeight: number, variants: VariantData[]) => ExperimentsData;
18
+ saveOutcomes: () => void;
19
+ };
20
+ export { ExperimentsHelper };
@@ -0,0 +1,98 @@
1
+ import { forget } from '@xylabs/sdk-js';
2
+ import { ExperimentsLocalStorageKey, OutcomesLocalStorageKey } from '../components';
3
+ import { getLocalStorageObject, setLocalStorageObject } from '../lib';
4
+ const defaultLocalStorageKey = 'testData';
5
+ const experimentsTestData = {};
6
+ let outcomes = {}; //prevent multi-outcome
7
+ // TODO - some expire logic around experiments
8
+ const ExperimentsHelper = {
9
+ buildLocalStorageKey: (localStorageProp) => {
10
+ return localStorageProp === true ? defaultLocalStorageKey : typeof localStorageProp === 'string' ? localStorageProp ?? defaultLocalStorageKey : '';
11
+ },
12
+ calcTotalWeight: (variants) => {
13
+ return variants.reduce((sum, variant) => {
14
+ return sum + variant.weight;
15
+ }, 0);
16
+ },
17
+ calculateExperiment: (name, localStorageProp, variants, userEvents) => {
18
+ //TODO - user events, it needs to be in the hook, all other compatibility should
19
+ ExperimentsHelper.loadOutcomes();
20
+ const localStorageKey = ExperimentsHelper.buildLocalStorageKey(localStorageProp);
21
+ const totalWeight = ExperimentsHelper.calcTotalWeight(variants);
22
+ ExperimentsHelper.saveExperimentRanges(name, totalWeight, variants);
23
+ const firstTime = name in outcomes;
24
+ let targetWeight = outcomes[name] ?? Math.random() * totalWeight;
25
+ outcomes[name] = targetWeight;
26
+ ExperimentsHelper.saveOutcomes();
27
+ for (const variant of variants) {
28
+ targetWeight -= variant.weight;
29
+ if (targetWeight > 0)
30
+ continue;
31
+ if (!variant.name) {
32
+ throw new Error('Experiment Elements must have Keys');
33
+ }
34
+ experimentsTestData[name] = variant.name;
35
+ if (firstTime) {
36
+ localStorage.setItem(localStorageKey, ExperimentsHelper.mergeData(experimentsTestData));
37
+ }
38
+ if (userEvents) {
39
+ forget(userEvents.testStarted({ name, variation: variant.name }));
40
+ }
41
+ return variant;
42
+ }
43
+ },
44
+ getExperiment: (name) => {
45
+ ExperimentsHelper.loadOutcomes();
46
+ const experiments = getLocalStorageObject(ExperimentsLocalStorageKey) || {};
47
+ return experiments[name];
48
+ },
49
+ getSelectedVariant: (name) => {
50
+ const outcomes = ExperimentsHelper.loadOutcomes();
51
+ const experiment = ExperimentsHelper.getExperiment(name);
52
+ let total = 0;
53
+ if (experiment && outcomes) {
54
+ const targetWeight = outcomes[name];
55
+ for (let i = 0; i < experiment.variants.length; i++) {
56
+ const variant = experiment.variants[i];
57
+ total += variant.weight;
58
+ if (total >= targetWeight) {
59
+ return variant;
60
+ }
61
+ }
62
+ }
63
+ },
64
+ loadOutcomes: () => {
65
+ outcomes = getLocalStorageObject(OutcomesLocalStorageKey);
66
+ return outcomes;
67
+ },
68
+ makeChildrenArray: (children) => {
69
+ if (Array.isArray(children)) {
70
+ return children;
71
+ }
72
+ else {
73
+ return [children];
74
+ }
75
+ },
76
+ mergeData: (data, log) => {
77
+ const dataArray = [];
78
+ for (const key in data) {
79
+ dataArray.push(`${key}-${data[key]}`);
80
+ }
81
+ log?.info('MergeData', dataArray.join('|'));
82
+ return dataArray.join('|');
83
+ },
84
+ saveExperimentRanges: (name, totalWeight, variants) => {
85
+ const experiments = getLocalStorageObject(ExperimentsLocalStorageKey) || {};
86
+ experiments[name] = {
87
+ totalWeight,
88
+ variants,
89
+ };
90
+ setLocalStorageObject(ExperimentsLocalStorageKey, experiments);
91
+ return experiments;
92
+ },
93
+ saveOutcomes: () => {
94
+ setLocalStorageObject(OutcomesLocalStorageKey, outcomes);
95
+ },
96
+ };
97
+ export { ExperimentsHelper };
98
+ //# sourceMappingURL=ExperimentsHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentsHelper.js","sourceRoot":"","sources":["../../../src/common/ExperimentsHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './ExperimentsHelper';
@@ -0,0 +1,2 @@
1
+ export * from './ExperimentsHelper';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA"}
@@ -6,7 +6,7 @@ import { EthersContext } from '../../contexts';
6
6
  import { useMediaQuery } from '../../hooks';
7
7
  import { FlexRow } from '../FlexBox';
8
8
  import { Identicon } from '../Identicon';
9
- export const EthAccountBox = ({ address, icon = false, iconSize = 16, iconOnly = false, shortenedLength, addressLength = 'auto', fontFamily = '"Source Code Pro",monospace', ...props }) => {
9
+ export const EthAccountBox = ({ address, icon = false, iconSize = 16, iconOnly = false, shortenedLength, height, addressLength = 'auto', fontFamily = '"Source Code Pro",monospace', ...props }) => {
10
10
  const { localAddress } = useContext(EthersContext);
11
11
  const theme = useTheme();
12
12
  const large = useMediaQuery(theme.breakpoints.up('md'));
@@ -22,6 +22,6 @@ export const EthAccountBox = ({ address, icon = false, iconSize = 16, iconOnly =
22
22
  : addressToDisplay.toShortString()
23
23
  : '-- --';
24
24
  // Note: We use the all zero address for spacing in case it is
25
- return (_jsxs(FlexRow, { justifyContent: "space-between", alignItems: "center", minHeight: theme.spacing(3), ...props, children: [icon ? _jsx(Identicon, { minHeight: theme.spacing(3), minWidth: theme.spacing(3), bgcolor: theme.palette.secondary.main, size: iconSize, value: address?.toHex() }) : null, iconOnly ? null : (_jsx(Typography, { marginLeft: icon ? 1 : 0, variant: "body1", fontFamily: fontFamily, children: textToDisplay })), isLocalAddress ? _jsx(FlexRow, { marginLeft: 0.5, children: "(You)" }) : null] }));
25
+ return (_jsxs(FlexRow, { height: height, justifyContent: "space-between", alignItems: "stretch", minHeight: theme.spacing(3), ...props, children: [icon ? (_jsx(Identicon, { minHeight: height ?? theme.spacing(3), minWidth: height ?? theme.spacing(3), bgcolor: theme.palette.secondary.main, size: iconSize, value: address?.toHex() })) : null, iconOnly ? null : (_jsx(Typography, { alignSelf: "center", marginLeft: icon ? 1 : 0, variant: "body1", fontFamily: fontFamily, children: textToDisplay })), isLocalAddress ? _jsx(FlexRow, { marginLeft: 0.5, children: "(You)" }) : null] }));
26
26
  };
27
27
  //# sourceMappingURL=EthAccountBox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EthAccountBox.js","sourceRoot":"","sources":["../../../../src/components/EthAccount/EthAccountBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAgB,OAAO,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAGxC,MAAM,CAAC,MAAM,aAAa,GAA6C,CAAC,EACtE,OAAO,EACP,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,EAAE,EACb,QAAQ,GAAG,KAAK,EAChB,eAAe,EACf,aAAa,GAAG,MAAM,EACtB,UAAU,GAAG,6BAA6B,EAC1C,GAAG,KAAK,EACT,EAAE,EAAE;IACH,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IAClD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IAExB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAExF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAA;IAE9F,MAAM,aAAa,GAAG,OAAO;QAC3B,CAAC,CAAC,aAAa,KAAK,MAAM;YACxB,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAC7B,CAAC,CAAC,aAAa,KAAK,OAAO;gBAC3B,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,eAAe,CAAC;gBACjD,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE;oBAC7B,CAAC,CAAC,gBAAgB,CAAC,aAAa,EAAE;QACpC,CAAC,CAAC,OAAO,CAAA;IAEX,8DAA8D;IAE9D,OAAO,CACL,MAAC,OAAO,IAAC,cAAc,EAAC,eAAe,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAM,KAAK,aAC/F,IAAI,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,EACpK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,KAAC,UAAU,IAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAC,OAAO,EAAC,UAAU,EAAE,UAAU,YACzE,aAAa,GACH,CACd,EACA,cAAc,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,UAAU,EAAE,GAAG,sBAAiB,CAAC,CAAC,CAAC,IAAI,IAC1D,CACX,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"EthAccountBox.js","sourceRoot":"","sources":["../../../../src/components/EthAccount/EthAccountBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAgB,OAAO,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAGxC,MAAM,CAAC,MAAM,aAAa,GAA6C,CAAC,EACtE,OAAO,EACP,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,EAAE,EACb,QAAQ,GAAG,KAAK,EAChB,eAAe,EACf,MAAM,EACN,aAAa,GAAG,MAAM,EACtB,UAAU,GAAG,6BAA6B,EAC1C,GAAG,KAAK,EACT,EAAE,EAAE;IACH,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IAClD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IAExB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAExF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAA;IAE9F,MAAM,aAAa,GAAG,OAAO;QAC3B,CAAC,CAAC,aAAa,KAAK,MAAM;YACxB,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAC7B,CAAC,CAAC,aAAa,KAAK,OAAO;gBAC3B,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,eAAe,CAAC;gBACjD,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE;oBAC7B,CAAC,CAAC,gBAAgB,CAAC,aAAa,EAAE;QACpC,CAAC,CAAC,OAAO,CAAA;IAEX,8DAA8D;IAE9D,OAAO,CACL,MAAC,OAAO,IAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAC,eAAe,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAM,KAAK,aAChH,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,SAAS,IAAC,SAAS,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAI,CAC3K,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,KAAC,UAAU,IAAC,SAAS,EAAC,QAAQ,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAC,OAAO,EAAC,UAAU,EAAE,UAAU,YAC5F,aAAa,GACH,CACd,EACA,cAAc,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,UAAU,EAAE,GAAG,sBAAiB,CAAC,CAAC,CAAC,IAAI,IAC1D,CACX,CAAA;AACH,CAAC,CAAA"}
@@ -2,3 +2,4 @@ export * from './Experiment';
2
2
  export * from './Experiments';
3
3
  export * from './ExperimentsDebugger';
4
4
  export * from './ExperimentsProps';
5
+ export * from './models';
@@ -2,4 +2,5 @@ export * from './Experiment';
2
2
  export * from './Experiments';
3
3
  export * from './ExperimentsDebugger';
4
4
  export * from './ExperimentsProps';
5
+ export * from './models';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Experiments/index.tsx"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Experiments/index.tsx"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,UAAU,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+ import { VariantData } from '../components';
3
+ declare const selectVariantForExperiment: (name: string, variants: Record<string, ReactNode>, defaultNode: ReactNode) => ReactNode;
4
+ declare const useExperiments: (name: string, experiments: VariantData[]) => {
5
+ experimentName: string;
6
+ selectVariant: (variants: Record<string, ReactNode>, defaultNode: ReactNode) => ReactNode;
7
+ };
8
+ export { selectVariantForExperiment, useExperiments };
@@ -0,0 +1,25 @@
1
+ import { useState } from 'react';
2
+ import { ExperimentsHelper } from '../common';
3
+ import { useUserEvents } from './useUserEvents';
4
+ const selectVariant = (current) => (variants, defaultNode) => {
5
+ if (current && current in variants) {
6
+ return variants[current];
7
+ }
8
+ return defaultNode;
9
+ };
10
+ const selectVariantForExperiment = (name, variants, defaultNode) => {
11
+ const variant = ExperimentsHelper.getSelectedVariant(name);
12
+ if (variants[variant?.name ?? '']) {
13
+ return variants[variant?.name ?? ''];
14
+ }
15
+ return defaultNode;
16
+ };
17
+ const useExperiments = (name, experiments) => {
18
+ const [activeExperiment] = useState(ExperimentsHelper.calculateExperiment(name, true, experiments, useUserEvents()));
19
+ return {
20
+ experimentName: name,
21
+ selectVariant: selectVariant(activeExperiment?.name),
22
+ };
23
+ };
24
+ export { selectVariantForExperiment, useExperiments };
25
+ //# sourceMappingURL=useExperiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExperiment.js","sourceRoot":"","sources":["../../../src/hooks/useExperiment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC,QAAmC,EAAE,WAAsB,EAAE,EAAE;IAC1G,IAAI,OAAO,IAAI,OAAO,IAAI,QAAQ,EAAE;QAClC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;KACzB;IACD,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAE,QAAmC,EAAE,WAAsB,EAAE,EAAE;IAC/G,MAAM,OAAO,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAC1D,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE;QACjC,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;KACrC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,WAA0B,EAAE,EAAE;IAClE,MAAM,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;IAEpH,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC;KACrD,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,CAAA"}
@@ -12,6 +12,7 @@ export class DripBaseEvent {
12
12
  payload.push(this.param);
13
13
  }
14
14
  payload.push(data);
15
+ console.log('sdk-react', payload);
15
16
  this.dcq.push(payload);
16
17
  await delay(0);
17
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEvent.js","sourceRoot":"","sources":["../../../../../src/lib/Tracking/Drip/BaseEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAItC,MAAM,OAAO,aAAa;IAKxB,YAAY,IAAY,EAAE,KAAc;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAC1B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAO;QACvB,MAAM,OAAO,GAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;SACzB;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,MAAM,KAAK,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAEO,MAAM;QACZ,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAa,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAChB,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;SAC7B;QACD,OAAO,MAAM,CAAC,IAAsB,CAAA;IACtC,CAAC;IAEO,MAAM;QACZ,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAa,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAChB,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;SAC7B;QACD,OAAO,MAAM,CAAC,IAAsB,CAAA;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"BaseEvent.js","sourceRoot":"","sources":["../../../../../src/lib/Tracking/Drip/BaseEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAItC,MAAM,OAAO,aAAa;IAKxB,YAAY,IAAY,EAAE,KAAc;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAC1B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAO;QACvB,MAAM,OAAO,GAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;SACzB;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,MAAM,KAAK,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAEO,MAAM;QACZ,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAa,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAChB,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;SAC7B;QACD,OAAO,MAAM,CAAC,IAAsB,CAAA;IACtC,CAAC;IAEO,MAAM;QACZ,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAa,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAChB,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;SAC7B;QACD,OAAO,MAAM,CAAC,IAAsB,CAAA;IACtC,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import { TapjoyStandardEvent } from './StandardEvent';
2
2
  declare class TapjoyStandardEvents<T extends Record<string, unknown>> {
3
- purchase(): TapjoyStandardEvent<T>;
3
+ accountCreated(): TapjoyStandardEvent<T>;
4
4
  }
5
5
  export { TapjoyStandardEvents };
@@ -1,7 +1,7 @@
1
1
  import { TapjoyStandardEvent } from './StandardEvent';
2
2
  class TapjoyStandardEvents {
3
- purchase() {
4
- return new TapjoyStandardEvent('Purchase');
3
+ accountCreated() {
4
+ return new TapjoyStandardEvent('Conversion');
5
5
  }
6
6
  }
7
7
  export { TapjoyStandardEvents };
@@ -1 +1 @@
1
- {"version":3,"file":"StandardEvents.js","sourceRoot":"","sources":["../../../../../src/lib/Tracking/Tapjoy/StandardEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,oBAAoB;IACjB,QAAQ;QACb,OAAO,IAAI,mBAAmB,CAAI,UAAU,CAAC,CAAA;IAC/C,CAAC;CACF;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAA"}
1
+ {"version":3,"file":"StandardEvents.js","sourceRoot":"","sources":["../../../../../src/lib/Tracking/Tapjoy/StandardEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,oBAAoB;IACjB,cAAc;QACnB,OAAO,IAAI,mBAAmB,CAAI,YAAY,CAAC,CAAA;IACjD,CAAC;CACF;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAA"}
package/package.json CHANGED
@@ -126,6 +126,6 @@
126
126
  },
127
127
  "sideEffects": false,
128
128
  "types": "dist/esm/index.d.ts",
129
- "version": "2.12.7",
129
+ "version": "2.12.10",
130
130
  "packageManager": "yarn@3.1.1"
131
131
  }
@@ -0,0 +1,111 @@
1
+ import { ReactElement } from 'react'
2
+ import { forget, Log } from '@xylabs/sdk-js'
3
+
4
+ import { ExperimentProps, ExperimentsData, ExperimentsLocalStorageKey, OutcomesData, OutcomesLocalStorageKey, VariantData } from '../components'
5
+ import { getLocalStorageObject, setLocalStorageObject } from '../lib'
6
+ import { UserEventHandler } from '@xylabs/pixel'
7
+ import { UserEventsProps } from '../contexts'
8
+
9
+ const defaultLocalStorageKey = 'testData'
10
+ const experimentsTestData: { [index: string]: string } = {}
11
+ let outcomes: OutcomesData = {} //prevent multi-outcome
12
+
13
+ // TODO - some expire logic around experiments
14
+ const ExperimentsHelper = {
15
+ buildLocalStorageKey: (localStorageProp: boolean | string) => {
16
+ return localStorageProp === true ? defaultLocalStorageKey : typeof localStorageProp === 'string' ? localStorageProp ?? defaultLocalStorageKey : ''
17
+ },
18
+
19
+ calcTotalWeight: (variants: VariantData[]) => {
20
+ return variants.reduce((sum, variant) => {
21
+ return sum + variant.weight
22
+ }, 0)
23
+ },
24
+
25
+ calculateExperiment: (name: string, localStorageProp: string | boolean, variants: VariantData[], userEvents: UserEventHandler<UserEventsProps>) => {
26
+ //TODO - user events, it needs to be in the hook, all other compatibility should
27
+ ExperimentsHelper.loadOutcomes()
28
+ const localStorageKey = ExperimentsHelper.buildLocalStorageKey(localStorageProp)
29
+ const totalWeight = ExperimentsHelper.calcTotalWeight(variants)
30
+ ExperimentsHelper.saveExperimentRanges(name, totalWeight, variants)
31
+ const firstTime = name in outcomes
32
+ let targetWeight = outcomes[name] ?? Math.random() * totalWeight
33
+ outcomes[name] = targetWeight
34
+ ExperimentsHelper.saveOutcomes()
35
+ for (const variant of variants) {
36
+ targetWeight -= variant.weight
37
+ if (targetWeight > 0) continue
38
+ if (!variant.name) {
39
+ throw new Error('Experiment Elements must have Keys')
40
+ }
41
+ experimentsTestData[name] = variant.name
42
+ if (firstTime) {
43
+ localStorage.setItem(localStorageKey, ExperimentsHelper.mergeData(experimentsTestData))
44
+ }
45
+ if (userEvents) {
46
+ forget(userEvents.testStarted({ name, variation: variant.name }))
47
+ }
48
+ return variant
49
+ }
50
+ },
51
+
52
+ getExperiment: (name: string) => {
53
+ ExperimentsHelper.loadOutcomes()
54
+ const experiments = getLocalStorageObject<ExperimentsData>(ExperimentsLocalStorageKey) || {}
55
+ return experiments[name]
56
+ },
57
+
58
+ getSelectedVariant: (name: string) => {
59
+ const outcomes = ExperimentsHelper.loadOutcomes()
60
+ const experiment = ExperimentsHelper.getExperiment(name)
61
+ let total = 0
62
+ if (experiment && outcomes) {
63
+ const targetWeight = outcomes[name]
64
+ for (let i = 0; i < experiment.variants.length; i++) {
65
+ const variant = experiment.variants[i]
66
+ total += variant.weight
67
+ if (total >= targetWeight) {
68
+ return variant
69
+ }
70
+ }
71
+ }
72
+ },
73
+
74
+ loadOutcomes: () => {
75
+ outcomes = getLocalStorageObject(OutcomesLocalStorageKey)
76
+ return outcomes
77
+ },
78
+
79
+ makeChildrenArray: (children: ReactElement<ExperimentProps>[] | ReactElement<ExperimentProps>) => {
80
+ if (Array.isArray(children)) {
81
+ return children as ReactElement<ExperimentProps>[]
82
+ } else {
83
+ return [children] as ReactElement<ExperimentProps>[]
84
+ }
85
+ },
86
+
87
+ mergeData: (data: { [index: string]: string }, log?: Log) => {
88
+ const dataArray: string[] = []
89
+ for (const key in data) {
90
+ dataArray.push(`${key}-${data[key]}`)
91
+ }
92
+ log?.info('MergeData', dataArray.join('|'))
93
+ return dataArray.join('|')
94
+ },
95
+
96
+ saveExperimentRanges: (name: string, totalWeight: number, variants: VariantData[]) => {
97
+ const experiments = getLocalStorageObject<ExperimentsData>(ExperimentsLocalStorageKey) || {}
98
+ experiments[name] = {
99
+ totalWeight,
100
+ variants,
101
+ }
102
+ setLocalStorageObject(ExperimentsLocalStorageKey, experiments)
103
+ return experiments
104
+ },
105
+
106
+ saveOutcomes: () => {
107
+ setLocalStorageObject(OutcomesLocalStorageKey, outcomes)
108
+ },
109
+ }
110
+
111
+ export { ExperimentsHelper }
@@ -0,0 +1 @@
1
+ export * from './ExperimentsHelper'
@@ -17,7 +17,7 @@ const StorybookEntry = {
17
17
 
18
18
  const Template: ComponentStory<typeof EthAccountBox> = (args) => (
19
19
  <FlexRow>
20
- <EthAccountBox {...args}></EthAccountBox>
20
+ <EthAccountBox height={40} {...args}></EthAccountBox>
21
21
  </FlexRow>
22
22
  )
23
23
 
@@ -14,6 +14,7 @@ export const EthAccountBox: React.FC<EthAccountProps & FlexBoxProps> = ({
14
14
  iconSize = 16,
15
15
  iconOnly = false,
16
16
  shortenedLength,
17
+ height,
17
18
  addressLength = 'auto',
18
19
  fontFamily = '"Source Code Pro",monospace',
19
20
  ...props
@@ -40,10 +41,12 @@ export const EthAccountBox: React.FC<EthAccountProps & FlexBoxProps> = ({
40
41
  // Note: We use the all zero address for spacing in case it is
41
42
 
42
43
  return (
43
- <FlexRow justifyContent="space-between" alignItems="center" minHeight={theme.spacing(3)} {...props}>
44
- {icon ? <Identicon minHeight={theme.spacing(3)} minWidth={theme.spacing(3)} bgcolor={theme.palette.secondary.main} size={iconSize} value={address?.toHex()} /> : null}
44
+ <FlexRow height={height} justifyContent="space-between" alignItems="stretch" minHeight={theme.spacing(3)} {...props}>
45
+ {icon ? (
46
+ <Identicon minHeight={height ?? theme.spacing(3)} minWidth={height ?? theme.spacing(3)} bgcolor={theme.palette.secondary.main} size={iconSize} value={address?.toHex()} />
47
+ ) : null}
45
48
  {iconOnly ? null : (
46
- <Typography marginLeft={icon ? 1 : 0} variant="body1" fontFamily={fontFamily}>
49
+ <Typography alignSelf="center" marginLeft={icon ? 1 : 0} variant="body1" fontFamily={fontFamily}>
47
50
  {textToDisplay}
48
51
  </Typography>
49
52
  )}
@@ -2,3 +2,4 @@ export * from './Experiment'
2
2
  export * from './Experiments'
3
3
  export * from './ExperimentsDebugger'
4
4
  export * from './ExperimentsProps'
5
+ export * from './models'
@@ -0,0 +1,31 @@
1
+ import { ReactNode, useState } from 'react'
2
+
3
+ import { ExperimentsHelper } from '../common'
4
+ import { VariantData } from '../components'
5
+ import { useUserEvents } from './useUserEvents'
6
+
7
+ const selectVariant = (current?: string) => (variants: Record<string, ReactNode>, defaultNode: ReactNode) => {
8
+ if (current && current in variants) {
9
+ return variants[current]
10
+ }
11
+ return defaultNode
12
+ }
13
+
14
+ const selectVariantForExperiment = (name: string, variants: Record<string, ReactNode>, defaultNode: ReactNode) => {
15
+ const variant = ExperimentsHelper.getSelectedVariant(name)
16
+ if (variants[variant?.name ?? '']) {
17
+ return variants[variant?.name ?? '']
18
+ }
19
+ return defaultNode
20
+ }
21
+
22
+ const useExperiments = (name: string, experiments: VariantData[]) => {
23
+ const [activeExperiment] = useState(ExperimentsHelper.calculateExperiment(name, true, experiments, useUserEvents()))
24
+
25
+ return {
26
+ experimentName: name,
27
+ selectVariant: selectVariant(activeExperiment?.name),
28
+ }
29
+ }
30
+
31
+ export { selectVariantForExperiment, useExperiments }
@@ -0,0 +1,43 @@
1
+ import { ComponentMeta, ComponentStory } from '@storybook/react'
2
+
3
+ import { selectVariantForExperiment, useExperiments } from './useExperiment'
4
+
5
+ const View: React.FC = () => {
6
+ const { experimentName, selectVariant } = useExperiments('Storybook Test', [
7
+ { name: 'a/legacy', weight: 33 },
8
+ { name: 'b/testing', weight: 33 },
9
+ { name: 'c/testing', weight: 33 },
10
+ ])
11
+ const texts = { 'a/legacy': <p>a</p>, 'b/testing': <p>b</p>, 'c/testing': <p>c</p> }
12
+ const test0 = selectVariantForExperiment('Storybook Test Does not exists', texts, <p>DefaultNode</p>)
13
+ const test1 = selectVariant({ 'a/legacy': <p>a</p>, 'b/testing': <p>b</p>, 'c/testing': <p>c</p> }, <p>default node</p>)
14
+ const test2 = selectVariantForExperiment(experimentName, texts, <p>DefaultNode</p>)
15
+ return (
16
+ <div>
17
+ <div>{test0}</div>
18
+ <div>{test1}</div>
19
+ <div>{test2}</div>
20
+ </div>
21
+ )
22
+ }
23
+
24
+ const StorybookEntry = {
25
+ argTypes: {},
26
+ component: View,
27
+ parameters: {
28
+ docs: {
29
+ page: null,
30
+ },
31
+ },
32
+ title: 'Hooks/useExperiments',
33
+ } as ComponentMeta<typeof View>
34
+
35
+ const Template: ComponentStory<typeof View> = (args) => <View {...args} />
36
+
37
+ const Default = Template.bind({})
38
+ Default.args = {}
39
+
40
+ export { Default }
41
+
42
+ // eslint-disable-next-line import/no-default-export
43
+ export default StorybookEntry
@@ -20,6 +20,7 @@ export class DripBaseEvent<T extends Record<string, unknown>> {
20
20
  payload.push(this.param)
21
21
  }
22
22
  payload.push(data)
23
+ console.log('sdk-react', payload)
23
24
  this.dcq.push(payload)
24
25
  await delay(0)
25
26
  }
@@ -1,8 +1,8 @@
1
1
  import { TapjoyStandardEvent } from './StandardEvent'
2
2
 
3
3
  class TapjoyStandardEvents<T extends Record<string, unknown>> {
4
- public purchase() {
5
- return new TapjoyStandardEvent<T>('Purchase')
4
+ public accountCreated() {
5
+ return new TapjoyStandardEvent<T>('Conversion')
6
6
  }
7
7
  }
8
8