Contexts and Providers
Optionally, you can use contexts and providers provided by firereact to get the instance of your Firebase app or any specific service to avoid prop-drilling and global variables.
Later, in your code, you can access to these instances via useContext as such:
const YourCustomComponent = () => {
const firestore = useContext(FirestoreContext);
// use `firestore` instance
}
Info
This is totally optional and you can still stick to classic prop-drilling methods or global variables.
Setting Up
After you install firereact, head to you application entry point (index.ts, main.tsx or maybe App.tsx) and wrap your app with providers given by firereact library.
Setting Up for Firebase
Head to your entry point and wrap your app with FirebaseProvider:
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<FirebaseProvider app={app}>
{/** the rest of your app */}
</FirebaseProvider>
</React.StrictMode>
)
FirebaseProvider only requires one parameter with signature app: FirebaseApp.
Now, you can get the instance of your FirebaseApp anywhere in the component tree by simply doing:
const app = useContext(FirebaseAppContext);
Tip
The type you get from useContext is FirebaseApp | undefined. You can simply use app! (non-null assertion operator) as you guarantee it to be defined when you use FirebaseProvider.
Setting Up for Firestore
Head to your entry point and wrap your app with FirestoreProvider:
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<FirestoreProvider firestore={firestore}>
{/** the rest of your app */}
</FirestoreProvider>
</React.StrictMode>
)
FirestoreProvider only requires one parameter with signature firestore: Firestore.
Now, you can get the instance of your Firestore anywhere in the component tree by simply doing:
const firestore = useContext(FirestoreContext);
Tip
The type you get from useContext is Firestore | undefined. You can simply use firestore! (non-null assertion operator) as you guarantee it to be defined when you use FirestoreProvider.
Setting Up for Firebase Auth
Head to your entry point and wrap your app with FirebaseAuthProvider:
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<FirebaseAuthProvider auth={auth}>
{/** the rest of your app */}
</FirebaseAuthProvider>
</React.StrictMode>
)
FirebaseAuthProvider only requires one parameter with signature auth: Auth.
Now, you can get the instance of your Auth anywhere in the component tree by simply doing:
const auth = useContext(FirebaseAuthContext);
Tip
The type you get from useContext is Auth | undefined. You can simply use auth! (non-null assertion operator) as you guarantee it to be defined when you use FirebaseAuthProvider.
Setting Up for Firebase Functions
Head to your entry point and wrap your app with FirebaseFunctionsProvider:
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<FirebaseFunctionsProvider functions={functions}>
{/** the rest of your app */}
</FirebaseFunctionsProvider>
</React.StrictMode>
)
FirebaseFunctionsProvider only requires one parameter with signature functions: Functions.
Now, you can get the instance of your Functions anywhere in the component tree by simply doing:
const functions = useContext(FirebaseFunctionsContext);
Tip
The type you get from useContext is Functions | undefined. You can simply use functions! (non-null assertion operator) as you guarantee it to be defined when you use FirebaseFunctionsProvider.
Setting Up for Firebase Storage
Head to your entry point and wrap your app with FirebaseStorageProvider:
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<FirebaseStorageProvider storage={storage}>
{/** the rest of your app */}
</FirebaseStorageProvider>
</React.StrictMode>
)
FirebaseStorageProvider only requires one parameter with signature storage: FirebaseStorage.
Now, you can get the instance of your FirebaseStorage anywhere in the component tree by simply doing:
const storage = useContext(FirebaseStorageContext);
Tip
The type you get from useContext is FirebaseStorage | undefined. You can simply use functions! (non-null assertion operator) as you guarantee it to be defined when you use FirebaseStorageProvider.
Setting Up for Multiple Instances
Sometimes, wrapping your entry point with multiple providers might look ugly. In that case, you can use FirebaseSuiteProvider, which lets you selectively choose what types of Firebase services should be injected into your global app context.
Head to your entry point and wrap your app with FirebaseSuiteProvider:
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<FirebaseSuiteProvider
app={app} {/** optional */}
firestore={firestore} {/** optional */}
auth={auth} {/** optional */}
functions={functions} {/** optional */}
storage={storage} {/** optional */}
>
{/** the rest of your app */}
</FirebaseSuiteProvider>
</React.StrictMode>
)
All the parameters for FirebaseSuiteProvider are optional.
Now, you can get the instance of any service anywhere in the component tree by simply doing:
const app = useContext(FirebaseAppContext);
const firestore = useContext(FirestoreContext);
const auth = useContext(FirebaseAuthContext);
const functions = useContext(FirebaseFunctionsContext);
const storage = useContext(FirebaseStorageContext);
Warning
The type you get from useContext can be undefined. You need to make sure you provide the instance of a specific Firebase service globally before using non-null assertion operator.