13852a5b4STomasz Sapetaimport { css } from '@emotion/react';
2*f4b1168bSBartosz Kaszubowskiimport { breakpoints, spacing } from '@expo/styleguide-base';
33f609562SBartosz Kaszubowskiimport { PropsWithChildren } from 'react';
43852a5b4STomasz Sapeta
5448dd81eSBartosz Kaszubowskiimport { Snippet } from '~/ui/components/Snippet/Snippet';
6448dd81eSBartosz Kaszubowskiimport { SnippetContent } from '~/ui/components/Snippet/SnippetContent';
7448dd81eSBartosz Kaszubowskiimport { SnippetHeader } from '~/ui/components/Snippet/SnippetHeader';
8448dd81eSBartosz Kaszubowski
93852a5b4STomasz Sapetaconst MDX_CLASS_NAME_TO_TAB_NAME: Record<string, string> = {
103852a5b4STomasz Sapeta  'language-swift': 'Swift',
113852a5b4STomasz Sapeta  'language-kotlin': 'Kotlin',
123852a5b4STomasz Sapeta  'language-javascript': 'JavaScript',
133852a5b4STomasz Sapeta  'language-typescript': 'TypeScript',
143852a5b4STomasz Sapeta  'language-json': 'JSON',
153852a5b4STomasz Sapeta  'language-ruby': 'Ruby',
163852a5b4STomasz Sapeta  'language-groovy': 'Gradle',
173852a5b4STomasz Sapeta};
183852a5b4STomasz Sapeta
193f609562SBartosz Kaszubowskitype Props = PropsWithChildren<{
203852a5b4STomasz Sapeta  tabs?: string[];
21448dd81eSBartosz Kaszubowski  connected?: boolean;
223f609562SBartosz Kaszubowski}>;
233852a5b4STomasz Sapeta
24448dd81eSBartosz Kaszubowskiexport function CodeBlocksTable({ children, tabs, connected = true, ...rest }: Props) {
253852a5b4STomasz Sapeta  const childrenArray = Array.isArray(children) ? children : [children];
263852a5b4STomasz Sapeta  const codeBlocks = childrenArray.filter(
273f609562SBartosz Kaszubowski    ({ props }) =>
283f609562SBartosz Kaszubowski      props.children.props.className && props.children.props.className.startsWith('language-')
293852a5b4STomasz Sapeta  );
303852a5b4STomasz Sapeta  const tabNames =
313852a5b4STomasz Sapeta    tabs ||
323852a5b4STomasz Sapeta    codeBlocks.map(child => {
333852a5b4STomasz Sapeta      const className = child.props.children.props.className;
343852a5b4STomasz Sapeta      return MDX_CLASS_NAME_TO_TAB_NAME[className] || className.replace('language-', '');
353852a5b4STomasz Sapeta    });
363852a5b4STomasz Sapeta
373852a5b4STomasz Sapeta  return (
38448dd81eSBartosz Kaszubowski    <div css={[codeBlocksWrapperStyle, connected && codeBlockConnectedWrapperStyle]} {...rest}>
393852a5b4STomasz Sapeta      {codeBlocks.map((codeBlock, index) => (
40448dd81eSBartosz Kaszubowski        <Snippet key={index} css={snippetWrapperStyle}>
41448dd81eSBartosz Kaszubowski          <SnippetHeader title={tabNames[index]} />
42448dd81eSBartosz Kaszubowski          <SnippetContent skipPadding css={snippetContentStyle}>
43448dd81eSBartosz Kaszubowski            {codeBlock}
44448dd81eSBartosz Kaszubowski          </SnippetContent>
45448dd81eSBartosz Kaszubowski        </Snippet>
463852a5b4STomasz Sapeta      ))}
473852a5b4STomasz Sapeta    </div>
483852a5b4STomasz Sapeta  );
493852a5b4STomasz Sapeta}
50448dd81eSBartosz Kaszubowski
51448dd81eSBartosz Kaszubowskiconst codeBlocksWrapperStyle = css({
52448dd81eSBartosz Kaszubowski  display: 'grid',
53448dd81eSBartosz Kaszubowski  gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',
54448dd81eSBartosz Kaszubowski  gap: spacing[4],
55448dd81eSBartosz Kaszubowski  gridAutoRows: '1fr',
56448dd81eSBartosz Kaszubowski
57448dd81eSBartosz Kaszubowski  pre: {
58448dd81eSBartosz Kaszubowski    border: 0,
59448dd81eSBartosz Kaszubowski    margin: 0,
60448dd81eSBartosz Kaszubowski    gridTemplateRows: 'minmax(100px, 1fr)',
61448dd81eSBartosz Kaszubowski    height: '100%',
62448dd81eSBartosz Kaszubowski  },
63448dd81eSBartosz Kaszubowski
64448dd81eSBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.large}px)`]: {
65448dd81eSBartosz Kaszubowski    gridTemplateColumns: 'minmax(0, 1fr)',
66448dd81eSBartosz Kaszubowski    gridAutoRows: 'auto',
67448dd81eSBartosz Kaszubowski  },
68448dd81eSBartosz Kaszubowski});
69448dd81eSBartosz Kaszubowski
70448dd81eSBartosz Kaszubowskiconst codeBlockConnectedWrapperStyle = css({
71448dd81eSBartosz Kaszubowski  [`@media screen and (min-width: ${breakpoints.large}px)`]: {
72448dd81eSBartosz Kaszubowski    gridGap: 0,
73448dd81eSBartosz Kaszubowski
74448dd81eSBartosz Kaszubowski    '> div:nth-of-type(odd)': {
75448dd81eSBartosz Kaszubowski      '> div': {
76448dd81eSBartosz Kaszubowski        borderRight: 0,
77448dd81eSBartosz Kaszubowski        borderTopRightRadius: 0,
78448dd81eSBartosz Kaszubowski        borderBottomRightRadius: 0,
79448dd81eSBartosz Kaszubowski      },
80448dd81eSBartosz Kaszubowski    },
81448dd81eSBartosz Kaszubowski
82448dd81eSBartosz Kaszubowski    '> div:nth-of-type(even)': {
83448dd81eSBartosz Kaszubowski      '> div': {
84448dd81eSBartosz Kaszubowski        borderTopLeftRadius: 0,
85448dd81eSBartosz Kaszubowski        borderBottomLeftRadius: 0,
86448dd81eSBartosz Kaszubowski      },
87448dd81eSBartosz Kaszubowski    },
88448dd81eSBartosz Kaszubowski  },
89448dd81eSBartosz Kaszubowski});
90448dd81eSBartosz Kaszubowski
91448dd81eSBartosz Kaszubowskiconst snippetWrapperStyle = css({
92448dd81eSBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.large}px)`]: {
93448dd81eSBartosz Kaszubowski    marginBottom: 0,
94448dd81eSBartosz Kaszubowski
95448dd81eSBartosz Kaszubowski    '&:last-of-type': {
96448dd81eSBartosz Kaszubowski      marginBottom: spacing[4],
97448dd81eSBartosz Kaszubowski    },
98448dd81eSBartosz Kaszubowski  },
99448dd81eSBartosz Kaszubowski});
100448dd81eSBartosz Kaszubowski
101448dd81eSBartosz Kaszubowskiconst snippetContentStyle = css({
102448dd81eSBartosz Kaszubowski  height: '100%',
103448dd81eSBartosz Kaszubowski});
104