import { signInWithPopup } from 'firebase/auth';
import { useCallback, useState } from 'react';
import { useFirebaseAuth } from '../contexts/FirebaseAuthProvider';
import { Banner } from './Banner';
import { Button, type ButtonProps } from './Button';
export const UtahIdLogin = ({
size = 'medium',
errorRenderer = (error) => {
return {error};
},
}: {
size?: ButtonProps['size'];
errorRenderer?: (error: string) => React.ReactNode;
}) => {
const [signInError, setSignInError] = useState(null);
const { auth, provider } = useFirebaseAuth() || {};
const handlePress = useCallback(async () => {
if (!auth || !provider) {
console.warn(
'You must initialize Firebase Auth with an identity provider before using this component',
);
return;
}
// @see https://firebase.google.com/docs/auth/web/google-signin
try {
await signInWithPopup(auth, provider);
} catch (error) {
// Check if the error is a typical Firebase error
if (error && typeof error === 'object' && 'code' in error) {
const errorWithCode = error as { code: string; message: string };
const match = /\{.*\}/.exec(errorWithCode.message);
if (match?.length) {
try {
const response = JSON.parse(match[0]);
setSignInError(response.error.message);
} catch {
setSignInError(errorWithCode.message ?? 'Unknown error');
}
} else {
setSignInError(errorWithCode.message ?? 'Unknown error');
}
} else {
setSignInError('Unknown login error');
}
}
}, [auth, provider]);
let height = 'h-6';
if (size === 'extraSmall') {
height = 'h-4';
} else if (size === 'small') {
height = 'h-5';
} else if (size === 'medium') {
height = 'h-6';
} else if (size === 'large') {
height = 'h-7';
} else if (size === 'extraLarge') {
height = 'h-9';
}
return (
<>
continue with
<>{signInError && errorRenderer(signInError)}>
>
);
};