Skip to content

Commit ac8bb13

Browse files
committedNov 9, 2022
[firestore] Improve isMounted check
1 parent 44b830d commit ac8bb13

File tree

3 files changed

+19
-14
lines changed

3 files changed

+19
-14
lines changed
 

‎firestore/useCollection.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from 'firebase/firestore';
1212
import { useCallback, useEffect, useMemo } from 'react';
1313
import { useLoadingValue } from '../util';
14+
import useIsMounted from '../util/useIsMounted';
1415
import { useIsFirestoreQueryEqual } from './helpers';
1516
import {
1617
CollectionDataHook,
@@ -65,7 +66,7 @@ export const useCollectionOnce = <T = DocumentData>(
6566
QuerySnapshot<T>,
6667
FirestoreError
6768
>();
68-
let effectActive = true;
69+
const isMounted = useIsMounted();
6970
const ref = useIsFirestoreQueryEqual<Query<T>>(query, reset);
7071

7172
const loadData = useCallback(
@@ -78,11 +79,11 @@ export const useCollectionOnce = <T = DocumentData>(
7879

7980
try {
8081
const result = await get(query);
81-
if (effectActive) {
82+
if (isMounted) {
8283
setValue(result);
8384
}
8485
} catch (error) {
85-
if (effectActive) {
86+
if (isMounted) {
8687
setError(error as FirestoreError);
8788
}
8889
}
@@ -97,10 +98,6 @@ export const useCollectionOnce = <T = DocumentData>(
9798

9899
useEffect(() => {
99100
loadData(ref.current, options);
100-
101-
return () => {
102-
effectActive = false;
103-
};
104101
}, [ref.current]);
105102

106103
return [value as QuerySnapshot<T>, loading, error, reloadData];

‎firestore/useDocument.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from 'firebase/firestore';
1212
import { useCallback, useEffect, useMemo } from 'react';
1313
import { useLoadingValue } from '../util';
14+
import useIsMounted from '../util/useIsMounted';
1415
import { useIsFirestoreRefEqual } from './helpers';
1516
import {
1617
DataOptions,
@@ -65,7 +66,7 @@ export const useDocumentOnce = <T = DocumentData>(
6566
DocumentSnapshot<T>,
6667
FirestoreError
6768
>();
68-
let effectActive = true;
69+
const isMounted = useIsMounted();
6970
const ref = useIsFirestoreRefEqual<DocumentReference<T>>(docRef, reset);
7071

7172
const loadData = useCallback(
@@ -78,11 +79,11 @@ export const useDocumentOnce = <T = DocumentData>(
7879

7980
try {
8081
const result = await get(reference);
81-
if (effectActive) {
82+
if (isMounted) {
8283
setValue(result);
8384
}
8485
} catch (error) {
85-
if (effectActive) {
86+
if (isMounted) {
8687
setError(error as FirestoreError);
8788
}
8889
}
@@ -102,10 +103,6 @@ export const useDocumentOnce = <T = DocumentData>(
102103
}
103104

104105
loadData(ref.current, options);
105-
106-
return () => {
107-
effectActive = false;
108-
};
109106
}, [ref.current]);
110107

111108
return [value as DocumentSnapshot<T>, loading, error, reloadData];

‎util/useIsMounted.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { useEffect, useState } from 'react';
2+
3+
export default () => {
4+
const [isMounted, setIsMounted] = useState(true);
5+
useEffect(() => {
6+
return () => {
7+
setIsMounted(false);
8+
};
9+
}, []);
10+
return isMounted;
11+
};

0 commit comments

Comments
 (0)
Please sign in to comment.