storyExports.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import {space} from 'sentry/styles/space';
  4. import {StorySourceLinks} from 'sentry/views/stories/storySourceLinks';
  5. import type {StoryDescriptor} from './useStoriesLoader';
  6. export function StoryExports(props: {story: StoryDescriptor}) {
  7. const {default: DefaultExport, ...namedExports} = props.story.exports;
  8. return (
  9. <Fragment>
  10. <StorySourceLinksContainer>
  11. <StorySourceLinks story={props.story} />
  12. </StorySourceLinksContainer>
  13. {/* Render default export first */}
  14. {DefaultExport ? (
  15. <Story key="default">
  16. <DefaultExport />
  17. </Story>
  18. ) : null}
  19. {Object.entries(namedExports).map(([name, MaybeComponent]) => {
  20. if (typeof MaybeComponent === 'function') {
  21. return (
  22. <Story key={name}>
  23. <MaybeComponent />
  24. </Story>
  25. );
  26. }
  27. throw new Error(
  28. `Story exported an unsupported key ${name} with value: ${typeof MaybeComponent}`
  29. );
  30. })}
  31. </Fragment>
  32. );
  33. }
  34. const StorySourceLinksContainer = styled('div')`
  35. display: flex;
  36. gap: ${space(1)};
  37. align-items: center;
  38. justify-content: flex-end;
  39. margin-top: ${space(1.5)};
  40. `;
  41. const Story = styled('section')`
  42. padding-top: ${space(2)};
  43. `;