useStoriesLoader.tsx 1021 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import type React from 'react';
  2. import {useMemo} from 'react';
  3. import {useQuery, type UseQueryResult} from 'sentry/utils/queryClient';
  4. const context = require.context('sentry', true, /\.stories.tsx$/, 'lazy');
  5. export interface StoryDescriptor {
  6. exports: Record<string, React.ComponentType | any>;
  7. filename: string;
  8. }
  9. export function useStoryBookFiles() {
  10. return useMemo(() => context.keys().map(file => file.replace(/^\.\//, 'app/')), []);
  11. }
  12. async function importStory(filename: string): Promise<StoryDescriptor> {
  13. const story = await context(filename.replace(/^app\//, './'));
  14. return {
  15. exports: story,
  16. filename,
  17. };
  18. }
  19. interface UseStoriesLoaderOptions {
  20. files: string[];
  21. }
  22. export function useStoriesLoader(
  23. options: UseStoriesLoaderOptions
  24. ): UseQueryResult<StoryDescriptor[], Error> {
  25. return useQuery({
  26. queryKey: [options.files],
  27. queryFn: (): Promise<StoryDescriptor[]> => {
  28. return Promise.all(options.files.map(importStory));
  29. },
  30. enabled: !!options.files,
  31. });
  32. }