Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,11 @@ export interface AST {
Tag: React.ComponentType;
}

export type AdditionalProps = {
onError?: (error: Error) => void;
override?: AdditionalProps;
} & SvgProps;

export interface XmlAST extends AST {
children: (XmlAST | string)[];
parent: XmlAST | null;
Expand All @@ -534,21 +539,18 @@ export interface JsxAST extends AST {
children: (JSX.Element | string)[];
}

export interface UriProps extends SvgProps {
export interface UriProps extends AdditionalProps {
uri: string | null;
override?: SvgProps;
}
export type UriState = { xml: string | null };

export interface XmlProps extends SvgProps {
export interface XmlProps extends AdditionalProps {
xml: string | null;
override?: SvgProps;
}
export type XmlState = { ast: JsxAST | null };

export interface AstProps extends SvgProps {
export interface AstProps extends AdditionalProps {
ast: JsxAST | null;
override?: SvgProps;
}

export type Middleware = (ast: XmlAST) => XmlAST;
Expand Down
31 changes: 23 additions & 8 deletions src/xml.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export interface JsxAST extends AST {

export type AdditionalProps = {
onError?: (error: Error) => void;
override?: Object;
override?: AdditionalProps;
};

export type UriProps = { uri: string | null } & AdditionalProps;
Expand All @@ -109,13 +109,24 @@ export function SvgAst({ ast, override }: AstProps) {
export const err = console.error.bind(console);

export function SvgXml(props: XmlProps) {
const { onError = err, xml, override } = props;
const ast = useMemo<JsxAST | null>(() => (xml !== null ? parse(xml) : null), [
const { xml } = props;
const onError = props.onError || props.override?.onError || err;
const ast = useMemo<JsxAST | null>(() => {
try {
return xml !== null ? parse(xml) : null;
} catch (e) {
if (!!onError) {
onError(e);
}
return null;
}
}, [
xml,
onError
]);

try {
return <SvgAst ast={ast} override={override || props} />;
return <SvgAst ast={ast} override={props.override || props} />;
} catch (error) {
onError(error);
return null;
Expand All @@ -133,8 +144,8 @@ export function SvgUri(props: UriProps) {
useEffect(() => {
uri
? fetchText(uri)
.then(setXml)
.catch(onError)
.then(setXml)
.catch(onError)
: setXml(null);
}, [onError, uri]);
return <SvgXml xml={xml} override={props} />;
Expand All @@ -155,9 +166,13 @@ export class SvgFromXml extends Component<XmlProps, XmlState> {
}
parse(xml: string | null) {
try {
this.setState({ ast: xml ? parse(xml) : null });
const ast = xml ? parse(xml) : null;
this.setState({ ast });
} catch (e) {
console.error(e);
const onError = this.props.onError || this.props.override?.onError || err;
if (!!onError) {
onError(e);
}
}
}
render() {
Expand Down