-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Expand file tree
/
Copy patherror-mdx.tsx
More file actions
48 lines (45 loc) · 1.21 KB
/
error-mdx.tsx
File metadata and controls
48 lines (45 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
'use client';
import {Fragment} from 'react';
import {ErrorDecoderProvider} from '../../../components/_/ErrorDecoderContext';
import {MDXComponents} from '../../../components/MDX/MDXComponents';
export default function ErrorMDX({
content,
errorCode,
errorMessage,
}: {
content: string;
errorCode: string | null;
errorMessage: string | null;
}) {
return (
<ErrorDecoderProvider value={{errorMessage, errorCode}}>
{JSON.parse(content, reviveNodeOnClient)}
</ErrorDecoderProvider>
);
}
// Deserialize a client React tree from JSON.
function reviveNodeOnClient(parentPropertyName: unknown, val: any) {
if (Array.isArray(val) && val[0] == '$r') {
// Assume it's a React element.
let Type = val[1];
let key = val[2];
if (key == null) {
key = parentPropertyName; // Index within a parent.
}
let props = val[3];
if (Type === 'wrapper') {
Type = Fragment;
props = {children: props.children};
}
if (Type in MDXComponents) {
Type = MDXComponents[Type as keyof typeof MDXComponents];
}
if (!Type) {
console.error('Unknown type: ' + Type);
Type = Fragment;
}
return <Type key={key} {...props} />;
} else {
return val;
}
}