72 lines
2.1 KiB
JavaScript
72 lines
2.1 KiB
JavaScript
import {
|
|
getAuth,
|
|
signInAnonymously,
|
|
signInWithCustomToken,
|
|
signOut,
|
|
} from '@react-native-firebase/auth';
|
|
import { getFirestore } from '@react-native-firebase/firestore';
|
|
import {
|
|
connectFunctionsEmulator,
|
|
getFunctions,
|
|
} from '@react-native-firebase/functions';
|
|
import fetchBackend from './handleBackend';
|
|
import { Platform } from 'react-native';
|
|
import { getStorage } from '@react-native-firebase/storage';
|
|
|
|
export const db = getFirestore();
|
|
export const storage = getStorage();
|
|
export const firebaseAuth = getAuth();
|
|
|
|
let initializationPromise = null;
|
|
let lastInitializedKey = null;
|
|
|
|
export async function initializeFirebase(publicKey, privateKey) {
|
|
const cacheKey = publicKey;
|
|
|
|
if (initializationPromise && lastInitializedKey === cacheKey) {
|
|
console.log('Reusing existing initialization promise');
|
|
return initializationPromise;
|
|
}
|
|
|
|
if (lastInitializedKey !== cacheKey) {
|
|
initializationPromise = null;
|
|
}
|
|
|
|
lastInitializedKey = cacheKey;
|
|
initializationPromise = (async () => {
|
|
try {
|
|
// Initialize App Check first
|
|
// Sign in anonymously
|
|
if (__DEV__) {
|
|
connectFunctionsEmulator(getFunctions(), process.env.DEVICE_IP, 5001);
|
|
}
|
|
|
|
const currentUser = firebaseAuth.currentUser;
|
|
|
|
if (currentUser && currentUser?.uid === publicKey) {
|
|
return currentUser;
|
|
}
|
|
await signInAnonymously(firebaseAuth);
|
|
const isSignedIn = firebaseAuth.currentUser;
|
|
console.log(isSignedIn.uid, 'signed in');
|
|
const token = await fetchBackend(
|
|
'customToken',
|
|
{ userAuth: isSignedIn?.uid },
|
|
privateKey,
|
|
publicKey,
|
|
);
|
|
if (!token) throw new Error('Not able to get custom token from backend');
|
|
|
|
const customSignIn = await signInWithCustomToken(firebaseAuth, token);
|
|
return customSignIn;
|
|
} catch (error) {
|
|
console.error('Error initializing Firebase:', error);
|
|
// Clear the cache on error so the next call can retry
|
|
initializationPromise = null;
|
|
lastInitializedKey = null;
|
|
throw new Error(String(error.message));
|
|
}
|
|
})();
|
|
return initializationPromise;
|
|
}
|