import type React from 'react'; import {useMemo} from 'react'; import {useQuery, type UseQueryResult} from 'sentry/utils/queryClient'; const context = require.context('sentry', true, /\.stories.tsx$/, 'lazy'); export interface StoryDescriptor { exports: Record; filename: string; } export function useStoryBookFiles() { return useMemo(() => context.keys().map(file => file.replace(/^\.\//, 'app/')), []); } async function importStory(filename: string): Promise { const story = await context(filename.replace(/^app\//, './')); return { exports: story, filename, }; } type StoriesResult = T extends string ? StoryDescriptor : StoryDescriptor[]; interface UseStoriesLoaderOptions { filename: T; } export default function useStoriesLoader( options: UseStoriesLoaderOptions ): UseQueryResult, Error> { return useQuery({ queryKey: [options.filename], queryFn: (): Promise> => { if (Array.isArray(options.filename)) { return Promise.all(options.filename.map(importStory)) as Promise< StoriesResult >; } return importStory(options.filename) as Promise>; }, enabled: !!options.filename, }); }