react-firebase-pagination 1.1.14 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,78 +1,86 @@
1
- # react-firebase-pagination
2
-
3
- A React Hook that makes it easy to paginate Firestore collections.
4
- This hook provides _cumulative_ pagination and maintains references to previous documents, so it might not be suitable for large document sets.
5
-
6
- ## Support for Firebase 9
7
-
8
- support for Firebase 9 and are backwards _incompatible_ with previous versions of Firebase.
9
-
10
- ## Install
11
-
12
- ```
13
- npm install react-firebase-pagination
14
- ```
15
-
16
- OR
17
-
18
- ```
19
- yarn add react-firebase-pagination
20
- ```
21
-
22
- ### Options
23
-
24
- | **prop** | **Type** | **Default** | **description** | **Required** |
25
- | ---------- | --------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
26
- | query | `Query` | null | The query of your Firebase database. e.g. `query(collection(db, '[collection]'))`. | ✔ |
27
- | pageSize | `Number` | 10 | The number of items per page. | |
28
- | pageByPage | `Boolean` | false | When this option is True, data is loaded page by page like Google search, and when it's not, it loads data on a single page and appends new data on the bottom of current data like a Facebook feed. | |
29
- | liveUpdate | `Boolean` | false | Add Firebase snapshot listener to update data live | |
30
-
31
- ### State
32
-
33
- | **prop** | **value** | **description** |
34
- | ----------- | ---------- | ----------------------------------------------------------------------------------------------------------- |
35
- | loading | `Boolean` | Is true when a page is loading. |
36
- | data | `Object` | [Data Object](#data-object-contain) |
37
- | getNext | `Function` | W'll render the next page when called. (Take no arguments) |
38
- | getPrevious | `Function` | W'll render the previous page when called. (Take no arguments and work only in [pageByPage](#options) mode) |
39
- | hasNext | `Boolean` | It's true when the next page has data. |
40
- | hasPrevious | `Boolean` | It's true when a previous page has data. (Work only in [pageByPage](#options) mode) |
41
-
42
- ### Data Object Contain
43
-
44
- | **prop** | **value** | **description** |
45
- | ----------- | ----------- | -------------------------------------------------------------------------------------------------- |
46
- | docs | `Documents` | Document Array. |
47
- | totalDocs | `Number` | Total Document count. |
48
- | totalPages | `Number` | Total Page count. |
49
- | currentPage | `Number` | Current Page Number in [pageByPage](#options) mode or how may time's data load on the current page |
50
-
51
- ## Example Use
52
-
53
- This is an example of a [Firestore](https://firebase.google.com/docs/firestore/).
54
-
55
- You can also change query during runtime. Hook will detect new query and start pagination from the beginning.
56
- Here is an example of controlling query's `orderDirection` by React's state:
57
-
58
- ```jsx
59
- import usePagination from 'react-firebase-pagination';
60
- import { query, orderBy, collection } from 'firebase/firestore'
61
- import db from './your/database/path';
62
-
63
- const mainQuery = query(collection(db, '[collection]'), orderBy('created_timestamp', 'desc'));
64
-
65
- const App = () => {
66
- const { getNext, getPrevious, data, loading } = usePagination({
67
- pageSize: 10,
68
- pageByPage: true,
69
- query: mainQuery,
70
- })
71
-
72
- if (loading) {
73
- return <LoadingComponent />
74
- }
75
-
76
- ...
77
- }
78
- ```
1
+ [![npm version](https://badge.fury.io/js/react-firebase-pagination.svg)](https://badge.fury.io/js/react-firebase-pagination)
2
+
3
+ # react-firebase-pagination
4
+
5
+ A React Hook that makes it easy to paginate Firestore collections.
6
+ This hook provides _cumulative_ pagination and maintains references to previous documents, so it might not be suitable for large document sets.
7
+
8
+ ## Support for Firebase 9
9
+
10
+ support for Firebase 9 and are backwards _incompatible_ with previous versions of Firebase.
11
+
12
+ ## Install
13
+
14
+ ```
15
+ npm install react-firebase-pagination
16
+ ```
17
+
18
+ OR
19
+
20
+ ```
21
+ yarn add react-firebase-pagination
22
+ ```
23
+
24
+ ### Options
25
+
26
+ | **prop** | **Type** | **Default** | **description** | **Required** |
27
+ | ---------- | --------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
28
+ | query | `Query` | — | The Firestore query. Safe to create inline each render; identity is driven by `queryKey`. | ✔ |
29
+ | queryKey | `unknown[]` | — | Stable key for the logical query (sorts, filters, collection). Change it when the query meaning changes — pagination resets to page 1. | ✔ |
30
+ | pageSize | `Number` | 10 | The number of items per page. | |
31
+ | pageByPage | `Boolean` | false | When this option is True, data is loaded page by page like Google search, and when it's not, it loads data on a single page and appends new data on the bottom of current data like a Facebook feed. | |
32
+ | liveUpdate | `Boolean` | false | Add Firebase snapshot listener to update data live | |
33
+
34
+ ### State
35
+
36
+ | **prop** | **value** | **description** |
37
+ | ----------- | ---------- | ----------------------------------------------------------------------------------------------------------- |
38
+ | loading | `Boolean` | Is true when a page is loading. |
39
+ | data | `Object` | [Data Object](#data-object-contain) |
40
+ | getNext | `Function` | W'll render the next page when called. (Take no arguments) |
41
+ | getPrevious | `Function` | W'll render the previous page when called. (Take no arguments and work only in [pageByPage](#options) mode) |
42
+ | hasNext | `Boolean` | It's true when the next page has data. |
43
+ | hasPrevious | `Boolean` | It's true when a previous page has data. (Work only in [pageByPage](#options) mode) |
44
+
45
+ ### Data Object Contain
46
+
47
+ | **prop** | **value** | **description** |
48
+ | ----------- | ----------- | -------------------------------------------------------------------------------------------------- |
49
+ | docs | `Documents` | Document Array. |
50
+ | totalDocs | `Number` | Total Document count. |
51
+ | totalPages | `Number` | Total Page count. |
52
+ | currentPage | `Number` | Current Page Number in [pageByPage](#options) mode or how may time's data load on the current page |
53
+
54
+ ## Example Use
55
+
56
+ This is an example of a [Firestore](https://firebase.google.com/docs/firestore/) query. You can rebuild `query(...)` every render — pass a `queryKey` so the hook only resets when sorts/filters actually change:
57
+
58
+ ```jsx
59
+ import usePagination from 'react-firebase-pagination'
60
+ import { query, orderBy, collection } from 'firebase/firestore'
61
+ import db from './your/database/path'
62
+
63
+ const App = () => {
64
+ const [sort, setSort] = useState('newest') // 'newest' | 'oldest' | ...
65
+
66
+ const mainQuery = query(
67
+ collection(db, '[collection]'),
68
+ sort === 'oldest'
69
+ ? orderBy('created_timestamp', 'asc')
70
+ : orderBy('created_timestamp', 'desc'),
71
+ )
72
+
73
+ const { getNext, getPrevious, data, loading } = usePagination({
74
+ pageSize: 10,
75
+ pageByPage: true,
76
+ query: mainQuery,
77
+ queryKey: ['[collection]', sort],
78
+ })
79
+
80
+ if (loading) {
81
+ return <LoadingComponent />
82
+ }
83
+
84
+ ...
85
+ }
86
+ ```
package/dist/App.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { Query, QueryDocumentSnapshot } from 'firebase/firestore';
2
+ type data = {
3
+ totalDocs: number;
4
+ totalPages: number;
5
+ currentPage: number;
6
+ docs: QueryDocumentSnapshot[];
7
+ };
8
+ type hookReturnValue = {
9
+ data: data;
10
+ error?: Error;
11
+ loading: boolean;
12
+ getNext: () => void;
13
+ getPrevious: () => void;
14
+ hasNext: boolean;
15
+ hasPrevious: boolean;
16
+ };
17
+ /** Primitive-friendly key that identifies the logical Firestore query. */
18
+ export type QueryKey = readonly unknown[];
19
+ type hookProps = {
20
+ query: Query;
21
+ /** Stable identity for `query`. Change this when sorts/filters change to reset pagination. */
22
+ queryKey: QueryKey;
23
+ pageSize?: number;
24
+ pageByPage?: boolean;
25
+ liveUpdate?: boolean;
26
+ };
27
+ type usePaginateType = (props: hookProps) => hookReturnValue;
28
+ declare const usePagination: usePaginateType;
29
+ export default usePagination;
30
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAA+B,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAGnG,KAAK,IAAI,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAA;AAEzG,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,CAAA;AAEzC,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,KAAK,CAAA;IACZ,8FAA8F;IAC9F,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAID,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,eAAe,CAAA;AAI5D,QAAA,MAAM,aAAa,EAAE,eAkLpB,CAAA;eAEc,aAAa"}
package/dist/App.js ADDED
@@ -0,0 +1,174 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { query, limit, getDocs, startAfter, onSnapshot, getCountFromServer } from 'firebase/firestore';
3
+ const addQuery = (q, fun, value) => (value ? query(q, fun(value)) : q);
4
+ const usePagination = ({ pageSize = 10, query: mainQuery, queryKey, pageByPage = false, liveUpdate = false }) => {
5
+ const [error, setError] = useState();
6
+ const [loading, setLoading] = useState(true);
7
+ const [docs, setDocs] = useState([]);
8
+ /** Last document of each loaded page. Length === current page number. */
9
+ const [pageCursors, setPageCursors] = useState([]);
10
+ const [activeQuery, setActiveQuery] = useState(() => addQuery(mainQuery, limit, pageSize));
11
+ const [totals, setTotals] = useState({ totalDocs: 0, totalPages: 0 });
12
+ const mainQueryRef = useRef(mainQuery);
13
+ const navKindRef = useRef('reset');
14
+ const pageByPageRef = useRef(pageByPage);
15
+ useEffect(() => {
16
+ mainQueryRef.current = mainQuery;
17
+ }, [mainQuery]);
18
+ useEffect(() => {
19
+ pageByPageRef.current = pageByPage;
20
+ }, [pageByPage]);
21
+ const queryKeySignature = JSON.stringify(queryKey);
22
+ const applySnapshot = useCallback((res) => {
23
+ const lastDoc = res.docs[res.docs.length - 1];
24
+ const kind = navKindRef.current;
25
+ if (kind === 'reset') {
26
+ setDocs(res.docs);
27
+ setPageCursors(lastDoc ? [lastDoc] : []);
28
+ }
29
+ else if (kind === 'next') {
30
+ if (pageByPageRef.current) {
31
+ setDocs(res.docs);
32
+ }
33
+ else {
34
+ setDocs((prev) => [...prev, ...res.docs]);
35
+ }
36
+ if (lastDoc) {
37
+ setPageCursors((prev) => [...prev, lastDoc]);
38
+ }
39
+ }
40
+ else if (kind === 'previous') {
41
+ setDocs(res.docs);
42
+ if (lastDoc) {
43
+ setPageCursors((prev) => [...prev, lastDoc]);
44
+ }
45
+ }
46
+ else {
47
+ if (pageByPageRef.current) {
48
+ setDocs(res.docs);
49
+ if (lastDoc) {
50
+ setPageCursors((prev) => (prev.length === 0 ? [lastDoc] : [...prev.slice(0, -1), lastDoc]));
51
+ }
52
+ }
53
+ }
54
+ navKindRef.current = 'idle';
55
+ setLoading(false);
56
+ }, []);
57
+ const onErr = useCallback((err) => {
58
+ setError(err);
59
+ setLoading(false);
60
+ }, []);
61
+ const refreshTotals = useCallback(() => {
62
+ return getCountFromServer(mainQueryRef.current).then((res) => {
63
+ setTotals({ totalDocs: res.data().count, totalPages: Math.ceil(res.data().count / pageSize) || 0 });
64
+ });
65
+ }, [pageSize]);
66
+ // Reset when the logical query (queryKey) or page size changes — not on Query identity
67
+ useEffect(() => {
68
+ let cancelled = false;
69
+ navKindRef.current = 'reset';
70
+ setLoading(true);
71
+ setError(undefined);
72
+ setDocs([]);
73
+ setPageCursors([]);
74
+ setActiveQuery(addQuery(mainQueryRef.current, limit, pageSize));
75
+ refreshTotals().catch((err) => {
76
+ if (cancelled)
77
+ return;
78
+ onErr(err);
79
+ });
80
+ return () => {
81
+ cancelled = true;
82
+ };
83
+ }, [queryKeySignature, pageSize, refreshTotals, onErr]);
84
+ useEffect(() => {
85
+ let cancelled = false;
86
+ setLoading(true);
87
+ if (liveUpdate) {
88
+ const unsubscribe = onSnapshot(activeQuery, { includeMetadataChanges: true }, (res) => {
89
+ if (cancelled)
90
+ return;
91
+ // Skip pure metadata echoes for docs; still apply when docs/pending state matter.
92
+ // Recount only after local writes are acknowledged so getCountFromServer is accurate.
93
+ if (!res.metadata.hasPendingWrites) {
94
+ applySnapshot(res);
95
+ refreshTotals().catch((err) => {
96
+ if (cancelled)
97
+ return;
98
+ onErr(err);
99
+ });
100
+ }
101
+ else if (res.docChanges().length > 0) {
102
+ // Optimistic UI for local adds/removes; count updates on the follow-up snapshot.
103
+ applySnapshot(res);
104
+ }
105
+ }, (err) => {
106
+ if (cancelled)
107
+ return;
108
+ onErr(err);
109
+ });
110
+ return () => {
111
+ cancelled = true;
112
+ unsubscribe();
113
+ };
114
+ }
115
+ getDocs(activeQuery)
116
+ .then((res) => {
117
+ if (cancelled)
118
+ return;
119
+ applySnapshot(res);
120
+ })
121
+ .catch((err) => {
122
+ if (cancelled)
123
+ return;
124
+ onErr(err);
125
+ });
126
+ return () => {
127
+ cancelled = true;
128
+ };
129
+ }, [activeQuery, liveUpdate, applySnapshot, onErr, refreshTotals]);
130
+ const currentPage = pageCursors.length;
131
+ const hasNext = currentPage > 0 && currentPage < totals.totalPages;
132
+ const hasPrevious = pageByPage && currentPage > 1;
133
+ const getNext = useCallback(() => {
134
+ if (!hasNext)
135
+ return;
136
+ const cursor = pageCursors[pageCursors.length - 1];
137
+ if (!cursor)
138
+ return;
139
+ navKindRef.current = 'next';
140
+ setLoading(true);
141
+ setActiveQuery(addQuery(addQuery(mainQueryRef.current, startAfter, cursor), limit, pageSize));
142
+ }, [hasNext, pageCursors, pageSize]);
143
+ const getPrevious = useCallback(() => {
144
+ if (!hasPrevious)
145
+ return;
146
+ const newCursors = pageCursors.slice(0, -2);
147
+ const cursor = newCursors[newCursors.length - 1];
148
+ navKindRef.current = 'previous';
149
+ setPageCursors(newCursors.length ? newCursors : []);
150
+ setLoading(true);
151
+ if (cursor) {
152
+ setActiveQuery(addQuery(addQuery(mainQueryRef.current, startAfter, cursor), limit, pageSize));
153
+ }
154
+ else {
155
+ navKindRef.current = 'reset';
156
+ setActiveQuery(addQuery(mainQueryRef.current, limit, pageSize));
157
+ }
158
+ }, [hasPrevious, pageCursors, pageSize]);
159
+ return {
160
+ error,
161
+ loading,
162
+ getNext,
163
+ getPrevious,
164
+ hasNext,
165
+ hasPrevious,
166
+ data: {
167
+ docs,
168
+ ...totals,
169
+ currentPage,
170
+ },
171
+ };
172
+ };
173
+ export default usePagination;
174
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AA8BtG,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,GAAsB,EAAE,KAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAErG,MAAM,aAAa,GAAoB,CAAC,EAAE,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,EAAE,EAAE;IAC/H,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAS,CAAA;IAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAA;IAC7D,yEAAyE;IACzE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAA;IAC3E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC1F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;IAE7G,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,UAAU,GAAG,MAAM,CAAU,OAAO,CAAC,CAAA;IAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,SAAS,CAAA;IAClC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,OAAO,GAAG,UAAU,CAAA;IACpC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAElD,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,GAAgC,EAAE,EAAE;QACrE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAA;QAE/B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1C,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;YAC3C,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACjB,IAAI,OAAO,EAAE,CAAC;oBACZ,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;gBAC7F,CAAC;YACH,CAAC;QACH,CAAC;QAED,UAAU,CAAC,OAAO,GAAG,MAAM,CAAA;QAC3B,UAAU,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,GAAU,EAAE,EAAE;QACvC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACb,UAAU,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,OAAO,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3D,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACrG,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,uFAAuF;IACvF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;QAC5B,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,QAAQ,CAAC,SAAS,CAAC,CAAA;QACnB,OAAO,CAAC,EAAE,CAAC,CAAA;QACX,cAAc,CAAC,EAAE,CAAC,CAAA;QAClB,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;QAE/D,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YACnC,IAAI,SAAS;gBAAE,OAAM;YACrB,KAAK,CAAC,GAAG,CAAC,CAAA;QACZ,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,UAAU,CAC5B,WAAW,EACX,EAAE,sBAAsB,EAAE,IAAI,EAAE,EAChC,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,SAAS;oBAAE,OAAM;gBACrB,kFAAkF;gBAClF,sFAAsF;gBACtF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;oBACnC,aAAa,CAAC,GAAG,CAAC,CAAA;oBAClB,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBACnC,IAAI,SAAS;4BAAE,OAAM;wBACrB,KAAK,CAAC,GAAG,CAAC,CAAA;oBACZ,CAAC,CAAC,CAAA;gBACJ,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,iFAAiF;oBACjF,aAAa,CAAC,GAAG,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,SAAS;oBAAE,OAAM;gBACrB,KAAK,CAAC,GAAG,CAAC,CAAA;YACZ,CAAC,CACF,CAAA;YACD,OAAO,GAAG,EAAE;gBACV,SAAS,GAAG,IAAI,CAAA;gBAChB,WAAW,EAAE,CAAA;YACf,CAAC,CAAA;QACH,CAAC;QAED,OAAO,CAAC,WAAW,CAAC;aACjB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,SAAS;gBAAE,OAAM;YACrB,aAAa,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YACpB,IAAI,SAAS;gBAAE,OAAM;YACrB,KAAK,CAAC,GAAG,CAAC,CAAA;QACZ,CAAC,CAAC,CAAA;QAEJ,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAA;IAElE,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAA;IACtC,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,MAAM,CAAC,UAAU,CAAA;IAClE,MAAM,WAAW,GAAG,UAAU,IAAI,WAAW,GAAG,CAAC,CAAA;IAEjD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,UAAU,CAAC,OAAO,GAAG,MAAM,CAAA;QAC3B,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC/F,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEpC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,CAAC,WAAW;YAAE,OAAM;QACxB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAChD,UAAU,CAAC,OAAO,GAAG,UAAU,CAAA;QAC/B,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACnD,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,IAAI,MAAM,EAAE,CAAC;YACX,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/F,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;YAC5B,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;IAExC,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO;QACP,WAAW;QACX,OAAO;QACP,WAAW;QACX,IAAI,EAAE;YACJ,IAAI;YACJ,GAAG,MAAM;YACT,WAAW;SACZ;KACF,CAAA;AACH,CAAC,CAAA;AAED,eAAe,aAAa,CAAA"}
@@ -1,2 +1,3 @@
1
1
  import usePagination from './App';
2
2
  export default usePagination;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,OAAO,CAAA;eAElB,aAAa"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,OAAO,CAAA;AAEjC,eAAe,aAAa,CAAA"}
package/package.json CHANGED
@@ -1,55 +1,70 @@
1
- {
2
- "name": "react-firebase-pagination",
3
- "version": "1.1.14",
4
- "main": "./dist/cjs/index.js",
5
- "module": "./dist/esm/index.js",
6
- "types": "./dist/esm/index.d.ts",
7
- "author": "Chirag Codealchemy",
8
- "license": "MIT",
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/chirag-codealchemy/react-firebase-pagination.git"
12
- },
13
- "scripts": {
14
- "build": "yarn build:esm && yarn build:cjs",
15
- "build:esm": "tsc",
16
- "build:cjs": "tsc --module commonjs --outDir dist/cjs",
17
- "lint": "eslint \"{**/*,*}.{js,ts,jsx,tsx}\"",
18
- "prettier": "prettier --write \"src/**.{js,ts,jsx,tsx}\"",
19
- "prepare": "yarn build",
20
- "prepublishOnly": "yarn prettier && yarn lint"
21
- },
22
- "peerDependencies": {
23
- "firebase": ">=9",
24
- "react": ">=16"
25
- },
26
- "files": [
27
- "dist",
28
- "LICENSE",
29
- "README.md"
30
- ],
31
- "keywords": [
32
- "react",
33
- "firebase",
34
- "pagination",
35
- "firebase pagination",
36
- "firebase-pagination",
37
- "react firebase pagination",
38
- "react-firebase-pagination"
39
- ],
40
- "devDependencies": {
41
- "@types/react": "^18.2.8",
42
- "@typescript-eslint/eslint-plugin": "^5.59.8",
43
- "@typescript-eslint/parser": "^5.59.8",
44
- "eslint": "^8.42.0",
45
- "eslint-config-prettier": "^8.8.0",
46
- "eslint-plugin-prettier": "^4.2.1",
47
- "eslint-plugin-react": "^7.32.2",
48
- "eslint-plugin-react-hooks": "^4.6.0",
49
- "firebase": "^9",
50
- "prettier": "^2.8.8",
51
- "react": "^18.2.0",
52
- "react-dom": "^18.2.0",
53
- "typescript": "5.1.3"
54
- }
55
- }
1
+ {
2
+ "name": "react-firebase-pagination",
3
+ "version": "2.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "author": "Chirag Patel",
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/Chirag7096/react-firebase-pagination.git"
20
+ },
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "lint": "eslint .",
24
+ "prettier": "prettier --write \"src/**/*.{js,ts,jsx,tsx}\"",
25
+ "prepare": "bun run build",
26
+ "prepublishOnly": "bun prettier && bun lint",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "peerDependencies": {
30
+ "firebase": ">=9",
31
+ "react": ">=16"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "LICENSE",
36
+ "README.md"
37
+ ],
38
+ "keywords": [
39
+ "expo",
40
+ "next",
41
+ "react",
42
+ "firebase",
43
+ "pagination",
44
+ "firebase pagination",
45
+ "firebase-pagination",
46
+ "expo firebase pagination",
47
+ "expo-firebase-pagination",
48
+ "next-firebase-pagination",
49
+ "next firebase pagination",
50
+ "react firebase pagination",
51
+ "react-firebase-pagination"
52
+ ],
53
+ "devDependencies": {
54
+ "@babel/core": "^8.0.6",
55
+ "@babel/eslint-parser": "^7.29.9",
56
+ "@babel/preset-typescript": "^8.0.1",
57
+ "@eslint/js": "^10.0.1",
58
+ "@types/react": "^19.3.0",
59
+ "eslint": "^9",
60
+ "eslint-config-prettier": "^10.1.8",
61
+ "eslint-plugin-prettier": "^5.5.6",
62
+ "eslint-plugin-react-hooks": "^7.1.1",
63
+ "firebase": "^12.19.0",
64
+ "globals": "^17.12.0",
65
+ "prettier": "^3.9.8",
66
+ "react": "^19.3.0",
67
+ "react-dom": "^19.3.0",
68
+ "typescript": "7.0.2"
69
+ }
70
+ }
package/dist/cjs/App.d.ts DELETED
@@ -1,23 +0,0 @@
1
- import { Query, QueryDocumentSnapshot } from 'firebase/firestore';
2
- type data = {
3
- totalDocs: number;
4
- totalPages: number;
5
- currentPage: number;
6
- docs: QueryDocumentSnapshot[];
7
- };
8
- type hookReturnValue = {
9
- data: data;
10
- error?: Error;
11
- loading: boolean;
12
- getNext: () => void;
13
- getPrevious: () => void;
14
- };
15
- type hookProps = {
16
- query: Query;
17
- pageSize: number;
18
- pageByPage: boolean;
19
- liveUpdate: boolean;
20
- };
21
- type usePaginateType = (props: hookProps) => hookReturnValue;
22
- declare const usePagination: usePaginateType;
23
- export default usePagination;
package/dist/cjs/App.js DELETED
@@ -1,83 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- var tslib_1 = require("tslib");
4
- var react_1 = require("react");
5
- var firestore_1 = require("firebase/firestore");
6
- var addQuery = function (q, fun, value) {
7
- return value ? (0, firestore_1.query)(q, fun(value)) : q;
8
- };
9
- var usePagination = function (_a) {
10
- var _b = _a.pageSize, pageSize = _b === void 0 ? 10 : _b, mainQuery = _a.query, _c = _a.pageByPage, pageByPage = _c === void 0 ? false : _c, _d = _a.liveUpdate, liveUpdate = _d === void 0 ? false : _d;
11
- var _e = (0, react_1.useState)(), error = _e[0], setError = _e[1];
12
- var _f = (0, react_1.useState)(false), loading = _f[0], setLoading = _f[1];
13
- var _g = (0, react_1.useState)([]), docs = _g[0], setDocs = _g[1];
14
- var _h = (0, react_1.useState)([]), lastSnap = _h[0], setLastSnap = _h[1];
15
- var _j = (0, react_1.useState)(addQuery(mainQuery, firestore_1.limit, pageSize)), query = _j[0], setQuery = _j[1];
16
- var _k = (0, react_1.useState)({
17
- totalDocs: 0,
18
- totalPages: 0,
19
- }), totals = _k[0], setTotals = _k[1];
20
- var onRes = function (res) {
21
- if (res.docs.length) {
22
- setLastSnap(function (e) { return tslib_1.__spreadArray(tslib_1.__spreadArray([], e, true), [res.docs[pageSize - 1]], false); });
23
- setDocs(function (e) { return (pageByPage ? res.docs : tslib_1.__spreadArray(tslib_1.__spreadArray([], e, true), res.docs, true)); });
24
- }
25
- setLoading(false);
26
- };
27
- var onErr = function (err) {
28
- setError(err);
29
- setLoading(false);
30
- };
31
- (0, react_1.useEffect)(function () {
32
- setLoading(true);
33
- if (liveUpdate) {
34
- var unsubscribe = (0, firestore_1.onSnapshot)(query, onRes, onErr);
35
- return unsubscribe;
36
- }
37
- else {
38
- (0, firestore_1.getDocs)(query).then(onRes).catch(onErr);
39
- return function () { return null; };
40
- }
41
- // eslint-disable-next-line react-hooks/exhaustive-deps
42
- }, [query]);
43
- (0, react_1.useEffect)(function () {
44
- setLoading(true);
45
- (0, firestore_1.getCountFromServer)(mainQuery).then(function (res) {
46
- setQuery(addQuery(mainQuery, firestore_1.limit, pageSize));
47
- setTotals({
48
- totalDocs: res.data().count,
49
- totalPages: Math.ceil(res.data().count / pageSize),
50
- });
51
- });
52
- }, [mainQuery, pageSize, pageByPage]);
53
- var getLastEle = function (array) { return array[array.length - 1]; };
54
- var getNext = function () {
55
- if (lastSnap.length < totals.totalPages) {
56
- var q = addQuery(mainQuery, firestore_1.startAfter, getLastEle(lastSnap));
57
- q = addQuery(q, firestore_1.limit, pageSize);
58
- setQuery(q);
59
- }
60
- };
61
- var getPrevious = function () {
62
- if (pageByPage && lastSnap.length > 1) {
63
- var newArray = lastSnap.slice(0, -2);
64
- setLastSnap(newArray);
65
- var q = addQuery(mainQuery, firestore_1.startAfter, getLastEle(newArray));
66
- q = addQuery(q, firestore_1.limit, pageSize);
67
- setQuery(q);
68
- }
69
- };
70
- return (0, react_1.useMemo)(function () { return ({
71
- error: error,
72
- loading: loading,
73
- getNext: getNext,
74
- getPrevious: getPrevious,
75
- hasNext: lastSnap.length < totals.totalPages,
76
- hasPrevious: pageByPage ? 1 < lastSnap.length : false,
77
- data: tslib_1.__assign(tslib_1.__assign({ docs: docs }, totals), { currentPage: lastSnap.length }),
78
- }); },
79
- // eslint-disable-next-line react-hooks/exhaustive-deps
80
- [docs]);
81
- };
82
- exports.default = usePagination;
83
- //# sourceMappingURL=App.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import usePagination from './App';
2
- export default usePagination;
package/dist/cjs/index.js DELETED
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- var tslib_1 = require("tslib");
4
- var App_1 = tslib_1.__importDefault(require("./App"));
5
- exports.default = App_1.default;
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,sDAAiC;AAEjC,kBAAe,aAAa,CAAA"}
package/dist/esm/App.d.ts DELETED
@@ -1,23 +0,0 @@
1
- import { Query, QueryDocumentSnapshot } from 'firebase/firestore';
2
- type data = {
3
- totalDocs: number;
4
- totalPages: number;
5
- currentPage: number;
6
- docs: QueryDocumentSnapshot[];
7
- };
8
- type hookReturnValue = {
9
- data: data;
10
- error?: Error;
11
- loading: boolean;
12
- getNext: () => void;
13
- getPrevious: () => void;
14
- };
15
- type hookProps = {
16
- query: Query;
17
- pageSize: number;
18
- pageByPage: boolean;
19
- liveUpdate: boolean;
20
- };
21
- type usePaginateType = (props: hookProps) => hookReturnValue;
22
- declare const usePagination: usePaginateType;
23
- export default usePagination;
package/dist/esm/App.js DELETED
@@ -1,81 +0,0 @@
1
- import { __assign, __spreadArray } from "tslib";
2
- import { useState, useEffect, useMemo } from 'react';
3
- import { query, limit, getDocs, startAfter, onSnapshot, getCountFromServer, } from 'firebase/firestore';
4
- var addQuery = function (q, fun, value) {
5
- return value ? query(q, fun(value)) : q;
6
- };
7
- var usePagination = function (_a) {
8
- var _b = _a.pageSize, pageSize = _b === void 0 ? 10 : _b, mainQuery = _a.query, _c = _a.pageByPage, pageByPage = _c === void 0 ? false : _c, _d = _a.liveUpdate, liveUpdate = _d === void 0 ? false : _d;
9
- var _e = useState(), error = _e[0], setError = _e[1];
10
- var _f = useState(false), loading = _f[0], setLoading = _f[1];
11
- var _g = useState([]), docs = _g[0], setDocs = _g[1];
12
- var _h = useState([]), lastSnap = _h[0], setLastSnap = _h[1];
13
- var _j = useState(addQuery(mainQuery, limit, pageSize)), query = _j[0], setQuery = _j[1];
14
- var _k = useState({
15
- totalDocs: 0,
16
- totalPages: 0,
17
- }), totals = _k[0], setTotals = _k[1];
18
- var onRes = function (res) {
19
- if (res.docs.length) {
20
- setLastSnap(function (e) { return __spreadArray(__spreadArray([], e, true), [res.docs[pageSize - 1]], false); });
21
- setDocs(function (e) { return (pageByPage ? res.docs : __spreadArray(__spreadArray([], e, true), res.docs, true)); });
22
- }
23
- setLoading(false);
24
- };
25
- var onErr = function (err) {
26
- setError(err);
27
- setLoading(false);
28
- };
29
- useEffect(function () {
30
- setLoading(true);
31
- if (liveUpdate) {
32
- var unsubscribe = onSnapshot(query, onRes, onErr);
33
- return unsubscribe;
34
- }
35
- else {
36
- getDocs(query).then(onRes).catch(onErr);
37
- return function () { return null; };
38
- }
39
- // eslint-disable-next-line react-hooks/exhaustive-deps
40
- }, [query]);
41
- useEffect(function () {
42
- setLoading(true);
43
- getCountFromServer(mainQuery).then(function (res) {
44
- setQuery(addQuery(mainQuery, limit, pageSize));
45
- setTotals({
46
- totalDocs: res.data().count,
47
- totalPages: Math.ceil(res.data().count / pageSize),
48
- });
49
- });
50
- }, [mainQuery, pageSize, pageByPage]);
51
- var getLastEle = function (array) { return array[array.length - 1]; };
52
- var getNext = function () {
53
- if (lastSnap.length < totals.totalPages) {
54
- var q = addQuery(mainQuery, startAfter, getLastEle(lastSnap));
55
- q = addQuery(q, limit, pageSize);
56
- setQuery(q);
57
- }
58
- };
59
- var getPrevious = function () {
60
- if (pageByPage && lastSnap.length > 1) {
61
- var newArray = lastSnap.slice(0, -2);
62
- setLastSnap(newArray);
63
- var q = addQuery(mainQuery, startAfter, getLastEle(newArray));
64
- q = addQuery(q, limit, pageSize);
65
- setQuery(q);
66
- }
67
- };
68
- return useMemo(function () { return ({
69
- error: error,
70
- loading: loading,
71
- getNext: getNext,
72
- getPrevious: getPrevious,
73
- hasNext: lastSnap.length < totals.totalPages,
74
- hasPrevious: pageByPage ? 1 < lastSnap.length : false,
75
- data: __assign(__assign({ docs: docs }, totals), { currentPage: lastSnap.length }),
76
- }); },
77
- // eslint-disable-next-line react-hooks/exhaustive-deps
78
- [docs]);
79
- };
80
- export default usePagination;
81
- //# sourceMappingURL=App.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,OAAO,CAAA;AAEjC,eAAe,aAAa,CAAA"}
File without changes