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
53 lines
1.6 KiB
TypeScript
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 <></>;
|
|
};
|