mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-03 05:04:51 +08:00
Clean up source snippet retrieval for arbitrary stories
This commit is contained in:
parent
ac1b4f5251
commit
0ae41ca27d
@ -13,6 +13,7 @@ import { CURRENT_SELECTION } from './types';
|
||||
import { SourceType } from '../shared';
|
||||
|
||||
import { enhanceSource } from './enhanceSource';
|
||||
import { useStories } from './useStory';
|
||||
|
||||
export enum SourceState {
|
||||
OPEN = 'open',
|
||||
@ -46,14 +47,8 @@ const getStory = (storyId: StoryId, docsContext: DocsContextProps): Story | null
|
||||
return docsContext.storyById(storyId);
|
||||
};
|
||||
|
||||
const getSourceState = (storyIds: string[], docsContext: DocsContextProps) => {
|
||||
const states = storyIds
|
||||
.map((storyId) => {
|
||||
const story = getStory(storyId, docsContext);
|
||||
return story?.parameters.docs?.source?.state;
|
||||
})
|
||||
.filter(Boolean);
|
||||
|
||||
const getSourceState = (stories: Story[]) => {
|
||||
const states = stories.map((story) => story.parameters.docs?.source?.state).filter(Boolean);
|
||||
if (states.length === 0) return SourceState.CLOSED;
|
||||
// FIXME: handling multiple stories is a pain
|
||||
return states[0];
|
||||
@ -117,17 +112,22 @@ export const getSourceProps = (
|
||||
singleProps.id === CURRENT_SELECTION || !singleProps.id ? currentId : singleProps.id;
|
||||
const targetIds = multiProps.ids || [targetId];
|
||||
|
||||
const stories = useStories(targetIds, docsContext);
|
||||
if (!stories) {
|
||||
return { error: SourceError.SOURCE_UNAVAILABLE, state: SourceState.NONE };
|
||||
}
|
||||
|
||||
if (!source) {
|
||||
source = targetIds
|
||||
.map((storyId) => {
|
||||
.map((storyId, idx) => {
|
||||
const storySource = getStorySource(storyId, sourceContext);
|
||||
const story = getStory(storyId, docsContext);
|
||||
return getSnippet(storySource, story);
|
||||
const storyObj = stories[idx];
|
||||
return getSnippet(storySource, storyObj);
|
||||
})
|
||||
.join('\n\n');
|
||||
}
|
||||
|
||||
const state = getSourceState(targetIds, docsContext);
|
||||
const state = getSourceState(stories);
|
||||
|
||||
const { docs: docsParameters = {} } = parameters;
|
||||
const { source: sourceParameters = {} } = docsParameters;
|
||||
|
@ -8,11 +8,23 @@ export function useStory<TFramework extends AnyFramework>(
|
||||
storyId: StoryId,
|
||||
context: DocsContextProps<TFramework>
|
||||
): Story<TFramework> | void {
|
||||
const [story, setStory] = useState(null);
|
||||
const stories = useStories([storyId], context);
|
||||
return stories && stories[0];
|
||||
}
|
||||
|
||||
export function useStories<TFramework extends AnyFramework>(
|
||||
storyIds: StoryId[],
|
||||
context: DocsContextProps<TFramework>
|
||||
): Story<TFramework>[] | void {
|
||||
const [stories, setStories] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
context.loadStory(storyId).then((s) => setStory(s));
|
||||
Promise.all(storyIds.map((storyId) => context.loadStory(storyId))).then((loadedStories) => {
|
||||
if (!stories) {
|
||||
setStories(loadedStories);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return story;
|
||||
return stories;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user