-
-
Notifications
You must be signed in to change notification settings - Fork 106
/
Copy pathScript.tsx
30 lines (25 loc) · 789 Bytes
/
Script.tsx
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
import { createResource } from './createResource';
export interface ScriptProps {
src: HTMLScriptElement['src'];
}
export const ScriptResource = createResource((src: ScriptProps['src']) => {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.onload = () => resolve(script);
script.onerror = reject;
// @todo decide if this is sensible.
// script.async = true
document.body.appendChild(script);
});
});
export const Script: React.FC<ScriptProps> = ({ children, ...rest }) => {
ScriptResource.read(rest.src);
if (typeof children === 'function') {
return children();
}
return children;
};
export function useScript({ src }: ScriptProps) {
return ScriptResource.read(src);
}