Files
twenty/packages/twenty-front/src/modules/captcha/components/CaptchaProviderScriptLoaderEffect.tsx
Charles Bochet 158e7a31f4 Improve tests (#5994)
Our tests on FE are red, which is a threat to code quality. I'm adding a
few unit tests to improve the coverage and lowering a bit the lines
coverage threshold
2024-06-23 20:12:18 +02:00

53 lines
1.6 KiB
TypeScript

import { useEffect } from 'react';
import { useRecoilValue, useSetRecoilState } from 'recoil';
import { isCaptchaScriptLoadedState } from '@/captcha/states/isCaptchaScriptLoadedState';
import { getCaptchaUrlByProvider } from '@/captcha/utils/getCaptchaUrlByProvider';
import { captchaProviderState } from '@/client-config/states/captchaProviderState';
import { CaptchaDriverType } from '~/generated/graphql';
export const CaptchaProviderScriptLoaderEffect = () => {
const captchaProvider = useRecoilValue(captchaProviderState);
const setIsCaptchaScriptLoaded = useSetRecoilState(
isCaptchaScriptLoadedState,
);
useEffect(() => {
if (!captchaProvider?.provider || !captchaProvider.siteKey) {
return;
}
const scriptUrl = getCaptchaUrlByProvider(
captchaProvider.provider,
captchaProvider.siteKey,
);
if (!scriptUrl) {
return;
}
let scriptElement: HTMLScriptElement | null = document.querySelector(
`script[src="${scriptUrl}"]`,
);
if (!scriptElement) {
scriptElement = document.createElement('script');
scriptElement.src = scriptUrl;
scriptElement.onload = () => {
if (captchaProvider.provider === CaptchaDriverType.GoogleRecaptcha) {
window.grecaptcha?.ready(() => {
setIsCaptchaScriptLoaded(true);
});
} else {
setIsCaptchaScriptLoaded(true);
}
};
document.body.appendChild(scriptElement);
}
}, [
captchaProvider?.provider,
captchaProvider?.siteKey,
setIsCaptchaScriptLoaded,
]);
return <></>;
};