diff --git a/code/addons/test/src/node/vitest-manager.ts b/code/addons/test/src/node/vitest-manager.ts index 72764b46877f..0982dc3611dd 100644 --- a/code/addons/test/src/node/vitest-manager.ts +++ b/code/addons/test/src/node/vitest-manager.ts @@ -80,6 +80,16 @@ export class VitestManager { reportOnFailure: true, reporter: [['html', {}], storybookCoverageReporter], reportsDirectory: resolvePathInStorybookCache(COVERAGE_DIRECTORY), + exclude: [ + '**/*.config.*', + '**/*.workspace.*', + '**/.storybook/**', + '**/.yarn/**', + '**/src/**/!(stories)/**', + '**/src/**/*.stories.*', + '**/test/**/*.stories.*', + '**/storybook-static/**', + ], } : { enabled: false } ) as CoverageOptions; diff --git a/code/core/src/manager/container/Panel.tsx b/code/core/src/manager/container/Panel.tsx index 1331e0f8cc67..a22c6db74556 100644 --- a/code/core/src/manager/container/Panel.tsx +++ b/code/core/src/manager/container/Panel.tsx @@ -1,58 +1,70 @@ import type { FC } from 'react'; -import React from 'react'; +import React, { useMemo, useState } from 'react'; -import { type API_LeafEntry, Addon_TypesEnum } from '@storybook/core/types'; +import { Addon_TypesEnum } from '@storybook/core/types'; -import { Consumer } from '@storybook/core/manager-api'; -import type { API, Combo } from '@storybook/core/manager-api'; - -import memoize from 'memoizerific'; +import { useChannel, useStorybookApi, useStorybookState } from '@storybook/core/manager-api'; +import { STORY_PREPARED } from '../../core-events'; import { AddonPanel } from '../components/panel/Panel'; -const createPanelActions = memoize(1)((api) => ({ - onSelect: (panel: string) => api.setSelectedPanel(panel), - toggleVisibility: () => api.togglePanel(), - togglePosition: () => api.togglePanelPosition(), -})); +const Panel: FC = (props) => { + const api = useStorybookApi(); + const state = useStorybookState(); + const [story, setStory] = useState(api.getCurrentStoryData()); -const getPanels = memoize(1)((api: API, story: API_LeafEntry) => { - const allPanels = api.getElements(Addon_TypesEnum.PANEL); + useChannel( + { + [STORY_PREPARED]: () => { + setStory(api.getCurrentStoryData()); + }, + }, + [] + ); - if (!allPanels || !story || story.type !== 'story') { - return allPanels; - } + const { parameters, type } = story ?? {}; - const { parameters } = story; + const panelActions = useMemo( + () => ({ + onSelect: (panel: string) => api.setSelectedPanel(panel), + toggleVisibility: () => api.togglePanel(), + togglePosition: () => api.togglePanelPosition(), + }), + [api] + ); - const filteredPanels: typeof allPanels = {}; - Object.entries(allPanels).forEach(([id, panel]) => { - const { paramKey }: any = panel; - if (paramKey && parameters && parameters[paramKey] && parameters[paramKey].disable) { - return; - } - if ( - panel.disabled === true || - (typeof panel.disabled === 'function' && panel.disabled(parameters)) - ) { - return; + const panels = useMemo(() => { + const allPanels = api.getElements(Addon_TypesEnum.PANEL); + + if (!allPanels || type !== 'story') { + return allPanels; } - filteredPanels[id] = panel; - }); - - return filteredPanels; -}); - -const mapper = ({ state, api }: Combo) => ({ - panels: getPanels(api, api.getCurrentStoryData()), - selectedPanel: api.getSelectedPanel(), - panelPosition: state.layout.panelPosition, - actions: createPanelActions(api), - shortcuts: api.getShortcutKeys(), -}); - -const Panel: FC = (props) => ( - {(customProps) => } -); + + const filteredPanels: typeof allPanels = {}; + Object.entries(allPanels).forEach(([id, p]) => { + const { paramKey }: any = p; + if (paramKey && parameters && parameters[paramKey] && parameters[paramKey].disable) { + return; + } + if (p.disabled === true || (typeof p.disabled === 'function' && p.disabled(parameters))) { + return; + } + filteredPanels[id] = p; + }); + + return filteredPanels; + }, [api, type, parameters]); + + return ( + + ); +}; export default Panel;