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 queryRef = useIsEqualRef ( query , ( ) => dispatch ( { type : 'reset' } ) ) ;
1518
1619 useEffect ( ( ) => {
17- const ref : database . Query | null | undefined = queryRef . current ;
20+ const ref : firebase . database . Query | null | undefined = queryRef . current ;
1821 if ( ! ref ) {
1922 dispatch ( { type : 'empty' } ) ;
2023 return ;
2124 }
2225
2326 const onChildAdded = (
24- snapshot : database . DataSnapshot | null ,
27+ snapshot : firebase . database . DataSnapshot | null ,
2528 previousKey ?: string | null
2629 ) => {
2730 dispatch ( { type : 'add' , previousKey, snapshot } ) ;
2831 } ;
2932
30- const onChildChanged = ( snapshot : database . DataSnapshot | null ) => {
33+ const onChildChanged = ( snapshot : firebase . database . DataSnapshot | null ) => {
3134 dispatch ( { type : 'change' , snapshot } ) ;
3235 } ;
3336
3437 const onChildMoved = (
35- snapshot : database . DataSnapshot | null ,
38+ snapshot : firebase . database . DataSnapshot | null ,
3639 previousKey ?: string | null
3740 ) => {
3841 dispatch ( { type : 'move' , previousKey, snapshot } ) ;
3942 } ;
4043
41- const onChildRemoved = ( snapshot : database . DataSnapshot | null ) => {
44+ const onChildRemoved = ( snapshot : firebase . database . DataSnapshot | null ) => {
4245 dispatch ( { type : 'remove' , snapshot } ) ;
4346 } ;
4447
45- const onError = ( error : FirebaseError ) => {
48+ const onError = ( error : firebase . FirebaseError ) => {
4649 dispatch ( { type : 'error' , error } ) ;
4750 } ;
4851
49- const onValue = ( snapshots : database . DataSnapshot [ ] | null ) => {
52+ const onValue = ( snapshots : firebase . database . DataSnapshot [ ] | null ) => {
5053 dispatch ( { type : 'value' , snapshots } ) ;
5154 } ;
5255
5356 let childAddedHandler : ReturnType < typeof ref . on > | undefined ;
54- const children : database . DataSnapshot [ ] = [ ] ;
55- const onInitialLoad = ( snapshot : database . DataSnapshot ) => {
57+ const children : firebase . database . DataSnapshot [ ] = [ ] ;
58+ const onInitialLoad = ( snapshot : firebase . database . DataSnapshot ) => {
5659 let childrenToProcess = Object . keys ( snapshot . val ( ) ) . length ;
5760
5861 const onChildAddedWithoutInitialLoad = (
59- addedChild : database . DataSnapshot ,
62+ addedChild : firebase . database . DataSnapshot ,
6063 previousKey ?: string
6164 ) => {
6265 // process the first batch of children all at once
@@ -102,10 +105,11 @@ export const useList = (query?: database.Query | null): ListHook => {
102105 } ;
103106 } , [ dispatch , queryRef ] ) ;
104107
105- return [ state . value . values , state . loading , state . error ] ;
108+ const resArray : ListHook = [ state . value . values , state . loading , state . error ] ;
109+ return useMemo ( ( ) => resArray , resArray ) ;
106110} ;
107111
108- export const useListKeys = ( query ?: database . Query | null ) : ListKeysHook => {
112+ export const useListKeys = ( query ?: firebase . database . Query | null ) : ListKeysHook => {
109113 const [ value , loading , error ] = useList ( query ) ;
110114 return [
111115 value ? value . map ( ( snapshot ) => snapshot . key as string ) : undefined ,
@@ -115,20 +119,25 @@ export const useListKeys = (query?: database.Query | null): ListKeysHook => {
115119} ;
116120
117121export const useListVals = < T > (
118- query ?: database . Query | null ,
122+ query ?: firebase . database . Query | null ,
119123 options ?: {
120124 keyField ?: string ;
125+ refField ?: string ;
121126 }
122127) : ListValsHook < T > => {
128+ const keyField = options ? options . keyField : undefined ;
129+ const refField = options ? options . refField : undefined ;
123130 const [ snapshots , loading , error ] = useList ( query ) ;
124131 const values = useMemo (
125132 ( ) =>
126133 snapshots
127134 ? snapshots . map ( ( snapshot ) =>
128- snapshotToData ( snapshot , options ? options . keyField : undefined )
135+ snapshotToData ( snapshot , options ? options . keyField : undefined , refField )
129136 )
130137 : undefined ,
131138 [ snapshots , options && options . keyField ]
132139 ) ;
133- return [ values , loading , error ] ;
140+
141+ const resArray : ListValsHook < T > = [ values , loading , error ] ;
142+ return useMemo ( ( ) => resArray , resArray ) ;
134143} ;
0 commit comments