Skip to content

Commit d7e38d4

Browse files
committed
Improve CollapsibleCode component
1 parent 9939cfd commit d7e38d4

3 files changed

Lines changed: 37 additions & 10 deletions

File tree

packages/docs-gesture-handler/src/components/CollapseButton/index.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable import-x/extensions */
12
import React from 'react';
23
import styles from './styles.module.css';
34
import Arrow from '@site/static/img/Arrow.svg';
@@ -7,11 +8,11 @@ import clsx from 'clsx';
78

89
const CollapseButton: React.FC<{
910
label: string;
10-
labelCollapsed: string;
11+
expandedLabel: string;
1112
collapsed: boolean;
1213
onCollapse: () => void;
1314
className?: string;
14-
}> = ({ label, labelCollapsed, collapsed, onCollapse, className }) => {
15+
}> = ({ label, expandedLabel, collapsed, onCollapse, className }) => {
1516
const { colorMode } = useColorMode();
1617

1718
return (
@@ -25,7 +26,7 @@ const CollapseButton: React.FC<{
2526
<ArrowDark className={styles.arrow} />
2627
)}
2728

28-
<button>{collapsed ? labelCollapsed : label}</button>
29+
<button type="button">{collapsed ? label : expandedLabel}</button>
2930
</div>
3031
);
3132
};

packages/docs-gesture-handler/src/components/CollapseButton/styles.module.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
font-size: 16px;
1414
color: var(--ifm-font-color-base);
1515
cursor: pointer;
16+
user-select: none;
1617
}
1718

1819
.arrow {
Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,61 @@
1-
import React, { useState } from 'react';
1+
import React, { useState, useEffect } from 'react';
22
import CodeBlock from '@theme/CodeBlock';
33
import styles from './styles.module.css';
44

55
import CollapseButton from '@site/src/components/CollapseButton';
66

7+
import * as prettier from 'prettier/standalone';
8+
import tsParser from 'prettier/plugins/typescript';
9+
import estreeParser from 'prettier/plugins/estree';
10+
11+
const prettierOptions = {
12+
parser: 'typescript',
13+
plugins: [tsParser, estreeParser],
14+
};
15+
716
interface Props {
817
src: string;
18+
label: string;
19+
expandedLabel: string;
920
lineBounds: number[];
1021
}
1122

12-
export default function CollapsibleCode({ src, lineBounds }: Props) {
23+
export default function CollapsibleCode({
24+
src,
25+
label,
26+
expandedLabel,
27+
lineBounds,
28+
}: Props) {
1329
const [collapsed, setCollapsed] = useState(true);
30+
const [code, setCode] = useState<string>(src);
31+
32+
useEffect(() => {
33+
async function formatCode() {
34+
const formattedCode = await prettier.format(src, prettierOptions);
35+
setCode(formattedCode);
36+
}
37+
void formatCode();
38+
}, [src]);
1439

1540
if (!lineBounds) {
16-
return <CodeBlock language="jsx">{src}</CodeBlock>;
41+
return <CodeBlock language="tsx">{code}</CodeBlock>;
1742
}
1843

1944
const [start, end] = lineBounds;
2045

21-
const codeLines = src.split('\n');
46+
const codeLines = code.split('\n');
2247
const linesToShow = codeLines.slice(start, end + 1).join('\n');
2348

2449
return (
2550
<div className={styles.container}>
2651
<CollapseButton
27-
label="Collapse the full code"
28-
labelCollapsed="Expand the full code"
52+
label={label}
53+
expandedLabel={expandedLabel}
2954
collapsed={collapsed}
3055
onCollapse={() => setCollapsed(!collapsed)}
3156
className={styles.collapseButton}
3257
/>
33-
<CodeBlock language="jsx">{collapsed ? linesToShow : src}</CodeBlock>
58+
<CodeBlock language="tsx">{collapsed ? linesToShow : code}</CodeBlock>
3459
</div>
3560
);
3661
}

0 commit comments

Comments
 (0)