@@ -2,38 +2,54 @@ import React, { useEffect, useState } from 'react';
2
2
import MarkdownPreview from '@uiw/react-markdown-preview' ;
3
3
import GitHubCorners from '@uiw/react-github-corners' ;
4
4
import rehypeAttr from 'rehype-attr' ;
5
- // @ts -ignore
5
+ import Loader from '@uiw/react-loader' ;
6
6
import exts from 'code-example/ext.json' ;
7
7
import TextareaCodeEditor from '../' ;
8
8
import MDStr from '../README.md' ;
9
9
import './App.css' ;
10
10
11
- const App : React . FC = ( ) => {
12
- const [ value , setValue ] = useState ( '' ) ;
13
- const [ language , setLanguage ] = useState ( 'jsx' ) ;
14
- const [ lang , setLang ] = useState ( 'jsx' ) ;
11
+ const useFetch = ( language : string ) => {
12
+ const [ code , setCode ] = useState ( '' ) ;
13
+ const [ loading , setLoading ] = useState ( false ) ;
14
+ const [ lang , setLang ] = useState ( language ) ;
15
+ const [ error , setError ] = useState < any > ( null ) ;
16
+
15
17
useEffect ( ( ) => {
16
- if ( language ) {
17
- import ( `code-example/txt/sample.${ language } .txt` )
18
- . then ( ( code ) => {
19
- setValue ( code . default || '' ) ;
20
- let str = language ;
21
- if ( / ^ ( m y s q l | p g s q l ) $ / . test ( language ) ) {
22
- str = 'sql' ;
23
- }
24
- if ( / ^ ( o b j e c t i v e - c ) $ / . test ( language ) ) {
25
- str = 'objc' ;
26
- }
27
- if ( / ^ ( v u e ) $ / . test ( language ) ) {
28
- str = 'html' ;
29
- }
30
- setLang ( str ) ;
31
- } )
32
- . catch ( ( err ) => {
33
- setValue ( '' ) ;
34
- } ) ;
35
- }
18
+ setLoading ( true ) ;
19
+ const fetchData = async ( ) => {
20
+ try {
21
+ const codeStr = await import ( `code-example/txt/sample.${ language } .txt` ) ;
22
+ setCode ( codeStr . default ) ;
23
+
24
+ let str = language ;
25
+ if ( / ^ ( m y s q l | p g s q l ) $ / . test ( language ) ) {
26
+ str = 'sql' ;
27
+ }
28
+ if ( / ^ ( o b j e c t i v e - c ) $ / . test ( language ) ) {
29
+ str = 'objc' ;
30
+ }
31
+ if ( / ^ ( v u e ) $ / . test ( language ) ) {
32
+ str = 'html' ;
33
+ }
34
+ setLang ( str ) ;
35
+ setLoading ( false ) ;
36
+ } catch ( error ) {
37
+ console . log ( error ) ;
38
+ setLoading ( false ) ;
39
+ setError ( error ) ;
40
+ setCode ( '' ) ;
41
+ }
42
+ } ;
43
+ fetchData ( ) ;
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36
45
} , [ language ] ) ;
46
+
47
+ return { lang, loading, code, setCode, error } ;
48
+ } ;
49
+
50
+ const App : React . FC = ( ) => {
51
+ const [ language , setLanguage ] = useState ( 'jsx' ) ;
52
+ const { lang, loading, code, setCode } = useFetch ( language ) ;
37
53
// @ts -ignore
38
54
const version = VERSION ;
39
55
return (
@@ -46,7 +62,7 @@ const App: React.FC = () => {
46
62
< div className = "App-editor" >
47
63
< TextareaCodeEditor
48
64
autoFocus
49
- value = { value }
65
+ value = { code }
50
66
language = { lang }
51
67
minHeight = { 80 }
52
68
placeholder = { `Please enter ${ ( language || '' ) . toLocaleUpperCase ( ) } code.` }
@@ -55,7 +71,7 @@ const App: React.FC = () => {
55
71
fontSize : 14 ,
56
72
fontFamily : 'ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace' ,
57
73
} }
58
- onChange = { ( evn ) => setValue ( evn . target . value ) }
74
+ onChange = { ( evn ) => setCode ( evn . target . value ) }
59
75
/>
60
76
</ div >
61
77
< div className = "App-tools" style = { { marginTop : 5 } } >
@@ -69,6 +85,7 @@ const App: React.FC = () => {
69
85
) ;
70
86
} ) }
71
87
</ select >
88
+ < Loader loading = { loading } />
72
89
</ div >
73
90
< MarkdownPreview source = { MDStr } className = "info" rehypePlugins = { [ [ rehypeAttr , { properties : 'attr' } ] ] } />
74
91
</ div >
0 commit comments