import { AuthScreen } from '@/components/auth/auth-screen'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Text } from '@/components/ui/text'; import { useToast } from '@/components/ui/toast'; import { messageFor } from '@/lib/errors'; import { auth } from '@/lib/firebase'; import { router } from 'expo-router'; import { sendPasswordResetEmail } from 'firebase/auth'; import { Mail } from 'lucide-react-native'; import { useState } from 'react'; /** * Where the reset link sends the user. * * Unset by default, and that is the shipped behaviour: without it Firebase uses * its own hosted reset page, which works perfectly well — the user changes * their password in the browser and comes back to the app to sign in. Set * EXPO_PUBLIC_FIREBASE_LINK_URL to a Hosting URL your app claims through * Universal Links / App Links and the link opens `/reset-password` in the app * instead. See the README. * * Note this must be an **https** URL on a domain listed under Authentication → * Settings → Authorized domains. A custom scheme (`myapp://`) is rejected. */ const linkUrl = process.env.EXPO_PUBLIC_FIREBASE_LINK_URL; export default function ForgotPasswordScreen() { const [email, setEmail] = useState(''); const [sent, setSent] = useState(false); const [loading, setLoading] = useState(false); const toast = useToast(); const send = async () => { setLoading(true); try { await sendPasswordResetEmail( auth, email.trim(), linkUrl ? { url: linkUrl, handleCodeInApp: true } : undefined ); setSent(true); } catch (caught) { // With email enumeration protection on — the default since September // 2023 — Firebase resolves successfully for an unknown address too, so // this branch is a genuine failure (a malformed address, a rate limit), // not "no such user". toast.error('Could not send the email', messageFor(caught)); } finally { setLoading(false); } }; if (sent) { return ( {linkUrl ? 'The link opens this app and takes you straight to a new-password screen. It expires in an hour.' : 'The link opens a page where you can set a new password, then come back here to sign in. It expires in an hour.'} ); } return ( router.back()}> Back to sign in } > email.trim() && send()} /> ); }