@@ -58,14 +58,25 @@ function missingTag() {
58
58
return null ;
59
59
}
60
60
61
- interface AST {
61
+ export interface AST {
62
62
tag : string ;
63
63
children : ( AST | string ) [ ] | ( ReactElement | string ) [ ] ;
64
64
props : { } ;
65
65
Tag : ComponentType ;
66
66
}
67
67
68
- export function SvgAst ( { ast, override } : { ast : AST ; override ?: Object } ) {
68
+ export type UriProps = { uri : string | null ; override ?: Object } ;
69
+ export type UriState = { xml : string | null } ;
70
+
71
+ export type XmlProps = { xml : string | null ; override ?: Object } ;
72
+ export type XmlState = { ast : AST | null } ;
73
+
74
+ export type AstProps = { ast : AST | null ; override ?: Object } ;
75
+
76
+ export function SvgAst ( { ast, override } : AstProps ) {
77
+ if ( ! ast ) {
78
+ return null ;
79
+ }
69
80
const { props, children } = ast ;
70
81
return (
71
82
< Svg { ...props } { ...override } >
@@ -74,10 +85,12 @@ export function SvgAst({ ast, override }: { ast: AST; override?: Object }) {
74
85
) ;
75
86
}
76
87
77
- export function SvgXml ( props : { xml : string ; override ?: Object } ) {
88
+ export function SvgXml ( props : XmlProps ) {
78
89
const { xml, override } = props ;
79
- const ast = useMemo ( ( ) => xml && parse ( xml ) , [ xml ] ) ;
80
- return ( ast && < SvgAst ast = { ast } override = { override || props } /> ) || null ;
90
+ const ast = useMemo < AST | null > ( ( ) => ( xml !== null ? parse ( xml ) : null ) , [
91
+ xml ,
92
+ ] ) ;
93
+ return < SvgAst ast = { ast } override = { override || props } /> ;
81
94
}
82
95
83
96
async function fetchText ( uri : string ) {
@@ -87,21 +100,23 @@ async function fetchText(uri: string) {
87
100
88
101
const err = console . error . bind ( console ) ;
89
102
90
- export function SvgUri ( props : { uri : string ; override ?: Object } ) {
103
+ export function SvgUri ( props : UriProps ) {
91
104
const { uri } = props ;
92
- const [ xml , setXml ] = useState ( ) ;
105
+ const [ xml , setXml ] = useState < string | null > ( null ) ;
93
106
useEffect ( ( ) => {
94
- fetchText ( uri )
95
- . then ( setXml )
96
- . catch ( err ) ;
107
+ uri
108
+ ? fetchText ( uri )
109
+ . then ( setXml )
110
+ . catch ( err )
111
+ : setXml ( null ) ;
97
112
} , [ uri ] ) ;
98
- return ( xml && < SvgXml xml = { xml } override = { props } /> ) || null ;
113
+ return < SvgXml xml = { xml } override = { props } /> ;
99
114
}
100
115
101
116
// Extending Component is required for Animated support.
102
117
103
- export class SvgFromXml extends Component < { xml : string ; override ?: Object } > {
104
- state : { ast ?: AST } = { } ;
118
+ export class SvgFromXml extends Component < XmlProps , XmlState > {
119
+ state = { ast : null } ;
105
120
componentDidMount ( ) {
106
121
this . parse ( this . props . xml ) ;
107
122
}
@@ -111,9 +126,9 @@ export class SvgFromXml extends Component<{ xml: string; override?: Object }> {
111
126
this . parse ( xml ) ;
112
127
}
113
128
}
114
- parse ( xml : string ) {
129
+ parse ( xml : string | null ) {
115
130
try {
116
- this . setState ( { ast : parse ( xml ) } ) ;
131
+ this . setState ( { ast : xml ? parse ( xml ) : null } ) ;
117
132
} catch ( e ) {
118
133
console . error ( e ) ;
119
134
}
@@ -123,24 +138,24 @@ export class SvgFromXml extends Component<{ xml: string; override?: Object }> {
123
138
props,
124
139
state : { ast } ,
125
140
} = this ;
126
- return ast ? < SvgAst ast = { ast } override = { props . override || props } /> : null ;
141
+ return < SvgAst ast = { ast } override = { props . override || props } /> ;
127
142
}
128
143
}
129
144
130
- export class SvgFromUri extends Component < { uri : string ; override ?: Object } > {
131
- state : { xml ?: string } = { } ;
145
+ export class SvgFromUri extends Component < UriProps , UriState > {
146
+ state = { xml : null } ;
132
147
componentDidMount ( ) {
133
148
this . fetch ( this . props . uri ) ;
134
149
}
135
- componentDidUpdate ( prevProps : { uri : string } ) {
150
+ componentDidUpdate ( prevProps : { uri : string | null } ) {
136
151
const { uri } = this . props ;
137
152
if ( uri !== prevProps . uri ) {
138
153
this . fetch ( uri ) ;
139
154
}
140
155
}
141
- async fetch ( uri : string ) {
156
+ async fetch ( uri : string | null ) {
142
157
try {
143
- this . setState ( { xml : await fetchText ( uri ) } ) ;
158
+ this . setState ( { xml : uri ? await fetchText ( uri ) : null } ) ;
144
159
} catch ( e ) {
145
160
console . error ( e ) ;
146
161
}
@@ -150,7 +165,7 @@ export class SvgFromUri extends Component<{ uri: string; override?: Object }> {
150
165
props,
151
166
state : { xml } ,
152
167
} = this ;
153
- return xml ? < SvgFromXml xml = { xml } override = { props } /> : null ;
168
+ return < SvgFromXml xml = { xml } override = { props } /> ;
154
169
}
155
170
}
156
171
0 commit comments