Skip to content

Commit d73e66d

Browse files
authored
docs: improve codeblock button loading state and error handling (ant-design#53889)
1 parent 713c5d6 commit d73e66d

File tree

1 file changed

+52
-52
lines changed

1 file changed

+52
-52
lines changed
Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,17 @@
1-
import React, { Suspense, useEffect, useState } from 'react';
2-
import { Tooltip } from 'antd';
1+
import React, { useState } from 'react';
2+
import { Tooltip, App } from 'antd';
3+
import { LoadingOutlined } from '@ant-design/icons';
34
import { FormattedMessage } from 'dumi';
45

5-
const codeBlockJs =
6-
'https://renderoffice.a' +
7-
'lipay' +
8-
'objects.com/p' +
9-
'/yuyan/180020010001206410/parseFileData-v1.0.1.js';
10-
11-
function useShowCodeBlockButton() {
12-
const [showCodeBlockButton, setShowCodeBlockButton] = useState(false);
13-
14-
useEffect(() => {
15-
const scriptId = 'hitu-code-block-js';
16-
const existScript = document.getElementById(scriptId) as HTMLScriptElement | null;
17-
18-
if (existScript) {
19-
// 如果已标记 loaded,直接显示按钮
20-
if (existScript.dataset.loaded) {
21-
setShowCodeBlockButton(true);
22-
}
23-
return;
24-
}
25-
const script = document.createElement('script');
26-
script.src = codeBlockJs;
27-
script.async = true;
28-
script.id = scriptId;
29-
script.onload = () => {
30-
script.dataset.loaded = 'true';
31-
setShowCodeBlockButton(true);
32-
};
33-
document.body.appendChild(script);
34-
}, []);
35-
36-
return showCodeBlockButton;
37-
}
38-
396
interface CodeBlockButtonProps {
407
title?: string;
418
dependencies: Record<PropertyKey, string>;
429
jsx: string;
4310
}
4411

4512
const CodeBlockButton: React.FC<CodeBlockButtonProps> = ({ title, dependencies = {}, jsx }) => {
46-
const showCodeBlockButton = useShowCodeBlockButton();
13+
const { message } = App.useApp();
14+
const [loading, setLoading] = useState(false);
4715

4816
const codeBlockPrefillConfig = {
4917
title: `${title} - antd@${dependencies.antd}`,
@@ -57,24 +25,56 @@ const CodeBlockButton: React.FC<CodeBlockButtonProps> = ({ title, dependencies =
5725
json: JSON.stringify({ name: 'antd-demo', dependencies }, null, 2),
5826
};
5927

60-
return showCodeBlockButton ? (
28+
const openHituCodeBlockFn = () => {
29+
setLoading(false);
30+
// @ts-ignore
31+
if (window.openHituCodeBlock) {
32+
// @ts-ignore
33+
window.openHituCodeBlock(JSON.stringify(codeBlockPrefillConfig));
34+
} else {
35+
message.error('此功能仅在内网环境可用');
36+
}
37+
};
38+
39+
const handleClick = () => {
40+
const scriptId = 'hitu-code-block-js';
41+
const existScript = document.getElementById(scriptId) as HTMLScriptElement | null;
42+
// @ts-ignore
43+
if (existScript?.dataset.loaded) {
44+
openHituCodeBlockFn();
45+
return;
46+
}
47+
setLoading(true);
48+
const script = document.createElement('script');
49+
script.src = `https://renderoffice.alipayobjects.com/p/yuyan/180020010001206410/parseFileData-v1.0.1.js?t=${Date.now()}`;
50+
script.async = true;
51+
script.id = scriptId;
52+
script.onload = () => {
53+
script.dataset.loaded = 'true';
54+
openHituCodeBlockFn();
55+
};
56+
script.onerror = () => {
57+
openHituCodeBlockFn();
58+
};
59+
document.body.appendChild(script);
60+
};
61+
62+
return (
6163
<Tooltip title={<FormattedMessage id="app.demo.codeblock" />}>
6264
<div className="code-box-code-action">
63-
<img
64-
alt="codeblock"
65-
src="https://mdn.alipayobjects.com/huamei_wtld8u/afts/img/A*K8rjSJpTNQ8AAAAAAAAAAAAADhOIAQ/original"
66-
className="code-box-codeblock"
67-
onClick={() => {
68-
openHituCodeBlock?.(JSON.stringify(codeBlockPrefillConfig));
69-
}}
70-
/>
65+
{loading ? (
66+
<LoadingOutlined className="code-box-codeblock" />
67+
) : (
68+
<img
69+
alt="codeblock"
70+
src="https://mdn.alipayobjects.com/huamei_wtld8u/afts/img/A*K8rjSJpTNQ8AAAAAAAAAAAAADhOIAQ/original"
71+
className="code-box-codeblock"
72+
onClick={handleClick}
73+
/>
74+
)}
7175
</div>
7276
</Tooltip>
73-
) : null;
77+
);
7478
};
7579

76-
export default (props: CodeBlockButtonProps) => (
77-
<Suspense>
78-
<CodeBlockButton {...props} />
79-
</Suspense>
80-
);
80+
export default CodeBlockButton;

0 commit comments

Comments
 (0)