Fix dismissing recaptcha
This commit is contained in:
parent
24ccfa0dd8
commit
d59f0e748d
2 changed files with 41 additions and 8 deletions
|
@ -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() {
|
||||||
|
|
|
@ -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 };
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue