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' ;
34import { 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-
396interface CodeBlockButtonProps {
407 title ?: string ;
418 dependencies : Record < PropertyKey , string > ;
429 jsx : string ;
4310}
4411
4512const 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