{
  "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": []
}
