Skip to content

Commit efe6e65

Browse files
committed
Add keyField and refField to database generics
1 parent df85e80 commit efe6e65

File tree

4 files changed

+65
-33
lines changed

4 files changed

+65
-33
lines changed

database/index.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1+
export { useList, useListKeys, useListVals } from './useList';
2+
export { useObject, useObjectVal } from './useObject';
13
export {
2-
useList,
3-
useListKeys,
4-
useListVals,
54
ListHook,
65
ListKeysHook,
76
ListValsHook,
8-
} from './useList';
9-
export {
10-
useObject,
11-
useObjectVal,
127
ObjectHook,
138
ObjectValHook,
14-
} from './useObject';
9+
} from './types';

database/types.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import firebase from 'firebase/app';
2+
import { LoadingHook } from '../util';
3+
4+
export type Val<
5+
T,
6+
KeyField extends string = '',
7+
RefField extends string = ''
8+
> = T & Record<KeyField, string> & Record<RefField, string>;
9+
10+
export type ObjectHook = LoadingHook<
11+
firebase.database.DataSnapshot,
12+
firebase.FirebaseError
13+
>;
14+
export type ObjectValHook<
15+
T,
16+
KeyField extends string = '',
17+
RefField extends string = ''
18+
> = LoadingHook<Val<T, KeyField, RefField>, firebase.FirebaseError>;
19+
20+
export type ListHook = LoadingHook<
21+
firebase.database.DataSnapshot[],
22+
firebase.FirebaseError
23+
>;
24+
export type ListKeysHook = LoadingHook<string[], firebase.FirebaseError>;
25+
export type ListValsHook<
26+
T,
27+
KeyField extends string = '',
28+
RefField extends string = ''
29+
> = LoadingHook<Val<T, KeyField, RefField>[], firebase.FirebaseError>;

database/useList.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@ import firebase from 'firebase/app';
22
import { useEffect, useMemo } from 'react';
33
import { snapshotToData, ValOptions } from './helpers';
44
import useListReducer from './helpers/useListReducer';
5-
import { LoadingHook, useIsEqualRef } from '../util';
6-
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>;
5+
import { ListHook, ListKeysHook, ListValsHook, Val } from './types';
6+
import { useIsEqualRef } from '../util';
137

148
export const useList = (query?: firebase.database.Query | null): ListHook => {
159
const [state, dispatch] = useListReducer();
@@ -129,23 +123,31 @@ export const useListKeys = (
129123
return useMemo(() => resArray, resArray);
130124
};
131125

132-
export const useListVals = <T>(
126+
export const useListVals = <
127+
T,
128+
KeyField extends string = '',
129+
RefField extends string = ''
130+
>(
133131
query?: firebase.database.Query | null,
134-
options?: ValOptions,
135-
): ListValsHook<T> => {
132+
options?: ValOptions
133+
): ListValsHook<T, KeyField, RefField> => {
136134
const keyField = options ? options.keyField : undefined;
137135
const refField = options ? options.refField : undefined;
138136
const [snapshots, loading, error] = useList(query);
139137
const values = useMemo(
140138
() =>
141-
snapshots
139+
(snapshots
142140
? snapshots.map((snapshot) =>
143141
snapshotToData(snapshot, keyField, refField)
144142
)
145-
: undefined,
143+
: undefined) as Val<T, KeyField, RefField>[],
146144
[snapshots, keyField, refField]
147145
);
148146

149-
const resArray: ListValsHook<T> = [values, loading, error];
147+
const resArray: ListValsHook<T, KeyField, RefField> = [
148+
values,
149+
loading,
150+
error,
151+
];
150152
return useMemo(() => resArray, resArray);
151153
};

database/useObject.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
import firebase from 'firebase/app';
22
import { useEffect, useMemo } from 'react';
33
import { snapshotToData, ValOptions } from './helpers';
4-
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
5-
6-
export type ObjectHook = LoadingHook<
7-
firebase.database.DataSnapshot,
8-
firebase.FirebaseError
9-
>;
10-
export type ObjectValHook<T> = LoadingHook<T, firebase.FirebaseError>;
4+
import { ObjectHook, ObjectValHook, Val } from './types';
5+
import { useIsEqualRef, useLoadingValue } from '../util';
116

127
export const useObject = (
138
query?: firebase.database.Query | null
@@ -36,18 +31,29 @@ export const useObject = (
3631
return useMemo(() => resArray, resArray);
3732
};
3833

39-
export const useObjectVal = <T>(
34+
export const useObjectVal = <
35+
T,
36+
KeyField extends string = '',
37+
RefField extends string = ''
38+
>(
4039
query?: firebase.database.Query | null,
4140
options?: ValOptions
42-
): ObjectValHook<T> => {
41+
): ObjectValHook<T, KeyField, RefField> => {
4342
const keyField = options ? options.keyField : undefined;
4443
const refField = options ? options.refField : undefined;
4544
const [snapshot, loading, error] = useObject(query);
4645
const value = useMemo(
47-
() => (snapshot ? snapshotToData(snapshot, keyField, refField) : undefined),
46+
() =>
47+
(snapshot
48+
? snapshotToData(snapshot, keyField, refField)
49+
: undefined) as Val<T, KeyField, RefField>,
4850
[snapshot, keyField, refField]
4951
);
5052

51-
const resArray: ObjectValHook<T> = [value, loading, error];
53+
const resArray: ObjectValHook<T, KeyField, RefField> = [
54+
value,
55+
loading,
56+
error,
57+
];
5258
return useMemo(() => resArray, resArray);
5359
};

0 commit comments

Comments
 (0)