react-use-pagination
Version:
A React hook to help manage pagination state
8 lines (7 loc) • 9.32 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/getPaginationMeta.ts", "../src/usePagination.ts", "../src/paginationStateReducer.ts", "../src/Pagination.tsx"],
"sourcesContent": ["export const getPreviousEnabled = (currentPage: number): boolean => currentPage > 0;\n\nexport const getNextEnabled = (currentPage: number, totalPages: number): boolean =>\n currentPage + 1 < totalPages;\n\nexport const getTotalPages = (totalItems: number, pageSize: number): number =>\n Math.ceil(totalItems / pageSize);\n\nexport const getStartIndex = (pageSize: number, currentPage: number): number =>\n pageSize * currentPage;\n\nexport const getEndIndex = (pageSize: number, currentPage: number, totalItems: number): number => {\n const lastPageEndIndex = pageSize * (currentPage + 1);\n\n if (lastPageEndIndex > totalItems) {\n return totalItems - 1;\n }\n\n return lastPageEndIndex - 1;\n};\n\nexport const limitPageBounds =\n (totalItems: number, pageSize: number) =>\n (page: number): number =>\n Math.min(Math.max(page, 0), getTotalPages(totalItems, pageSize) - 1);\n\nexport type PaginationState = {\n totalItems: number;\n pageSize: number;\n currentPage: number;\n};\n\nexport type PaginationMeta = {\n totalPages: number;\n startIndex: number;\n endIndex: number;\n previousEnabled: boolean;\n nextEnabled: boolean;\n};\n\nexport const getPaginationMeta = ({\n totalItems,\n pageSize,\n currentPage,\n}: PaginationState): PaginationMeta => {\n const totalPages = getTotalPages(totalItems, pageSize);\n return {\n totalPages,\n startIndex: getStartIndex(pageSize, currentPage),\n endIndex: getEndIndex(pageSize, currentPage, totalItems),\n previousEnabled: getPreviousEnabled(currentPage),\n nextEnabled: getNextEnabled(currentPage, totalPages),\n };\n};\n", "import { useCallback, useEffect, useMemo, useRef, useReducer } from \"react\";\nimport { getPaginationMeta, PaginationState, PaginationMeta } from \"./getPaginationMeta\";\nimport { paginationStateReducer } from \"./paginationStateReducer\";\n\ntype UsePaginationConfig = {\n totalItems?: number;\n initialPage?: number;\n initialPageSize?: number;\n};\n\ntype PaginationActions = {\n setPage: (page: number) => void;\n setNextPage: () => void;\n setPreviousPage: () => void;\n setPageSize: (pageSize: number, nextPage?: number) => void;\n};\n\nexport function usePagination({\n totalItems = 0,\n initialPage = 0,\n initialPageSize = 0,\n}: UsePaginationConfig = {}): PaginationState & PaginationMeta & PaginationActions {\n const initialState = {\n totalItems,\n pageSize: initialPageSize,\n currentPage: initialPage,\n };\n\n const [paginationState, dispatch] = useReducer(paginationStateReducer, initialState);\n\n const totalItemsRef = useRef(totalItems);\n totalItemsRef.current = totalItems;\n\n useEffect(() => {\n return () => {\n if (typeof totalItemsRef.current !== \"number\" || totalItems === totalItemsRef.current) {\n return;\n }\n\n dispatch({ type: \"SET_TOTALITEMS\", totalItems: totalItemsRef.current });\n };\n }, [totalItems]);\n\n return {\n ...paginationState,\n ...useMemo(() => getPaginationMeta(paginationState), [paginationState]),\n setPage: useCallback((page: number) => {\n dispatch({\n type: \"SET_PAGE\",\n page,\n });\n }, []),\n setNextPage: useCallback(() => {\n dispatch({ type: \"NEXT_PAGE\" });\n }, []),\n setPreviousPage: useCallback(() => {\n dispatch({ type: \"PREVIOUS_PAGE\" });\n }, []),\n setPageSize: useCallback((pageSize: number, nextPage = 0) => {\n dispatch({ type: \"SET_PAGESIZE\", pageSize, nextPage });\n }, []),\n };\n}\n", "import { limitPageBounds, PaginationState } from \"./getPaginationMeta\";\n\ntype CurrentPageActions =\n | { type: \"NEXT_PAGE\" }\n | { type: \"PREVIOUS_PAGE\" }\n | { type: \"SET_PAGE\"; page: number };\n\ntype TotalItemsActions = {\n type: \"SET_TOTALITEMS\";\n totalItems: number;\n nextPage?: number;\n};\n\ntype PageSizeActions = {\n type: \"SET_PAGESIZE\";\n pageSize: number;\n nextPage?: number;\n};\n\ntype PaginationStateReducerActions = CurrentPageActions | TotalItemsActions | PageSizeActions;\n\nconst getCurrentPageReducer = (rootState: PaginationState) =>\n function currentPageReducer(\n state: PaginationState[\"currentPage\"],\n action: PaginationStateReducerActions\n ) {\n switch (action.type) {\n case \"SET_PAGE\":\n return limitPageBounds(rootState.totalItems, rootState.pageSize)(action.page);\n case \"NEXT_PAGE\":\n return limitPageBounds(rootState.totalItems, rootState.pageSize)(state + 1);\n case \"PREVIOUS_PAGE\":\n return limitPageBounds(rootState.totalItems, rootState.pageSize)(state - 1);\n case \"SET_PAGESIZE\":\n return limitPageBounds(\n rootState.totalItems,\n action.pageSize\n )(action.nextPage ?? state);\n case \"SET_TOTALITEMS\":\n return limitPageBounds(\n action.totalItems,\n rootState.pageSize\n )(action.nextPage ?? state);\n /* istanbul ignore next */\n default:\n return state;\n }\n };\n\nfunction totalItemsReducer(state: PaginationState[\"totalItems\"], action: TotalItemsActions) {\n switch (action.type) {\n case \"SET_TOTALITEMS\":\n return action.totalItems;\n default:\n return state;\n }\n}\n\nfunction pageSizeReducer(state: PaginationState[\"pageSize\"], action: PageSizeActions) {\n switch (action.type) {\n case \"SET_PAGESIZE\":\n return action.pageSize;\n default:\n return state;\n }\n}\n\nexport function paginationStateReducer(\n state: PaginationState,\n action: PaginationStateReducerActions\n): PaginationState {\n return {\n currentPage: getCurrentPageReducer(state)(state.currentPage, action as CurrentPageActions),\n totalItems: totalItemsReducer(state.totalItems, action as TotalItemsActions),\n pageSize: pageSizeReducer(state.pageSize, action as PageSizeActions),\n };\n}\n", "import { ReactNode } from \"react\";\n\nimport { usePagination } from \"./usePagination\";\n\ntype PaginationProps = {\n children: (arg0: ReturnType<typeof usePagination>) => ReactNode;\n totalItems?: number;\n initialPage?: number;\n initialPageSize: number;\n};\n\nfunction Pagination({\n children,\n totalItems = 0,\n initialPage = 0,\n initialPageSize,\n}: PaginationProps) {\n return children(usePagination({ totalItems, initialPage, initialPageSize }));\n}\n\nPagination.displayName = \"Pagination\";\n\nexport { Pagination };\n"],
"mappings": "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",
"names": []
}