1- import { database , FirebaseError } from 'firebase' ;
1+ import firebase from 'firebase/app ' ;
22import { useEffect , useMemo } from 'react' ;
33import { snapshotToData } from './helpers' ;
44import useListReducer from './helpers/useListReducer' ;
55import { LoadingHook , useIsEqualRef } from '../util' ;
66
7- export type ListHook = LoadingHook < database . DataSnapshot [ ] , FirebaseError > ;
8- export type ListKeysHook = LoadingHook < string [ ] , FirebaseError > ;
9- export type ListValsHook < T > = LoadingHook < T [ ] , FirebaseError > ;
7+ export type ListHook = LoadingHook <
8+ firebase . database . DataSnapshot [ ] ,
9+ firebase . FirebaseError
10+ > ;
11+ export type ListKeysHook = LoadingHook < string [ ] , firebase . FirebaseError > ;
12+ export type ListValsHook < T > = LoadingHook < T [ ] , firebase . FirebaseError > ;
1013
11- export const useList = ( query ?: database . Query | null ) : ListHook => {
14+ export const useList = ( query ?: firebase . database . Query | null ) : ListHook => {
1215 const [ state , dispatch ] = useListReducer ( ) ;
1316
1417 const ref = useIsEqualRef ( query , ( ) => dispatch ( { type : 'reset' } ) ) ;
1518
1619 const onChildAdded = (
17- snapshot : database . DataSnapshot | null ,
20+ snapshot : firebase . database . DataSnapshot | null ,
1821 previousKey ?: string | null
1922 ) => {
2023 dispatch ( { type : 'add' , previousKey, snapshot } ) ;
2124 } ;
2225
23- const onChildChanged = ( snapshot : database . DataSnapshot | null ) => {
26+ const onChildChanged = ( snapshot : firebase . database . DataSnapshot | null ) => {
2427 dispatch ( { type : 'change' , snapshot } ) ;
2528 } ;
2629
2730 const onChildMoved = (
28- snapshot : database . DataSnapshot | null ,
31+ snapshot : firebase . database . DataSnapshot | null ,
2932 previousKey ?: string | null
3033 ) => {
3134 dispatch ( { type : 'move' , previousKey, snapshot } ) ;
3235 } ;
3336
34- const onChildRemoved = ( snapshot : database . DataSnapshot | null ) => {
37+ const onChildRemoved = ( snapshot : firebase . database . DataSnapshot | null ) => {
3538 dispatch ( { type : 'remove' , snapshot } ) ;
3639 } ;
3740
38- const onError = ( error : FirebaseError ) => {
41+ const onError = ( error : firebase . FirebaseError ) => {
3942 dispatch ( { type : 'error' , error } ) ;
4043 } ;
4144
@@ -44,7 +47,7 @@ export const useList = (query?: database.Query | null): ListHook => {
4447 } ;
4548
4649 useEffect ( ( ) => {
47- const query : database . Query | null | undefined = ref . current ;
50+ const query : firebase . database . Query | null | undefined = ref . current ;
4851 if ( ! query ) {
4952 dispatch ( { type : 'empty' } ) ;
5053 return ;
@@ -64,20 +67,35 @@ export const useList = (query?: database.Query | null): ListHook => {
6467 } ;
6568 } , [ ref . current ] ) ;
6669
67- 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+ ) ;
6875} ;
6976
70- export const useListKeys = ( query ?: database . Query | null ) : ListKeysHook => {
71- const [ value , loading , error ] = useList ( query ) ;
72- return [
73- value ? value . map ( snapshot => snapshot . key as string ) : undefined ,
77+ export const useListKeys = (
78+ query ?: firebase . database . Query | null
79+ ) : ListKeysHook => {
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 ,
7487 loading ,
7588 error ,
7689 ] ;
90+
91+ return useMemo (
92+ ( ) => resArray ,
93+ resArray ,
94+ ) ;
7795} ;
7896
7997export const useListVals = < T > (
80- query ?: database . Query | null ,
98+ query ?: firebase . database . Query | null ,
8199 options ?: {
82100 keyField ?: string ;
83101 }
@@ -86,11 +104,16 @@ export const useListVals = <T>(
86104 const values = useMemo (
87105 ( ) =>
88106 snapshots
89- ? snapshots . map ( snapshot =>
107+ ? snapshots . map ( ( snapshot ) =>
90108 snapshotToData ( snapshot , options ? options . keyField : undefined )
91109 )
92110 : undefined ,
93111 [ snapshots , options && options . keyField ]
94112 ) ;
95- return [ values , loading , error ] ;
113+
114+ const resArray : ListValsHook < T > = [ values , loading , error ] ;
115+ return useMemo (
116+ ( ) => resArray ,
117+ resArray ,
118+ ) ;
96119} ;
0 commit comments