import { DEFAULT_WEB_APP_OPTIONS, FirebaseOptions } from 'expo-firebase-core'; import { CodedError } from 'expo-modules-core'; import * as React from 'react'; import { WebView } from './WebView'; interface Props extends React.ComponentProps { firebaseConfig?: FirebaseOptions; firebaseVersion?: string; appVerificationDisabledForTesting?: boolean; languageCode?: string; onLoad?: () => any; onError?: () => any; onVerify: (token: string) => any; onFullChallenge?: () => any; invisible?: boolean; verify?: boolean; } function getWebviewSource( firebaseConfig: FirebaseOptions, firebaseVersion?: string, appVerificationDisabledForTesting: boolean = false, languageCode?: string, invisible?: boolean ) { firebaseVersion = firebaseVersion || '8.0.0'; return { baseUrl: `https://${firebaseConfig.authDomain}`, html: ` ${ invisible ? `` : `
` } `, }; } function validateFirebaseConfig(firebaseConfig?: FirebaseOptions) { if (!firebaseConfig) { throw new CodedError( 'ERR_FIREBASE_RECAPTCHA_CONFIG', `Missing firebase web configuration. Please set the "expo.web.config.firebase" field in "app.json" or use the "firebaseConfig" prop.` ); } const { authDomain } = firebaseConfig; if (!authDomain) { throw new CodedError( 'ERR_FIREBASE_RECAPTCHA_CONFIG', `Missing "authDomain" in firebase web configuration.` ); } } export default function FirebaseRecaptcha(props: Props) { const { firebaseConfig, firebaseVersion, appVerificationDisabledForTesting, languageCode, onVerify, onLoad, onError, onFullChallenge, invisible, verify, ...otherProps } = props; const webview = React.useRef(null); const [loaded, setLoaded] = React.useState(false); React.useEffect(() => { if (webview.current && loaded && verify) { // @ts-ignore: Object is possibly null webview.current.injectJavaScript(` (function(){ window.dispatchEvent(new MessageEvent('message', {data: { verify: true }})); })(); true; `); } return () => {}; }, [webview, verify, loaded]); validateFirebaseConfig(firebaseConfig); if (!firebaseConfig) { console.error( `FirebaseRecaptcha: Missing firebase web configuration. Please set the "expo.web.config.firebase" field in "app.json" or use the "firebaseConfig" prop.` ); return null; } return ( { const data = JSON.parse(event.nativeEvent.data); switch (data.type) { case 'load': if (onLoad) { setLoaded(true); onLoad(); } break; case 'error': if (onError) { onError(); } break; case 'verify': onVerify(data.token); break; case 'fullChallenge': if (onFullChallenge) { onFullChallenge(); } break; } }} {...otherProps} /> ); } FirebaseRecaptcha.defaultProps = { firebaseConfig: DEFAULT_WEB_APP_OPTIONS, };