1 | import deprecate from 'util-deprecate';
|
2 | import dedent from 'ts-dedent';
|
3 | import { isStory } from '../lib/stories';
|
4 | const 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 | `);
|
9 | export 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 |
|
19 | export 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 | }
|
32 | export 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 |