Skip to content

Commit 7d80ea2

Browse files
committed
chore: error-handling, react-unmount-node
1 parent 61d76ea commit 7d80ea2

File tree

5 files changed

+42
-31
lines changed

5 files changed

+42
-31
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ Visit: https://coldemo.github.io/
66

77
- [ ] vscode tsconfig src/\* alias (being reverted by npm-run-dev)
88
- [ ] antd4, safe js exec sandbox - see pureproxy
9-
- [ ] storage list, reset btn, sandboxNode, batch-screenshot, responsive-improve
109
- [ ] lang ts/tsx/vue/py/rb/java
10+
- [ ] storage list, reset btn, responsive, screenshot
11+
- [ ] error-handling, sandboxNode
1112
- [x] gh-pages, lang js/jsx, react/vue, umd-hack
1213
- [x] code read from url, storybook cards
1314
- [x] web worker for babel transform

src/hooks/useApi.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type Request = (
1515

1616
export interface UseApiObj<T = any, DT = T | null> {
1717
request: Request;
18+
error: Error | null;
1819
response: AxiosResponse<T> | null;
1920
getData: () => DT;
2021
loading: boolean;
@@ -34,6 +35,7 @@ export let useApi = <T = any, DT = T>(
3435
): UseApiObj<T, DT> => {
3536
let [response, setResponse] = useState<AxiosResponse<T> | null>(null);
3637
let [loading, setLoading] = useState(false);
38+
let [error, setError] = useState(null);
3739

3840
let request: Request = useCallback(
3941
async (patch = {}) => {
@@ -51,8 +53,10 @@ export let useApi = <T = any, DT = T>(
5153
...patch,
5254
});
5355
setResponse(response);
56+
setError(null);
5457
} catch (err) {
55-
// @todo
58+
setResponse(null);
59+
setError(err);
5660
} finally {
5761
setLoading(false);
5862
}
@@ -64,5 +68,5 @@ export let useApi = <T = any, DT = T>(
6468
return parseData(response);
6569
}, [parseData, response]);
6670

67-
return { request, response, getData, loading };
71+
return { request, error, response, getData, loading };
6872
};

src/playground/Playground.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,12 @@ export let Playground: React.FC = () => {
7070
response: respIndex,
7171
loading: loadingIndex,
7272
} = useApi<string>('GET', 'code/index.yml');
73-
let { request: reqCode, response: respCode, loading: loadingCode } = useApi<
74-
string
75-
>('GET', 'code/:file');
73+
let {
74+
request: reqCode,
75+
error: errReqCode,
76+
response: respCode,
77+
loading: loadingCode,
78+
} = useApi<string>('GET', 'code/:file');
7679
let preloading = loadingIndex || loadingCode;
7780

7881
useEffect(() => {
@@ -89,19 +92,31 @@ export let Playground: React.FC = () => {
8992
let txt = respIndex.data;
9093
let list = txt
9194
.split(/\n/)
95+
.map(s => s.replace(/#.*/, '').trim())
9296
.filter(Boolean)
9397
.map(v => v.replace(/^-\s*/, ''));
9498
let defaults = list[0];
9599
// reqCode({ pathParams: { file: file || defaults } });
96100
history.push(`/playground/${file || defaults}`);
97-
}, [file, history, reqCode, respIndex]);
101+
// eslint-disable-next-line react-hooks/exhaustive-deps
102+
}, [file, respIndex]);
98103

99104
useEffect(() => {
100105
if (respCode == null) return;
101106
codeBinding.controlled.onChange(null, null, respCode.data);
102107
// eslint-disable-next-line react-hooks/exhaustive-deps
103108
}, [respCode]);
104109

110+
useEffect(() => {
111+
// if (errReqCode && String(errReqCode).includes('status code 404')) {
112+
// history.push('/'); // force redirect
113+
// }
114+
if (errReqCode) {
115+
displayError(new Error(`${errReqCode.message} - ${file}`));
116+
}
117+
// eslint-disable-next-line react-hooks/exhaustive-deps
118+
}, [errReqCode]);
119+
105120
let [preview, setPreview] = useState('');
106121
let [compiling, setCompiling] = useState(false);
107122
let [rendering, setRendering] = useState(false);

src/playground/babelMaster.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ let wrapCode = (code: string) => {
44
return `
55
(async () => {
66
setRendering(true)
7-
mountNode.innerHTML = ''
7+
// mountNode.innerHTML = '' // can cause error in react
8+
ReactDOM.unmountComponentAtNode(mountNode)
89
try {
910
let { useRef, useMemo, useState, useEffect, useLayoutEffect, useReducer, useContext, useCallback, useImperativeHandle } = React
1011
;;${code};;

src/playground/util.tsx

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ export let loadJsForceUmd = async ({
1717
name: string;
1818
deps: { [key: string]: string };
1919
}) => {
20-
let { data: code } = await Axios(url);
20+
let code = '';
21+
try {
22+
let { data } = await Axios(url);
23+
code = data;
24+
} catch (err) {
25+
throw new Error(`loadJsForceUmd - ${err.message} - ${url}`);
26+
}
2127
code = `
2228
(() => {
2329
let module = { exports: {} }
@@ -64,29 +70,13 @@ export let loadCss = (url: string) => {
6470
};
6571

6672
export let appendJs = (code: string) => {
67-
return new Promise((resolve, reject) => {
68-
let el = document.createElement('script');
69-
el.innerHTML = code;
70-
el.onload = () => {
71-
resolve();
72-
};
73-
el.onerror = e => {
74-
reject(new Error(`appendJs onerror - ${code.slice(0, 100)}`));
75-
};
76-
window.mountNode.appendChild(el);
77-
});
73+
let el = document.createElement('script');
74+
el.innerHTML = code;
75+
window.mountNode.appendChild(el);
7876
};
7977

8078
export let appendCss = (code: string) => {
81-
return new Promise((resolve, reject) => {
82-
let el = document.createElement('style');
83-
el.innerHTML = code;
84-
el.onload = () => {
85-
resolve();
86-
};
87-
el.onerror = e => {
88-
reject(new Error(`appendCss onerror - ${code.slice(0, 100)}`));
89-
};
90-
window.mountNode.appendChild(el);
91-
});
79+
let el = document.createElement('style');
80+
el.innerHTML = code;
81+
window.mountNode.appendChild(el);
9282
};

0 commit comments

Comments
 (0)