/
index.tsx
104 lines (88 loc) · 2.99 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
/// <reference path="./typings.d.ts" />
import global from 'global';
import React, { FC, FunctionComponent } from 'react';
import ReactDOM from 'react-dom';
import { Location, LocationProvider, useNavigate } from '@storybook/router';
import { Provider as ManagerProvider, Combo } from '@storybook/api';
import {
ThemeProvider,
ensure as ensureTheme,
CacheProvider,
createCache,
} from '@storybook/theming';
import { HelmetProvider } from 'react-helmet-async';
import App from './app';
import Provider from './provider';
const emotionCache = createCache({ key: 'sto' });
emotionCache.compat = true;
const { DOCS_MODE } = global;
// @ts-ignore
ThemeProvider.displayName = 'ThemeProvider';
// @ts-ignore
HelmetProvider.displayName = 'HelmetProvider';
const getDocsMode = () => {
try {
return !!DOCS_MODE;
} catch (e) {
return false;
}
};
const Container = process.env.XSTORYBOOK_EXAMPLE_APP ? React.StrictMode : React.Fragment;
export interface RootProps {
provider: Provider;
history?: History;
}
export const Root: FunctionComponent<RootProps> = ({ provider }) => (
<Container key="container">
<HelmetProvider key="helmet.Provider">
<LocationProvider key="location.provider">
<Main provider={provider} />
</LocationProvider>
</HelmetProvider>
</Container>
);
const Main: FC<{ provider: Provider }> = ({ provider }) => {
const navigate = useNavigate();
return (
<Location key="location.consumer">
{(locationData) => (
<ManagerProvider
key="manager"
provider={provider}
{...locationData}
navigate={navigate}
docsMode={getDocsMode()}
>
{({ state, api }: Combo) => {
const panelCount = Object.keys(api.getPanels()).length;
const story = api.getData(state.storyId, state.refId);
const isLoading = story
? !!state.refs[state.refId] && !state.refs[state.refId].ready
: !state.storiesFailed && !state.storiesConfigured;
return (
<CacheProvider value={emotionCache}>
<ThemeProvider key="theme.provider" theme={ensureTheme(state.theme)}>
<App
key="app"
viewMode={state.viewMode}
layout={isLoading ? { ...state.layout, showPanel: false } : state.layout}
panelCount={panelCount}
docsOnly={story && story.parameters && story.parameters.docsOnly}
/>
</ThemeProvider>
</CacheProvider>
);
}}
</ManagerProvider>
)}
</Location>
);
};
export default function renderStorybookUI(domNode: HTMLElement, provider: Provider) {
if (!(provider instanceof Provider)) {
throw new Error('provider is not extended from the base Provider');
}
ReactDOM.render(<Root key="root" provider={provider} />, domNode);
}
export { Provider };