/**
* AuthProvider
* Wraps app and handles auth initialization
*
* Usage:
* ```tsx
*
*
*
* ```
*/
import { useEffect, useState, type ReactNode } from "react";
import { View, Text } from "react-native";
import { initializeAuthListener } from "../stores/initializeAuthListener";
interface AuthProviderProps {
children: ReactNode;
/**
* Custom error component to display when auth initialization fails
*/
ErrorFallback?: React.ComponentType<{ error: Error; retry: () => void }>;
}
export interface ErrorFallbackProps {
error: Error;
retry: () => void;
}
/**
* Default error fallback component
*/
function DefaultErrorFallback({ error, retry }: { error: Error; retry: () => void }) {
return (
Authentication Error
{error.message || "Failed to initialize authentication. Please restart the app."}
Retry
);
}
/**
* AuthProvider component
* Initializes Firebase auth listener on mount
* Must wrap the app root
* Includes error boundary for graceful error handling
*/
export function AuthProvider({ children, ErrorFallback = DefaultErrorFallback }: AuthProviderProps): ReactNode {
const [error, setError] = useState(null);
const [retryCount, setRetryCount] = useState(0);
useEffect(() => {
let unsubscribe: (() => void) | undefined;
try {
unsubscribe = initializeAuthListener();
} catch (err) {
const errorObj = err instanceof Error ? err : new Error("Unknown initialization error");
setError(errorObj);
}
return () => {
if (unsubscribe) {
try {
unsubscribe();
} catch (error) {
if (__DEV__) {
console.error('[AuthProvider] Cleanup failed:', error instanceof Error ? error.message : String(error));
}
}
}
};
}, [retryCount]); // Re-run on retry
// If error occurred, show error fallback
if (error) {
return {
setError(null);
setRetryCount(prev => prev + 1);
}} />;
}
return <>{children}>;
}