diff --git a/docs/reference/README.md b/docs/reference/README.md
index 52c83109..e7d24aef 100644
--- a/docs/reference/README.md
+++ b/docs/reference/README.md
@@ -4,105 +4,112 @@
# ReactFire reference docs
+## Enumerations
+
+- [~~ListenEvent~~](enumerations/ListenEvent.md)
+
## Classes
-- [ReactFireError](classes/ReactFireError.md)
+- [~~ReactFireError~~](classes/ReactFireError.md)
## Interfaces
- [AuthCheckProps](interfaces/AuthCheckProps.md)
-- [ClaimCheckErrors](interfaces/ClaimCheckErrors.md)
-- [ClaimsCheckProps](interfaces/ClaimsCheckProps.md)
-- [ClaimsValidator](interfaces/ClaimsValidator.md)
-- [FirebaseAppProviderProps](interfaces/FirebaseAppProviderProps.md)
+- [~~ClaimCheckErrors~~](interfaces/ClaimCheckErrors.md)
+- [~~ClaimsCheckProps~~](interfaces/ClaimsCheckProps.md)
+- [~~ClaimsValidator~~](interfaces/ClaimsValidator.md)
+- [~~FirebaseAppProviderProps~~](interfaces/FirebaseAppProviderProps.md)
- [ObservableStatus](interfaces/ObservableStatus.md)
+- [~~QueryChange~~](interfaces/QueryChange.md)
- [ReactFireOptions](interfaces/ReactFireOptions.md)
-- [SignInCheckOptionsBasic](interfaces/SignInCheckOptionsBasic.md)
-- [SignInCheckOptionsClaimsObject](interfaces/SignInCheckOptionsClaimsObject.md)
-- [SignInCheckOptionsClaimsValidator](interfaces/SignInCheckOptionsClaimsValidator.md)
+- [~~SignInCheckOptionsBasic~~](interfaces/SignInCheckOptionsBasic.md)
+- [~~SignInCheckOptionsClaimsObject~~](interfaces/SignInCheckOptionsClaimsObject.md)
+- [~~SignInCheckOptionsClaimsValidator~~](interfaces/SignInCheckOptionsClaimsValidator.md)
- [SuspensePerfProps](interfaces/SuspensePerfProps.md)
## Type Aliases
-- [ReactFireGlobals](type-aliases/ReactFireGlobals.md)
-- [SigninCheckResult](type-aliases/SigninCheckResult.md)
-- [StorageImageProps](type-aliases/StorageImageProps.md)
+- [~~AllParameters~~](type-aliases/AllParameters.md)
+- [~~ReactFireGlobals~~](type-aliases/ReactFireGlobals.md)
+- [ReactFireUsable](type-aliases/ReactFireUsable.md)
+- [~~SigninCheckResult~~](type-aliases/SigninCheckResult.md)
+- [~~StorageImageProps~~](type-aliases/StorageImageProps.md)
## Variables
-- [AnalyticsProvider](variables/AnalyticsProvider.md)
-- [AnalyticsSdkContext](variables/AnalyticsSdkContext.md)
-- [AppCheckProvider](variables/AppCheckProvider.md)
-- [AppCheckSdkContext](variables/AppCheckSdkContext.md)
-- [AuthProvider](variables/AuthProvider.md)
-- [AuthSdkContext](variables/AuthSdkContext.md)
-- [DatabaseProvider](variables/DatabaseProvider.md)
-- [DatabaseSdkContext](variables/DatabaseSdkContext.md)
-- [FirestoreProvider](variables/FirestoreProvider.md)
-- [FirestoreSdkContext](variables/FirestoreSdkContext.md)
-- [FunctionsProvider](variables/FunctionsProvider.md)
-- [FunctionsSdkContext](variables/FunctionsSdkContext.md)
-- [PerformanceProvider](variables/PerformanceProvider.md)
-- [PerformanceSdkContext](variables/PerformanceSdkContext.md)
-- [RemoteConfigProvider](variables/RemoteConfigProvider.md)
-- [RemoteConfigSdkContext](variables/RemoteConfigSdkContext.md)
-- [StorageProvider](variables/StorageProvider.md)
-- [StorageSdkContext](variables/StorageSdkContext.md)
-- [useInitAnalytics](variables/useInitAnalytics.md)
-- [useInitAppCheck](variables/useInitAppCheck.md)
-- [useInitAuth](variables/useInitAuth.md)
-- [useInitDatabase](variables/useInitDatabase.md)
-- [useInitFirestore](variables/useInitFirestore.md)
-- [useInitFunctions](variables/useInitFunctions.md)
-- [useInitPerformance](variables/useInitPerformance.md)
-- [useInitRemoteConfig](variables/useInitRemoteConfig.md)
-- [useInitStorage](variables/useInitStorage.md)
+- [~~AnalyticsProvider~~](variables/AnalyticsProvider.md)
+- [~~AnalyticsSdkContext~~](variables/AnalyticsSdkContext.md)
+- [~~AppCheckProvider~~](variables/AppCheckProvider.md)
+- [~~AppCheckSdkContext~~](variables/AppCheckSdkContext.md)
+- [~~AuthProvider~~](variables/AuthProvider.md)
+- [~~AuthSdkContext~~](variables/AuthSdkContext.md)
+- [~~DatabaseProvider~~](variables/DatabaseProvider.md)
+- [~~DatabaseSdkContext~~](variables/DatabaseSdkContext.md)
+- [~~FirestoreProvider~~](variables/FirestoreProvider.md)
+- [~~FirestoreSdkContext~~](variables/FirestoreSdkContext.md)
+- [~~FunctionsProvider~~](variables/FunctionsProvider.md)
+- [~~FunctionsSdkContext~~](variables/FunctionsSdkContext.md)
+- [~~PerformanceProvider~~](variables/PerformanceProvider.md)
+- [~~PerformanceSdkContext~~](variables/PerformanceSdkContext.md)
+- [~~RemoteConfigProvider~~](variables/RemoteConfigProvider.md)
+- [~~RemoteConfigSdkContext~~](variables/RemoteConfigSdkContext.md)
+- [~~StorageProvider~~](variables/StorageProvider.md)
+- [~~StorageSdkContext~~](variables/StorageSdkContext.md)
+- [~~useInitAnalytics~~](variables/useInitAnalytics.md)
+- [~~useInitAppCheck~~](variables/useInitAppCheck.md)
+- [~~useInitAuth~~](variables/useInitAuth.md)
+- [~~useInitDatabase~~](variables/useInitDatabase.md)
+- [~~useInitFirestore~~](variables/useInitFirestore.md)
+- [~~useInitFunctions~~](variables/useInitFunctions.md)
+- [~~useInitPerformance~~](variables/useInitPerformance.md)
+- [~~useInitRemoteConfig~~](variables/useInitRemoteConfig.md)
+- [~~useInitStorage~~](variables/useInitStorage.md)
- [version](variables/version.md)
## Functions
-- [~~AuthCheck~~](functions/AuthCheck.md)
-- [checkIdField](functions/checkIdField.md)
-- [checkinitialData](functions/checkinitialData.md)
-- [checkOptions](functions/checkOptions.md)
+- [AuthCheck](functions/AuthCheck.md)
+- [~~checkIdField~~](functions/checkIdField.md)
+- [~~checkinitialData~~](functions/checkinitialData.md)
+- [~~checkOptions~~](functions/checkOptions.md)
- [~~ClaimsCheck~~](functions/ClaimsCheck.md)
-- [FirebaseAppProvider](functions/FirebaseAppProvider.md)
-- [preloadFirestoreDoc](functions/preloadFirestoreDoc.md)
-- [preloadObservable](functions/preloadObservable.md)
-- [preloadUser](functions/preloadUser.md)
-- [StorageImage](functions/StorageImage.md)
+- [~~FirebaseAppProvider~~](functions/FirebaseAppProvider.md)
+- [~~preloadFirestoreDoc~~](functions/preloadFirestoreDoc.md)
+- [~~preloadObservable~~](functions/preloadObservable.md)
+- [~~preloadUser~~](functions/preloadUser.md)
+- [~~StorageImage~~](functions/StorageImage.md)
- [SuspenseWithPerf](functions/SuspenseWithPerf.md)
-- [useAnalytics](functions/useAnalytics.md)
-- [useAppCheck](functions/useAppCheck.md)
-- [useAuth](functions/useAuth.md)
-- [useCallableFunctionResponse](functions/useCallableFunctionResponse.md)
-- [useDatabase](functions/useDatabase.md)
+- [~~useAnalytics~~](functions/useAnalytics.md)
+- [~~useAppCheck~~](functions/useAppCheck.md)
+- [~~useAuth~~](functions/useAuth.md)
+- [~~useCallableFunctionResponse~~](functions/useCallableFunctionResponse.md)
+- [~~useDatabase~~](functions/useDatabase.md)
- [useDatabaseList](functions/useDatabaseList.md)
-- [useDatabaseListData](functions/useDatabaseListData.md)
+- [~~useDatabaseListData~~](functions/useDatabaseListData.md)
- [useDatabaseObject](functions/useDatabaseObject.md)
-- [useDatabaseObjectData](functions/useDatabaseObjectData.md)
-- [useFirebaseApp](functions/useFirebaseApp.md)
-- [useFirestore](functions/useFirestore.md)
+- [~~useDatabaseObjectData~~](functions/useDatabaseObjectData.md)
+- [~~useFirebaseApp~~](functions/useFirebaseApp.md)
+- [~~useFirestore~~](functions/useFirestore.md)
- [useFirestoreCollection](functions/useFirestoreCollection.md)
-- [useFirestoreCollectionData](functions/useFirestoreCollectionData.md)
+- [~~useFirestoreCollectionData~~](functions/useFirestoreCollectionData.md)
- [useFirestoreDoc](functions/useFirestoreDoc.md)
-- [useFirestoreDocData](functions/useFirestoreDocData.md)
-- [useFirestoreDocDataOnce](functions/useFirestoreDocDataOnce.md)
-- [useFirestoreDocOnce](functions/useFirestoreDocOnce.md)
-- [useFunctions](functions/useFunctions.md)
+- [~~useFirestoreDocData~~](functions/useFirestoreDocData.md)
+- [~~useFirestoreDocDataOnce~~](functions/useFirestoreDocDataOnce.md)
+- [~~useFirestoreDocOnce~~](functions/useFirestoreDocOnce.md)
+- [~~useFunctions~~](functions/useFunctions.md)
- [useIdTokenResult](functions/useIdTokenResult.md)
-- [useIsSuspenseEnabled](functions/useIsSuspenseEnabled.md)
-- [useObservable](functions/useObservable.md)
-- [usePerformance](functions/usePerformance.md)
-- [useRemoteConfig](functions/useRemoteConfig.md)
-- [useRemoteConfigAll](functions/useRemoteConfigAll.md)
-- [useRemoteConfigBoolean](functions/useRemoteConfigBoolean.md)
-- [useRemoteConfigNumber](functions/useRemoteConfigNumber.md)
-- [useRemoteConfigString](functions/useRemoteConfigString.md)
-- [useRemoteConfigValue](functions/useRemoteConfigValue.md)
-- [useSigninCheck](functions/useSigninCheck.md)
-- [useStorage](functions/useStorage.md)
+- [~~useIsSuspenseEnabled~~](functions/useIsSuspenseEnabled.md)
+- [~~useObservable~~](functions/useObservable.md)
+- [~~usePerformance~~](functions/usePerformance.md)
+- [~~useRemoteConfig~~](functions/useRemoteConfig.md)
+- [~~useRemoteConfigAll~~](functions/useRemoteConfigAll.md)
+- [~~useRemoteConfigBoolean~~](functions/useRemoteConfigBoolean.md)
+- [~~useRemoteConfigNumber~~](functions/useRemoteConfigNumber.md)
+- [~~useRemoteConfigString~~](functions/useRemoteConfigString.md)
+- [~~useRemoteConfigValue~~](functions/useRemoteConfigValue.md)
+- [~~useSigninCheck~~](functions/useSigninCheck.md)
+- [~~useStorage~~](functions/useStorage.md)
- [useStorageDownloadURL](functions/useStorageDownloadURL.md)
-- [useStorageTask](functions/useStorageTask.md)
-- [useSuspenseEnabledFromConfigAndContext](functions/useSuspenseEnabledFromConfigAndContext.md)
+- [~~useStorageTask~~](functions/useStorageTask.md)
+- [~~useSuspenseEnabledFromConfigAndContext~~](functions/useSuspenseEnabledFromConfigAndContext.md)
- [useUser](functions/useUser.md)
diff --git a/docs/reference/classes/ReactFireError.md b/docs/reference/classes/ReactFireError.md
index 591ddb68..d7c84298 100644
--- a/docs/reference/classes/ReactFireError.md
+++ b/docs/reference/classes/ReactFireError.md
@@ -4,9 +4,13 @@
[ReactFire reference docs](../README.md) / ReactFireError
-# Class: ReactFireError
+# ~~Class: ReactFireError~~
-Defined in: [src/index.ts:12](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L12)
+Defined in: [src/useFirebaseStream.ts:35](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L35)
+
+## Deprecated
+
+Error class used only by the deprecated `useSigninCheck` hook. Will be removed in v5.0.0.
## Extends
@@ -18,7 +22,7 @@ Defined in: [src/index.ts:12](https://github.com/FirebaseExtended/reactfire/blob
> **new ReactFireError**(`code`, `message`, `customData?`): `ReactFireError`
-Defined in: [src/index.ts:15](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L15)
+Defined in: [src/useFirebaseStream.ts:38](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L38)
#### Parameters
@@ -44,7 +48,7 @@ Defined in: [src/index.ts:15](https://github.com/FirebaseExtended/reactfire/blob
## Properties
-### cause?
+### ~~cause?~~
> `optional` **cause?**: `unknown`
@@ -56,23 +60,23 @@ Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:24
***
-### code
+### ~~code~~
> `readonly` **code**: `string`
-Defined in: [src/index.ts:15](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L15)
+Defined in: [src/useFirebaseStream.ts:38](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L38)
***
-### customData?
+### ~~customData?~~
> `optional` **customData?**: `Record`\<`string`, `unknown`\>
-Defined in: [src/index.ts:15](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L15)
+Defined in: [src/useFirebaseStream.ts:38](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L38)
***
-### message
+### ~~message~~
> **message**: `string`
@@ -84,11 +88,11 @@ Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1075
***
-### name
+### ~~name~~
> `readonly` **name**: `"ReactFireError"` = `'ReactFireError'`
-Defined in: [src/index.ts:13](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L13)
+Defined in: [src/useFirebaseStream.ts:36](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L36)
#### Overrides
@@ -96,7 +100,7 @@ Defined in: [src/index.ts:13](https://github.com/FirebaseExtended/reactfire/blob
***
-### stack?
+### ~~stack?~~
> `optional` **stack?**: `string`
@@ -108,7 +112,7 @@ Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076
## Methods
-### isError()
+### ~~isError()~~
> `static` **isError**(`error`): `error is Error`
diff --git a/docs/reference/enumerations/ListenEvent.md b/docs/reference/enumerations/ListenEvent.md
new file mode 100644
index 00000000..ebee45dc
--- /dev/null
+++ b/docs/reference/enumerations/ListenEvent.md
@@ -0,0 +1,53 @@
+[**ReactFire reference docs**](../README.md)
+
+***
+
+[ReactFire reference docs](../README.md) / ListenEvent
+
+# ~~Enumeration: ListenEvent~~
+
+Defined in: [src/database.tsx:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L17)
+
+## Deprecated
+
+Legacy rxfire change event enum. In v5.0.0, `useDatabaseObject` returns `DataSnapshot` and `useDatabaseList` returns `DataSnapshot[]`.
+
+## Enumeration Members
+
+### ~~added~~
+
+> **added**: `"child_added"`
+
+Defined in: [src/database.tsx:18](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L18)
+
+***
+
+### ~~changed~~
+
+> **changed**: `"child_changed"`
+
+Defined in: [src/database.tsx:20](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L20)
+
+***
+
+### ~~moved~~
+
+> **moved**: `"child_moved"`
+
+Defined in: [src/database.tsx:21](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L21)
+
+***
+
+### ~~removed~~
+
+> **removed**: `"child_removed"`
+
+Defined in: [src/database.tsx:19](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L19)
+
+***
+
+### ~~value~~
+
+> **value**: `"value"`
+
+Defined in: [src/database.tsx:22](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L22)
diff --git a/docs/reference/functions/AuthCheck.md b/docs/reference/functions/AuthCheck.md
index dfb0e3ea..23e4c908 100644
--- a/docs/reference/functions/AuthCheck.md
+++ b/docs/reference/functions/AuthCheck.md
@@ -4,11 +4,13 @@
[ReactFire reference docs](../README.md) / AuthCheck
-# ~~Function: AuthCheck()~~
+# Function: AuthCheck()
> **AuthCheck**(`__namedParameters`): `ReactElement`
-Defined in: [src/auth.tsx:259](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L259)
+Defined in: [src/auth.tsx:633](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L633)
+
+Conditionally render children based on signed-in status and [custom claims](https://firebase.google.com/docs/auth/admin/custom-claims).
## Parameters
@@ -19,11 +21,3 @@ Defined in: [src/auth.tsx:259](https://github.com/FirebaseExtended/reactfire/blo
## Returns
`ReactElement`
-
-## Deprecated
-
-Use `useSigninCheck` instead
-
-Conditionally render children based on signed-in status and [custom claims](https://firebase.google.com/docs/auth/admin/custom-claims).
-
-Meant for Concurrent mode only (``). [More detail](https://github.com/FirebaseExtended/reactfire/issues/325#issuecomment-827654376).
diff --git a/docs/reference/functions/ClaimsCheck.md b/docs/reference/functions/ClaimsCheck.md
index fa5ca95e..2f13898d 100644
--- a/docs/reference/functions/ClaimsCheck.md
+++ b/docs/reference/functions/ClaimsCheck.md
@@ -8,7 +8,7 @@
> **ClaimsCheck**(`__namedParameters`): `Element`
-Defined in: [src/auth.tsx:215](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L215)
+Defined in: [src/auth.tsx:593](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L593)
## Parameters
@@ -22,7 +22,7 @@ Defined in: [src/auth.tsx:215](https://github.com/FirebaseExtended/reactfire/blo
## Deprecated
-Use `useSigninCheck` instead
+Use `` instead. Will be removed in v5.0.0.
Conditionally render children based on [custom claims](https://firebase.google.com/docs/auth/admin/custom-claims).
diff --git a/docs/reference/functions/FirebaseAppProvider.md b/docs/reference/functions/FirebaseAppProvider.md
index 6b851653..71058846 100644
--- a/docs/reference/functions/FirebaseAppProvider.md
+++ b/docs/reference/functions/FirebaseAppProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / FirebaseAppProvider
-# Function: FirebaseAppProvider()
+# ~~Function: FirebaseAppProvider()~~
> **FirebaseAppProvider**(`props`): `Element`
-Defined in: [src/firebaseApp.tsx:26](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L26)
+Defined in: [src/firebaseApp.tsx:35](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L35)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/firebaseApp.tsx:26](https://github.com/FirebaseExtended/reactfi
## Returns
`Element`
+
+## Deprecated
+
+`` is deprecated and will be removed in v5.0.0. Initialize your Firebase app at module scope (`export const app = initializeApp(config)`) and pass SDK instances or references directly to ReactFire hooks.
diff --git a/docs/reference/functions/StorageImage.md b/docs/reference/functions/StorageImage.md
index 59c9a60b..de582e6b 100644
--- a/docs/reference/functions/StorageImage.md
+++ b/docs/reference/functions/StorageImage.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / StorageImage
-# Function: StorageImage()
+# ~~Function: StorageImage()~~
> **StorageImage**(`props`): `Element`
-Defined in: [src/storage.tsx:82](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L82)
+Defined in: [src/storage.tsx:185](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L185)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/storage.tsx:82](https://github.com/FirebaseExtended/reactfire/b
## Returns
`Element`
+
+## Deprecated
+
+Use `useStorageDownloadURL(ref)` with a standard `
` element instead. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/SuspenseWithPerf.md b/docs/reference/functions/SuspenseWithPerf.md
index 6ab06a72..71a87b6c 100644
--- a/docs/reference/functions/SuspenseWithPerf.md
+++ b/docs/reference/functions/SuspenseWithPerf.md
@@ -8,7 +8,7 @@
> **SuspenseWithPerf**(`__namedParameters`): `ReactElement`
-Defined in: [src/performance.tsx:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L9)
+Defined in: [src/performance.tsx:45](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L45)
## Parameters
diff --git a/docs/reference/functions/checkIdField.md b/docs/reference/functions/checkIdField.md
index 82d7c5a9..b4ec33c8 100644
--- a/docs/reference/functions/checkIdField.md
+++ b/docs/reference/functions/checkIdField.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / checkIdField
-# Function: checkIdField()
+# ~~Function: checkIdField()~~
> **checkIdField**(`options`): `any`
-Defined in: [src/index.ts:47](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L47)
+Defined in: [src/useFirebaseStream.ts:93](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L93)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/index.ts:47](https://github.com/FirebaseExtended/reactfire/blob
## Returns
`any`
+
+## Deprecated
+
+Internal option helper. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/checkOptions.md b/docs/reference/functions/checkOptions.md
index 4f4fdaf0..132dc669 100644
--- a/docs/reference/functions/checkOptions.md
+++ b/docs/reference/functions/checkOptions.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / checkOptions
-# Function: checkOptions()
+# ~~Function: checkOptions()~~
> **checkOptions**(`options`, `field`): `any`
-Defined in: [src/index.ts:34](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L34)
+Defined in: [src/useFirebaseStream.ts:74](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L74)
## Parameters
@@ -23,3 +23,7 @@ Defined in: [src/index.ts:34](https://github.com/FirebaseExtended/reactfire/blob
## Returns
`any`
+
+## Deprecated
+
+Internal option helper. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/checkinitialData.md b/docs/reference/functions/checkinitialData.md
index f2c78405..2c8e865c 100644
--- a/docs/reference/functions/checkinitialData.md
+++ b/docs/reference/functions/checkinitialData.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / checkinitialData
-# Function: checkinitialData()
+# ~~Function: checkinitialData()~~
> **checkinitialData**(`options`): `any`
-Defined in: [src/index.ts:43](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L43)
+Defined in: [src/useFirebaseStream.ts:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L86)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/index.ts:43](https://github.com/FirebaseExtended/reactfire/blob
## Returns
`any`
+
+## Deprecated
+
+Internal option helper. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/preloadFirestoreDoc.md b/docs/reference/functions/preloadFirestoreDoc.md
index a9c7db3a..bd0a08e9 100644
--- a/docs/reference/functions/preloadFirestoreDoc.md
+++ b/docs/reference/functions/preloadFirestoreDoc.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / preloadFirestoreDoc
-# Function: preloadFirestoreDoc()
+# ~~Function: preloadFirestoreDoc()~~
-> **preloadFirestoreDoc**(`refProvider`): `Promise`\<`SuspenseSubject`\<`DocumentSnapshot`\<`DocumentData`, `DocumentData`\>\>\>
+> **preloadFirestoreDoc**(`refProvider`): `Promise`\<`DocumentSnapshot`\<`any`, `DocumentData`\>\>
-Defined in: [src/firestore.tsx:28](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L28)
+Defined in: [src/firestore.tsx:95](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L95)
Preload a subscription to a Firestore document reference.
@@ -22,4 +22,8 @@ Use this to warm up `useFirestoreDoc` for a specific document
## Returns
-`Promise`\<`SuspenseSubject`\<`DocumentSnapshot`\<`DocumentData`, `DocumentData`\>\>\>
+`Promise`\<`DocumentSnapshot`\<`any`, `DocumentData`\>\>
+
+## Deprecated
+
+Unwrap `useFirestoreDoc(ref).experimental_usable` with `React.use()` instead. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/preloadObservable.md b/docs/reference/functions/preloadObservable.md
index 92aab4f9..0181e3da 100644
--- a/docs/reference/functions/preloadObservable.md
+++ b/docs/reference/functions/preloadObservable.md
@@ -4,11 +4,15 @@
[ReactFire reference docs](../README.md) / preloadObservable
-# Function: preloadObservable()
+# ~~Function: preloadObservable()~~
> **preloadObservable**\<`T`\>(`source`, `id`, `suspenseEnabled?`): `SuspenseSubject`\<`T`\>
-Defined in: [src/useObservable.ts:20](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L20)
+Defined in: [src/useObservable.ts:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L30)
+
+Starts listening to an Observable.
+Call this once you know you're going to render a
+child that will consume the observable.
## Type Parameters
@@ -33,3 +37,7 @@ Defined in: [src/useObservable.ts:20](https://github.com/FirebaseExtended/reactf
## Returns
`SuspenseSubject`\<`T`\>
+
+## Deprecated
+
+RxJS integration (`preloadObservable`, `useObservable`, `SuspenseSubject`) is deprecated and will be removed in v5.0.0.
diff --git a/docs/reference/functions/preloadUser.md b/docs/reference/functions/preloadUser.md
index 65e598af..f2eac792 100644
--- a/docs/reference/functions/preloadUser.md
+++ b/docs/reference/functions/preloadUser.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / preloadUser
-# Function: preloadUser()
+# ~~Function: preloadUser()~~
-> **preloadUser**(`authResolver`): `Promise`\<`User` \| `null` \| `undefined`\>
+> **preloadUser**(`authResolver`): `Promise`\<`User` \| `null`\>
-Defined in: [src/auth.tsx:11](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L11)
+Defined in: [src/auth.tsx:90](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L90)
## Parameters
@@ -18,4 +18,8 @@ Defined in: [src/auth.tsx:11](https://github.com/FirebaseExtended/reactfire/blob
## Returns
-`Promise`\<`User` \| `null` \| `undefined`\>
+`Promise`\<`User` \| `null`\>
+
+## Deprecated
+
+Unwrap `useUser(auth).experimental_usable` with `React.use()` instead. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useAnalytics.md b/docs/reference/functions/useAnalytics.md
index 1a8eb2eb..9e95c907 100644
--- a/docs/reference/functions/useAnalytics.md
+++ b/docs/reference/functions/useAnalytics.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useAnalytics
-# Function: useAnalytics()
+# ~~Function: useAnalytics()~~
> **useAnalytics**(): `Analytics`
-Defined in: [src/sdk.tsx:84](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L84)
+Defined in: [src/sdk.tsx:119](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L119)
## Returns
`Analytics`
+
+## Deprecated
+
+Initialize Analytics at module scope instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useAppCheck.md b/docs/reference/functions/useAppCheck.md
index 0a8f8e45..1020966e 100644
--- a/docs/reference/functions/useAppCheck.md
+++ b/docs/reference/functions/useAppCheck.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useAppCheck
-# Function: useAppCheck()
+# ~~Function: useAppCheck()~~
> **useAppCheck**(): `AppCheck`
-Defined in: [src/sdk.tsx:82](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L82)
+Defined in: [src/sdk.tsx:115](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L115)
## Returns
`AppCheck`
+
+## Deprecated
+
+Initialize AppCheck at module scope instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useAuth.md b/docs/reference/functions/useAuth.md
index fd9a7056..64f5a7a8 100644
--- a/docs/reference/functions/useAuth.md
+++ b/docs/reference/functions/useAuth.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useAuth
-# Function: useAuth()
+# ~~Function: useAuth()~~
> **useAuth**(): `Auth`
-Defined in: [src/sdk.tsx:83](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L83)
+Defined in: [src/sdk.tsx:117](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L117)
## Returns
`Auth`
+
+## Deprecated
+
+Initialize Auth at module scope (`getAuth(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useCallableFunctionResponse.md b/docs/reference/functions/useCallableFunctionResponse.md
index 3ea2b8d8..5301cd4d 100644
--- a/docs/reference/functions/useCallableFunctionResponse.md
+++ b/docs/reference/functions/useCallableFunctionResponse.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useCallableFunctionResponse
-# Function: useCallableFunctionResponse()
+# ~~Function: useCallableFunctionResponse()~~
> **useCallableFunctionResponse**\<`RequestData`, `ResponseData`\>(`functionName`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`ResponseData`\>
-Defined in: [src/functions.tsx:14](https://github.com/FirebaseExtended/reactfire/blob/main/src/functions.tsx#L14)
+Defined in: [src/functions.tsx:16](https://github.com/FirebaseExtended/reactfire/blob/main/src/functions.tsx#L16)
Calls a callable function.
@@ -37,3 +37,7 @@ The name of the function to call
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`ResponseData`\>
+
+## Deprecated
+
+Call `httpsCallable(functions, functionName)` directly (e.g. inside React 19 `useActionState` or an event handler). Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useDatabase.md b/docs/reference/functions/useDatabase.md
index 1efac90b..20e1263d 100644
--- a/docs/reference/functions/useDatabase.md
+++ b/docs/reference/functions/useDatabase.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useDatabase
-# Function: useDatabase()
+# ~~Function: useDatabase()~~
> **useDatabase**(): `Database`
-Defined in: [src/sdk.tsx:85](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L85)
+Defined in: [src/sdk.tsx:121](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L121)
## Returns
`Database`
+
+## Deprecated
+
+Initialize Database at module scope (`getDatabase(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useDatabaseList.md b/docs/reference/functions/useDatabaseList.md
index 4c501bf7..9040da96 100644
--- a/docs/reference/functions/useDatabaseList.md
+++ b/docs/reference/functions/useDatabaseList.md
@@ -6,9 +6,9 @@
# Function: useDatabaseList()
-> **useDatabaseList**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`[] \| `QueryChange`[]\>
+> **useDatabaseList**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`QueryChange`](../interfaces/QueryChange.md)[] \| `T`[]\>
-Defined in: [src/database.tsx:48](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L48)
+Defined in: [src/database.tsx:139](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L139)
Subscribe to a Realtime Database list
@@ -22,7 +22,7 @@ Subscribe to a Realtime Database list
### ref
-`Query` \| `DatabaseReference`
+`DatabaseReference` \| `Query`
Reference to the DB List you want to listen to
@@ -32,4 +32,4 @@ Reference to the DB List you want to listen to
## Returns
-[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`[] \| `QueryChange`[]\>
+[`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`QueryChange`](../interfaces/QueryChange.md)[] \| `T`[]\>
diff --git a/docs/reference/functions/useDatabaseListData.md b/docs/reference/functions/useDatabaseListData.md
index 41d5a441..9652f00e 100644
--- a/docs/reference/functions/useDatabaseListData.md
+++ b/docs/reference/functions/useDatabaseListData.md
@@ -4,11 +4,13 @@
[ReactFire reference docs](../README.md) / useDatabaseListData
-# Function: useDatabaseListData()
+# ~~Function: useDatabaseListData()~~
> **useDatabaseListData**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`[] \| `null`\>
-Defined in: [src/database.tsx:58](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L58)
+Defined in: [src/database.tsx:167](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L167)
+
+Subscribe to a Realtime Database list and unwrap the snapshots into an array.
## Type Parameters
@@ -20,7 +22,7 @@ Defined in: [src/database.tsx:58](https://github.com/FirebaseExtended/reactfire/
### ref
-`Query` \| `DatabaseReference`
+`DatabaseReference` \| `Query`
### options?
@@ -29,3 +31,7 @@ Defined in: [src/database.tsx:58](https://github.com/FirebaseExtended/reactfire/
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`[] \| `null`\>
+
+## Deprecated
+
+Use `useDatabaseList` and read `child.val()` / `child.key` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useDatabaseObject.md b/docs/reference/functions/useDatabaseObject.md
index 632d5bf2..1c7bf8f1 100644
--- a/docs/reference/functions/useDatabaseObject.md
+++ b/docs/reference/functions/useDatabaseObject.md
@@ -6,9 +6,9 @@
# Function: useDatabaseObject()
-> **useDatabaseObject**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `QueryChange`\>
+> **useDatabaseObject**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`QueryChange`](../interfaces/QueryChange.md) \| `T`\>
-Defined in: [src/database.tsx:27](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L27)
+Defined in: [src/database.tsx:54](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L54)
Subscribe to a Realtime Database object
@@ -32,4 +32,4 @@ Reference to the DB object you want to listen to
## Returns
-[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `QueryChange`\>
+[`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`QueryChange`](../interfaces/QueryChange.md) \| `T`\>
diff --git a/docs/reference/functions/useDatabaseObjectData.md b/docs/reference/functions/useDatabaseObjectData.md
index ae86c498..213aa239 100644
--- a/docs/reference/functions/useDatabaseObjectData.md
+++ b/docs/reference/functions/useDatabaseObjectData.md
@@ -4,11 +4,13 @@
[ReactFire reference docs](../README.md) / useDatabaseObjectData
-# Function: useDatabaseObjectData()
+# ~~Function: useDatabaseObjectData()~~
> **useDatabaseObjectData**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`\>
-Defined in: [src/database.tsx:34](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L34)
+Defined in: [src/database.tsx:93](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L93)
+
+Subscribe to a Realtime Database object and unwrap the snapshot into a plain object.
## Type Parameters
@@ -29,3 +31,7 @@ Defined in: [src/database.tsx:34](https://github.com/FirebaseExtended/reactfire/
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`\>
+
+## Deprecated
+
+Use `useDatabaseObject` and read `snapshot.val()` / `snapshot.key` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useFirebaseApp.md b/docs/reference/functions/useFirebaseApp.md
index d7f1d7cc..f25980a8 100644
--- a/docs/reference/functions/useFirebaseApp.md
+++ b/docs/reference/functions/useFirebaseApp.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useFirebaseApp
-# Function: useFirebaseApp()
+# ~~Function: useFirebaseApp()~~
> **useFirebaseApp**(): `FirebaseApp`
-Defined in: [src/firebaseApp.tsx:80](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L80)
+Defined in: [src/firebaseApp.tsx:99](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L99)
## Returns
`FirebaseApp`
+
+## Deprecated
+
+`useFirebaseApp` is deprecated and will be removed in v5.0.0. Import your `firebaseApp` directly from the module where you called `initializeApp(config)`.
diff --git a/docs/reference/functions/useFirestore.md b/docs/reference/functions/useFirestore.md
index 648d679b..af8dd7c3 100644
--- a/docs/reference/functions/useFirestore.md
+++ b/docs/reference/functions/useFirestore.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useFirestore
-# Function: useFirestore()
+# ~~Function: useFirestore()~~
> **useFirestore**(): `Firestore`
-Defined in: [src/sdk.tsx:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L86)
+Defined in: [src/sdk.tsx:123](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L123)
## Returns
`Firestore`
+
+## Deprecated
+
+Initialize Firestore at module scope (`getFirestore(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useFirestoreCollection.md b/docs/reference/functions/useFirestoreCollection.md
index 8cc2a2e4..8479ccc1 100644
--- a/docs/reference/functions/useFirestoreCollection.md
+++ b/docs/reference/functions/useFirestoreCollection.md
@@ -8,7 +8,7 @@
> **useFirestoreCollection**\<`T`\>(`query`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`QuerySnapshot`\<`T`, `DocumentData`\>\>
-Defined in: [src/firestore.tsx:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L86)
+Defined in: [src/firestore.tsx:229](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L229)
Subscribe to a Firestore collection
diff --git a/docs/reference/functions/useFirestoreCollectionData.md b/docs/reference/functions/useFirestoreCollectionData.md
index 206f7132..7f1ce35e 100644
--- a/docs/reference/functions/useFirestoreCollectionData.md
+++ b/docs/reference/functions/useFirestoreCollectionData.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useFirestoreCollectionData
-# Function: useFirestoreCollectionData()
+# ~~Function: useFirestoreCollectionData()~~
> **useFirestoreCollectionData**\<`T`\>(`query`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`[]\>
-Defined in: [src/firestore.tsx:96](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L96)
+Defined in: [src/firestore.tsx:293](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L293)
Subscribe to a Firestore collection and unwrap the snapshot into an array.
@@ -31,3 +31,7 @@ Subscribe to a Firestore collection and unwrap the snapshot into an array.
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`[]\>
+
+## Deprecated
+
+Use `useFirestoreCollection(query)` and map `snap.docs` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useFirestoreDoc.md b/docs/reference/functions/useFirestoreDoc.md
index f14bb8b4..8f46119a 100644
--- a/docs/reference/functions/useFirestoreDoc.md
+++ b/docs/reference/functions/useFirestoreDoc.md
@@ -8,7 +8,7 @@
> **useFirestoreDoc**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`DocumentSnapshot`\<`T`, `DocumentData`\>\>
-Defined in: [src/firestore.tsx:42](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L42)
+Defined in: [src/firestore.tsx:105](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L105)
Subscribe to Firestore Document changes
diff --git a/docs/reference/functions/useFirestoreDocData.md b/docs/reference/functions/useFirestoreDocData.md
index ffaaac8b..934d8c57 100644
--- a/docs/reference/functions/useFirestoreDocData.md
+++ b/docs/reference/functions/useFirestoreDocData.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useFirestoreDocData
-# Function: useFirestoreDocData()
+# ~~Function: useFirestoreDocData()~~
> **useFirestoreDocData**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `undefined`\>
-Defined in: [src/firestore.tsx:62](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L62)
+Defined in: [src/firestore.tsx:197](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L197)
Subscribe to Firestore Document changes and unwrap the document into a plain object
@@ -31,3 +31,7 @@ Subscribe to Firestore Document changes and unwrap the document into a plain obj
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `undefined`\>
+
+## Deprecated
+
+Use `useFirestoreDoc(ref)` and read `snap.data()` / `snap.id` / `snap.exists()` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useFirestoreDocDataOnce.md b/docs/reference/functions/useFirestoreDocDataOnce.md
index 32da9e3e..45a942ee 100644
--- a/docs/reference/functions/useFirestoreDocDataOnce.md
+++ b/docs/reference/functions/useFirestoreDocDataOnce.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useFirestoreDocDataOnce
-# Function: useFirestoreDocDataOnce()
+# ~~Function: useFirestoreDocDataOnce()~~
> **useFirestoreDocDataOnce**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `undefined`\>
-Defined in: [src/firestore.tsx:74](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L74)
+Defined in: [src/firestore.tsx:216](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L216)
Get a Firestore document, unwrap the document into a plain object, and don't subscribe to changes
@@ -31,3 +31,7 @@ Get a Firestore document, unwrap the document into a plain object, and don't sub
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `undefined`\>
+
+## Deprecated
+
+Use `useFirestoreDoc(ref, { once: true })` and read `snap.data()` / `snap.id` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useFirestoreDocOnce.md b/docs/reference/functions/useFirestoreDocOnce.md
index 6280573d..2f468ba7 100644
--- a/docs/reference/functions/useFirestoreDocOnce.md
+++ b/docs/reference/functions/useFirestoreDocOnce.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useFirestoreDocOnce
-# Function: useFirestoreDocOnce()
+# ~~Function: useFirestoreDocOnce()~~
> **useFirestoreDocOnce**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`DocumentSnapshot`\<`T`, `DocumentData`\>\>
-Defined in: [src/firestore.tsx:52](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L52)
+Defined in: [src/firestore.tsx:167](https://github.com/FirebaseExtended/reactfire/blob/main/src/firestore.tsx#L167)
Get a firestore document and don't subscribe to changes
@@ -31,3 +31,7 @@ Get a firestore document and don't subscribe to changes
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`DocumentSnapshot`\<`T`, `DocumentData`\>\>
+
+## Deprecated
+
+Pass `{ once: true }` to `useFirestoreDoc(ref, { once: true })` instead. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useFunctions.md b/docs/reference/functions/useFunctions.md
index bd5a2ade..8336b5c0 100644
--- a/docs/reference/functions/useFunctions.md
+++ b/docs/reference/functions/useFunctions.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useFunctions
-# Function: useFunctions()
+# ~~Function: useFunctions()~~
> **useFunctions**(): `Functions`
-Defined in: [src/sdk.tsx:87](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L87)
+Defined in: [src/sdk.tsx:125](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L125)
## Returns
`Functions`
+
+## Deprecated
+
+Initialize Functions at module scope (`getFunctions(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useIdTokenResult.md b/docs/reference/functions/useIdTokenResult.md
index 7293fc74..88879c9b 100644
--- a/docs/reference/functions/useIdTokenResult.md
+++ b/docs/reference/functions/useIdTokenResult.md
@@ -6,24 +6,50 @@
# Function: useIdTokenResult()
+## Call Signature
+
> **useIdTokenResult**(`user`, `forceRefresh?`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`IdTokenResult`\>
-Defined in: [src/auth.tsx:41](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L41)
+Defined in: [src/auth.tsx:170](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L170)
-## Parameters
+### Parameters
-### user
+#### user
`User`
-### forceRefresh?
+#### forceRefresh?
-`boolean` = `false`
+`boolean`
-### options?
+#### options?
[`ReactFireOptions`](../interfaces/ReactFireOptions.md)\<`IdTokenResult`\>
-## Returns
+### Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`IdTokenResult`\>
+
+## Call Signature
+
+> **useIdTokenResult**(`auth`, `forceRefresh?`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`IdTokenResult` \| `null`\>
+
+Defined in: [src/auth.tsx:175](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L175)
+
+### Parameters
+
+#### auth
+
+`Auth`
+
+#### forceRefresh?
+
+`boolean`
+
+#### options?
+
+[`ReactFireOptions`](../interfaces/ReactFireOptions.md)\<`IdTokenResult` \| `null`\>
+
+### Returns
+
+[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`IdTokenResult` \| `null`\>
diff --git a/docs/reference/functions/useIsSuspenseEnabled.md b/docs/reference/functions/useIsSuspenseEnabled.md
index b068fabe..1267f9b6 100644
--- a/docs/reference/functions/useIsSuspenseEnabled.md
+++ b/docs/reference/functions/useIsSuspenseEnabled.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useIsSuspenseEnabled
-# Function: useIsSuspenseEnabled()
+# ~~Function: useIsSuspenseEnabled()~~
> **useIsSuspenseEnabled**(): `boolean`
-Defined in: [src/firebaseApp.tsx:62](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L62)
+Defined in: [src/firebaseApp.tsx:75](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L75)
## Returns
`boolean`
+
+## Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of using context-based Suspense mode. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useObservable.md b/docs/reference/functions/useObservable.md
index 4ca565df..57dc0934 100644
--- a/docs/reference/functions/useObservable.md
+++ b/docs/reference/functions/useObservable.md
@@ -4,11 +4,13 @@
[ReactFire reference docs](../README.md) / useObservable
-# Function: useObservable()
+# ~~Function: useObservable()~~
> **useObservable**\<`T`\>(`observableId`, `source`, `config?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`\>
-Defined in: [src/useObservable.ts:67](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L67)
+Defined in: [src/useObservable.ts:46](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L46)
+
+Subscribe to an RxJS `Observable`.
## Type Parameters
@@ -33,3 +35,7 @@ Defined in: [src/useObservable.ts:67](https://github.com/FirebaseExtended/reactf
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T`\>
+
+## Deprecated
+
+RxJS integration (`useObservable`, `preloadObservable`, `SuspenseSubject`) is deprecated and will be removed in v5.0.0.
diff --git a/docs/reference/functions/usePerformance.md b/docs/reference/functions/usePerformance.md
index 0ff1b523..4170b36b 100644
--- a/docs/reference/functions/usePerformance.md
+++ b/docs/reference/functions/usePerformance.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / usePerformance
-# Function: usePerformance()
+# ~~Function: usePerformance()~~
> **usePerformance**(): `FirebasePerformance`
-Defined in: [src/sdk.tsx:88](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L88)
+Defined in: [src/sdk.tsx:127](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L127)
## Returns
`FirebasePerformance`
+
+## Deprecated
+
+Initialize Performance at module scope (`getPerformance(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useRemoteConfig.md b/docs/reference/functions/useRemoteConfig.md
index 78b14879..50260eb3 100644
--- a/docs/reference/functions/useRemoteConfig.md
+++ b/docs/reference/functions/useRemoteConfig.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useRemoteConfig
-# Function: useRemoteConfig()
+# ~~Function: useRemoteConfig()~~
> **useRemoteConfig**(): `RemoteConfig`
-Defined in: [src/sdk.tsx:90](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L90)
+Defined in: [src/sdk.tsx:131](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L131)
## Returns
`RemoteConfig`
+
+## Deprecated
+
+Initialize RemoteConfig at module scope (`getRemoteConfig(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useRemoteConfigAll.md b/docs/reference/functions/useRemoteConfigAll.md
index dcbdf075..aa913546 100644
--- a/docs/reference/functions/useRemoteConfigAll.md
+++ b/docs/reference/functions/useRemoteConfigAll.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useRemoteConfigAll
-# Function: useRemoteConfigAll()
+# ~~Function: useRemoteConfigAll()~~
-> **useRemoteConfigAll**(`key`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`AllParameters`\>
+> **useRemoteConfigAll**(`key`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`AllParameters`](../type-aliases/AllParameters.md)\>
-Defined in: [src/remote-config.tsx:66](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L66)
+Defined in: [src/remote-config.tsx:118](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L118)
Convience method similar to useRemoteConfigValue. Returns allRemote Config parameters.
@@ -22,4 +22,8 @@ The parameter key in Remote Config
## Returns
-[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`AllParameters`\>
+[`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`AllParameters`](../type-aliases/AllParameters.md)\>
+
+## Deprecated
+
+Call `fetchAndActivate(remoteConfig)` and `getAll(remoteConfig)` from `firebase/remote-config` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useRemoteConfigBoolean.md b/docs/reference/functions/useRemoteConfigBoolean.md
index d696beb8..093643e5 100644
--- a/docs/reference/functions/useRemoteConfigBoolean.md
+++ b/docs/reference/functions/useRemoteConfigBoolean.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useRemoteConfigBoolean
-# Function: useRemoteConfigBoolean()
+# ~~Function: useRemoteConfigBoolean()~~
> **useRemoteConfigBoolean**(`key`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`boolean`\>
-Defined in: [src/remote-config.tsx:58](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L58)
+Defined in: [src/remote-config.tsx:108](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L108)
Convience method similar to useRemoteConfigValue. Returns a `boolean` from a Remote Config parameter.
@@ -23,3 +23,7 @@ The parameter key in Remote Config
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`boolean`\>
+
+## Deprecated
+
+Call `fetchAndActivate(remoteConfig)` and `getBoolean(remoteConfig, key)` from `firebase/remote-config` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useRemoteConfigNumber.md b/docs/reference/functions/useRemoteConfigNumber.md
index 7affc5bb..6d9bda92 100644
--- a/docs/reference/functions/useRemoteConfigNumber.md
+++ b/docs/reference/functions/useRemoteConfigNumber.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useRemoteConfigNumber
-# Function: useRemoteConfigNumber()
+# ~~Function: useRemoteConfigNumber()~~
> **useRemoteConfigNumber**(`key`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`number`\>
-Defined in: [src/remote-config.tsx:50](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L50)
+Defined in: [src/remote-config.tsx:98](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L98)
Convience method similar to useRemoteConfigValue. Returns a `number` from a Remote Config parameter.
@@ -23,3 +23,7 @@ The parameter key in Remote Config
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`number`\>
+
+## Deprecated
+
+Call `fetchAndActivate(remoteConfig)` and `getNumber(remoteConfig, key)` from `firebase/remote-config` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useRemoteConfigString.md b/docs/reference/functions/useRemoteConfigString.md
index a16940fc..c92535d3 100644
--- a/docs/reference/functions/useRemoteConfigString.md
+++ b/docs/reference/functions/useRemoteConfigString.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useRemoteConfigString
-# Function: useRemoteConfigString()
+# ~~Function: useRemoteConfigString()~~
> **useRemoteConfigString**(`key`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`string`\>
-Defined in: [src/remote-config.tsx:42](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L42)
+Defined in: [src/remote-config.tsx:88](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L88)
Convience method similar to useRemoteConfigValue. Returns a `string` from a Remote Config parameter.
@@ -23,3 +23,7 @@ The parameter key in Remote Config
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`string`\>
+
+## Deprecated
+
+Call `fetchAndActivate(remoteConfig)` and `getString(remoteConfig, key)` from `firebase/remote-config` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useRemoteConfigValue.md b/docs/reference/functions/useRemoteConfigValue.md
index f8a9c115..687d1a1a 100644
--- a/docs/reference/functions/useRemoteConfigValue.md
+++ b/docs/reference/functions/useRemoteConfigValue.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useRemoteConfigValue
-# Function: useRemoteConfigValue()
+# ~~Function: useRemoteConfigValue()~~
> **useRemoteConfigValue**(`key`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`Value`\>
-Defined in: [src/remote-config.tsx:34](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L34)
+Defined in: [src/remote-config.tsx:78](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L78)
Accepts a key and optionally a Remote Config instance. Returns a
Remote Config Value.
@@ -24,3 +24,7 @@ The parameter key in Remote Config
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`Value`\>
+
+## Deprecated
+
+Call `fetchAndActivate(remoteConfig)` and synchronous getters (`getValue(remoteConfig, key)`) from `firebase/remote-config` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useSigninCheck.md b/docs/reference/functions/useSigninCheck.md
index 895405bc..953abbdb 100644
--- a/docs/reference/functions/useSigninCheck.md
+++ b/docs/reference/functions/useSigninCheck.md
@@ -4,42 +4,14 @@
[ReactFire reference docs](../README.md) / useSigninCheck
-# Function: useSigninCheck()
+# ~~Function: useSigninCheck()~~
> **useSigninCheck**(`options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`SigninCheckResult`](../type-aliases/SigninCheckResult.md)\>
-Defined in: [src/auth.tsx:136](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L136)
+Defined in: [src/auth.tsx:334](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L334)
Subscribe to the signed-in status of a user.
-```ts
-const { status, data:signInCheckResult } = useSigninCheck();
-
-if (status === 'loading') {
- return }
-
-if (signInCheckResult.signedIn === true) {
- return
-} else {
- return
-}
-```
-
-Optionally check [custom claims](https://firebase.google.com/docs/auth/admin/custom-claims) of a user as well.
-
-```ts
-// pass in an object describing the custom claims a user must have
-const {status, data: signInCheckResult} = useSigninCheck({requiredClaims: {admin: true}});
-
-// pass in a custom claims validator function
-const {status, data: signInCheckResult} = useSigninCheck({validateCustomClaims: (userClaims) => {
- // custom validation logic...
-}});
-
-// You can optionally force-refresh the token
-const {status, data: signInCheckResult} = useSigninCheck({forceRefresh: true, requiredClaims: {admin: true}});
-```
-
## Parameters
### options?
@@ -49,3 +21,7 @@ const {status, data: signInCheckResult} = useSigninCheck({forceRefresh: true, re
## Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<[`SigninCheckResult`](../type-aliases/SigninCheckResult.md)\>
+
+## Deprecated
+
+Use `useUser(auth)`, `useIdTokenResult(auth)`, or `` instead. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useStorage.md b/docs/reference/functions/useStorage.md
index 74d28fe2..40be7b3a 100644
--- a/docs/reference/functions/useStorage.md
+++ b/docs/reference/functions/useStorage.md
@@ -4,12 +4,16 @@
[ReactFire reference docs](../README.md) / useStorage
-# Function: useStorage()
+# ~~Function: useStorage()~~
> **useStorage**(): `FirebaseStorage`
-Defined in: [src/sdk.tsx:89](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L89)
+Defined in: [src/sdk.tsx:129](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L129)
## Returns
`FirebaseStorage`
+
+## Deprecated
+
+Initialize Storage at module scope (`getStorage(app)`) instead of reading from Context. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useStorageDownloadURL.md b/docs/reference/functions/useStorageDownloadURL.md
index ced03bbf..519e1767 100644
--- a/docs/reference/functions/useStorageDownloadURL.md
+++ b/docs/reference/functions/useStorageDownloadURL.md
@@ -6,9 +6,9 @@
# Function: useStorageDownloadURL()
-> **useStorageDownloadURL**\<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`string` \| `T`\>
+> **useStorageDownloadURL**\<`T`\>(`storageRef`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`string` \| `T`\>
-Defined in: [src/storage.tsx:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L30)
+Defined in: [src/storage.tsx:111](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L111)
Subscribe to a storage ref's download URL
@@ -20,7 +20,7 @@ Subscribe to a storage ref's download URL
## Parameters
-### ref
+### storageRef
`StorageReference`
diff --git a/docs/reference/functions/useStorageTask.md b/docs/reference/functions/useStorageTask.md
index f6cbc13d..2efb832e 100644
--- a/docs/reference/functions/useStorageTask.md
+++ b/docs/reference/functions/useStorageTask.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useStorageTask
-# Function: useStorageTask()
+# ~~Function: useStorageTask()~~
-> **useStorageTask**\<`T`\>(`task`, `ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `UploadTaskSnapshot`\>
+> **useStorageTask**\<`T`\>(`task`, `ref`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`UploadTaskSnapshot` \| `T`\>
-Defined in: [src/storage.tsx:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L17)
+Defined in: [src/storage.tsx:54](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L54)
Subscribe to the progress of a storage task
@@ -38,4 +38,8 @@ reference to the blob the task is acting on
## Returns
-[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`T` \| `UploadTaskSnapshot`\>
+[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`UploadTaskSnapshot` \| `T`\>
+
+## Deprecated
+
+Track `uploadBytesResumable` progress inside your upload handler or action instead. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useSuspenseEnabledFromConfigAndContext.md b/docs/reference/functions/useSuspenseEnabledFromConfigAndContext.md
index 4781e595..e670592f 100644
--- a/docs/reference/functions/useSuspenseEnabledFromConfigAndContext.md
+++ b/docs/reference/functions/useSuspenseEnabledFromConfigAndContext.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / useSuspenseEnabledFromConfigAndContext
-# Function: useSuspenseEnabledFromConfigAndContext()
+# ~~Function: useSuspenseEnabledFromConfigAndContext()~~
> **useSuspenseEnabledFromConfigAndContext**(`suspenseFromConfig?`): `boolean`
-Defined in: [src/firebaseApp.tsx:69](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L69)
+Defined in: [src/firebaseApp.tsx:85](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L85)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/firebaseApp.tsx:69](https://github.com/FirebaseExtended/reactfi
## Returns
`boolean`
+
+## Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of using context-based Suspense mode. Will be removed in v5.0.0.
diff --git a/docs/reference/functions/useUser.md b/docs/reference/functions/useUser.md
index 0f7277e6..68a79ed0 100644
--- a/docs/reference/functions/useUser.md
+++ b/docs/reference/functions/useUser.md
@@ -6,24 +6,54 @@
# Function: useUser()
+## Call Signature
+
> **useUser**\<`T`\>(`options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`User` \| `null`\>
-Defined in: [src/auth.tsx:22](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L22)
+Defined in: [src/auth.tsx:102](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L102)
Subscribe to Firebase auth state changes, including token refresh
-## Type Parameters
+### Type Parameters
-### T
+#### T
`T` = `unknown`
-## Parameters
+### Parameters
+
+#### options?
+
+[`ReactFireOptions`](../interfaces/ReactFireOptions.md)\<`T`\>
+
+### Returns
+
+[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`User` \| `null`\>
+
+## Call Signature
+
+> **useUser**\<`T`\>(`auth`, `options?`): [`ObservableStatus`](../interfaces/ObservableStatus.md)\<`User` \| `null`\>
+
+Defined in: [src/auth.tsx:103](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L103)
+
+Subscribe to Firebase auth state changes, including token refresh
+
+### Type Parameters
+
+#### T
+
+`T` = `unknown`
+
+### Parameters
+
+#### auth
+
+`Auth`
-### options?
+#### options?
[`ReactFireOptions`](../interfaces/ReactFireOptions.md)\<`T`\>
-## Returns
+### Returns
[`ObservableStatus`](../interfaces/ObservableStatus.md)\<`User` \| `null`\>
diff --git a/docs/reference/interfaces/AuthCheckProps.md b/docs/reference/interfaces/AuthCheckProps.md
index c5edcb62..c6d66f26 100644
--- a/docs/reference/interfaces/AuthCheckProps.md
+++ b/docs/reference/interfaces/AuthCheckProps.md
@@ -6,15 +6,23 @@
# Interface: AuthCheckProps
-Defined in: [src/auth.tsx:54](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L54)
+Defined in: [src/auth.tsx:255](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L255)
## Properties
+### auth?
+
+> `optional` **auth?**: `Auth`
+
+Defined in: [src/auth.tsx:256](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L256)
+
+***
+
### children
> **children**: `ReactNode`
-Defined in: [src/auth.tsx:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L56)
+Defined in: [src/auth.tsx:258](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L258)
***
@@ -22,7 +30,7 @@ Defined in: [src/auth.tsx:56](https://github.com/FirebaseExtended/reactfire/blob
> **fallback**: `ReactNode`
-Defined in: [src/auth.tsx:55](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L55)
+Defined in: [src/auth.tsx:257](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L257)
***
@@ -30,4 +38,4 @@ Defined in: [src/auth.tsx:55](https://github.com/FirebaseExtended/reactfire/blob
> `optional` **requiredClaims?**: `Object`
-Defined in: [src/auth.tsx:57](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L57)
+Defined in: [src/auth.tsx:259](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L259)
diff --git a/docs/reference/interfaces/ClaimCheckErrors.md b/docs/reference/interfaces/ClaimCheckErrors.md
index ce0afa98..b034270e 100644
--- a/docs/reference/interfaces/ClaimCheckErrors.md
+++ b/docs/reference/interfaces/ClaimCheckErrors.md
@@ -4,9 +4,13 @@
[ReactFire reference docs](../README.md) / ClaimCheckErrors
-# Interface: ClaimCheckErrors
+# ~~Interface: ClaimCheckErrors~~
-Defined in: [src/auth.tsx:67](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L67)
+Defined in: [src/auth.tsx:275](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L275)
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
## Indexable
diff --git a/docs/reference/interfaces/ClaimsCheckProps.md b/docs/reference/interfaces/ClaimsCheckProps.md
index 34375923..da97e4e2 100644
--- a/docs/reference/interfaces/ClaimsCheckProps.md
+++ b/docs/reference/interfaces/ClaimsCheckProps.md
@@ -4,33 +4,37 @@
[ReactFire reference docs](../README.md) / ClaimsCheckProps
-# Interface: ClaimsCheckProps
+# ~~Interface: ClaimsCheckProps~~
-Defined in: [src/auth.tsx:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L60)
+Defined in: [src/auth.tsx:265](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L265)
+
+## Deprecated
+
+Use `` or `useIdTokenResult(auth)` instead. Will be removed in v5.0.0.
## Properties
-### children
+### ~~children~~
> **children**: `ReactNode`
-Defined in: [src/auth.tsx:63](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L63)
+Defined in: [src/auth.tsx:268](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L268)
***
-### fallback
+### ~~fallback~~
> **fallback**: `ReactNode`
-Defined in: [src/auth.tsx:62](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L62)
+Defined in: [src/auth.tsx:267](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L267)
***
-### requiredClaims
+### ~~requiredClaims~~
> **requiredClaims**: `object`
-Defined in: [src/auth.tsx:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L64)
+Defined in: [src/auth.tsx:269](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L269)
#### Index Signature
@@ -38,8 +42,8 @@ Defined in: [src/auth.tsx:64](https://github.com/FirebaseExtended/reactfire/blob
***
-### user
+### ~~user~~
> **user**: `User`
-Defined in: [src/auth.tsx:61](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L61)
+Defined in: [src/auth.tsx:266](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L266)
diff --git a/docs/reference/interfaces/ClaimsValidator.md b/docs/reference/interfaces/ClaimsValidator.md
index 436ddd45..686d9f05 100644
--- a/docs/reference/interfaces/ClaimsValidator.md
+++ b/docs/reference/interfaces/ClaimsValidator.md
@@ -4,13 +4,17 @@
[ReactFire reference docs](../README.md) / ClaimsValidator
-# Interface: ClaimsValidator()
+# ~~Interface: ClaimsValidator()~~
-Defined in: [src/auth.tsx:93](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L93)
+Defined in: [src/auth.tsx:313](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L313)
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
> **ClaimsValidator**(`claims`): `object`
-Defined in: [src/auth.tsx:94](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L94)
+Defined in: [src/auth.tsx:314](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L314)
## Parameters
@@ -22,10 +26,14 @@ Defined in: [src/auth.tsx:94](https://github.com/FirebaseExtended/reactfire/blob
`object`
-### errors
+### ~~errors~~
> **errors**: \{ \} \| [`ClaimCheckErrors`](ClaimCheckErrors.md)
-### hasRequiredClaims
+### ~~hasRequiredClaims~~
> **hasRequiredClaims**: `boolean`
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
diff --git a/docs/reference/interfaces/FirebaseAppProviderProps.md b/docs/reference/interfaces/FirebaseAppProviderProps.md
index 80a7ff39..02c2c5da 100644
--- a/docs/reference/interfaces/FirebaseAppProviderProps.md
+++ b/docs/reference/interfaces/FirebaseAppProviderProps.md
@@ -4,38 +4,46 @@
[ReactFire reference docs](../README.md) / FirebaseAppProviderProps
-# Interface: FirebaseAppProviderProps
+# ~~Interface: FirebaseAppProviderProps~~
-Defined in: [src/firebaseApp.tsx:14](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L14)
+Defined in: [src/firebaseApp.tsx:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L17)
+
+## Deprecated
+
+`` is deprecated and will be removed in v5.0.0. Initialize your Firebase app at module scope (`export const app = initializeApp(config)`) and pass SDK instances or references directly to ReactFire hooks.
## Properties
-### appName?
+### ~~appName?~~
> `optional` **appName?**: `string`
-Defined in: [src/firebaseApp.tsx:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L17)
+Defined in: [src/firebaseApp.tsx:20](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L20)
***
-### firebaseApp?
+### ~~firebaseApp?~~
> `optional` **firebaseApp?**: `FirebaseApp`
-Defined in: [src/firebaseApp.tsx:15](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L15)
+Defined in: [src/firebaseApp.tsx:18](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L18)
***
-### firebaseConfig?
+### ~~firebaseConfig?~~
> `optional` **firebaseConfig?**: `FirebaseOptions`
-Defined in: [src/firebaseApp.tsx:16](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L16)
+Defined in: [src/firebaseApp.tsx:19](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L19)
***
-### suspense?
+### ~~suspense?~~
> `optional` **suspense?**: `boolean`
-Defined in: [src/firebaseApp.tsx:18](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L18)
+Defined in: [src/firebaseApp.tsx:24](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L24)
+
+#### Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of setting `suspense={true}`.
diff --git a/docs/reference/interfaces/ObservableStatus.md b/docs/reference/interfaces/ObservableStatus.md
index a1846ef9..ec07572c 100644
--- a/docs/reference/interfaces/ObservableStatus.md
+++ b/docs/reference/interfaces/ObservableStatus.md
@@ -6,7 +6,7 @@
# Interface: ObservableStatus\
-Defined in: [src/useObservable.ts:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L30)
+Defined in: [src/useFirebaseStream.ts:97](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L97)
## Type Parameters
@@ -20,11 +20,11 @@ Defined in: [src/useObservable.ts:30](https://github.com/FirebaseExtended/reactf
> **data**: `T`
-Defined in: [src/useObservable.ts:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L56)
+Defined in: [src/useFirebaseStream.ts:127](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L127)
The most recent value.
-If `initialData` is passed in, the first value of `data` will be the valuea provided in `initialData` **UNLESS** the underlying observable is ready, in which case it will skip `initialData`.
+If `initialData` is passed in, the first value of `data` will be the value provided in `initialData` **UNLESS** the underlying observable is ready, in which case it will skip `initialData`.
***
@@ -32,49 +32,75 @@ If `initialData` is passed in, the first value of `data` will be the valuea prov
> **error**: `Error` \| `undefined`
-Defined in: [src/useObservable.ts:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L60)
+Defined in: [src/useFirebaseStream.ts:131](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L131)
Any error that may have occurred in the underlying observable
***
-### firstValuePromise
+### experimental\_usable
+
+> `readonly` **experimental\_usable**: [`ReactFireUsable`](../type-aliases/ReactFireUsable.md)\<`T`\>
+
+Defined in: [src/useFirebaseStream.ts:153](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L153)
+
+A React 19 `Usable` that can be passed directly into `React.use()`
+(`const data = use(useFirestoreDoc(ref).experimental_usable)`).
+
+Suspends on initial load when no data is available yet, and synchronously
+unwraps the latest live value on all subsequent renders without re-suspending.
+
+***
+
+### ~~firstValuePromise~~
> **firstValuePromise**: `Promise`\<`void`\>
-Defined in: [src/useObservable.ts:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L64)
+Defined in: [src/useFirebaseStream.ts:137](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L137)
Promise that resolves after first emit from observable
+#### Deprecated
+
+Pass `.experimental_usable` (or `.usable`) to `React.use()` instead. Will be removed in v5.0.0.
+
***
-### hasEmitted
+### ~~hasEmitted~~
> **hasEmitted**: `boolean`
-Defined in: [src/useObservable.ts:46](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L46)
+Defined in: [src/useFirebaseStream.ts:115](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L115)
Indicates whether the hook has emitted a value at some point
If `initialData` is passed in, this will be `true`.
+#### Deprecated
+
+Check `status === 'success'` or pass `.experimental_usable` to `React.use()` instead. Will be removed in v5.0.0.
+
***
-### isComplete
+### ~~isComplete~~
> **isComplete**: `boolean`
-Defined in: [src/useObservable.ts:50](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L50)
+Defined in: [src/useFirebaseStream.ts:121](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L121)
If this is `true`, the hook will be emitting no further items.
+#### Deprecated
+
+Will be removed in v5.0.0.
+
***
### status
-> **status**: `"error"` \| `"loading"` \| `"success"`
+> **status**: `"loading"` \| `"error"` \| `"success"`
-Defined in: [src/useObservable.ts:40](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L40)
+Defined in: [src/useFirebaseStream.ts:107](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L107)
The loading status.
@@ -83,3 +109,17 @@ The loading status.
- `success`: The hook has emitted at least one value
If `initialData` is passed in, this will skip `loading` and go straight to `success`.
+
+***
+
+### usable
+
+> `readonly` **usable**: [`ReactFireUsable`](../type-aliases/ReactFireUsable.md)\<`T`\>
+
+Defined in: [src/useFirebaseStream.ts:145](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L145)
+
+A React 19 `Usable` that can be passed directly into `React.use()`
+(`const data = use(useFirestoreDoc(ref).usable)`).
+
+Suspends on initial load when no data is available yet, and synchronously
+unwraps the latest live value on all subsequent renders without re-suspending.
diff --git a/docs/reference/interfaces/QueryChange.md b/docs/reference/interfaces/QueryChange.md
new file mode 100644
index 00000000..4783147b
--- /dev/null
+++ b/docs/reference/interfaces/QueryChange.md
@@ -0,0 +1,37 @@
+[**ReactFire reference docs**](../README.md)
+
+***
+
+[ReactFire reference docs](../README.md) / QueryChange
+
+# ~~Interface: QueryChange~~
+
+Defined in: [src/database.tsx:28](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L28)
+
+## Deprecated
+
+Legacy rxfire change wrapper. In v5.0.0, `useDatabaseObject` returns `DataSnapshot` and `useDatabaseList` returns `DataSnapshot[]`.
+
+## Properties
+
+### ~~event~~
+
+> **event**: [`ListenEvent`](../enumerations/ListenEvent.md)
+
+Defined in: [src/database.tsx:31](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L31)
+
+***
+
+### ~~prevKey~~
+
+> **prevKey**: `string` \| `null` \| `undefined`
+
+Defined in: [src/database.tsx:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L30)
+
+***
+
+### ~~snapshot~~
+
+> **snapshot**: `DataSnapshot`
+
+Defined in: [src/database.tsx:29](https://github.com/FirebaseExtended/reactfire/blob/main/src/database.tsx#L29)
diff --git a/docs/reference/interfaces/ReactFireOptions.md b/docs/reference/interfaces/ReactFireOptions.md
index 7ca63c5e..0f426010 100644
--- a/docs/reference/interfaces/ReactFireOptions.md
+++ b/docs/reference/interfaces/ReactFireOptions.md
@@ -6,7 +6,7 @@
# Interface: ReactFireOptions\
-Defined in: [src/index.ts:24](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L24)
+Defined in: [src/useFirebaseStream.ts:47](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L47)
## Extended by
@@ -20,11 +20,25 @@ Defined in: [src/index.ts:24](https://github.com/FirebaseExtended/reactfire/blob
## Properties
-### idField?
+### ~~idField?~~
> `optional` **idField?**: `string`
-Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L25)
+Defined in: [src/useFirebaseStream.ts:51](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L51)
+
+#### Deprecated
+
+`*Data` hooks and `idField` are deprecated and will be removed in v5.0.0. Use snapshot hooks (`useFirestoreDoc`, `useFirestoreCollection`, `useDatabaseObject`, `useDatabaseList`) and read `doc.id` or `child.key` directly.
+
+***
+
+### includeMetadataChanges?
+
+> `optional` **includeMetadataChanges?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:68](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L68)
+
+Emit when snapshot metadata (`hasPendingWrites`, `fromCache`) changes (`useFirestoreDoc` / `useFirestoreCollection`).
***
@@ -32,7 +46,17 @@ Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob
> `optional` **initialData?**: `any`
-Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L26)
+Defined in: [src/useFirebaseStream.ts:52](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L52)
+
+***
+
+### once?
+
+> `optional` **once?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L64)
+
+Resolve the initial read once and do not keep a real-time listener open (`useFirestoreDoc` / `useFirestoreCollection`).
***
@@ -40,16 +64,20 @@ Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob
> `optional` **startWithValue?**: `any`
-Defined in: [src/index.ts:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L30)
+Defined in: [src/useFirebaseStream.ts:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L56)
#### Deprecated
-use initialData instead
+use `initialData` instead
***
-### suspense?
+### ~~suspense?~~
> `optional` **suspense?**: `boolean`
-Defined in: [src/index.ts:31](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L31)
+Defined in: [src/useFirebaseStream.ts:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L60)
+
+#### Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of setting `suspense: true`.
diff --git a/docs/reference/interfaces/SignInCheckOptionsBasic.md b/docs/reference/interfaces/SignInCheckOptionsBasic.md
index 66967bf8..03480198 100644
--- a/docs/reference/interfaces/SignInCheckOptionsBasic.md
+++ b/docs/reference/interfaces/SignInCheckOptionsBasic.md
@@ -4,9 +4,13 @@
[ReactFire reference docs](../README.md) / SignInCheckOptionsBasic
-# Interface: SignInCheckOptionsBasic
+# ~~Interface: SignInCheckOptionsBasic~~
-Defined in: [src/auth.tsx:85](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L85)
+Defined in: [src/auth.tsx:299](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L299)
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
## Extends
@@ -19,19 +23,23 @@ Defined in: [src/auth.tsx:85](https://github.com/FirebaseExtended/reactfire/blob
## Properties
-### forceRefresh?
+### ~~forceRefresh?~~
> `optional` **forceRefresh?**: `boolean`
-Defined in: [src/auth.tsx:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L86)
+Defined in: [src/auth.tsx:300](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L300)
***
-### idField?
+### ~~idField?~~
> `optional` **idField?**: `string`
-Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L25)
+Defined in: [src/useFirebaseStream.ts:51](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L51)
+
+#### Deprecated
+
+`*Data` hooks and `idField` are deprecated and will be removed in v5.0.0. Use snapshot hooks (`useFirestoreDoc`, `useFirestoreCollection`, `useDatabaseObject`, `useDatabaseList`) and read `doc.id` or `child.key` directly.
#### Inherited from
@@ -39,11 +47,25 @@ Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob
***
-### initialData?
+### ~~includeMetadataChanges?~~
+
+> `optional` **includeMetadataChanges?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:68](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L68)
+
+Emit when snapshot metadata (`hasPendingWrites`, `fromCache`) changes (`useFirestoreDoc` / `useFirestoreCollection`).
+
+#### Inherited from
+
+[`ReactFireOptions`](ReactFireOptions.md).[`includeMetadataChanges`](ReactFireOptions.md#includemetadatachanges)
+
+***
+
+### ~~initialData?~~
> `optional` **initialData?**: `any`
-Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L26)
+Defined in: [src/useFirebaseStream.ts:52](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L52)
#### Inherited from
@@ -51,15 +73,29 @@ Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob
***
+### ~~once?~~
+
+> `optional` **once?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L64)
+
+Resolve the initial read once and do not keep a real-time listener open (`useFirestoreDoc` / `useFirestoreCollection`).
+
+#### Inherited from
+
+[`ReactFireOptions`](ReactFireOptions.md).[`once`](ReactFireOptions.md#once)
+
+***
+
### ~~startWithValue?~~
> `optional` **startWithValue?**: `any`
-Defined in: [src/index.ts:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L30)
+Defined in: [src/useFirebaseStream.ts:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L56)
#### Deprecated
-use initialData instead
+use `initialData` instead
#### Inherited from
@@ -67,11 +103,15 @@ use initialData instead
***
-### suspense?
+### ~~suspense?~~
> `optional` **suspense?**: `boolean`
-Defined in: [src/index.ts:31](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L31)
+Defined in: [src/useFirebaseStream.ts:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L60)
+
+#### Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of setting `suspense: true`.
#### Inherited from
diff --git a/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md b/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md
index 09a1eae0..76332ea4 100644
--- a/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md
+++ b/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md
@@ -4,9 +4,13 @@
[ReactFire reference docs](../README.md) / SignInCheckOptionsClaimsObject
-# Interface: SignInCheckOptionsClaimsObject
+# ~~Interface: SignInCheckOptionsClaimsObject~~
-Defined in: [src/auth.tsx:89](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L89)
+Defined in: [src/auth.tsx:306](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L306)
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
## Extends
@@ -14,11 +18,11 @@ Defined in: [src/auth.tsx:89](https://github.com/FirebaseExtended/reactfire/blob
## Properties
-### forceRefresh?
+### ~~forceRefresh?~~
> `optional` **forceRefresh?**: `boolean`
-Defined in: [src/auth.tsx:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L86)
+Defined in: [src/auth.tsx:300](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L300)
#### Inherited from
@@ -26,11 +30,15 @@ Defined in: [src/auth.tsx:86](https://github.com/FirebaseExtended/reactfire/blob
***
-### idField?
+### ~~idField?~~
> `optional` **idField?**: `string`
-Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L25)
+Defined in: [src/useFirebaseStream.ts:51](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L51)
+
+#### Deprecated
+
+`*Data` hooks and `idField` are deprecated and will be removed in v5.0.0. Use snapshot hooks (`useFirestoreDoc`, `useFirestoreCollection`, `useDatabaseObject`, `useDatabaseList`) and read `doc.id` or `child.key` directly.
#### Inherited from
@@ -38,11 +46,25 @@ Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob
***
-### initialData?
+### ~~includeMetadataChanges?~~
+
+> `optional` **includeMetadataChanges?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:68](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L68)
+
+Emit when snapshot metadata (`hasPendingWrites`, `fromCache`) changes (`useFirestoreDoc` / `useFirestoreCollection`).
+
+#### Inherited from
+
+[`SignInCheckOptionsBasic`](SignInCheckOptionsBasic.md).[`includeMetadataChanges`](SignInCheckOptionsBasic.md#includemetadatachanges)
+
+***
+
+### ~~initialData?~~
> `optional` **initialData?**: `any`
-Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L26)
+Defined in: [src/useFirebaseStream.ts:52](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L52)
#### Inherited from
@@ -50,11 +72,25 @@ Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob
***
-### requiredClaims
+### ~~once?~~
+
+> `optional` **once?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L64)
+
+Resolve the initial read once and do not keep a real-time listener open (`useFirestoreDoc` / `useFirestoreCollection`).
+
+#### Inherited from
+
+[`SignInCheckOptionsBasic`](SignInCheckOptionsBasic.md).[`once`](SignInCheckOptionsBasic.md#once)
+
+***
+
+### ~~requiredClaims~~
> **requiredClaims**: `ParsedToken`
-Defined in: [src/auth.tsx:90](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L90)
+Defined in: [src/auth.tsx:307](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L307)
***
@@ -62,11 +98,11 @@ Defined in: [src/auth.tsx:90](https://github.com/FirebaseExtended/reactfire/blob
> `optional` **startWithValue?**: `any`
-Defined in: [src/index.ts:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L30)
+Defined in: [src/useFirebaseStream.ts:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L56)
#### Deprecated
-use initialData instead
+use `initialData` instead
#### Inherited from
@@ -74,11 +110,15 @@ use initialData instead
***
-### suspense?
+### ~~suspense?~~
> `optional` **suspense?**: `boolean`
-Defined in: [src/index.ts:31](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L31)
+Defined in: [src/useFirebaseStream.ts:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L60)
+
+#### Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of setting `suspense: true`.
#### Inherited from
diff --git a/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md b/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md
index 5ba7f609..8bcf14fa 100644
--- a/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md
+++ b/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md
@@ -4,9 +4,13 @@
[ReactFire reference docs](../README.md) / SignInCheckOptionsClaimsValidator
-# Interface: SignInCheckOptionsClaimsValidator
+# ~~Interface: SignInCheckOptionsClaimsValidator~~
-Defined in: [src/auth.tsx:100](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L100)
+Defined in: [src/auth.tsx:323](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L323)
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
## Extends
@@ -14,11 +18,11 @@ Defined in: [src/auth.tsx:100](https://github.com/FirebaseExtended/reactfire/blo
## Properties
-### forceRefresh?
+### ~~forceRefresh?~~
> `optional` **forceRefresh?**: `boolean`
-Defined in: [src/auth.tsx:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L86)
+Defined in: [src/auth.tsx:300](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L300)
#### Inherited from
@@ -26,11 +30,15 @@ Defined in: [src/auth.tsx:86](https://github.com/FirebaseExtended/reactfire/blob
***
-### idField?
+### ~~idField?~~
> `optional` **idField?**: `string`
-Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L25)
+Defined in: [src/useFirebaseStream.ts:51](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L51)
+
+#### Deprecated
+
+`*Data` hooks and `idField` are deprecated and will be removed in v5.0.0. Use snapshot hooks (`useFirestoreDoc`, `useFirestoreCollection`, `useDatabaseObject`, `useDatabaseList`) and read `doc.id` or `child.key` directly.
#### Inherited from
@@ -38,11 +46,25 @@ Defined in: [src/index.ts:25](https://github.com/FirebaseExtended/reactfire/blob
***
-### initialData?
+### ~~includeMetadataChanges?~~
+
+> `optional` **includeMetadataChanges?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:68](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L68)
+
+Emit when snapshot metadata (`hasPendingWrites`, `fromCache`) changes (`useFirestoreDoc` / `useFirestoreCollection`).
+
+#### Inherited from
+
+[`SignInCheckOptionsBasic`](SignInCheckOptionsBasic.md).[`includeMetadataChanges`](SignInCheckOptionsBasic.md#includemetadatachanges)
+
+***
+
+### ~~initialData?~~
> `optional` **initialData?**: `any`
-Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L26)
+Defined in: [src/useFirebaseStream.ts:52](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L52)
#### Inherited from
@@ -50,15 +72,29 @@ Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob
***
+### ~~once?~~
+
+> `optional` **once?**: `boolean`
+
+Defined in: [src/useFirebaseStream.ts:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L64)
+
+Resolve the initial read once and do not keep a real-time listener open (`useFirestoreDoc` / `useFirestoreCollection`).
+
+#### Inherited from
+
+[`SignInCheckOptionsBasic`](SignInCheckOptionsBasic.md).[`once`](SignInCheckOptionsBasic.md#once)
+
+***
+
### ~~startWithValue?~~
> `optional` **startWithValue?**: `any`
-Defined in: [src/index.ts:30](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L30)
+Defined in: [src/useFirebaseStream.ts:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L56)
#### Deprecated
-use initialData instead
+use `initialData` instead
#### Inherited from
@@ -66,11 +102,15 @@ use initialData instead
***
-### suspense?
+### ~~suspense?~~
> `optional` **suspense?**: `boolean`
-Defined in: [src/index.ts:31](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L31)
+Defined in: [src/useFirebaseStream.ts:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L60)
+
+#### Deprecated
+
+Pass `hook().experimental_usable` (or `hook().usable`) to `React.use()` instead of setting `suspense: true`.
#### Inherited from
@@ -78,8 +118,8 @@ Defined in: [src/index.ts:31](https://github.com/FirebaseExtended/reactfire/blob
***
-### validateCustomClaims
+### ~~validateCustomClaims~~
> **validateCustomClaims**: [`ClaimsValidator`](ClaimsValidator.md)
-Defined in: [src/auth.tsx:101](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L101)
+Defined in: [src/auth.tsx:324](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L324)
diff --git a/docs/reference/interfaces/SuspensePerfProps.md b/docs/reference/interfaces/SuspensePerfProps.md
index a2ab17da..1a28cdb7 100644
--- a/docs/reference/interfaces/SuspensePerfProps.md
+++ b/docs/reference/interfaces/SuspensePerfProps.md
@@ -6,7 +6,7 @@
# Interface: SuspensePerfProps
-Defined in: [src/performance.tsx:3](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L3)
+Defined in: [src/performance.tsx:6](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L6)
## Properties
@@ -14,7 +14,7 @@ Defined in: [src/performance.tsx:3](https://github.com/FirebaseExtended/reactfir
> **children**: `ReactNode`
-Defined in: [src/performance.tsx:4](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L4)
+Defined in: [src/performance.tsx:7](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L7)
***
@@ -22,7 +22,17 @@ Defined in: [src/performance.tsx:4](https://github.com/FirebaseExtended/reactfir
> **fallback**: `ReactNode`
-Defined in: [src/performance.tsx:6](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L6)
+Defined in: [src/performance.tsx:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L9)
+
+***
+
+### perf?
+
+> `optional` **perf?**: `FirebasePerformance`
+
+Defined in: [src/performance.tsx:13](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L13)
+
+Optional Firebase Performance Monitoring instance to record the trace with.
***
@@ -30,4 +40,4 @@ Defined in: [src/performance.tsx:6](https://github.com/FirebaseExtended/reactfir
> **traceId**: `string`
-Defined in: [src/performance.tsx:5](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L5)
+Defined in: [src/performance.tsx:8](https://github.com/FirebaseExtended/reactfire/blob/main/src/performance.tsx#L8)
diff --git a/docs/reference/type-aliases/AllParameters.md b/docs/reference/type-aliases/AllParameters.md
new file mode 100644
index 00000000..74790a9f
--- /dev/null
+++ b/docs/reference/type-aliases/AllParameters.md
@@ -0,0 +1,19 @@
+[**ReactFire reference docs**](../README.md)
+
+***
+
+[ReactFire reference docs](../README.md) / AllParameters
+
+# ~~Type Alias: AllParameters~~
+
+> **AllParameters** = `object`
+
+Defined in: [src/remote-config.tsx:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/remote-config.tsx#L17)
+
+## Index Signature
+
+\[`key`: `string`\]: `Value`
+
+## Deprecated
+
+Use `getAll(remoteConfig)` from `firebase/remote-config` directly. Will be removed in v5.0.0.
diff --git a/docs/reference/type-aliases/ReactFireGlobals.md b/docs/reference/type-aliases/ReactFireGlobals.md
index 995ef49a..defaf4eb 100644
--- a/docs/reference/type-aliases/ReactFireGlobals.md
+++ b/docs/reference/type-aliases/ReactFireGlobals.md
@@ -4,32 +4,36 @@
[ReactFire reference docs](../README.md) / ReactFireGlobals
-# Type Alias: ReactFireGlobals
+# ~~Type Alias: ReactFireGlobals~~
> **ReactFireGlobals** = `object`
-Defined in: [src/index.ts:6](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L6)
+Defined in: [src/index.ts:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L9)
+
+## Deprecated
+
+Internal global cache type. Will be removed in v5.0.0.
## Properties
-### \_reactFireDatabaseCachedQueries
+### ~~\_reactFireDatabaseCachedQueries~~
> **\_reactFireDatabaseCachedQueries**: `DatabaseQuery`[]
-Defined in: [src/index.ts:7](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L7)
+Defined in: [src/index.ts:10](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L10)
***
-### \_reactFireFirestoreQueryCache
+### ~~\_reactFireFirestoreQueryCache~~
> **\_reactFireFirestoreQueryCache**: `FirestoreQuery`[]
-Defined in: [src/index.ts:8](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L8)
+Defined in: [src/index.ts:11](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L11)
***
-### \_reactFirePreloadedObservables
+### ~~\_reactFirePreloadedObservables~~
> **\_reactFirePreloadedObservables**: `Map`\<`string`, `SuspenseSubject`\<`any`\>\>
-Defined in: [src/index.ts:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L9)
+Defined in: [src/index.ts:12](https://github.com/FirebaseExtended/reactfire/blob/main/src/index.ts#L12)
diff --git a/docs/reference/type-aliases/ReactFireUsable.md b/docs/reference/type-aliases/ReactFireUsable.md
new file mode 100644
index 00000000..7bc083f5
--- /dev/null
+++ b/docs/reference/type-aliases/ReactFireUsable.md
@@ -0,0 +1,20 @@
+[**ReactFire reference docs**](../README.md)
+
+***
+
+[ReactFire reference docs](../README.md) / ReactFireUsable
+
+# Type Alias: ReactFireUsable\
+
+> **ReactFireUsable**\<`T`\> = `Promise`\<`T`\>
+
+Defined in: [src/useFirebaseStream.ts:24](https://github.com/FirebaseExtended/reactfire/blob/main/src/useFirebaseStream.ts#L24)
+
+A thenable compatible with React 19's `React.use()` while remaining structurally valid
+under `@types/react` 16, 17, 18, and 19.
+
+## Type Parameters
+
+### T
+
+`T`
diff --git a/docs/reference/type-aliases/SigninCheckResult.md b/docs/reference/type-aliases/SigninCheckResult.md
index f6f71bd1..deeb5cc5 100644
--- a/docs/reference/type-aliases/SigninCheckResult.md
+++ b/docs/reference/type-aliases/SigninCheckResult.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / SigninCheckResult
-# Type Alias: SigninCheckResult
+# ~~Type Alias: SigninCheckResult~~
> **SigninCheckResult** = \{ `errors`: \{ \}; `hasRequiredClaims`: `false`; `signedIn`: `false`; `user`: `null`; \} \| \{ `errors`: [`ClaimCheckErrors`](../interfaces/ClaimCheckErrors.md); `hasRequiredClaims`: `boolean`; `signedIn`: `true`; `user`: `User`; \}
-Defined in: [src/auth.tsx:71](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L71)
+Defined in: [src/auth.tsx:282](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L282)
+
+## Deprecated
+
+Will be removed in v5.0.0 along with `useSigninCheck`.
diff --git a/docs/reference/type-aliases/StorageImageProps.md b/docs/reference/type-aliases/StorageImageProps.md
index f4dcf98f..fd6d5f92 100644
--- a/docs/reference/type-aliases/StorageImageProps.md
+++ b/docs/reference/type-aliases/StorageImageProps.md
@@ -4,40 +4,44 @@
[ReactFire reference docs](../README.md) / StorageImageProps
-# Type Alias: StorageImageProps
+# ~~Type Alias: StorageImageProps~~
> **StorageImageProps** = `object`
-Defined in: [src/storage.tsx:40](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L40)
+Defined in: [src/storage.tsx:136](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L136)
+
+## Deprecated
+
+Use `useStorageDownloadURL(ref)` with a standard `
` element instead. Will be removed in v5.0.0.
## Properties
-### placeHolder?
+### ~~placeHolder?~~
> `optional` **placeHolder?**: `React.ReactNode`
-Defined in: [src/storage.tsx:44](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L44)
+Defined in: [src/storage.tsx:140](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L140)
***
-### storage?
+### ~~storage?~~
> `optional` **storage?**: `FirebaseStorage`
-Defined in: [src/storage.tsx:42](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L42)
+Defined in: [src/storage.tsx:138](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L138)
***
-### storagePath
+### ~~storagePath~~
> **storagePath**: `string`
-Defined in: [src/storage.tsx:41](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L41)
+Defined in: [src/storage.tsx:137](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L137)
***
-### suspense?
+### ~~suspense?~~
> `optional` **suspense?**: `boolean`
-Defined in: [src/storage.tsx:43](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L43)
+Defined in: [src/storage.tsx:139](https://github.com/FirebaseExtended/reactfire/blob/main/src/storage.tsx#L139)
diff --git a/docs/reference/variables/AnalyticsProvider.md b/docs/reference/variables/AnalyticsProvider.md
index 67edf246..8ba1d924 100644
--- a/docs/reference/variables/AnalyticsProvider.md
+++ b/docs/reference/variables/AnalyticsProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / AnalyticsProvider
-# Variable: AnalyticsProvider
+# ~~Variable: AnalyticsProvider~~
> `const` **AnalyticsProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:74](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L74)
+Defined in: [src/sdk.tsx:100](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L100)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:74](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/AnalyticsSdkContext.md b/docs/reference/variables/AnalyticsSdkContext.md
index 8d51b3f9..4acdee1b 100644
--- a/docs/reference/variables/AnalyticsSdkContext.md
+++ b/docs/reference/variables/AnalyticsSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / AnalyticsSdkContext
-# Variable: AnalyticsSdkContext
+# ~~Variable: AnalyticsSdkContext~~
> `const` **AnalyticsSdkContext**: `Context`\<`Analytics` \| `undefined`\>
-Defined in: [src/sdk.tsx:20](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L20)
+Defined in: [src/sdk.tsx:21](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L21)
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/AppCheckProvider.md b/docs/reference/variables/AppCheckProvider.md
index ff42596a..90a39e18 100644
--- a/docs/reference/variables/AppCheckProvider.md
+++ b/docs/reference/variables/AppCheckProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / AppCheckProvider
-# Variable: AppCheckProvider
+# ~~Variable: AppCheckProvider~~
> `const` **AppCheckProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:72](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L72)
+Defined in: [src/sdk.tsx:96](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L96)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:72](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/AppCheckSdkContext.md b/docs/reference/variables/AppCheckSdkContext.md
index 311519af..cdf759ef 100644
--- a/docs/reference/variables/AppCheckSdkContext.md
+++ b/docs/reference/variables/AppCheckSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / AppCheckSdkContext
-# Variable: AppCheckSdkContext
+# ~~Variable: AppCheckSdkContext~~
> `const` **AppCheckSdkContext**: `Context`\<`AppCheck` \| `undefined`\>
-Defined in: [src/sdk.tsx:18](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L18)
+Defined in: [src/sdk.tsx:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L17)
+
+## Deprecated
+
+Pass Firebase SDK instances or references directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/AuthProvider.md b/docs/reference/variables/AuthProvider.md
index 11ea5392..86bf6ef8 100644
--- a/docs/reference/variables/AuthProvider.md
+++ b/docs/reference/variables/AuthProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / AuthProvider
-# Variable: AuthProvider
+# ~~Variable: AuthProvider~~
> `const` **AuthProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:73](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L73)
+Defined in: [src/sdk.tsx:98](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L98)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:73](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass `auth` directly to `useUser(auth)`, `useIdTokenResult(auth)`, or ``. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/AuthSdkContext.md b/docs/reference/variables/AuthSdkContext.md
index 22b522cb..f4c5f5ad 100644
--- a/docs/reference/variables/AuthSdkContext.md
+++ b/docs/reference/variables/AuthSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / AuthSdkContext
-# Variable: AuthSdkContext
+# ~~Variable: AuthSdkContext~~
> `const` **AuthSdkContext**: `Context`\<`Auth` \| `undefined`\>
Defined in: [src/sdk.tsx:19](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L19)
+
+## Deprecated
+
+Pass `auth` directly to `useUser(auth)`, `useIdTokenResult(auth)`, or ``. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/DatabaseProvider.md b/docs/reference/variables/DatabaseProvider.md
index e8069948..3aadaed2 100644
--- a/docs/reference/variables/DatabaseProvider.md
+++ b/docs/reference/variables/DatabaseProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / DatabaseProvider
-# Variable: DatabaseProvider
+# ~~Variable: DatabaseProvider~~
> `const` **DatabaseProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:75](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L75)
+Defined in: [src/sdk.tsx:102](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L102)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:75](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Realtime Database references directly to `useDatabaseObject` / `useDatabaseList`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/DatabaseSdkContext.md b/docs/reference/variables/DatabaseSdkContext.md
index 09acae02..0e401fea 100644
--- a/docs/reference/variables/DatabaseSdkContext.md
+++ b/docs/reference/variables/DatabaseSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / DatabaseSdkContext
-# Variable: DatabaseSdkContext
+# ~~Variable: DatabaseSdkContext~~
> `const` **DatabaseSdkContext**: `Context`\<`Database` \| `undefined`\>
-Defined in: [src/sdk.tsx:21](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L21)
+Defined in: [src/sdk.tsx:23](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L23)
+
+## Deprecated
+
+Pass Realtime Database references directly to `useDatabaseObject` / `useDatabaseList`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/FirestoreProvider.md b/docs/reference/variables/FirestoreProvider.md
index d689f31f..26b21a89 100644
--- a/docs/reference/variables/FirestoreProvider.md
+++ b/docs/reference/variables/FirestoreProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / FirestoreProvider
-# Variable: FirestoreProvider
+# ~~Variable: FirestoreProvider~~
> `const` **FirestoreProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:76](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L76)
+Defined in: [src/sdk.tsx:104](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L104)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:76](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Firestore references directly to `useFirestoreDoc` / `useFirestoreCollection`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/FirestoreSdkContext.md b/docs/reference/variables/FirestoreSdkContext.md
index 0fcb9ea2..84247c92 100644
--- a/docs/reference/variables/FirestoreSdkContext.md
+++ b/docs/reference/variables/FirestoreSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / FirestoreSdkContext
-# Variable: FirestoreSdkContext
+# ~~Variable: FirestoreSdkContext~~
> `const` **FirestoreSdkContext**: `Context`\<`Firestore` \| `undefined`\>
-Defined in: [src/sdk.tsx:22](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L22)
+Defined in: [src/sdk.tsx:25](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L25)
+
+## Deprecated
+
+Pass Firestore references directly to `useFirestoreDoc` / `useFirestoreCollection`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/FunctionsProvider.md b/docs/reference/variables/FunctionsProvider.md
index 918b2609..6cd4eeee 100644
--- a/docs/reference/variables/FunctionsProvider.md
+++ b/docs/reference/variables/FunctionsProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / FunctionsProvider
-# Variable: FunctionsProvider
+# ~~Variable: FunctionsProvider~~
> `const` **FunctionsProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:77](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L77)
+Defined in: [src/sdk.tsx:106](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L106)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:77](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/FunctionsSdkContext.md b/docs/reference/variables/FunctionsSdkContext.md
index fe59787f..a995bf54 100644
--- a/docs/reference/variables/FunctionsSdkContext.md
+++ b/docs/reference/variables/FunctionsSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / FunctionsSdkContext
-# Variable: FunctionsSdkContext
+# ~~Variable: FunctionsSdkContext~~
> `const` **FunctionsSdkContext**: `Context`\<`Functions` \| `undefined`\>
-Defined in: [src/sdk.tsx:23](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L23)
+Defined in: [src/sdk.tsx:27](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L27)
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/PerformanceProvider.md b/docs/reference/variables/PerformanceProvider.md
index ee2fcc28..6fbc1063 100644
--- a/docs/reference/variables/PerformanceProvider.md
+++ b/docs/reference/variables/PerformanceProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / PerformanceProvider
-# Variable: PerformanceProvider
+# ~~Variable: PerformanceProvider~~
> `const` **PerformanceProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:78](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L78)
+Defined in: [src/sdk.tsx:108](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L108)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:78](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass `perf` directly to ``. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/PerformanceSdkContext.md b/docs/reference/variables/PerformanceSdkContext.md
index cff32f29..b1d539fc 100644
--- a/docs/reference/variables/PerformanceSdkContext.md
+++ b/docs/reference/variables/PerformanceSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / PerformanceSdkContext
-# Variable: PerformanceSdkContext
+# ~~Variable: PerformanceSdkContext~~
> `const` **PerformanceSdkContext**: `Context`\<`FirebasePerformance` \| `undefined`\>
-Defined in: [src/sdk.tsx:25](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L25)
+Defined in: [src/sdk.tsx:31](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L31)
+
+## Deprecated
+
+Pass `perf` directly to ``. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/RemoteConfigProvider.md b/docs/reference/variables/RemoteConfigProvider.md
index 8d3d3625..f1462080 100644
--- a/docs/reference/variables/RemoteConfigProvider.md
+++ b/docs/reference/variables/RemoteConfigProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / RemoteConfigProvider
-# Variable: RemoteConfigProvider
+# ~~Variable: RemoteConfigProvider~~
> `const` **RemoteConfigProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:80](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L80)
+Defined in: [src/sdk.tsx:112](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L112)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:80](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/RemoteConfigSdkContext.md b/docs/reference/variables/RemoteConfigSdkContext.md
index 00fbb0f7..942bc35a 100644
--- a/docs/reference/variables/RemoteConfigSdkContext.md
+++ b/docs/reference/variables/RemoteConfigSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / RemoteConfigSdkContext
-# Variable: RemoteConfigSdkContext
+# ~~Variable: RemoteConfigSdkContext~~
> `const` **RemoteConfigSdkContext**: `Context`\<`RemoteConfig` \| `undefined`\>
-Defined in: [src/sdk.tsx:26](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L26)
+Defined in: [src/sdk.tsx:33](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L33)
+
+## Deprecated
+
+Pass Firebase SDK instances directly instead of using Context Providers. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/StorageProvider.md b/docs/reference/variables/StorageProvider.md
index dbcb81c1..01fa67c7 100644
--- a/docs/reference/variables/StorageProvider.md
+++ b/docs/reference/variables/StorageProvider.md
@@ -4,11 +4,11 @@
[ReactFire reference docs](../README.md) / StorageProvider
-# Variable: StorageProvider
+# ~~Variable: StorageProvider~~
> `const` **StorageProvider**: (`props`) => `ReactElement`
-Defined in: [src/sdk.tsx:79](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L79)
+Defined in: [src/sdk.tsx:110](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L110)
## Parameters
@@ -19,3 +19,7 @@ Defined in: [src/sdk.tsx:79](https://github.com/FirebaseExtended/reactfire/blob/
## Returns
`ReactElement`
+
+## Deprecated
+
+Pass Storage references directly to `useStorageDownloadURL`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/StorageSdkContext.md b/docs/reference/variables/StorageSdkContext.md
index e921e113..64b02e27 100644
--- a/docs/reference/variables/StorageSdkContext.md
+++ b/docs/reference/variables/StorageSdkContext.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / StorageSdkContext
-# Variable: StorageSdkContext
+# ~~Variable: StorageSdkContext~~
> `const` **StorageSdkContext**: `Context`\<`FirebaseStorage` \| `undefined`\>
-Defined in: [src/sdk.tsx:24](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L24)
+Defined in: [src/sdk.tsx:29](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L29)
+
+## Deprecated
+
+Pass Storage references directly to `useStorageDownloadURL`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitAnalytics.md b/docs/reference/variables/useInitAnalytics.md
index 80cddfb2..48b1b50f 100644
--- a/docs/reference/variables/useInitAnalytics.md
+++ b/docs/reference/variables/useInitAnalytics.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitAnalytics
-# Variable: useInitAnalytics
+# ~~Variable: useInitAnalytics~~
> `const` **useInitAnalytics**: `InitSdkHook`\<`Analytics`\>
-Defined in: [src/sdk.tsx:99](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L99)
+Defined in: [src/sdk.tsx:143](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L143)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitAppCheck.md b/docs/reference/variables/useInitAppCheck.md
index 810fc3f0..6b2b94e3 100644
--- a/docs/reference/variables/useInitAppCheck.md
+++ b/docs/reference/variables/useInitAppCheck.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitAppCheck
-# Variable: useInitAppCheck
+# ~~Variable: useInitAppCheck~~
> `const` **useInitAppCheck**: `InitSdkHook`\<`AppCheck`\>
-Defined in: [src/sdk.tsx:97](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L97)
+Defined in: [src/sdk.tsx:139](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L139)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope (`initializeFirestore`, etc.) instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitAuth.md b/docs/reference/variables/useInitAuth.md
index bd29275b..48f66013 100644
--- a/docs/reference/variables/useInitAuth.md
+++ b/docs/reference/variables/useInitAuth.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitAuth
-# Variable: useInitAuth
+# ~~Variable: useInitAuth~~
> `const` **useInitAuth**: `InitSdkHook`\<`Auth`\>
-Defined in: [src/sdk.tsx:98](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L98)
+Defined in: [src/sdk.tsx:141](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L141)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope (`initializeAuth`, etc.) instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitDatabase.md b/docs/reference/variables/useInitDatabase.md
index 4bb0de18..22b3b4cf 100644
--- a/docs/reference/variables/useInitDatabase.md
+++ b/docs/reference/variables/useInitDatabase.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitDatabase
-# Variable: useInitDatabase
+# ~~Variable: useInitDatabase~~
> `const` **useInitDatabase**: `InitSdkHook`\<`Database`\>
-Defined in: [src/sdk.tsx:100](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L100)
+Defined in: [src/sdk.tsx:145](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L145)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitFirestore.md b/docs/reference/variables/useInitFirestore.md
index 5ef24c7e..9d050bc0 100644
--- a/docs/reference/variables/useInitFirestore.md
+++ b/docs/reference/variables/useInitFirestore.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitFirestore
-# Variable: useInitFirestore
+# ~~Variable: useInitFirestore~~
> `const` **useInitFirestore**: `InitSdkHook`\<`Firestore`\>
-Defined in: [src/sdk.tsx:101](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L101)
+Defined in: [src/sdk.tsx:147](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L147)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope (`initializeFirestore`) instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitFunctions.md b/docs/reference/variables/useInitFunctions.md
index 63c7eed4..83113059 100644
--- a/docs/reference/variables/useInitFunctions.md
+++ b/docs/reference/variables/useInitFunctions.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitFunctions
-# Variable: useInitFunctions
+# ~~Variable: useInitFunctions~~
> `const` **useInitFunctions**: `InitSdkHook`\<`Functions`\>
-Defined in: [src/sdk.tsx:102](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L102)
+Defined in: [src/sdk.tsx:149](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L149)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitPerformance.md b/docs/reference/variables/useInitPerformance.md
index 150cdfdd..6c1f0833 100644
--- a/docs/reference/variables/useInitPerformance.md
+++ b/docs/reference/variables/useInitPerformance.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitPerformance
-# Variable: useInitPerformance
+# ~~Variable: useInitPerformance~~
> `const` **useInitPerformance**: `InitSdkHook`\<`FirebasePerformance`\>
-Defined in: [src/sdk.tsx:103](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L103)
+Defined in: [src/sdk.tsx:151](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L151)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitRemoteConfig.md b/docs/reference/variables/useInitRemoteConfig.md
index f9871886..867a4bf7 100644
--- a/docs/reference/variables/useInitRemoteConfig.md
+++ b/docs/reference/variables/useInitRemoteConfig.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitRemoteConfig
-# Variable: useInitRemoteConfig
+# ~~Variable: useInitRemoteConfig~~
> `const` **useInitRemoteConfig**: `InitSdkHook`\<`RemoteConfig`\>
-Defined in: [src/sdk.tsx:105](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L105)
+Defined in: [src/sdk.tsx:154](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L154)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/useInitStorage.md b/docs/reference/variables/useInitStorage.md
index a38823da..d5dfbd84 100644
--- a/docs/reference/variables/useInitStorage.md
+++ b/docs/reference/variables/useInitStorage.md
@@ -4,8 +4,12 @@
[ReactFire reference docs](../README.md) / useInitStorage
-# Variable: useInitStorage
+# ~~Variable: useInitStorage~~
> `const` **useInitStorage**: `InitSdkHook`\<`FirebaseStorage`\>
-Defined in: [src/sdk.tsx:107](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L107)
+Defined in: [src/sdk.tsx:157](https://github.com/FirebaseExtended/reactfire/blob/main/src/sdk.tsx#L157)
+
+## Deprecated
+
+Initialize Firebase SDKs at module scope instead of `useInit*`. Will be removed in v5.0.0.
diff --git a/docs/reference/variables/version.md b/docs/reference/variables/version.md
index 35c34d90..23265881 100644
--- a/docs/reference/variables/version.md
+++ b/docs/reference/variables/version.md
@@ -8,4 +8,4 @@
> `const` **version**: `string`
-Defined in: [src/firebaseApp.tsx:22](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L22)
+Defined in: [src/firebaseApp.tsx:28](https://github.com/FirebaseExtended/reactfire/blob/main/src/firebaseApp.tsx#L28)
diff --git a/package-lock.json b/package-lock.json
index 1e974b3b..7f078203 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,6 @@
"version": "4.2.6",
"license": "MIT",
"dependencies": {
- "rxfire": "^6.1.0",
"rxjs": "^6.6.3 || ^7.0.1",
"use-sync-external-store": "^1.2.0"
},
@@ -53,7 +52,7 @@
"node": ">=14"
},
"peerDependencies": {
- "firebase": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || next",
+ "firebase": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || next",
"react": ">=16 || experimental"
}
},
@@ -313,6 +312,7 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-1.4.1.tgz",
"integrity": "sha512-bcusQfA/tHjUjBTnMx6jdoPMpDl3r8K15Z+snHz9wq0Foox0F/V+kNLXucEOHoTL2hTc9l+onZCyBJs2QoIC3g==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.3",
@@ -333,6 +333,7 @@
"version": "0.10.17",
"resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.17.tgz",
"integrity": "sha512-n5vfBbvzduMou/2cqsnKrIes4auaBjdhg8QNA2ZQZ59QgtO2QiwBaXQZQE4O4sgB0Ds1tvLgUUkY+pwzu6/xEg==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -349,6 +350,7 @@
"version": "0.2.23",
"resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.23.tgz",
"integrity": "sha512-3AdO10RN18G5AzREPoFgYhW6vWXr3u+OYQv6pl3CX6Fky8QRk0AHurZlY3Q1xkXO0TDxIsdhO3y65HF7PBOJDw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/analytics": "0.10.17",
@@ -365,12 +367,14 @@
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz",
"integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/app": {
"version": "0.13.2",
"resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.2.tgz",
"integrity": "sha512-jwtMmJa1BXXDCiDx1vC6SFN/+HfYG53UkfJa6qeN5ogvOunzbFDO3wISZy5n9xgYFUrEP6M7e8EG++riHNTv9w==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -387,6 +391,7 @@
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.10.1.tgz",
"integrity": "sha512-MgNdlms9Qb0oSny87pwpjKush9qUwCJhfmTJHDfrcKo4neLGiSeVE4qJkzP7EQTIUFKp84pbTxobSAXkiuQVYQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -405,6 +410,7 @@
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.26.tgz",
"integrity": "sha512-PkX+XJMLDea6nmnopzFKlr+s2LMQGqdyT2DHdbx1v1dPSqOol2YzgpgymmhC67vitXVpNvS3m/AiWQWWhhRRPQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/app-check": "0.10.1",
@@ -425,18 +431,21 @@
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz",
"integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/app-check-types": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz",
"integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/app-compat": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.2.tgz",
"integrity": "sha512-LssbyKHlwLeiV8GBATyOyjmHcMpX/tFjzRUCS1jnwGAew1VsBB4fJowyS5Ud5LdFbYpJeS+IQoC+RQxpK7eH3Q==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/app": "0.13.2",
@@ -453,12 +462,14 @@
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz",
"integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/auth-compat": {
"version": "0.5.28",
"resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.28.tgz",
"integrity": "sha512-HpMSo/cc6Y8IX7bkRIaPPqT//Jt83iWy5rmDWeThXQCAImstkdNo3giFLORJwrZw2ptiGkOij64EH1ztNJzc7Q==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/auth": "1.10.8",
@@ -478,6 +489,7 @@
"version": "1.10.8",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.8.tgz",
"integrity": "sha512-GpuTz5ap8zumr/ocnPY57ZanX02COsXloY6Y/2LYPAuXYiaJRf6BAGDEdRq1BMjP93kqQnKNuKZUTMZbQ8MNYA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -502,12 +514,14 @@
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz",
"integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/auth-types": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz",
"integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"@firebase/app-types": "0.x",
@@ -518,6 +532,7 @@
"version": "0.6.18",
"resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.18.tgz",
"integrity": "sha512-n28kPCkE2dL2U28fSxZJjzPPVpKsQminJ6NrzcKXAI0E/lYC8YhfwpyllScqVEvAI3J2QgJZWYgrX+1qGI+SQQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/util": "1.12.1",
@@ -531,6 +546,7 @@
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.10.tgz",
"integrity": "sha512-VMVk7zxIkgwlVQIWHOKFahmleIjiVFwFOjmakXPd/LDgaB/5vzwsB5DWIYo+3KhGxWpidQlR8geCIn39YflJIQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/auth-interop-types": "0.2.4",
@@ -547,6 +563,7 @@
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.20.tgz",
"integrity": "sha512-H9Rpj1pQ1yc9+4HQOotFGLxqAXwOzCHsRSRjcQFNOr8lhUt6LeYjf0NSRL04sc4X0dWe8DsCvYKxMYvFG/iOJw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.3",
@@ -565,6 +582,7 @@
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.11.tgz",
"integrity": "sha512-itEsHARSsYS95+udF/TtIzNeQ0Uhx4uIna0sk4E0wQJBUnLc/G1X6D7oRljoOuwwCezRLGvWBRyNrugv/esOEw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -582,6 +600,7 @@
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.15.tgz",
"integrity": "sha512-XWHJ0VUJ0k2E9HDMlKxlgy/ZuTa9EvHCGLjaKSUvrQnwhgZuRU5N3yX6SZ+ftf2hTzZmfRkv+b3QRvGg40bKNw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/app-types": "0.9.3",
@@ -592,6 +611,7 @@
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.8.0.tgz",
"integrity": "sha512-QSRk+Q1/CaabKyqn3C32KSFiOdZpSqI9rpLK5BHPcooElumOBooPFa6YkDdiT+/KhJtel36LdAacha9BptMj2A==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -613,6 +633,7 @@
"version": "0.3.53",
"resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.53.tgz",
"integrity": "sha512-qI3yZL8ljwAYWrTousWYbemay2YZa+udLWugjdjju2KODWtLG94DfO4NALJgPLv8CVGcDHNFXoyQexdRA0Cz8Q==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -632,6 +653,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz",
"integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"@firebase/app-types": "0.x",
@@ -642,6 +664,7 @@
"version": "0.12.9",
"resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.9.tgz",
"integrity": "sha512-FG95w6vjbUXN84Ehezc2SDjGmGq225UYbHrb/ptkRT7OTuCiQRErOQuyt1jI1tvcDekdNog+anIObihNFz79Lg==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.3",
@@ -662,6 +685,7 @@
"version": "0.3.26",
"resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.26.tgz",
"integrity": "sha512-A798/6ff5LcG2LTWqaGazbFYnjBW8zc65YfID/en83ALmkhu2b0G8ykvQnLtakbV9ajrMYPn7Yc/XcYsZIUsjA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -681,12 +705,14 @@
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz",
"integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/installations": {
"version": "0.6.18",
"resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.18.tgz",
"integrity": "sha512-NQ86uGAcvO8nBRwVltRL9QQ4Reidc/3whdAasgeWCPIcrhOKDuNpAALa6eCVryLnK14ua2DqekCOX5uC9XbU/A==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -702,6 +728,7 @@
"version": "0.2.18",
"resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.18.tgz",
"integrity": "sha512-aLFohRpJO5kKBL/XYL4tN+GdwEB/Q6Vo9eZOM/6Kic7asSUgmSfGPpGUZO1OAaSRGwF4Lqnvi1f/f9VZnKzChw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -718,6 +745,7 @@
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz",
"integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"@firebase/app-types": "0.x"
@@ -727,6 +755,7 @@
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz",
"integrity": "sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
@@ -739,6 +768,7 @@
"version": "0.12.22",
"resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.22.tgz",
"integrity": "sha512-GJcrPLc+Hu7nk+XQ70Okt3M1u1eRr2ZvpMbzbc54oTPJZySHcX9ccZGVFcsZbSZ6o1uqumm8Oc7OFkD3Rn1/og==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -756,6 +786,7 @@
"version": "0.2.22",
"resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.22.tgz",
"integrity": "sha512-5ZHtRnj6YO6f/QPa/KU6gryjmX4Kg33Kn4gRpNU6M1K47Gm8kcQwPkX7erRUYEH1mIWptfvjvXMHWoZaWjkU7A==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -771,12 +802,14 @@
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz",
"integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/performance": {
"version": "0.7.7",
"resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.7.tgz",
"integrity": "sha512-JTlTQNZKAd4+Q5sodpw6CN+6NmwbY72av3Lb6wUKTsL7rb3cuBIhQSrslWbVz0SwK3x0ZNcqX24qtRbwKiv+6w==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -794,6 +827,7 @@
"version": "0.2.20",
"resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.20.tgz",
"integrity": "sha512-XkFK5NmOKCBuqOKWeRgBUFZZGz9SzdTZp4OqeUg+5nyjapTiZ4XoiiUL8z7mB2q+63rPmBl7msv682J3rcDXIQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -811,12 +845,14 @@
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz",
"integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/remote-config": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.6.5.tgz",
"integrity": "sha512-fU0c8HY0vrVHwC+zQ/fpXSqHyDMuuuglV94VF6Yonhz8Fg2J+KOowPGANM0SZkLvVOYpTeWp3ZmM+F6NjwWLnw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -833,6 +869,7 @@
"version": "0.2.18",
"resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.18.tgz",
"integrity": "sha512-YiETpldhDy7zUrnS8e+3l7cNs0sL7+tVAxvVYU0lu7O+qLHbmdtAxmgY+wJqWdW2c9nDvBFec7QiF58pEUu0qQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -850,12 +887,14 @@
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.4.0.tgz",
"integrity": "sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@firebase/storage": {
"version": "0.13.14",
"resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.14.tgz",
"integrity": "sha512-xTq5ixxORzx+bfqCpsh+o3fxOsGoDjC1nO0Mq2+KsOcny3l7beyBhP/y1u5T6mgsFQwI1j6oAkbT5cWdDBx87g==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -873,6 +912,7 @@
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.24.tgz",
"integrity": "sha512-XHn2tLniiP7BFKJaPZ0P8YQXKiVJX+bMyE2j2YWjYfaddqiJnROJYqSomwW6L3Y+gZAga35ONXUJQju6MB6SOQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -892,6 +932,7 @@
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz",
"integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"@firebase/app-types": "0.x",
@@ -902,6 +943,7 @@
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.1.tgz",
"integrity": "sha512-zGlBn/9Dnya5ta9bX/fgEoNC3Cp8s6h+uYPYaDieZsFOAdHP/ExzQ/eaDgxD3GOROdPkLKpvKY0iIzr9adle0w==",
+ "dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
@@ -915,6 +957,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz",
"integrity": "sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@gerrit0/mini-shiki": {
@@ -1258,6 +1301,7 @@
"version": "1.9.16",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.16.tgz",
"integrity": "sha512-wE4Ut/olIzfKqp631XrG+wbF0v1vWFN4YL9FyXC2LJiG33DsV7PLzURjrCvY/6je2ntdRkeLpPDluzSRGaVltQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@grpc/proto-loader": "^0.7.8",
@@ -1271,6 +1315,7 @@
"version": "0.7.15",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
"integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"lodash.camelcase": "^4.3.0",
@@ -1289,6 +1334,7 @@
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
@@ -1303,6 +1349,7 @@
"version": "17.7.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
"integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
@@ -1321,6 +1368,7 @@
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
@@ -2566,29 +2614,34 @@
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "dev": true
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "dev": true
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
"integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
+ "dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
"integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
+ "dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
"integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.1"
@@ -2597,22 +2650,26 @@
"node_modules/@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "dev": true
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "dev": true
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "dev": true
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
"integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
+ "dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@rolldown/binding-android-arm-eabi": {
@@ -3736,6 +3793,7 @@
"version": "25.9.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz",
"integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"undici-types": ">=7.24.0 <7.24.7"
@@ -4385,6 +4443,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -4393,6 +4452,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -5502,6 +5562,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -5512,7 +5573,8 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"node_modules/color-string": {
"version": "1.9.1",
@@ -6439,7 +6501,8 @@
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
},
"node_modules/emojilib": {
"version": "2.4.0",
@@ -6663,6 +6726,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -7476,6 +7540,7 @@
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
"integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"websocket-driver": ">=0.5.1"
@@ -7612,6 +7677,7 @@
"version": "11.10.0",
"resolved": "https://registry.npmjs.org/firebase/-/firebase-11.10.0.tgz",
"integrity": "sha512-nKBXoDzF0DrXTBQJlZa+sbC5By99ysYU1D6PkMRYknm0nCW7rJly47q492Ht7Ndz5MeYSBuboKuhS1e6mFC03w==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/ai": "1.4.1",
@@ -7843,6 +7909,7 @@
"version": "1.10.8",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.8.tgz",
"integrity": "sha512-GpuTz5ap8zumr/ocnPY57ZanX02COsXloY6Y/2LYPAuXYiaJRf6BAGDEdRq1BMjP93kqQnKNuKZUTMZbQ8MNYA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@firebase/component": "0.6.18",
@@ -8139,6 +8206,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
@@ -9117,6 +9185,7 @@
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
"integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/http-proxy-agent": {
@@ -9177,6 +9246,7 @@
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
"integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/ieee754": {
@@ -9519,6 +9589,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"engines": {
"node": ">=8"
}
@@ -10990,7 +11061,8 @@
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true
},
"node_modules/lodash.includes": {
"version": "4.3.0",
@@ -11135,6 +11207,7 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/loose-envify": {
@@ -12832,6 +12905,7 @@
"version": "7.6.6",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.6.tgz",
"integrity": "sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==",
+ "dev": true,
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -13368,6 +13442,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -13688,16 +13763,6 @@
"queue-microtask": "^1.2.2"
}
},
- "node_modules/rxfire": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/rxfire/-/rxfire-6.1.0.tgz",
- "integrity": "sha512-NezdjeY32VZcCuGO0bbb8H8seBsJSCaWdUwGsHNzUcAOHR0VGpzgPtzjuuLXr8R/iemkqSzbx/ioS7VwV43ynA==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "firebase": "^9.0.0 || ^10.0.0 || ^11.0.0",
- "rxjs": "^6.0.0 || ^7.0.0"
- }
- },
"node_modules/rxjs": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
@@ -13710,6 +13775,7 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -14361,6 +14427,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -14454,6 +14521,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -15376,6 +15444,7 @@
"version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
"integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/unicode-emoji-modifier-base": {
@@ -15796,6 +15865,7 @@
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
"integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/webidl-conversions": {
@@ -15811,6 +15881,7 @@
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz",
"integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"http-parser-js": ">=0.5.1",
@@ -15825,6 +15896,7 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=0.8.0"
@@ -16028,6 +16100,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -16145,6 +16218,7 @@
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
"engines": {
"node": ">=10"
}
diff --git a/package.json b/package.json
index 6b6b707f..ae9f8369 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,6 @@
{
"version": "4.2.6",
+ "sideEffects": false,
"license": "MIT",
"type": "module",
"main": "dist/index.umd.cjs",
@@ -36,7 +37,7 @@
"docs:fork": "typedoc --options typedoc.json --gitRemote upstream && markdown-toc -i docs/use.md"
},
"peerDependencies": {
- "firebase": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || next",
+ "firebase": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || next",
"react": ">=16 || experimental"
},
"husky": {
@@ -107,7 +108,6 @@
"vitest": "^4.1.9"
},
"dependencies": {
- "rxfire": "^6.1.0",
"rxjs": "^6.6.3 || ^7.0.1",
"use-sync-external-store": "^1.2.0"
},
diff --git a/src/SuspenseSubject.ts b/src/SuspenseSubject.ts
index 5b7ef884..73b3b444 100644
--- a/src/SuspenseSubject.ts
+++ b/src/SuspenseSubject.ts
@@ -1,12 +1,16 @@
import { empty, Observable, Subject, Subscriber, Subscription } from 'rxjs';
import { catchError, shareReplay, tap } from 'rxjs/operators';
-import { ObservableStatus } from './useObservable.js';
+import { attachUsable, createFulfilledUsable, instrumentPromise } from './useFirebaseStream.js';
+import type { ObservableStatus } from './useFirebaseStream.js';
+/**
+ * @deprecated RxJS integration (`SuspenseSubject`, `useObservable`, `preloadObservable`) is deprecated and will be removed in v5.0.0.
+ */
export class SuspenseSubject extends Subject {
private _value: T | undefined;
private _hasValue = false;
private _timeoutHandler: ReturnType;
- private _firstEmission: Promise;
+ private _firstEmission: Promise & { status?: 'pending' | 'fulfilled' | 'rejected'; value?: void; reason?: any };
private _error: any = undefined;
private _innerObservable: Observable;
private _warmupSubscription: Subscription;
@@ -21,15 +25,19 @@ export class SuspenseSubject extends Subject {
constructor(innerObservable: Observable, private _timeoutWindow: number, private _suspenseEnabled: boolean) {
super();
this._firstEmission = new Promise((resolve) => (this._resolveFirstEmission = resolve));
+ this._firstEmission.status = 'pending';
- this._immutableStatus = {
- status: 'loading',
- hasEmitted: false,
- isComplete: false,
- data: undefined,
- error: undefined,
- firstValuePromise: this._firstEmission
- } as ObservableStatus;
+ this._immutableStatus = attachUsable(
+ {
+ status: 'loading',
+ hasEmitted: false,
+ isComplete: false,
+ data: undefined as unknown as T,
+ error: undefined,
+ firstValuePromise: this._firstEmission,
+ },
+ () => instrumentPromise(this._firstEmission.then(() => this.value))
+ );
this._innerObservable = innerObservable.pipe(
tap({
@@ -40,16 +48,19 @@ export class SuspenseSubject extends Subject {
// save the error, so that we can raise on subscription or .value
// resolve the promise, so suspense tries again
this._error = e;
+ this._firstEmission.status = 'fulfilled';
+ this._firstEmission.value = undefined;
this._resolveFirstEmission();
this._updateImmutableStatus();
},
complete: () => {
this._isComplete = true;
this._updateImmutableStatus();
- }
+ },
}),
catchError(() => empty()),
- shareReplay(1)
+ // `refCount: true` detaches the source (the Firestore/RTDB listener) when the last subscriber leaves.
+ shareReplay({ bufferSize: 1, refCount: true })
);
// warm up the observable
this._warmupSubscription = this._innerObservable.subscribe();
@@ -91,19 +102,27 @@ export class SuspenseSubject extends Subject {
// Cast required because `data` is internally `T | undefined` while a value is
// still in flight, whereas ObservableStatus exposes `data: T` to consumers.
// The relationships between the status fields are verified in tests instead.
- this._immutableStatus = {
- status: this._error ? 'error' : (this._hasValue ? 'success' : 'loading'),
- hasEmitted: this._hasValue,
- isComplete: this._isComplete,
- data: this._value,
- error: this._error,
- firstValuePromise: this._firstEmission
- } as ObservableStatus;
+ this._immutableStatus = attachUsable(
+ {
+ status: this._error ? 'error' : this._hasValue ? 'success' : 'loading',
+ hasEmitted: this._hasValue,
+ isComplete: this._isComplete,
+ data: this._value as T,
+ error: this._error,
+ firstValuePromise: this._firstEmission,
+ },
+ () =>
+ this._hasValue
+ ? createFulfilledUsable(this._value as T)
+ : instrumentPromise(this._firstEmission.then(() => this.value))
+ );
}
private _next(value: T) {
this._hasValue = true;
this._value = value;
+ this._firstEmission.status = 'fulfilled';
+ this._firstEmission.value = undefined;
this._resolveFirstEmission();
this._updateImmutableStatus();
}
@@ -117,6 +136,7 @@ export class SuspenseSubject extends Subject {
this._value = undefined;
this._error = undefined;
this._firstEmission = new Promise((resolve) => (this._resolveFirstEmission = resolve));
+ this._firstEmission.status = 'pending';
this._updateImmutableStatus();
}
@@ -125,6 +145,10 @@ export class SuspenseSubject extends Subject {
clearTimeout(this._timeoutHandler);
}
this._innerSubscriber = this._innerObservable.subscribe(subscriber);
+ // A real subscriber now keeps the source alive; drop the warm-up subscription so unmounting releases it.
+ if (this._warmupSubscription) {
+ this._warmupSubscription.unsubscribe();
+ }
return this._innerSubscriber;
}
diff --git a/src/auth.tsx b/src/auth.tsx
index 6e74d6c5..9d313054 100644
--- a/src/auth.tsx
+++ b/src/auth.tsx
@@ -1,62 +1,267 @@
import * as React from 'react';
-import { user } from 'rxfire/auth';
-import { preloadObservable, ReactFireOptions, useAuth, useObservable, ObservableStatus, ReactFireError } from './index.js';
-import { from, of, defer } from 'rxjs';
-import { map, switchMap } from 'rxjs/operators';
+import { onIdTokenChanged } from 'firebase/auth';
+import { AuthSdkContext } from './sdk.js';
import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp.js';
+import {
+ InstrumentedPromise,
+ ObservableStatus,
+ ReactFireError,
+ ReactFireOptions,
+ ReactFireUsable,
+ attachUsable,
+ clearAllInFlight,
+ createFulfilledUsable,
+ createInFlightCache,
+ getInitialDataOption,
+ hasInitialDataOption,
+ instrumentPromise,
+ unwrapOrSuspend,
+ useFirebaseStream,
+} from './useFirebaseStream.js';
import type { Auth, User, IdTokenResult } from 'firebase/auth';
type Claims = IdTokenResult['claims'];
+const authReadyWeakMap = new WeakMap>();
+const lastUidByAuth = new WeakMap();
+
+function noteUserForAuth(auth: Auth, user: User | null): void {
+ const nextUid = user?.uid ?? null;
+ const prevUid = lastUidByAuth.get(auth);
+ if (prevUid !== undefined && prevUid !== nextUid) {
+ clearAllInFlight();
+ }
+ lastUidByAuth.set(auth, nextUid);
+}
+
+function getAuthReady(auth: Auth): InstrumentedPromise {
+ let promise = authReadyWeakMap.get(auth);
+ if (!promise) {
+ if ((auth as { _isInitialized?: boolean })._isInitialized || auth.currentUser) {
+ noteUserForAuth(auth, auth.currentUser);
+ promise = createFulfilledUsable(auth.currentUser);
+ } else {
+ promise = instrumentPromise(
+ auth.authStateReady().then(() => {
+ noteUserForAuth(auth, auth.currentUser);
+ return auth.currentUser;
+ })
+ );
+ }
+ authReadyWeakMap.set(auth, promise);
+ } else if (promise.status === 'fulfilled' && promise.value !== auth.currentUser) {
+ noteUserForAuth(auth, auth.currentUser);
+ promise = createFulfilledUsable(auth.currentUser);
+ authReadyWeakMap.set(auth, promise);
+ }
+ return promise;
+}
+
+interface UserTokenKey {
+ user: User;
+ forceRefresh: boolean;
+}
+
+interface AuthTokenKey {
+ auth: Auth;
+ uid: string | null;
+ forceRefresh: boolean;
+}
+
+const userTokenCache = createInFlightCache(
+ (a, b) => a.user === b.user && a.forceRefresh === b.forceRefresh
+);
+
+const authTokenCache = createInFlightCache(
+ (a, b) => a.auth === b.auth && a.uid === b.uid && a.forceRefresh === b.forceRefresh
+);
+
+function getOrStartTokenPromise(user: User, forceRefresh: boolean): InstrumentedPromise {
+ return userTokenCache.handle({ user, forceRefresh }, () => user.getIdTokenResult(forceRefresh)).getOrStart();
+}
+
+function isAuthInstance(val: unknown): val is Auth {
+ return Boolean(val && typeof val === 'object' && typeof (val as Auth).authStateReady === 'function');
+}
+
+/**
+ * @deprecated Unwrap `useUser(auth).experimental_usable` with `React.use()` instead. Will be removed in v5.0.0.
+ */
export async function preloadUser(authResolver: () => Promise) {
const auth = await authResolver();
- const user$ = preloadObservable(user(auth), `auth:user:${auth.name}`);
- return user$.toPromise();
+ await getAuthReady(auth);
+ return auth.currentUser;
}
/**
* Subscribe to Firebase auth state changes, including token refresh
*
- * @param options
+ * @param authOrOptions - Optional `Auth` instance (recommended for v5 compatibility) or `ReactFireOptions`
+ * @param maybeOptions - `ReactFireOptions` when `auth` is provided as the first argument
*/
-export function useUser(options?: ReactFireOptions): ObservableStatus {
- const auth = useAuth();
-
- const observableId = `auth:user:${auth.name}`;
- const observable$ = user(auth);
-
- const _options: ReactFireOptions = { ...options };
-
- // If a user is already signed in, seed initialData so consumers see the user
- // synchronously on the first render without waiting for the async observable.
- // We only do this when currentUser is truthy to avoid masking the uninitialized
- // (null before auth has loaded from storage) case as "signed out".
- if (auth.currentUser && !('initialData' in _options) && !('startWithValue' in _options)) {
- _options.initialData = auth.currentUser as unknown as T;
+export function useUser(options?: ReactFireOptions): ObservableStatus;
+export function useUser(auth: Auth, options?: ReactFireOptions): ObservableStatus;
+export function useUser(
+ authOrOptions?: Auth | ReactFireOptions,
+ maybeOptions?: ReactFireOptions
+): ObservableStatus {
+ const contextAuth = React.useContext(AuthSdkContext);
+ const hasExplicitAuth = isAuthInstance(authOrOptions);
+ const auth = hasExplicitAuth ? authOrOptions : contextAuth;
+ if (!auth) {
+ throw new Error('SDK not found. useSdk must be called from within a provider');
}
+ const options = hasExplicitAuth ? maybeOptions : (authOrOptions as ReactFireOptions | undefined);
+ const authReady = getAuthReady(auth);
+
+ return useFirebaseStream({
+ ref: auth,
+ inFlight: {
+ peek: () => authReadyWeakMap.get(auth),
+ getOrStart: () => getAuthReady(auth),
+ clear: () => {},
+ },
+ getSyncInitialValue: () => {
+ const isReady = Boolean(auth.currentUser) || authReady.status === 'fulfilled';
+ return isReady
+ ? { hasValue: true, value: auth.currentUser, isComplete: false }
+ : { hasValue: false, value: null };
+ },
+ subscribe: (onNext, onError) => {
+ let active = true;
+ const readyPromise = getAuthReady(auth);
+ if (auth.currentUser || readyPromise.status === 'fulfilled') {
+ onNext(auth.currentUser, false);
+ } else {
+ readyPromise.then(
+ () => {
+ if (active) {
+ onNext(auth.currentUser, false);
+ }
+ },
+ () => {}
+ );
+ }
- return useObservable(observableId, observable$, _options);
+ const unsubscribe = onIdTokenChanged(
+ auth,
+ (nextUser) => {
+ noteUserForAuth(auth, nextUser);
+ if (active) {
+ onNext(nextUser, false);
+ }
+ },
+ (err) => {
+ if (active) {
+ onError(err);
+ }
+ }
+ );
+
+ return () => {
+ active = false;
+ unsubscribe();
+ };
+ },
+ options,
+ });
}
-export function useIdTokenResult(user: User, forceRefresh = false, options?: ReactFireOptions): ObservableStatus {
- if (!user) {
+export function useIdTokenResult(
+ user: User,
+ forceRefresh?: boolean,
+ options?: ReactFireOptions
+): ObservableStatus;
+export function useIdTokenResult(
+ auth: Auth,
+ forceRefresh?: boolean,
+ options?: ReactFireOptions
+): ObservableStatus;
+export function useIdTokenResult(
+ userOrAuth: User | Auth,
+ forceRefresh = false,
+ options?: ReactFireOptions
+): ObservableStatus {
+ if (!userOrAuth) {
throw new Error('you must provide a user');
}
- const observableId = `auth:idTokenResult:${user.uid}:forceRefresh=${forceRefresh}`;
- // Wrap in `defer` so the token fetch runs lazily on subscription rather than
- // eagerly on every render.
- const observable$ = defer(() => from(user.getIdTokenResult(forceRefresh)));
+ const isAuth = isAuthInstance(userOrAuth);
+ const uid = isAuth ? (userOrAuth.currentUser?.uid ?? null) : userOrAuth.uid;
+
+ return useFirebaseStream<{ target: User | Auth; uid: string | null; forceRefresh: boolean }, any>({
+ ref: { target: userOrAuth, uid, forceRefresh },
+ isEqual: (a, b) => a.target === b.target && a.uid === b.uid && a.forceRefresh === b.forceRefresh,
+ inFlight: isAuth
+ ? authTokenCache.handle({ auth: userOrAuth, uid, forceRefresh }, () =>
+ getAuthReady(userOrAuth).then((user) => (user ? user.getIdTokenResult(forceRefresh) : null))
+ )
+ : userTokenCache.handle({ user: userOrAuth, forceRefresh }, () => userOrAuth.getIdTokenResult(forceRefresh)),
+ subscribe: (onNext, onError, inFlightPromise) => {
+ if (isAuth) {
+ let active = true;
+ let lastUser: User | null = null;
+ let seq = 0;
+ const unsubscribe = onIdTokenChanged(
+ userOrAuth,
+ (nextUser) => {
+ noteUserForAuth(userOrAuth, nextUser);
+ const currentSeq = ++seq;
+ if (!active) return;
+ if (!nextUser) {
+ lastUser = null;
+ onNext(null, false);
+ return;
+ }
+ const isNewUser = nextUser !== lastUser;
+ lastUser = nextUser;
+ const tokenPromise =
+ currentSeq === 1 && inFlightPromise && nextUser.uid === uid
+ ? (inFlightPromise as Promise)
+ : nextUser.getIdTokenResult(isNewUser && forceRefresh);
+ tokenPromise.then(
+ (res) => {
+ if (active && currentSeq === seq) onNext(res, false);
+ },
+ (err) => {
+ if (active && currentSeq === seq) onError(err);
+ }
+ );
+ },
+ (err) => {
+ if (active) onError(err);
+ }
+ );
+ return () => {
+ active = false;
+ unsubscribe();
+ };
+ }
- return useObservable(observableId, observable$, options);
+ const tokenPromise =
+ (inFlightPromise as InstrumentedPromise | undefined) ??
+ getOrStartTokenPromise(userOrAuth, forceRefresh);
+ tokenPromise.then(
+ (result) => onNext(result, true),
+ (error: Error) => onError(error)
+ );
+ return () => {};
+ },
+ options,
+ defaultIsComplete: !isAuth,
+ });
}
export interface AuthCheckProps {
+ auth?: Auth;
fallback: React.ReactNode;
children: React.ReactNode;
requiredClaims?: Object;
}
+/**
+ * @deprecated Use `` or `useIdTokenResult(auth)` instead. Will be removed in v5.0.0.
+ */
export interface ClaimsCheckProps {
user: User;
fallback: React.ReactNode;
@@ -64,10 +269,16 @@ export interface ClaimsCheckProps {
requiredClaims: { [key: string]: any };
}
+/**
+ * @deprecated Will be removed in v5.0.0 along with `useSigninCheck`.
+ */
export interface ClaimCheckErrors {
[key: string]: any[];
}
+/**
+ * @deprecated Will be removed in v5.0.0 along with `useSigninCheck`.
+ */
export type SigninCheckResult =
| {
signedIn: false;
@@ -82,14 +293,23 @@ export type SigninCheckResult =
user: User;
};
+/**
+ * @deprecated Will be removed in v5.0.0 along with `useSigninCheck`.
+ */
export interface SignInCheckOptionsBasic extends ReactFireOptions {
forceRefresh?: boolean;
}
+/**
+ * @deprecated Will be removed in v5.0.0 along with `useSigninCheck`.
+ */
export interface SignInCheckOptionsClaimsObject extends SignInCheckOptionsBasic {
requiredClaims: Claims;
}
+/**
+ * @deprecated Will be removed in v5.0.0 along with `useSigninCheck`.
+ */
export interface ClaimsValidator {
(claims: Claims): {
hasRequiredClaims: boolean;
@@ -97,95 +317,251 @@ export interface ClaimsValidator {
};
}
+/**
+ * @deprecated Will be removed in v5.0.0 along with `useSigninCheck`.
+ */
export interface SignInCheckOptionsClaimsValidator extends SignInCheckOptionsBasic {
validateCustomClaims: ClaimsValidator;
}
+const signinCheckUsableCache = new WeakMap