Skip to content

Commit 15ed56e

Browse files
fix(unity-react-core): fix storybook
1 parent 3357b8c commit 15ed56e

File tree

29 files changed

+742
-125
lines changed

29 files changed

+742
-125
lines changed

.storybook-configv8/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# .storybook-configv8 folder
2+
Once other packages in this monorepo are upgrade to Storybook v8. this folder should move to a common location

.storybook-configv8/Toggle.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React from 'react';
2+
3+
import { useGlobals, useParameter } from '@storybook/manager-api';
4+
import { IconButton } from '@storybook/components';
5+
6+
export const Toggle = ({global: globalKey, children}) => {
7+
const [globals, updateGlobals] = useGlobals();
8+
const params = useParameter(globalKey);
9+
10+
if (params?.disable) {
11+
return null;
12+
}
13+
14+
let isActive = globals[globalKey] || false;
15+
16+
return (
17+
<IconButton
18+
key={globalKey}
19+
active={isActive}
20+
title={`Apply ${globalKey} to the preview`}
21+
onClick={() =>{
22+
updateGlobals({
23+
[globalKey]: !isActive,
24+
})}
25+
}
26+
>
27+
{children}
28+
</IconButton>
29+
);
30+
};
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import React from "react";
2+
import { useAddonState, useChannel } from "@storybook/manager-api";
3+
import { styled } from "@storybook/theming";
4+
import { AddonPanel, Button, Form } from "@storybook/components";
5+
import { Source } from '@storybook/blocks';
6+
import { ADDON_ID, EVENTS } from "./constants.js";
7+
8+
const SourceWrapper = styled(Source)({
9+
margin: 0,
10+
backgroundColor: "#f8f8f8",
11+
zIndex: 1
12+
})
13+
14+
export const Panel = (props) => {
15+
const [{dataLayer, filter}, setState] = useAddonState(ADDON_ID, {
16+
dataLayer: [],
17+
filter: "!gtm.",
18+
});
19+
20+
// useChannel({
21+
// [EVENTS.CODE_UPDATE]: ({ dataLayer }) =>
22+
// setState((state) => ({ ...state, dataLayer })),
23+
// });
24+
25+
useChannel({
26+
[EVENTS.ADD_EVENT]: ({ event }) =>
27+
setState((state) => ({ ...state, dataLayer: [event, ...state.dataLayer] })),
28+
});
29+
30+
const handleClear = () => {
31+
setState((state) => ({ ...state, dataLayer: [] }));
32+
}
33+
34+
const handleChange= (e) => {
35+
const {target: {value = ""}} = e;
36+
setState((state) => ({ ...state, filter: value }));
37+
}
38+
39+
const filteredData = dataLayer.filter(({event}) => {
40+
/**
41+
* A lot of events are logged with prefix "gtm." and creates a lot of noise,
42+
* most of the time we just want to see the events we are triggering.
43+
* Leaving the option to not filter out gtm events.
44+
*/
45+
if (filter.slice(0,1) === "") {
46+
return true;
47+
} else if (filter.slice(0,1) === "!" && filter.slice(1).length > 0) {
48+
return event.indexOf(filter.slice(1)) === -1;
49+
} else if (filter.length > 0) {
50+
return event.indexOf(filter) > -1;
51+
}
52+
});
53+
54+
return (
55+
<AddonPanel {...props}>
56+
<Form.Field label="Event filter">
57+
<Form.Input id="filter" placeholder="filter" value={filter} onChange={handleChange}/>
58+
</Form.Field>
59+
<Button
60+
small
61+
primary
62+
onClick={()=>handleClear()}
63+
style={{
64+
margin: "8px",
65+
position: "sticky",
66+
top: "8px",
67+
left: "100%",
68+
zIndex: 2,
69+
}}
70+
>
71+
Clear
72+
</Button>
73+
<SourceWrapper code={`${JSON.stringify(filteredData, " ", 2)}`} language='json' format={true} />
74+
</AddonPanel>
75+
);
76+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const ADDON_ID = "dataLayer";
2+
export const PANEL_ID = `${ADDON_ID}/panel`;
3+
export const PARAM_KEY = `dataLayer`;
4+
export const EVENTS = {
5+
ADD_EVENT: `${ADDON_ID}/add`,
6+
CODE_UPDATE: `${ADDON_ID}/update`,
7+
CLEAR: `${ADDON_ID}/clear`,
8+
LISTEN: `${ADDON_ID}/listen`,
9+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
previewAnnotations: function previewAnnotations(entry = []) {
3+
return [...entry, require.resolve('./preset/preview.js')];
4+
},
5+
managerEntries: function managerEntries(entry = []) {
6+
return [...entry, require.resolve('./preset/manager.js')];
7+
}
8+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
import { addons, types, useAddonState } from "@storybook/manager-api";
3+
import { ADDON_ID, PANEL_ID } from "../constants";
4+
import { Panel } from "../Panel";
5+
6+
addons.register(ADDON_ID, () => {
7+
addons.add(PANEL_ID, {
8+
type: types.PANEL,
9+
title: function title(){
10+
const [{ dataLayer }] = useAddonState(ADDON_ID, {
11+
dataLayer: [],
12+
filter: "!gtm.",
13+
});
14+
return `Data Layer${dataLayer.length ? ` (${dataLayer.length})`: ``}`;
15+
},
16+
match: ({ viewMode }) => viewMode === "story",
17+
render: Panel,
18+
});
19+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { withDataLayerListener } from "../withDataLayerListener";
2+
export const decorators = [withDataLayerListener];
3+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { makeDecorator, useChannel, useEffect } from "@storybook/preview-api";
2+
import { EVENTS, PARAM_KEY } from "./constants";
3+
4+
export const withDataLayerListener = makeDecorator({
5+
name: "withDataLayerListener",
6+
parameterName: PARAM_KEY,
7+
skipIfNoParametersOrOptions: false,
8+
wrapper: (storyFn, context ) => {
9+
const emit = useChannel({});
10+
11+
function removeDOMObjects(eventObject){
12+
return Object.entries(eventObject).reduce((acc, [k, v])=>{
13+
acc[k] = (typeof v === "object" && v.tagName) ? v.tagName : v;
14+
return acc
15+
},{})
16+
}
17+
18+
function newPush() {
19+
for (var i = 0, n = this.length, l = arguments.length; i < l; i++, n++) {
20+
this[n] = arguments[i];
21+
emit(EVENTS.ADD_EVENT, {
22+
event: removeDOMObjects(arguments[i]),
23+
});
24+
}
25+
return n;
26+
}
27+
28+
const listenToDataLayer = () => {
29+
window.dataLayer = window.dataLayer || [];
30+
Object.defineProperty(window.dataLayer, "push", {
31+
value: newPush,
32+
writable: true,
33+
enumerable: true,
34+
configurable: true,
35+
});
36+
}
37+
38+
useEffect(()=>{
39+
setTimeout(listenToDataLayer, 1000);
40+
}, [])
41+
42+
return storyFn(context);
43+
},
44+
});
45+
46+
if (module && module.hot && module.hot.decline) {
47+
module.hot.decline();
48+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
export const clearStyles = (selector) => {
3+
const selectors = Array.isArray(selector) ? selector : [selector];
4+
selectors.forEach(clearStyle);
5+
};
6+
7+
const clearStyle = (selector) => {
8+
const element = document.getElementById(selector);
9+
if (element) {
10+
element.parentElement.removeChild(element);
11+
}
12+
};
13+
14+
export const addStyle = (selector, css) => {
15+
const existingStyle = document.getElementById(selector);
16+
if (existingStyle) {
17+
if (existingStyle.innerHTML !== css) {
18+
existingStyle.innerHTML = css;
19+
}
20+
} else {
21+
const style = document.createElement('style');
22+
style.setAttribute('id', selector);
23+
style.innerHTML = css;
24+
document.head.appendChild(style);
25+
}
26+
};

.storybook-configv8/index.js

Lines changed: 54 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)