storybook-addon-playground
Version:
A playground to enable consumers learn how to use the component library or to reproduce bugs
58 lines (55 loc) • 2.21 kB
JavaScript
import { useMemo, useEffect } from 'react';
import { useStorybookApi, useAddonState, useParameter } from '@storybook/manager-api';
import { PANEL_ID, ADDON_ID_FOR_PARAMETERS } from '../consts/addon-consts.js';
import { DEFAULT_ADDON_PARAMETERS } from '../consts/parameter-consts.js';
import { DEFAULT_ADDON_STATE } from '../consts/state-consts.js';
import { SNIPPET_SHARE_QUERY_ID } from '../consts/editor-consts.js';
import 'prettier';
import 'prettier/parser-html';
import 'prettier/parser-typescript';
import 'prettier/parser-postcss';
import { decodeAndDecompress } from '../utils/encode-decode-utils.js';
import { loadCodeFromStorage } from '../utils/persistence-utils.js';
const useInitialCode = () => {
const { getQueryParam } = useStorybookApi();
const [state, setState] = useAddonState(PANEL_ID, DEFAULT_ADDON_STATE);
const { hasInitialCodeLoaded } = state;
const { introCode, share: enableShare } = useParameter(ADDON_ID_FOR_PARAMETERS, DEFAULT_ADDON_PARAMETERS);
const sharedCode = useMemo(() => {
const shared = getQueryParam(SNIPPET_SHARE_QUERY_ID);
if (!shared) {
return null;
}
return decodeAndDecompress(shared);
}, [getQueryParam]);
const persistedCode = useMemo(() => {
return loadCodeFromStorage();
}, []);
const initialCodeToSet = useMemo(() => {
if (enableShare && hasValidCode(sharedCode)) {
return sharedCode;
}
if (hasValidCode(persistedCode)) {
return persistedCode;
}
if (hasValidCode(introCode)) {
return introCode;
}
return DEFAULT_ADDON_STATE.code;
}, [enableShare, sharedCode, persistedCode, introCode]);
useEffect(() => {
if (hasInitialCodeLoaded || introCode === null) {
return;
}
setState((state) => ({
...state,
code: initialCodeToSet,
hasInitialCodeLoaded: true,
}));
}, [hasInitialCodeLoaded, introCode, setState, initialCodeToSet]);
};
function hasValidCode(code) {
return code && Object.values(code).some(Boolean);
}
export { useInitialCode as default };
//# sourceMappingURL=useInitialCode.js.map