diff --git a/docs/reference/README.md b/docs/reference/README.md index 52c83109..037e6551 100644 --- a/docs/reference/README.md +++ b/docs/reference/README.md @@ -10,9 +10,7 @@ ## Interfaces -- [AuthCheckProps](interfaces/AuthCheckProps.md) - [ClaimCheckErrors](interfaces/ClaimCheckErrors.md) -- [ClaimsCheckProps](interfaces/ClaimsCheckProps.md) - [ClaimsValidator](interfaces/ClaimsValidator.md) - [FirebaseAppProviderProps](interfaces/FirebaseAppProviderProps.md) - [ObservableStatus](interfaces/ObservableStatus.md) @@ -61,11 +59,9 @@ ## Functions -- [~~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) diff --git a/docs/reference/functions/AuthCheck.md b/docs/reference/functions/AuthCheck.md deleted file mode 100644 index dfb0e3ea..00000000 --- a/docs/reference/functions/AuthCheck.md +++ /dev/null @@ -1,29 +0,0 @@ -[**ReactFire reference docs**](../README.md) - -*** - -[ReactFire reference docs](../README.md) / AuthCheck - -# ~~Function: AuthCheck()~~ - -> **AuthCheck**(`__namedParameters`): `ReactElement` - -Defined in: [src/auth.tsx:259](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L259) - -## Parameters - -### \_\_namedParameters - -[`AuthCheckProps`](../interfaces/AuthCheckProps.md) - -## 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 deleted file mode 100644 index fa5ca95e..00000000 --- a/docs/reference/functions/ClaimsCheck.md +++ /dev/null @@ -1,29 +0,0 @@ -[**ReactFire reference docs**](../README.md) - -*** - -[ReactFire reference docs](../README.md) / ClaimsCheck - -# ~~Function: ClaimsCheck()~~ - -> **ClaimsCheck**(`__namedParameters`): `Element` - -Defined in: [src/auth.tsx:215](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L215) - -## Parameters - -### \_\_namedParameters - -[`ClaimsCheckProps`](../interfaces/ClaimsCheckProps.md) - -## Returns - -`Element` - -## Deprecated - -Use `useSigninCheck` instead - -Conditionally render children based on [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/preloadUser.md b/docs/reference/functions/preloadUser.md index 65e598af..b2270e2e 100644 --- a/docs/reference/functions/preloadUser.md +++ b/docs/reference/functions/preloadUser.md @@ -8,7 +8,7 @@ > **preloadUser**(`authResolver`): `Promise`\<`User` \| `null` \| `undefined`\> -Defined in: [src/auth.tsx:11](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L11) +Defined in: [src/auth.tsx:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L9) ## Parameters diff --git a/docs/reference/functions/useIdTokenResult.md b/docs/reference/functions/useIdTokenResult.md index 7293fc74..ea7dfa82 100644 --- a/docs/reference/functions/useIdTokenResult.md +++ b/docs/reference/functions/useIdTokenResult.md @@ -8,7 +8,7 @@ > **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:39](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L39) ## Parameters diff --git a/docs/reference/functions/useSigninCheck.md b/docs/reference/functions/useSigninCheck.md index 895405bc..968efaad 100644 --- a/docs/reference/functions/useSigninCheck.md +++ b/docs/reference/functions/useSigninCheck.md @@ -8,7 +8,7 @@ > **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:121](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L121) Subscribe to the signed-in status of a user. diff --git a/docs/reference/functions/useUser.md b/docs/reference/functions/useUser.md index 0f7277e6..f5d566ad 100644 --- a/docs/reference/functions/useUser.md +++ b/docs/reference/functions/useUser.md @@ -8,7 +8,7 @@ > **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:20](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L20) Subscribe to Firebase auth state changes, including token refresh diff --git a/docs/reference/interfaces/AuthCheckProps.md b/docs/reference/interfaces/AuthCheckProps.md deleted file mode 100644 index c5edcb62..00000000 --- a/docs/reference/interfaces/AuthCheckProps.md +++ /dev/null @@ -1,33 +0,0 @@ -[**ReactFire reference docs**](../README.md) - -*** - -[ReactFire reference docs](../README.md) / AuthCheckProps - -# Interface: AuthCheckProps - -Defined in: [src/auth.tsx:54](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L54) - -## Properties - -### children - -> **children**: `ReactNode` - -Defined in: [src/auth.tsx:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L56) - -*** - -### fallback - -> **fallback**: `ReactNode` - -Defined in: [src/auth.tsx:55](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L55) - -*** - -### requiredClaims? - -> `optional` **requiredClaims?**: `Object` - -Defined in: [src/auth.tsx:57](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L57) diff --git a/docs/reference/interfaces/ClaimCheckErrors.md b/docs/reference/interfaces/ClaimCheckErrors.md index ce0afa98..179a4209 100644 --- a/docs/reference/interfaces/ClaimCheckErrors.md +++ b/docs/reference/interfaces/ClaimCheckErrors.md @@ -6,7 +6,7 @@ # Interface: ClaimCheckErrors -Defined in: [src/auth.tsx:67](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L67) +Defined in: [src/auth.tsx:52](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L52) ## Indexable diff --git a/docs/reference/interfaces/ClaimsCheckProps.md b/docs/reference/interfaces/ClaimsCheckProps.md deleted file mode 100644 index 34375923..00000000 --- a/docs/reference/interfaces/ClaimsCheckProps.md +++ /dev/null @@ -1,45 +0,0 @@ -[**ReactFire reference docs**](../README.md) - -*** - -[ReactFire reference docs](../README.md) / ClaimsCheckProps - -# Interface: ClaimsCheckProps - -Defined in: [src/auth.tsx:60](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L60) - -## Properties - -### children - -> **children**: `ReactNode` - -Defined in: [src/auth.tsx:63](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L63) - -*** - -### fallback - -> **fallback**: `ReactNode` - -Defined in: [src/auth.tsx:62](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L62) - -*** - -### requiredClaims - -> **requiredClaims**: `object` - -Defined in: [src/auth.tsx:64](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L64) - -#### Index Signature - -\[`key`: `string`\]: `any` - -*** - -### user - -> **user**: `User` - -Defined in: [src/auth.tsx:61](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L61) diff --git a/docs/reference/interfaces/ClaimsValidator.md b/docs/reference/interfaces/ClaimsValidator.md index 436ddd45..f6173e26 100644 --- a/docs/reference/interfaces/ClaimsValidator.md +++ b/docs/reference/interfaces/ClaimsValidator.md @@ -6,11 +6,11 @@ # Interface: ClaimsValidator() -Defined in: [src/auth.tsx:93](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L93) +Defined in: [src/auth.tsx:78](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L78) > **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:79](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L79) ## Parameters diff --git a/docs/reference/interfaces/SignInCheckOptionsBasic.md b/docs/reference/interfaces/SignInCheckOptionsBasic.md index 66967bf8..6fb7a5b2 100644 --- a/docs/reference/interfaces/SignInCheckOptionsBasic.md +++ b/docs/reference/interfaces/SignInCheckOptionsBasic.md @@ -6,7 +6,7 @@ # Interface: SignInCheckOptionsBasic -Defined in: [src/auth.tsx:85](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L85) +Defined in: [src/auth.tsx:70](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L70) ## Extends @@ -23,7 +23,7 @@ Defined in: [src/auth.tsx:85](https://github.com/FirebaseExtended/reactfire/blob > `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:71](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L71) *** diff --git a/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md b/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md index 09a1eae0..4c619eb2 100644 --- a/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md +++ b/docs/reference/interfaces/SignInCheckOptionsClaimsObject.md @@ -6,7 +6,7 @@ # Interface: SignInCheckOptionsClaimsObject -Defined in: [src/auth.tsx:89](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L89) +Defined in: [src/auth.tsx:74](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L74) ## Extends @@ -18,7 +18,7 @@ Defined in: [src/auth.tsx:89](https://github.com/FirebaseExtended/reactfire/blob > `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:71](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L71) #### Inherited from @@ -54,7 +54,7 @@ Defined in: [src/index.ts:26](https://github.com/FirebaseExtended/reactfire/blob > **requiredClaims**: `ParsedToken` -Defined in: [src/auth.tsx:90](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L90) +Defined in: [src/auth.tsx:75](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L75) *** diff --git a/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md b/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md index 5ba7f609..32902460 100644 --- a/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md +++ b/docs/reference/interfaces/SignInCheckOptionsClaimsValidator.md @@ -6,7 +6,7 @@ # Interface: SignInCheckOptionsClaimsValidator -Defined in: [src/auth.tsx:100](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L100) +Defined in: [src/auth.tsx:85](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L85) ## Extends @@ -18,7 +18,7 @@ Defined in: [src/auth.tsx:100](https://github.com/FirebaseExtended/reactfire/blo > `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:71](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L71) #### Inherited from @@ -82,4 +82,4 @@ Defined in: [src/index.ts:31](https://github.com/FirebaseExtended/reactfire/blob > **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:86](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L86) diff --git a/docs/reference/type-aliases/SigninCheckResult.md b/docs/reference/type-aliases/SigninCheckResult.md index f6f71bd1..aee05de0 100644 --- a/docs/reference/type-aliases/SigninCheckResult.md +++ b/docs/reference/type-aliases/SigninCheckResult.md @@ -8,4 +8,4 @@ > **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:56](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L56) diff --git a/docs/upgrade-guide.md b/docs/upgrade-guide.md index ba953351..7bd26774 100644 --- a/docs/upgrade-guide.md +++ b/docs/upgrade-guide.md @@ -2,6 +2,32 @@ ReactFire v5 contains breaking changes. This section lists them as they land; add an entry here in any PR that changes public behavior. +## `AuthCheck` and `ClaimsCheck` removed + +Both components were deprecated in v4 (May 2021) in favor of the `useSigninCheck` hook, which shipped in the same release. They have been removed in v5. + +They only ever worked with ``, and in non-suspense mode they logged a deprecation warning and rendered anyway. If you used them without suspense, you have been seeing that warning. + +**If you use either component**, replace it with `useSigninCheck`: + +```tsx +// Before +} requiredClaims={{ admin: true }}> + + + +// After +const { status, data: signInCheckResult } = useSigninCheck({ requiredClaims: { admin: true } }); + +if (status === 'loading') return ; + +return signInCheckResult.signedIn && signInCheckResult.hasRequiredClaims ? : ; +``` + +`useSigninCheck` also gives you the failed-claim details through `signInCheckResult.errors`, which the components never exposed, and it works in both suspense and non-suspense mode. + +The exported `AuthCheckProps` and `ClaimsCheckProps` types are gone with them. **`ClaimCheckErrors` remains**, since it is part of the `useSigninCheck` result shape. + ## Error handling behavior change Previously, errors from any reactfire hook were thrown unconditionally, making `status: 'error'` unreachable in practice. In v5, error handling depends on the mode: diff --git a/src/auth.tsx b/src/auth.tsx index 6e74d6c5..ebd71688 100644 --- a/src/auth.tsx +++ b/src/auth.tsx @@ -1,9 +1,7 @@ -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 { useSuspenseEnabledFromConfigAndContext } from './firebaseApp.js'; import type { Auth, User, IdTokenResult } from 'firebase/auth'; type Claims = IdTokenResult['claims']; @@ -51,19 +49,6 @@ export function useIdTokenResult(user: User, forceRefresh = false, options?: Rea return useObservable(observableId, observable$, options); } -export interface AuthCheckProps { - fallback: React.ReactNode; - children: React.ReactNode; - requiredClaims?: Object; -} - -export interface ClaimsCheckProps { - user: User; - fallback: React.ReactNode; - children: React.ReactNode; - requiredClaims: { [key: string]: any }; -} - export interface ClaimCheckErrors { [key: string]: any[]; } @@ -204,77 +189,3 @@ function getClaimsObjectValidator(requiredClaims: Claims): ClaimsValidator { }; }; } - -/** - * @deprecated Use `useSigninCheck` instead - * - * Conditionally render children based on [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). - */ -export function ClaimsCheck({ user, fallback, children, requiredClaims }: ClaimsCheckProps) { - const { data, status, error } = useIdTokenResult(user, false); - - if (status === 'loading') { - throw new Error('ClaimsCheck must be run in Suspense mode'); - } else if (status === 'error') { - throw error - } - - const { claims } = data; - const missingClaims: { [key: string]: { expected: string; actual: string | undefined } } = {}; - - const suspenseMode = useSuspenseEnabledFromConfigAndContext(); - if (!suspenseMode) { - console.warn( - 'ClaimsCheck is deprecated and only works when ReactFire is in experimental Suspense Mode. Use useSigninCheck or set suspense={true} in FirebaseAppProvider if you want to use this component.' - ); - } - - if (requiredClaims) { - Object.keys(requiredClaims).forEach((claim) => { - if (requiredClaims[claim] !== claims[claim]) { - missingClaims[claim] = { - expected: requiredClaims[claim], - actual: claims[claim]?.toString(), - }; - } - }); - } - - if (Object.keys(missingClaims).length === 0) { - return <>{children}; - } else { - return <>{fallback}; - } -} - -/** - * @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). - */ -export function AuthCheck({ fallback, children, requiredClaims }: AuthCheckProps): React.ReactElement { - const { data: user } = useUser(); - - const suspenseMode = useSuspenseEnabledFromConfigAndContext(); - if (!suspenseMode) { - console.warn( - 'AuthCheck is deprecated and only works when ReactFire is in experimental Suspense Mode. Use useSigninCheck or set suspense={true} in FirebaseAppProvider if you want to use this component.' - ); - } - - if (user) { - return requiredClaims ? ( - - {children} - - ) : ( - <>{children} - ); - } else { - return <>{fallback}; - } -} diff --git a/test/auth.test.tsx b/test/auth.test.tsx index 647ef683..94c3e233 100644 --- a/test/auth.test.tsx +++ b/test/auth.test.tsx @@ -5,7 +5,6 @@ import { NEVER } from 'rxjs'; import { preloadObservable } from '../src/useObservable'; import { FirebaseAppProvider, - AuthCheck, AuthProvider, useUser, useSigninCheck, @@ -29,11 +28,24 @@ describe('Authentication', () => { ); - const AuthCheckWrapper = (props?: { children?: any }) => ( + // Stands in for the removed : renders children when signed in and a fallback + // when not. Kept in suspense mode behind a Suspense boundary so the tests that used + // AuthCheckWrapper still exercise the same path. + const SigninGate = ({ children }: { children?: any }) => { + const { data: signinResult } = useSigninCheck(); + + if (signinResult?.signedIn !== true) { + return

not signed in

; + } + + return <>{children ??

signed in

}; + }; + + const SigninGateWrapper = (props?: { children?: any }) => ( - not signed in}>{props?.children ||

signed in

}
+ {props?.children}
@@ -62,10 +74,8 @@ describe('Authentication', () => { }); afterAll(() => { - afterAll(() => { - // @ts-expect-error console.info is mocked in beforeAll - console.info.mockRestore(); - }); + // @ts-expect-error console.info is mocked in beforeAll + console.info.mockRestore(); }); test('double check - emulator is running', async () => { @@ -85,56 +95,6 @@ describe('Authentication', () => { cleanup(); }); - describe('AuthCheck', () => { - it('can find firebase Auth from Context', async () => { - const { getByTestId } = render(); - - await waitFor(() => expect(getByTestId('signed-out')).toBeInTheDocument()); - }); - - it('renders the fallback if a user is not signed in', async () => { - const { getByTestId } = render(); - - await waitFor(() => expect(getByTestId('signed-out')).toBeInTheDocument()); - - await act(async () => { - await signIn(); - }); - - await waitFor(() => expect(getByTestId('signed-in')).toBeInTheDocument()); - }); - - it('renders children if a user is logged in', async () => { - await act(async () => { - await signIn(); - }); - - const { getByTestId } = render(); - - await waitFor(() => expect(getByTestId('signed-in')).toBeInTheDocument()); - }); - - it('can switch between logged in and logged out', async () => { - const { getByTestId } = render(); - - await waitFor(() => expect(getByTestId('signed-out')).toBeInTheDocument()); - - await act(async () => { - await signIn(); - }); - - await waitFor(() => expect(getByTestId('signed-in')).toBeInTheDocument()); - - await act(async () => { - await signOut(getAuth(app)); - }); - - await waitFor(() => expect(getByTestId('signed-out')).toBeInTheDocument()); - }); - - test.todo('checks requiredClaims'); - }); - describe('useSigninCheck()', () => { it('accurately reflects signed-in state', async () => { const { result } = renderHook(() => useSigninCheck(), { wrapper: Provider }); @@ -282,24 +242,30 @@ describe('Authentication', () => { }); describe('useUser', () => { - it('always returns a user if inside an component', async () => { - // Since this is wrapped in an AuthCheck component and we never sign in, this should never get rendered + it('returns a user inside a signed-in gate', async () => { + // The version of this test was vacuous: `beforeEach` signs out, so the + // gate rendered its fallback, UserDetails never mounted, and neither expectation ran. + // Signing in first and awaiting the gated testid is what makes it real. + await act(async () => { + await signIn(); + }); + const UserDetails = () => { const { data: user } = useUser(); expect(user).not.toBeNull(); expect(user).toBeDefined(); - return

Hello

; + return

Hello

; }; - render( - <> - - - - + const { findByTestId } = render( + + + ); + + await findByTestId('in'); }); it('returns the same value as getAuth(app).currentUser', async () => { @@ -366,7 +332,7 @@ describe('Authentication', () => { // a component that conditionally renders its child based on props const ConditionalRenderer = ({ renderChildren }: { renderChildren: boolean }) => { if (renderChildren) { - return ; + return ; } else { return Filler; }