storybook-addon-module-mock
Version:
[](https://www.npmjs.com/package/storybook-addon-module-mock) [](https://www.npmjs.com/package/storybook-addon-module-mock) [ • 1.79 kB
JavaScript
import React from 'react';
import { STORY_RENDER_PHASE_CHANGED } from 'storybook/internal/core-events';
import { useChannel, useRef, useState } from 'storybook/preview-api';
import { ADDON_ID } from './types.js';
export const MockDecorator = (Story, context) => {
const { parameters, name, id } = context;
const emit = useChannel({
[STORY_RENDER_PHASE_CHANGED]: ({ newPhase, storyId }) => {
if (storyId !== id && moduleMock?.mocks) {
moduleMock.mocks.forEach((mock) => mock.mockRestore());
moduleMock.mocks = undefined;
}
if (newPhase === 'completed' && storyId === id) {
if (moduleMock.mocks) {
moduleMock.mocks.forEach((mock) => mock.mockClear());
}
}
},
});
const [{ args }, render] = useState({});
const params = useRef(parameters);
const { moduleMock } = params.current;
if (!moduleMock?.mocks) {
const m = moduleMock?.mock?.();
const mocks = !m ? undefined : Array.isArray(m) ? m : [m];
moduleMock.mocks = mocks;
moduleMock.render = (args) => render({ args });
if (mocks) {
const sendStat = () => {
emit(ADDON_ID, mocks.map((mock) => {
return [mock.__name, mock.mock];
}));
};
mocks.forEach((mock) => (mock.__module.event = () => sendStat()));
sendStat();
}
else {
emit(ADDON_ID, []);
}
}
if (name === '$$mock$$')
return React.createElement(React.Fragment, null);
return Story(args ? { args } : undefined);
};
export const parameters = {
moduleMock: {
render: () => {
//
},
},
};