-
Notifications
You must be signed in to change notification settings - Fork 148
/
Copy pathuseLoadGsiScript.ts
60 lines (51 loc) · 1.77 KB
/
useLoadGsiScript.ts
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
49
50
51
52
53
54
55
56
57
58
59
60
import { useState, useEffect, useRef } from 'react';
export interface UseLoadGsiScriptOptions {
/**
* Nonce applied to GSI script tag. Propagates to GSI's inline style tag
*/
nonce?: string;
/**
* ISO-639 code of [locale](https://developers.google.com/identity/gsi/web/reference/js-reference#locale) to use for content
*/
locale?: string;
/**
* Callback fires on load [gsi](https://accounts.google.com/gsi/client) script success
*/
onScriptLoadSuccess?: () => void;
/**
* Callback fires on load [gsi](https://accounts.google.com/gsi/client) script failure
*/
onScriptLoadError?: () => void;
}
export default function useLoadGsiScript(
options: UseLoadGsiScriptOptions = {},
): boolean {
const { nonce, locale, onScriptLoadSuccess, onScriptLoadError } = options;
const [scriptLoadedSuccessfully, setScriptLoadedSuccessfully] =
useState(false);
const onScriptLoadSuccessRef = useRef(onScriptLoadSuccess);
onScriptLoadSuccessRef.current = onScriptLoadSuccess;
const onScriptLoadErrorRef = useRef(onScriptLoadError);
onScriptLoadErrorRef.current = onScriptLoadError;
useEffect(() => {
const scriptTag = document.createElement('script');
scriptTag.src = 'https://accounts.google.com/gsi/client';
if (locale) scriptTag.src += `?hl=${locale}`;
scriptTag.async = true;
scriptTag.defer = true;
scriptTag.nonce = nonce;
scriptTag.onload = () => {
setScriptLoadedSuccessfully(true);
onScriptLoadSuccessRef.current?.();
};
scriptTag.onerror = () => {
setScriptLoadedSuccessfully(false);
onScriptLoadErrorRef.current?.();
};
document.body.appendChild(scriptTag);
return () => {
document.body.removeChild(scriptTag);
};
}, [nonce]);
return scriptLoadedSuccessfully;
}