13852a5b4STomasz Sapetaimport { css } from '@emotion/react';
2f4b1168bSBartosz Kaszubowskiimport { breakpoints, spacing } from '@expo/styleguide-base';
3*9311bddcSBartosz Kaszubowskiimport { FileCode01Icon } from '@expo/styleguide-icons';
43f609562SBartosz Kaszubowskiimport { PropsWithChildren } from 'react';
53852a5b4STomasz Sapeta
6*9311bddcSBartosz Kaszubowskiimport { cleanCopyValue } from '~/components/base/code';
7448dd81eSBartosz Kaszubowskiimport { Snippet } from '~/ui/components/Snippet/Snippet';
8448dd81eSBartosz Kaszubowskiimport { SnippetContent } from '~/ui/components/Snippet/SnippetContent';
9448dd81eSBartosz Kaszubowskiimport { SnippetHeader } from '~/ui/components/Snippet/SnippetHeader';
10*9311bddcSBartosz Kaszubowskiimport { CopyAction } from '~/ui/components/Snippet/actions/CopyAction';
11448dd81eSBartosz Kaszubowski
123852a5b4STomasz Sapetaconst MDX_CLASS_NAME_TO_TAB_NAME: Record<string, string> = {
133852a5b4STomasz Sapeta  'language-swift': 'Swift',
143852a5b4STomasz Sapeta  'language-kotlin': 'Kotlin',
153852a5b4STomasz Sapeta  'language-javascript': 'JavaScript',
163852a5b4STomasz Sapeta  'language-typescript': 'TypeScript',
173852a5b4STomasz Sapeta  'language-json': 'JSON',
183852a5b4STomasz Sapeta  'language-ruby': 'Ruby',
193852a5b4STomasz Sapeta  'language-groovy': 'Gradle',
203852a5b4STomasz Sapeta};
213852a5b4STomasz Sapeta
223f609562SBartosz Kaszubowskitype Props = PropsWithChildren<{
233852a5b4STomasz Sapeta  tabs?: string[];
24448dd81eSBartosz Kaszubowski  connected?: boolean;
253f609562SBartosz Kaszubowski}>;
263852a5b4STomasz Sapeta
27448dd81eSBartosz Kaszubowskiexport function CodeBlocksTable({ children, tabs, connected = true, ...rest }: Props) {
283852a5b4STomasz Sapeta  const childrenArray = Array.isArray(children) ? children : [children];
293852a5b4STomasz Sapeta  const codeBlocks = childrenArray.filter(
303f609562SBartosz Kaszubowski    ({ props }) =>
313f609562SBartosz Kaszubowski      props.children.props.className && props.children.props.className.startsWith('language-')
323852a5b4STomasz Sapeta  );
333852a5b4STomasz Sapeta  const tabNames =
343852a5b4STomasz Sapeta    tabs ||
353852a5b4STomasz Sapeta    codeBlocks.map(child => {
363852a5b4STomasz Sapeta      const className = child.props.children.props.className;
373852a5b4STomasz Sapeta      return MDX_CLASS_NAME_TO_TAB_NAME[className] || className.replace('language-', '');
383852a5b4STomasz Sapeta    });
393852a5b4STomasz Sapeta
403852a5b4STomasz Sapeta  return (
41448dd81eSBartosz Kaszubowski    <div css={[codeBlocksWrapperStyle, connected && codeBlockConnectedWrapperStyle]} {...rest}>
423852a5b4STomasz Sapeta      {codeBlocks.map((codeBlock, index) => (
43448dd81eSBartosz Kaszubowski        <Snippet key={index} css={snippetWrapperStyle}>
44*9311bddcSBartosz Kaszubowski          <SnippetHeader title={tabNames[index]} Icon={FileCode01Icon}>
45*9311bddcSBartosz Kaszubowski            <CopyAction text={cleanCopyValue(codeBlock.props.children.props.children)} />
46*9311bddcSBartosz Kaszubowski          </SnippetHeader>
47*9311bddcSBartosz Kaszubowski          <SnippetContent className="p-0 h-full">{codeBlock}</SnippetContent>
48448dd81eSBartosz Kaszubowski        </Snippet>
493852a5b4STomasz Sapeta      ))}
503852a5b4STomasz Sapeta    </div>
513852a5b4STomasz Sapeta  );
523852a5b4STomasz Sapeta}
53448dd81eSBartosz Kaszubowski
54448dd81eSBartosz Kaszubowskiconst codeBlocksWrapperStyle = css({
55448dd81eSBartosz Kaszubowski  display: 'grid',
56448dd81eSBartosz Kaszubowski  gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)',
57448dd81eSBartosz Kaszubowski  gap: spacing[4],
58448dd81eSBartosz Kaszubowski  gridAutoRows: '1fr',
59448dd81eSBartosz Kaszubowski
60448dd81eSBartosz Kaszubowski  pre: {
61448dd81eSBartosz Kaszubowski    border: 0,
62448dd81eSBartosz Kaszubowski    margin: 0,
63448dd81eSBartosz Kaszubowski    gridTemplateRows: 'minmax(100px, 1fr)',
64448dd81eSBartosz Kaszubowski    height: '100%',
65448dd81eSBartosz Kaszubowski  },
66448dd81eSBartosz Kaszubowski
67448dd81eSBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.large}px)`]: {
68448dd81eSBartosz Kaszubowski    gridTemplateColumns: 'minmax(0, 1fr)',
69448dd81eSBartosz Kaszubowski    gridAutoRows: 'auto',
70448dd81eSBartosz Kaszubowski  },
71448dd81eSBartosz Kaszubowski});
72448dd81eSBartosz Kaszubowski
73448dd81eSBartosz Kaszubowskiconst codeBlockConnectedWrapperStyle = css({
74448dd81eSBartosz Kaszubowski  [`@media screen and (min-width: ${breakpoints.large}px)`]: {
75448dd81eSBartosz Kaszubowski    gridGap: 0,
76448dd81eSBartosz Kaszubowski
77448dd81eSBartosz Kaszubowski    '> div:nth-of-type(odd)': {
78448dd81eSBartosz Kaszubowski      '> div': {
79448dd81eSBartosz Kaszubowski        borderRight: 0,
80448dd81eSBartosz Kaszubowski        borderTopRightRadius: 0,
81448dd81eSBartosz Kaszubowski        borderBottomRightRadius: 0,
82448dd81eSBartosz Kaszubowski      },
83448dd81eSBartosz Kaszubowski    },
84448dd81eSBartosz Kaszubowski
85448dd81eSBartosz Kaszubowski    '> div:nth-of-type(even)': {
86448dd81eSBartosz Kaszubowski      '> div': {
87448dd81eSBartosz Kaszubowski        borderTopLeftRadius: 0,
88448dd81eSBartosz Kaszubowski        borderBottomLeftRadius: 0,
89448dd81eSBartosz Kaszubowski      },
90448dd81eSBartosz Kaszubowski    },
91448dd81eSBartosz Kaszubowski  },
92448dd81eSBartosz Kaszubowski});
93448dd81eSBartosz Kaszubowski
94448dd81eSBartosz Kaszubowskiconst snippetWrapperStyle = css({
95448dd81eSBartosz Kaszubowski  [`@media screen and (max-width: ${breakpoints.large}px)`]: {
96448dd81eSBartosz Kaszubowski    marginBottom: 0,
97448dd81eSBartosz Kaszubowski
98448dd81eSBartosz Kaszubowski    '&:last-of-type': {
99448dd81eSBartosz Kaszubowski      marginBottom: spacing[4],
100448dd81eSBartosz Kaszubowski    },
101448dd81eSBartosz Kaszubowski  },
102448dd81eSBartosz Kaszubowski});
103