import * as React from "react"; import ArgsProvider from "./args-provider"; import Msw from "./msw"; import { args, argTypes } from "virtual:generated-list"; import { useLadleContext } from "./context"; import type { StoryDecorator } from "../../shared/types"; import type { RequestHandler } from "msw"; export default function composeEnhancers(module: any, storyName: string) { let decorators: StoryDecorator[] = []; let parameters: { [key: string]: any } = {}; let mswHandlers: RequestHandler[] = []; if (module.default && module.default.msw) { mswHandlers = module.default.msw; } if (module[storyName] && module[storyName].msw) { mswHandlers = module[storyName].msw; } const props = { args: { ...args, ...(module.default && module.default.args ? module.default.args : {}), ...(module[storyName].args ? module[storyName].args : {}), }, argTypes: { ...argTypes, ...(module.default && module.default.argTypes ? module.default.argTypes : {}), ...(module[storyName].argTypes ? module[storyName].argTypes : {}), }, component: module[storyName], }; if (module[storyName] && Array.isArray(module[storyName].decorators)) { decorators = [...decorators, ...module[storyName].decorators]; } if (module.default && Array.isArray(module.default.decorators)) { decorators = [...decorators, ...module.default.decorators]; } parameters = { ...(module.default && module.default.parameters ? module.default.parameters : {}), ...(module[storyName].parameters ? module[storyName].parameters : {}), }; return function RenderDecoratedStory() { const { globalState } = useLadleContext(); const WithArgs = React.useMemo( () => function RenderWithArgs() { return ( ); }, [], ); if (decorators.length === 0) return ; const getBindedDecorator = (i: number) => { return React.useRef(() => { const context = useLadleContext(); const args: { [key: string]: any } = {}; Object.keys(context.globalState.control).forEach( (key) => (args[key] = context.globalState.control[key].value), ); return decorators[i](i === 0 ? WithArgs : getBindedDecorator(i - 1), { ...context, parameters, argTypes: props.argTypes, args, }); }).current; }; const Decorated = getBindedDecorator(decorators.length - 1); return globalState.controlInitialized ? : ; }; }