Fix dismissing recaptcha

This commit is contained in:
Robert Long 2022-01-04 17:57:23 -08:00
parent 24ccfa0dd8
commit d59f0e748d
2 changed files with 41 additions and 8 deletions

View file

@ -28,7 +28,7 @@ export function UnauthenticatedView() {
(e) => { (e) => {
e.preventDefault(); e.preventDefault();
const data = new FormData(e.target); const data = new FormData(e.target);
const roomName = data.get("roomName"); const roomName = data.get("callName");
const userName = data.get("userName"); const userName = data.get("userName");
async function submit() { async function submit() {

View file

@ -6,7 +6,7 @@ const RECAPTCHA_SCRIPT_URL =
export function useRecaptcha(sitekey) { export function useRecaptcha(sitekey) {
const [recaptchaId] = useState(() => randomString(16)); const [recaptchaId] = useState(() => randomString(16));
const resolvePromiseRef = useRef(); const promiseRef = useRef();
useEffect(() => { useEffect(() => {
if (!sitekey) { if (!sitekey) {
@ -22,8 +22,13 @@ export function useRecaptcha(sitekey) {
sitekey, sitekey,
size: "invisible", size: "invisible",
callback: (response) => { callback: (response) => {
if (resolvePromiseRef.current) { if (promiseRef.current) {
resolvePromiseRef.current(response); promiseRef.current.resolve(response);
}
},
"error-callback": (error) => {
if (promiseRef.current) {
promiseRef.current.reject(error);
} }
}, },
}); });
@ -51,9 +56,39 @@ export function useRecaptcha(sitekey) {
return Promise.reject(new Error("Recaptcha not loaded")); return Promise.reject(new Error("Recaptcha not loaded"));
} }
return new Promise((resolve) => { return new Promise((resolve, reject) => {
resolvePromiseRef.current = resolve; const observer = new MutationObserver((mutationsList) => {
for (const item of mutationsList) {
if (item.target.style.visibility !== "visible") {
reject(new Error("Recaptcha dismissed"));
observer.disconnect();
return;
}
}
});
promiseRef.current = {
resolve: (value) => {
resolve(value);
observer.disconnect();
},
reject: (error) => {
reject(error);
observer.disconnect();
},
};
window.grecaptcha.execute(); window.grecaptcha.execute();
const iframe = document.querySelector(
'iframe[src*="recaptcha/api2/bframe"]'
);
if (iframe?.parentNode?.parentNode) {
observer.observe(iframe?.parentNode?.parentNode, {
attributes: true,
});
}
}); });
}, [recaptchaId]); }, [recaptchaId]);
@ -63,7 +98,5 @@ export function useRecaptcha(sitekey) {
} }
}, [recaptchaId]); }, [recaptchaId]);
console.log(recaptchaId);
return { execute, reset, recaptchaId }; return { execute, reset, recaptchaId };
} }