Clean up source snippet retrieval for arbitrary stories

This commit is contained in:
Michael Shilman 2021-09-13 16:41:20 +08:00
parent ac1b4f5251
commit 0ae41ca27d
2 changed files with 27 additions and 15 deletions

View File

@ -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;

View File

@ -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;
}