Skip to content

Commit 2177d64

Browse files
authored
Merge pull request #79 from sdemjanenko/memoize_hook_return
Memoize hook return
2 parents 08d35f5 + 50df08a commit 2177d64

File tree

8 files changed

+120
-42
lines changed

8 files changed

+120
-42
lines changed

auth/useAuthState.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import firebase from 'firebase/app';
2-
import { useEffect } from 'react';
2+
import { useEffect, useMemo } from 'react';
33
import { LoadingHook, useLoadingValue } from '../util';
44

55
export type AuthStateHook = LoadingHook<firebase.User, firebase.auth.Error>;
@@ -18,5 +18,9 @@ export default (auth: firebase.auth.Auth): AuthStateHook => {
1818
};
1919
}, [auth]);
2020

21-
return [value, loading, error];
21+
const resArray:AuthStateHook = [value, loading, error]
22+
return useMemo<AuthStateHook>(
23+
() => resArray,
24+
resArray,
25+
);
2226
};

database/useList.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,31 @@ export const useList = (query?: firebase.database.Query | null): ListHook => {
6767
};
6868
}, [ref.current]);
6969

70-
return [state.value.values, state.loading, state.error];
70+
const resArray: ListHook = [state.value.values, state.loading, state.error];
71+
return useMemo(
72+
() => resArray,
73+
resArray,
74+
);
7175
};
7276

7377
export const useListKeys = (
7478
query?: firebase.database.Query | null
7579
): ListKeysHook => {
76-
const [value, loading, error] = useList(query);
77-
return [
78-
value ? value.map((snapshot) => snapshot.key as string) : undefined,
80+
const [snapshots, loading, error] = useList(query);
81+
const values = useMemo(
82+
() => (snapshots ? snapshots.map(snapshot => snapshot.key as string) : undefined),
83+
[snapshots]
84+
);
85+
const resArray: ListKeysHook = [
86+
values,
7987
loading,
8088
error,
8189
];
90+
91+
return useMemo(
92+
() => resArray,
93+
resArray,
94+
);
8295
};
8396

8497
export const useListVals = <T>(
@@ -97,5 +110,10 @@ export const useListVals = <T>(
97110
: undefined,
98111
[snapshots, options && options.keyField]
99112
);
100-
return [values, loading, error];
113+
114+
const resArray: ListValsHook<T> = [values, loading, error];
115+
return useMemo(
116+
() => resArray,
117+
resArray,
118+
);
101119
};

database/useObject.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ export const useObject = (
3232
};
3333
}, [ref.current]);
3434

35-
return [value, loading, error];
35+
const resArray: ObjectHook = [value, loading, error];
36+
return useMemo(
37+
() => resArray,
38+
resArray,
39+
);
3640
};
3741

3842
export const useObjectVal = <T>(
@@ -49,5 +53,10 @@ export const useObjectVal = <T>(
4953
: undefined,
5054
[snapshot, options && options.keyField]
5155
);
52-
return [value, loading, error];
56+
57+
const resArray: ObjectValHook<T> = [value, loading, error];
58+
return useMemo(
59+
() => resArray,
60+
resArray,
61+
);
5362
};

firestore/useCollection.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ export const useCollection = (
4040
};
4141
}, [ref.current]);
4242

43-
return [value, loading, error];
43+
const resArray: CollectionHook = [value, loading, error];
44+
return useMemo(
45+
() => resArray,
46+
resArray,
47+
);
4448
};
4549

4650
export const useCollectionData = <T>(
@@ -54,15 +58,19 @@ export const useCollectionData = <T>(
5458
const snapshotListenOptions = options
5559
? options.snapshotListenOptions
5660
: undefined;
57-
const [snapshot, loading, error] = useCollection(query, {
61+
const [snapshots, loading, error] = useCollection(query, {
5862
snapshotListenOptions,
5963
});
6064
const values = useMemo(
61-
() =>
62-
(snapshot
63-
? snapshot.docs.map((doc) => snapshotToData(doc, idField))
64-
: undefined) as T[],
65-
[snapshot, idField]
65+
() => (snapshots
66+
? snapshots.docs.map(doc => snapshotToData(doc, idField))
67+
: undefined) as T[],
68+
[snapshots, idField]
69+
);
70+
71+
const resArray: CollectionDataHook<T> = [values, loading, error]
72+
return useMemo(
73+
() => resArray,
74+
resArray,
6675
);
67-
return [values, loading, error];
6876
};

firestore/useCollectionOnce.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import firebase from 'firebase/app';
2-
import { useEffect } from 'react';
2+
import { useEffect, useMemo } from 'react';
33
import { snapshotToData } from './helpers';
44
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
55

@@ -32,7 +32,11 @@ export const useCollectionOnce = (
3232
.catch(setError);
3333
}, [ref.current]);
3434

35-
return [value, loading, error];
35+
const resArray: CollectionOnceHook = [value, loading, error];
36+
return useMemo(
37+
() => resArray,
38+
resArray,
39+
);
3640
};
3741

3842
export const useCollectionDataOnce = <T>(
@@ -44,12 +48,20 @@ export const useCollectionDataOnce = <T>(
4448
): CollectionDataOnceHook<T> => {
4549
const idField = options ? options.idField : undefined;
4650
const getOptions = options ? options.getOptions : undefined;
47-
const [value, loading, error] = useCollectionOnce(query, { getOptions });
48-
return [
49-
(value
50-
? value.docs.map((doc) => snapshotToData(doc, idField))
51+
const [snapshots, loading, error] = useCollectionOnce(query, { getOptions });
52+
const values = useMemo(
53+
() => (snapshots
54+
? snapshots.docs.map(doc => snapshotToData(doc, idField))
5155
: undefined) as T[],
56+
[snapshots, idField]
57+
);
58+
const resArray: CollectionDataOnceHook<T> = [
59+
values,
5260
loading,
5361
error,
5462
];
63+
return useMemo(
64+
() => resArray,
65+
resArray,
66+
);
5567
};

firestore/useDocument.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ export const useDocument = (
4040
};
4141
}, [ref.current]);
4242

43-
return [value, loading, error];
43+
const resArray: DocumentHook = [value, loading, error];
44+
return useMemo(
45+
() => resArray,
46+
resArray,
47+
);
4448
};
4549

4650
export const useDocumentData = <T>(
@@ -61,5 +65,10 @@ export const useDocumentData = <T>(
6165
() => (snapshot ? snapshotToData(snapshot, idField) : undefined) as T,
6266
[snapshot, idField]
6367
);
64-
return [value, loading, error];
68+
69+
const resArray: DocumentDataHook<T> = [value, loading, error];
70+
return useMemo(
71+
() => resArray,
72+
resArray,
73+
);
6574
};

firestore/useDocumentOnce.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import firebase from 'firebase/app';
2-
import { useEffect } from 'react';
2+
import { useEffect, useMemo } from 'react';
33
import { snapshotToData } from './helpers';
44
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
55

@@ -32,7 +32,11 @@ export const useDocumentOnce = (
3232
.catch(setError);
3333
}, [ref.current]);
3434

35-
return [value, loading, error];
35+
const resArray: DocumentOnceHook = [value, loading, error]
36+
return useMemo(
37+
() => resArray,
38+
resArray,
39+
);
3640
};
3741

3842
export const useDocumentDataOnce = <T>(
@@ -44,10 +48,15 @@ export const useDocumentDataOnce = <T>(
4448
): DocumentDataOnceHook<T> => {
4549
const idField = options ? options.idField : undefined;
4650
const getOptions = options ? options.getOptions : undefined;
47-
const [value, loading, error] = useDocumentOnce(docRef, { getOptions });
48-
return [
49-
(value ? snapshotToData(value, idField) : undefined) as T,
50-
loading,
51-
error,
52-
];
51+
const [snapshot, loading, error] = useDocumentOnce(docRef, { getOptions });
52+
const value = useMemo(
53+
() => (snapshot ? snapshotToData(snapshot, idField) : undefined) as T,
54+
[snapshot, idField]
55+
);
56+
57+
const resArray: DocumentDataOnceHook<T> = [value, loading, error]
58+
return useMemo(
59+
() => resArray,
60+
resArray,
61+
);
5362
};

util/useLoadingValue.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useReducer } from 'react';
1+
import { useMemo, useReducer } from 'react';
22

33
export type LoadingValue<T, E> = {
44
error?: E;
@@ -73,12 +73,21 @@ export default <T, E>(getDefaultValue?: () => T | null): LoadingValue<T, E> => {
7373
dispatch({ type: 'value', value });
7474
};
7575

76-
return {
77-
error: state.error,
78-
loading: state.loading,
79-
reset,
80-
setError,
81-
setValue,
82-
value: state.value,
83-
};
76+
return useMemo(
77+
() => ({
78+
error: state.error,
79+
loading: state.loading,
80+
reset,
81+
setError,
82+
setValue,
83+
value: state.value,
84+
}), [
85+
state.error,
86+
state.loading,
87+
reset,
88+
setError,
89+
setValue,
90+
state.value,
91+
]
92+
);
8493
};

0 commit comments

Comments
 (0)