UNPKG

2.9 kBJavaScriptView Raw
1import deprecate from 'util-deprecate';
2import dedent from 'ts-dedent';
3import { isStory } from '../lib/stories';
4const warnDisabledDeprecated = deprecate(() => {}, dedent`
5 Use 'parameters.key.disable' instead of 'parameters.key.disabled'.
6
7 https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-disabled-parameter
8 `);
9export let types;
10
11(function (types) {
12 types["TAB"] = "tab";
13 types["PANEL"] = "panel";
14 types["TOOL"] = "tool";
15 types["PREVIEW"] = "preview";
16 types["NOTES_ELEMENT"] = "notes-element";
17})(types || (types = {}));
18
19export function ensurePanel(panels, selectedPanel, currentPanel) {
20 const keys = Object.keys(panels);
21
22 if (keys.indexOf(selectedPanel) >= 0) {
23 return selectedPanel;
24 }
25
26 if (keys.length) {
27 return keys[0];
28 }
29
30 return currentPanel;
31}
32export const init = ({
33 provider,
34 store,
35 fullAPI
36}) => {
37 const api = {
38 getElements: type => provider.getElements(type),
39 getPanels: () => api.getElements(types.PANEL),
40 getStoryPanels: () => {
41 const allPanels = api.getPanels();
42 const {
43 storyId
44 } = store.getState();
45 const story = fullAPI.getData(storyId);
46
47 if (!allPanels || !story || !isStory(story)) {
48 return allPanels;
49 }
50
51 const {
52 parameters
53 } = story;
54 const filteredPanels = {};
55 Object.entries(allPanels).forEach(([id, panel]) => {
56 const {
57 paramKey
58 } = panel;
59
60 if (paramKey && parameters && parameters[paramKey] && (parameters[paramKey].disabled || parameters[paramKey].disable)) {
61 if (parameters[paramKey].disabled) {
62 warnDisabledDeprecated();
63 }
64
65 return;
66 }
67
68 filteredPanels[id] = panel;
69 });
70 return filteredPanels;
71 },
72 getSelectedPanel: () => {
73 const {
74 selectedPanel
75 } = store.getState();
76 return ensurePanel(api.getPanels(), selectedPanel, selectedPanel);
77 },
78 setSelectedPanel: panelName => {
79 store.setState({
80 selectedPanel: panelName
81 }, {
82 persistence: 'session'
83 });
84 },
85
86 setAddonState(addonId, newStateOrMerger, options) {
87 let nextState;
88 const {
89 addons: existing
90 } = store.getState();
91
92 if (typeof newStateOrMerger === 'function') {
93 const merger = newStateOrMerger;
94 nextState = merger(api.getAddonState(addonId));
95 } else {
96 nextState = newStateOrMerger;
97 }
98
99 return store.setState({
100 addons: Object.assign({}, existing, {
101 [addonId]: nextState
102 })
103 }, options).then(() => api.getAddonState(addonId));
104 },
105
106 getAddonState: addonId => {
107 return store.getState().addons[addonId];
108 }
109 };
110 return {
111 api,
112 state: {
113 selectedPanel: ensurePanel(api.getPanels(), store.getState().selectedPanel),
114 addons: {}
115 }
116 };
117};
\No newline at end of file