Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ERM-3220 Update pagination mechanisms for MCLs to work without stats #680

Merged
merged 10 commits into from
May 17, 2024
1 change: 1 addition & 0 deletions lib/hooks/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export { default as useInterfaceCredentials } from './useInterfaceCredentials';
export { default as useSingleFetchInterfaceCredentials } from './useSingleFetchInterfaceCredentials';
export { default as useChunkedCQLFetch } from './useChunkedCQLFetch';
export { default as useChunkedUsers } from './useChunkedUsers';
export { default as useFetchCurrentAndNext } from './useFetchCurrentAndNext';
export { default as useParallelBatchFetch } from './useParallelBatchFetch';
export { default as usePrevNextPagination } from './usePrevNextPagination';
export { default as usePrevious } from './usePrevious';
Expand Down
57 changes: 57 additions & 0 deletions lib/hooks/useFetchCurrentAndNext.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { useMemo } from 'react';
import { useQueries } from 'react-query';
import { useOkapiKy } from '@folio/stripes/core';
import { generateKiwtQueryParams } from '@k-int/stripes-kint-components';

const defaultParams = { page: 1 };

const useFetchCurrentAndNext = ({
params = {},
path = '',
keyArray = [],
EthanFreestone marked this conversation as resolved.
Show resolved Hide resolved
} = {}) => {
const ky = useOkapiKy();
const queryArray = [];

// Apply defaultParams ensuring that 'page' is defaulted properly
const effectiveParams = useMemo(() => ({ ...defaultParams, ...params }), [params]);

const currentPageParams = useMemo(() => (
generateKiwtQueryParams(
{ ...effectiveParams },
{}
)
), [effectiveParams]);
queryArray.push({
queryKey: [
path,
...currentPageParams,
...keyArray
],
queryFn: () => ky.get(`${path}?${currentPageParams?.join('&')}`).json(),
});

const nextPageParams = useMemo(() => (
generateKiwtQueryParams(
{ ...effectiveParams, page: effectiveParams.page + 1 },
{}
)
), [effectiveParams]);
queryArray.push({
queryKey: [
path,
...nextPageParams,
...keyArray
],
queryFn: () => ky.get(`${path}?${nextPageParams?.join('&')}`).json(),
});

const queries = useQueries(queryArray);

return ({
currentPage: queries[0],
nextPage: queries[1],
});
};

export default useFetchCurrentAndNext;
8 changes: 6 additions & 2 deletions lib/hooks/usePrevNextPagination.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ import {

import useLocalPageStore from './useLocalPageStore';

// Currently there are several places in which this hook is used twice within the same component
// Once in order to get the current page, and again in order to handle changes to paginations
// This hook should be refactored in order to resolve these issue - @EthanFreestone
const usePrevNextPagination = ({
count = 0, // Only needed for reading back MCL props
defaultToPageOne = true, // A prop to allow the implementor to turn off the defaulting to page=1
pageSize = DEFAULT_PAGINATION_SIZE, // Only needed for reading back MCL props
id = DEFAULT_PAGE_KEY, // This id is ONLY used for syncToLocation: false cases, as a key to the zustand store
syncToLocation = true // Used to turn on/off location syncing, so can be used as standalone state if required
syncToLocation = true, // Used to turn on/off location syncing, so can be used as standalone state if required,
hasNextPage = null // Override for canGoNext, used in the case in which resources are fetched with no stats
} = {}) => {
/* ------ ZUSTAND STORE ------ */
// For NON-SYNC-TO-LOCATION use cases, store the currentPage in a keyed store
Expand Down Expand Up @@ -146,7 +150,7 @@ const usePrevNextPagination = ({
]);

// Set up MCL specific props based on page
const pagingCanGoNext = currentPage && currentPage < Number(count) / pageSize;
const pagingCanGoNext = hasNextPage ?? (currentPage && (currentPage < Number(count) / pageSize));
const pagingCanGoPrevious = currentPage && Number(currentPage) > 1;
const pagingOffset = currentPage ? (currentPage - 1) * pageSize : 0;
const onNeedMoreData = (...args) => {
Expand Down
Loading