Skip to content

Commit 9f678ad

Browse files
committed
Add idField and refField types to generics. Resolves #50
1 parent 316301a commit 9f678ad

File tree

6 files changed

+139
-75
lines changed

6 files changed

+139
-75
lines changed

firestore/helpers/index.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
import firebase from 'firebase/app';
22

3-
export type Options = {
4-
snapshotListenOptions?: firebase.firestore.SnapshotListenOptions;
5-
};
6-
export type DataOptions = Options & {
7-
idField?: string;
8-
refField?: string;
9-
};
10-
113
export const snapshotToData = (
124
snapshot: firebase.firestore.DocumentSnapshot,
135
idField?: string,
14-
refField?: string,
6+
refField?: string
157
) => {
168
if (!snapshot.exists) {
179
return undefined;

firestore/types.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import firebase from 'firebase/app';
2+
import { LoadingHook } from '../util';
3+
4+
type IDOptions = {
5+
idField?: string;
6+
refField?: string;
7+
};
8+
export type Options = {
9+
snapshotListenOptions?: firebase.firestore.SnapshotListenOptions;
10+
};
11+
export type DataOptions = Options & IDOptions;
12+
export type OnceOptions = {
13+
getOptions?: firebase.firestore.GetOptions;
14+
};
15+
export type OnceDataOptions = OnceOptions & IDOptions;
16+
export type Data<
17+
T,
18+
IDField extends string = '',
19+
RefField extends string = ''
20+
> = T & Record<IDField, string> & Record<RefField, string>;
21+
22+
export type CollectionHook<T> = LoadingHook<
23+
firebase.firestore.QuerySnapshot<T>,
24+
Error
25+
>;
26+
export type CollectionDataHook<
27+
T,
28+
IDField extends string = '',
29+
RefField extends string = ''
30+
> = LoadingHook<Data<T, IDField, RefField>[], Error>;
31+
32+
export type DocumentHook<T> = LoadingHook<
33+
firebase.firestore.DocumentSnapshot<T>,
34+
Error
35+
>;
36+
export type DocumentDataHook<
37+
T,
38+
IDField extends string = '',
39+
RefField extends string = ''
40+
> = LoadingHook<Data<T, IDField, RefField>, Error>;

firestore/useCollection.ts

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import firebase from 'firebase/app';
22
import { useEffect, useMemo } from 'react';
3-
import { DataOptions, Options, snapshotToData } from './helpers';
4-
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
5-
6-
export type CollectionHook<T> = LoadingHook<
7-
firebase.firestore.QuerySnapshot<T>,
8-
Error
9-
>;
10-
export type CollectionDataHook<T> = LoadingHook<T[], Error>;
3+
import { snapshotToData } from './helpers';
4+
import {
5+
CollectionHook,
6+
CollectionDataHook,
7+
Data,
8+
DataOptions,
9+
Options,
10+
} from './types';
11+
import { useIsEqualRef, useLoadingValue } from '../util';
1112

1213
export const useCollection = <T>(
1314
query?: firebase.firestore.Query | null,
14-
options?: Options,
15+
options?: Options
1516
): CollectionHook<T> => {
1617
const { error, loading, reset, setError, setValue, value } = useLoadingValue<
1718
firebase.firestore.QuerySnapshot,
@@ -46,10 +47,14 @@ export const useCollection = <T>(
4647
return useMemo(() => resArray, resArray);
4748
};
4849

49-
export const useCollectionData = <T>(
50+
export const useCollectionData = <
51+
T,
52+
IDField extends string = '',
53+
RefField extends string = ''
54+
>(
5055
query?: firebase.firestore.Query | null,
5156
options?: DataOptions
52-
): CollectionDataHook<T> => {
57+
): CollectionDataHook<T, IDField, RefField> => {
5358
const idField = options ? options.idField : undefined;
5459
const refField = options ? options.refField : undefined;
5560
const snapshotListenOptions = options
@@ -61,11 +66,15 @@ export const useCollectionData = <T>(
6166
const values = useMemo(
6267
() =>
6368
(snapshots
64-
? snapshots.docs.map(doc => snapshotToData(doc, idField, refField))
65-
: undefined) as T[],
69+
? snapshots.docs.map((doc) => snapshotToData(doc, idField, refField))
70+
: undefined) as Data<T, IDField, RefField>[],
6671
[snapshots, idField, refField]
6772
);
6873

69-
const resArray: CollectionDataHook<T> = [values, loading, error];
74+
const resArray: CollectionDataHook<T, IDField, RefField> = [
75+
values,
76+
loading,
77+
error,
78+
];
7079
return useMemo(() => resArray, resArray);
7180
};

firestore/useCollectionOnce.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import firebase from 'firebase/app';
22
import { useEffect, useMemo } from 'react';
33
import { snapshotToData } from './helpers';
4-
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
5-
6-
export type CollectionOnceHook<T> = LoadingHook<
7-
firebase.firestore.QuerySnapshot<T>,
8-
Error
9-
>;
10-
export type CollectionDataOnceHook<T> = LoadingHook<T[], Error>;
4+
import {
5+
CollectionHook,
6+
CollectionDataHook,
7+
Data,
8+
OnceDataOptions,
9+
OnceOptions,
10+
} from './types';
11+
import { useIsEqualRef, useLoadingValue } from '../util';
1112

1213
export const useCollectionOnce = <T>(
1314
query?: firebase.firestore.Query | null,
14-
options?: {
15-
getOptions?: firebase.firestore.GetOptions;
16-
}
17-
): CollectionOnceHook<T> => {
15+
options?: OnceOptions
16+
): CollectionHook<T> => {
1817
const { error, loading, reset, setError, setValue, value } = useLoadingValue<
1918
firebase.firestore.QuerySnapshot,
2019
Error
@@ -32,22 +31,22 @@ export const useCollectionOnce = <T>(
3231
.catch(setError);
3332
}, [ref.current]);
3433

35-
const resArray: CollectionOnceHook<T> = [
34+
const resArray: CollectionHook<T> = [
3635
value as firebase.firestore.QuerySnapshot<T>,
3736
loading,
3837
error,
3938
];
4039
return useMemo(() => resArray, resArray);
4140
};
4241

43-
export const useCollectionDataOnce = <T>(
42+
export const useCollectionDataOnce = <
43+
T,
44+
IDField extends string = '',
45+
RefField extends string = ''
46+
>(
4447
query?: firebase.firestore.Query | null,
45-
options?: {
46-
getOptions?: firebase.firestore.GetOptions;
47-
idField?: string;
48-
refField?: string;
49-
}
50-
): CollectionDataOnceHook<T> => {
48+
options?: OnceDataOptions
49+
): CollectionDataHook<T, IDField, RefField> => {
5150
const idField = options ? options.idField : undefined;
5251
const refField = options ? options.refField : undefined;
5352
const getOptions = options ? options.getOptions : undefined;
@@ -58,9 +57,13 @@ export const useCollectionDataOnce = <T>(
5857
() =>
5958
(snapshots
6059
? snapshots.docs.map((doc) => snapshotToData(doc, idField, refField))
61-
: undefined) as T[],
60+
: undefined) as Data<T, IDField, RefField>[],
6261
[snapshots, idField, refField]
6362
);
64-
const resArray: CollectionDataOnceHook<T> = [values, loading, error];
63+
const resArray: CollectionDataHook<T, IDField, RefField> = [
64+
values,
65+
loading,
66+
error,
67+
];
6568
return useMemo(() => resArray, resArray);
6669
};

firestore/useDocument.ts

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import firebase from 'firebase/app';
22
import { useEffect, useMemo } from 'react';
3-
import { DataOptions, Options, snapshotToData } from './helpers';
4-
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
5-
6-
export type DocumentHook<T> = LoadingHook<
7-
firebase.firestore.DocumentSnapshot<T>,
8-
Error
9-
>;
10-
export type DocumentDataHook<T> = LoadingHook<T, Error>;
3+
import { snapshotToData } from './helpers';
4+
import {
5+
Data,
6+
DataOptions,
7+
DocumentHook,
8+
DocumentDataHook,
9+
Options,
10+
} from './types';
11+
import { useIsEqualRef, useLoadingValue } from '../util';
1112

1213
export const useDocument = <T>(
1314
docRef?: firebase.firestore.DocumentReference | null,
@@ -46,10 +47,14 @@ export const useDocument = <T>(
4647
return useMemo(() => resArray, resArray);
4748
};
4849

49-
export const useDocumentData = <T>(
50+
export const useDocumentData = <
51+
T,
52+
IDField extends string = '',
53+
RefField extends string = ''
54+
>(
5055
docRef?: firebase.firestore.DocumentReference | null,
51-
options?: DataOptions,
52-
): DocumentDataHook<T> => {
56+
options?: DataOptions
57+
): DocumentDataHook<T, IDField, RefField> => {
5358
const idField = options ? options.idField : undefined;
5459
const refField = options ? options.refField : undefined;
5560
const snapshotListenOptions = options
@@ -59,10 +64,17 @@ export const useDocumentData = <T>(
5964
snapshotListenOptions,
6065
});
6166
const value = useMemo(
62-
() => (snapshot ? snapshotToData(snapshot, idField, refField) : undefined) as T,
67+
() =>
68+
(snapshot
69+
? snapshotToData(snapshot, idField, refField)
70+
: undefined) as Data<T, IDField, RefField>,
6371
[snapshot, idField, refField]
6472
);
6573

66-
const resArray: DocumentDataHook<T> = [value, loading, error];
74+
const resArray: DocumentDataHook<T, IDField, RefField> = [
75+
value,
76+
loading,
77+
error,
78+
];
6779
return useMemo(() => resArray, resArray);
6880
};

firestore/useDocumentOnce.ts

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import firebase from 'firebase/app';
22
import { useEffect, useMemo } from 'react';
33
import { snapshotToData } from './helpers';
4+
import {
5+
Data,
6+
DocumentHook,
7+
DocumentDataHook,
8+
OnceOptions,
9+
OnceDataOptions,
10+
} from './types';
411
import { LoadingHook, useIsEqualRef, useLoadingValue } from '../util';
512

6-
export type DocumentOnceHook<T> = LoadingHook<
7-
firebase.firestore.DocumentSnapshot<T>,
8-
Error
9-
>;
1013
export type DocumentDataOnceHook<T> = LoadingHook<T, Error>;
1114

1215
export const useDocumentOnce = <T>(
1316
docRef?: firebase.firestore.DocumentReference | null,
14-
options?: {
15-
getOptions?: firebase.firestore.GetOptions;
16-
}
17-
): DocumentOnceHook<T> => {
17+
options?: OnceOptions
18+
): DocumentHook<T> => {
1819
const { error, loading, reset, setError, setValue, value } = useLoadingValue<
1920
firebase.firestore.DocumentSnapshot,
2021
Error
@@ -32,31 +33,38 @@ export const useDocumentOnce = <T>(
3233
.catch(setError);
3334
}, [ref.current]);
3435

35-
const resArray: DocumentOnceHook<T> = [
36+
const resArray: DocumentHook<T> = [
3637
value as firebase.firestore.DocumentSnapshot<T>,
3738
loading,
3839
error,
3940
];
4041
return useMemo(() => resArray, resArray);
4142
};
4243

43-
export const useDocumentDataOnce = <T>(
44+
export const useDocumentDataOnce = <
45+
T,
46+
IDField extends string = '',
47+
RefField extends string = ''
48+
>(
4449
docRef?: firebase.firestore.DocumentReference | null,
45-
options?: {
46-
getOptions?: firebase.firestore.GetOptions;
47-
idField?: string;
48-
refField?: string;
49-
}
50-
): DocumentDataOnceHook<T> => {
50+
options?: OnceDataOptions
51+
): DocumentDataHook<T, IDField, RefField> => {
5152
const idField = options ? options.idField : undefined;
5253
const refField = options ? options.refField : undefined;
5354
const getOptions = options ? options.getOptions : undefined;
5455
const [snapshot, loading, error] = useDocumentOnce<T>(docRef, { getOptions });
5556
const value = useMemo(
56-
() => (snapshot ? snapshotToData(snapshot, idField, refField) : undefined) as T,
57+
() =>
58+
(snapshot
59+
? snapshotToData(snapshot, idField, refField)
60+
: undefined) as Data<T, IDField, RefField>,
5761
[snapshot, idField, refField]
5862
);
5963

60-
const resArray: DocumentDataOnceHook<T> = [value, loading, error];
64+
const resArray: DocumentDataHook<T, IDField, RefField> = [
65+
value,
66+
loading,
67+
error,
68+
];
6169
return useMemo(() => resArray, resArray);
6270
};

0 commit comments

Comments
 (0)