Fix auto scroll (#1644)

This commit is contained in:
Dawid Tarasiuk 2021-12-06 15:41:18 +01:00 committed by GitHub
parent e2c05e7dd6
commit f111081331
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 136 additions and 134 deletions

View file

@ -15,7 +15,7 @@ import {
CategoryUrlQueryParams CategoryUrlQueryParams
} from "./urls"; } from "./urls";
import { CategoryCreateView } from "./views/CategoryCreate"; import { CategoryCreateView } from "./views/CategoryCreate";
import CategoryDetailsView, { getActiveTab } from "./views/CategoryDetails"; import CategoryDetailsView from "./views/CategoryDetails";
import CategoryListComponent from "./views/CategoryList"; import CategoryListComponent from "./views/CategoryList";
interface CategoryDetailsRouteParams { interface CategoryDetailsRouteParams {
@ -25,10 +25,7 @@ const CategoryDetails: React.FC<RouteComponentProps<
CategoryDetailsRouteParams CategoryDetailsRouteParams
>> = ({ location, match }) => { >> = ({ location, match }) => {
const qs = parseQs(location.search.substr(1)); const qs = parseQs(location.search.substr(1));
const params: CategoryUrlQueryParams = { const params: CategoryUrlQueryParams = qs;
...qs,
activeTab: getActiveTab(qs.activeTab)
};
return ( return (
<CategoryDetailsView <CategoryDetailsView

View file

@ -10,7 +10,6 @@ import {
Sort, Sort,
TabActionDialog TabActionDialog
} from "../types"; } from "../types";
import { CategoryPageTab } from "./components/CategoryUpdatePage";
const categorySectionUrl = "/categories/"; const categorySectionUrl = "/categories/";
@ -40,10 +39,7 @@ export type CategoryUrlDialog =
| "delete" | "delete"
| "delete-categories" | "delete-categories"
| "delete-products"; | "delete-products";
export type CategoryUrlQueryParams = BulkAction & export type CategoryUrlQueryParams = BulkAction & Dialog<CategoryUrlDialog>;
Dialog<CategoryUrlDialog> &
Pagination &
ActiveTab<CategoryPageTab>;
export const categoryUrl = (id: string, params?: CategoryUrlQueryParams) => export const categoryUrl = (id: string, params?: CategoryUrlQueryParams) =>
categoryPath(encodeURIComponent(id)) + "?" + stringifyQs(params); categoryPath(encodeURIComponent(id)) + "?" + stringifyQs(params);

View file

@ -4,11 +4,11 @@ import ActionDialog from "@saleor/components/ActionDialog";
import NotFoundPage from "@saleor/components/NotFoundPage"; import NotFoundPage from "@saleor/components/NotFoundPage";
import { WindowTitle } from "@saleor/components/WindowTitle"; import { WindowTitle } from "@saleor/components/WindowTitle";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useLocalPaginator, {
useSectionLocalPaginationState
} from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import { commonMessages, errorMessages } from "@saleor/intl"; import { commonMessages, errorMessages } from "@saleor/intl";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler"; import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
@ -18,7 +18,7 @@ import {
usePrivateMetadataUpdate usePrivateMetadataUpdate
} from "@saleor/utils/metadata/updateMetadata"; } from "@saleor/utils/metadata/updateMetadata";
import { getParsedDataForJsonStringField } from "@saleor/utils/richText/misc"; import { getParsedDataForJsonStringField } from "@saleor/utils/richText/misc";
import React from "react"; import React, { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import { PAGINATE_BY } from "../../config"; import { PAGINATE_BY } from "../../config";
@ -65,7 +65,6 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
}) => { }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -73,7 +72,19 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
const [updateMetadata] = useMetadataUpdate({}); const [updateMetadata] = useMetadataUpdate({});
const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
const paginationState = createPaginationState(PAGINATE_BY, params); const [activeTab, setActiveTab] = useState<CategoryPageTab>(
CategoryPageTab.categories
);
const [paginationState, setPaginationState] = useSectionLocalPaginationState(
PAGINATE_BY,
activeTab
);
const paginate = useLocalPaginator(setPaginationState);
const changeTab = (tab: CategoryPageTab) => {
reset();
setActiveTab(tab);
};
const { data, loading, refetch } = useCategoryDetailsQuery({ const { data, loading, refetch } = useCategoryDetailsQuery({
displayLoader: true, displayLoader: true,
variables: { ...paginationState, id } variables: { ...paginationState, id }
@ -155,26 +166,16 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
} }
}); });
const changeTab = (tabName: CategoryPageTab) => {
reset();
navigate(
categoryUrl(id, {
activeTab: tabName
})
);
};
const [openModal, closeModal] = createDialogActionHandlers< const [openModal, closeModal] = createDialogActionHandlers<
CategoryUrlDialog, CategoryUrlDialog,
CategoryUrlQueryParams CategoryUrlQueryParams
>(navigate, params => categoryUrl(id, params), params); >(navigate, params => categoryUrl(id, params), params);
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
params.activeTab === CategoryPageTab.categories activeTab === CategoryPageTab.categories
? maybe(() => data.category.children.pageInfo) ? maybe(() => data.category.children.pageInfo)
: maybe(() => data.category.products.pageInfo), : maybe(() => data.category.products.pageInfo),
paginationState, paginationState
params
); );
const handleUpdate = async (formData: CategoryUpdateData) => { const handleUpdate = async (formData: CategoryUpdateData) => {
@ -208,7 +209,7 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
<WindowTitle title={maybe(() => data.category.name)} /> <WindowTitle title={maybe(() => data.category.name)} />
<CategoryUpdatePage <CategoryUpdatePage
changeTab={changeTab} changeTab={changeTab}
currentTab={params.activeTab} currentTab={activeTab}
category={maybe(() => data.category)} category={maybe(() => data.category)}
disabled={loading} disabled={loading}
errors={updateResult.data?.categoryUpdate.errors || []} errors={updateResult.data?.categoryUpdate.errors || []}

View file

@ -44,9 +44,7 @@ export type CollectionUrlDialog =
| "assign" | "assign"
| "unassign" | "unassign"
| ChannelsAction; | ChannelsAction;
export type CollectionUrlQueryParams = BulkAction & export type CollectionUrlQueryParams = BulkAction & Dialog<CollectionUrlDialog>;
Pagination &
Dialog<CollectionUrlDialog>;
export type CollectionCreateUrlQueryParams = Dialog<ChannelsAction>; export type CollectionCreateUrlQueryParams = Dialog<ChannelsAction>;
export const collectionUrl = (id: string, params?: CollectionUrlQueryParams) => export const collectionUrl = (id: string, params?: CollectionUrlQueryParams) =>
collectionPath(encodeURIComponent(id)) + "?" + stringifyQs(params); collectionPath(encodeURIComponent(id)) + "?" + stringifyQs(params);

View file

@ -12,12 +12,12 @@ import { WindowTitle } from "@saleor/components/WindowTitle";
import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "@saleor/config"; import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "@saleor/config";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useChannels from "@saleor/hooks/useChannels"; import useChannels from "@saleor/hooks/useChannels";
import useLocalPaginator, {
useLocalPaginationState
} from "@saleor/hooks/useLocalPaginator";
import useLocalStorage from "@saleor/hooks/useLocalStorage"; import useLocalStorage from "@saleor/hooks/useLocalStorage";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import { commonMessages, errorMessages } from "@saleor/intl"; import { commonMessages, errorMessages } from "@saleor/intl";
import useProductSearch from "@saleor/searches/useProductSearch"; import useProductSearch from "@saleor/searches/useProductSearch";
import { arrayDiff } from "@saleor/utils/arrays"; import { arrayDiff } from "@saleor/utils/arrays";
@ -67,7 +67,6 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
const paginate = usePaginator();
const intl = useIntl(); const intl = useIntl();
const { search, loadMore, result } = useProductSearch({ const { search, loadMore, result } = useProductSearch({
variables: DEFAULT_INITIAL_SEARCH_DATA variables: DEFAULT_INITIAL_SEARCH_DATA
@ -158,7 +157,11 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
} }
}); });
const paginationState = createPaginationState(PAGINATE_BY, params); const [paginationState, setPaginationState] = useLocalPaginationState(
PAGINATE_BY
);
const paginate = useLocalPaginator(setPaginationState);
const handleBack = () => navigate(collectionListUrl()); const handleBack = () => navigate(collectionListUrl());
const [selectedChannel] = useLocalStorage("collectionListChannel", ""); const [selectedChannel] = useLocalStorage("collectionListChannel", "");
@ -255,8 +258,7 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
data?.collection?.products?.pageInfo, data?.collection?.products?.pageInfo,
paginationState, paginationState
params
); );
return ( return (

View file

@ -59,16 +59,6 @@ export enum SaleDetailsPageTab {
variants = "variants" variants = "variants"
} }
export function saleDetailsPageTab(tab: string): SaleDetailsPageTab {
return tab === SaleDetailsPageTab.products
? SaleDetailsPageTab.products
: tab === SaleDetailsPageTab.collections
? SaleDetailsPageTab.collections
: tab === SaleDetailsPageTab.categories
? SaleDetailsPageTab.categories
: SaleDetailsPageTab.variants;
}
export interface SaleDetailsPageProps export interface SaleDetailsPageProps
extends Pick<ListProps, Exclude<keyof ListProps, "onRowClick">>, extends Pick<ListProps, Exclude<keyof ListProps, "onRowClick">>,
TabListActions< TabListActions<

View file

@ -52,14 +52,6 @@ export enum VoucherDetailsPageTab {
products = "products" products = "products"
} }
export function voucherDetailsPageTab(tab: string): VoucherDetailsPageTab {
return tab === VoucherDetailsPageTab.products
? VoucherDetailsPageTab.products
: tab === VoucherDetailsPageTab.collections
? VoucherDetailsPageTab.collections
: VoucherDetailsPageTab.categories;
}
export interface VoucherDetailsPageFormData extends MetadataFormData { export interface VoucherDetailsPageFormData extends MetadataFormData {
applyOncePerCustomer: boolean; applyOncePerCustomer: boolean;
applyOncePerOrder: boolean; applyOncePerOrder: boolean;

View file

@ -6,8 +6,6 @@ import { useIntl } from "react-intl";
import { Route, RouteComponentProps, Switch } from "react-router-dom"; import { Route, RouteComponentProps, Switch } from "react-router-dom";
import { WindowTitle } from "../components/WindowTitle"; import { WindowTitle } from "../components/WindowTitle";
import { saleDetailsPageTab } from "./components/SaleDetailsPage";
import { voucherDetailsPageTab } from "./components/VoucherDetailsPage";
import { import {
saleAddPath, saleAddPath,
SaleCreateUrlQueryParams, SaleCreateUrlQueryParams,
@ -41,11 +39,8 @@ const SaleDetailsView: React.FC<RouteComponentProps<{ id: string }>> = ({
match, match,
location location
}) => { }) => {
const { activeTab, ...qs } = parseQs(location.search.substr(1)); const qs = parseQs(location.search.substr(1));
const params: SaleUrlQueryParams = { const params: SaleUrlQueryParams = qs;
...qs,
activeTab: saleDetailsPageTab(activeTab)
};
return ( return (
<SaleDetailsViewComponent <SaleDetailsViewComponent
@ -76,11 +71,9 @@ const VoucherDetailsView: React.FC<RouteComponentProps<{ id: string }>> = ({
match, match,
location location
}) => { }) => {
const { activeTab, ...qs } = parseQs(location.search.substr(1)); const qs = parseQs(location.search.substr(1));
const params: VoucherUrlQueryParams = { const params: VoucherUrlQueryParams = qs;
...qs,
activeTab: voucherDetailsPageTab(activeTab)
};
return ( return (
<VoucherDetailsViewComponent <VoucherDetailsViewComponent
id={decodeURIComponent(match.params.id)} id={decodeURIComponent(match.params.id)}

View file

@ -12,8 +12,6 @@ import {
Sort, Sort,
TabActionDialog TabActionDialog
} from "../types"; } from "../types";
import { SaleDetailsPageTab } from "./components/SaleDetailsPage";
import { VoucherDetailsPageTab } from "./components/VoucherDetailsPage";
export const discountSection = "/discounts/"; export const discountSection = "/discounts/";
@ -60,10 +58,7 @@ export type SaleUrlDialog =
| "unassign-variant" | "unassign-variant"
| "remove" | "remove"
| ChannelsAction; | ChannelsAction;
export type SaleUrlQueryParams = Pagination & export type SaleUrlQueryParams = BulkAction & Dialog<SaleUrlDialog>;
BulkAction &
Dialog<SaleUrlDialog> &
ActiveTab<SaleDetailsPageTab>;
export type SaleCreateUrlQueryParams = Dialog<ChannelsAction>; export type SaleCreateUrlQueryParams = Dialog<ChannelsAction>;
export const saleUrl = (id: string, params?: SaleUrlQueryParams) => export const saleUrl = (id: string, params?: SaleUrlQueryParams) =>
salePath(encodeURIComponent(id)) + "?" + stringifyQs(params); salePath(encodeURIComponent(id)) + "?" + stringifyQs(params);
@ -117,10 +112,7 @@ export type VoucherUrlDialog =
| "unassign-product" | "unassign-product"
| "remove" | "remove"
| ChannelsAction; | ChannelsAction;
export type VoucherUrlQueryParams = Pagination & export type VoucherUrlQueryParams = BulkAction & Dialog<VoucherUrlDialog>;
BulkAction &
Dialog<VoucherUrlDialog> &
ActiveTab<VoucherDetailsPageTab>;
export type VoucherCreateUrlQueryParams = Dialog<ChannelsAction>; export type VoucherCreateUrlQueryParams = Dialog<ChannelsAction>;
export const voucherUrl = (id: string, params?: VoucherUrlQueryParams) => export const voucherUrl = (id: string, params?: VoucherUrlQueryParams) =>
voucherPath(encodeURIComponent(id)) + "?" + stringifyQs(params); voucherPath(encodeURIComponent(id)) + "?" + stringifyQs(params);

View file

@ -37,12 +37,12 @@ import {
} from "@saleor/discounts/urls"; } from "@saleor/discounts/urls";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useChannels from "@saleor/hooks/useChannels"; import useChannels from "@saleor/hooks/useChannels";
import useLocalPaginator, {
useSectionLocalPaginationState
} from "@saleor/hooks/useLocalPaginator";
import useLocalStorage from "@saleor/hooks/useLocalStorage"; import useLocalStorage from "@saleor/hooks/useLocalStorage";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import { maybe } from "@saleor/misc"; import { maybe } from "@saleor/misc";
import { productUrl, productVariantEditPath } from "@saleor/products/urls"; import { productUrl, productVariantEditPath } from "@saleor/products/urls";
@ -56,7 +56,7 @@ import {
useMetadataUpdate, useMetadataUpdate,
usePrivateMetadataUpdate usePrivateMetadataUpdate
} from "@saleor/utils/metadata/updateMetadata"; } from "@saleor/utils/metadata/updateMetadata";
import React from "react"; import React, { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import { createUpdateHandler } from "./handlers"; import { createUpdateHandler } from "./handlers";
@ -71,7 +71,6 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
const [updateMetadata] = useMetadataUpdate({}); const [updateMetadata] = useMetadataUpdate({});
const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const notify = useNotifier(); const notify = useNotifier();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
@ -101,14 +100,17 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
const { availableChannels } = useAppChannel(false); const { availableChannels } = useAppChannel(false);
const paginationState = createPaginationState(PAGINATE_BY, params); const [activeTab, setActiveTab] = useState<SaleDetailsPageTab>(
SaleDetailsPageTab.categories
);
const [paginationState, setPaginationState] = useSectionLocalPaginationState(
PAGINATE_BY,
activeTab
);
const paginate = useLocalPaginator(setPaginationState);
const changeTab = (tab: SaleDetailsPageTab) => { const changeTab = (tab: SaleDetailsPageTab) => {
reset(); reset();
navigate( setActiveTab(tab);
saleUrl(id, {
activeTab: tab
})
);
}; };
const { data, loading } = useSaleDetails({ const { data, loading } = useSaleDetails({
@ -210,11 +212,11 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
<TypedSaleDelete onCompleted={handleSaleDelete}> <TypedSaleDelete onCompleted={handleSaleDelete}>
{(saleDelete, saleDeleteOpts) => { {(saleDelete, saleDeleteOpts) => {
const tabPageInfo = const tabPageInfo =
params.activeTab === SaleDetailsPageTab.categories activeTab === SaleDetailsPageTab.categories
? maybe(() => data.sale.categories.pageInfo) ? maybe(() => data.sale.categories.pageInfo)
: params.activeTab === SaleDetailsPageTab.collections : activeTab === SaleDetailsPageTab.collections
? maybe(() => data.sale.collections.pageInfo) ? maybe(() => data.sale.collections.pageInfo)
: params.activeTab === SaleDetailsPageTab.products : activeTab === SaleDetailsPageTab.products
? maybe(() => data.sale.products.pageInfo) ? maybe(() => data.sale.products.pageInfo)
: maybe(() => data.sale.variants.pageInfo); : maybe(() => data.sale.variants.pageInfo);
@ -266,7 +268,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
loadNextPage, loadNextPage,
loadPreviousPage, loadPreviousPage,
pageInfo pageInfo
} = paginate(tabPageInfo, paginationState, params); } = paginate(tabPageInfo, paginationState);
const handleUpdate = createUpdateHandler( const handleUpdate = createUpdateHandler(
data?.sale, data?.sale,
@ -335,7 +337,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
navigate( navigate(
productVariantEditPath(productId, variantId) productVariantEditPath(productId, variantId)
)} )}
activeTab={params.activeTab} activeTab={activeTab}
onBack={() => navigate(saleListUrl())} onBack={() => navigate(saleListUrl())}
onTabClick={changeTab} onTabClick={changeTab}
onSubmit={handleSubmit} onSubmit={handleSubmit}

View file

@ -36,11 +36,11 @@ import {
} from "@saleor/discounts/urls"; } from "@saleor/discounts/urls";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useChannels from "@saleor/hooks/useChannels"; import useChannels from "@saleor/hooks/useChannels";
import useLocalPaginator, {
useSectionLocalPaginationState
} from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import useShop from "@saleor/hooks/useShop"; import useShop from "@saleor/hooks/useShop";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import useCategorySearch from "@saleor/searches/useCategorySearch"; import useCategorySearch from "@saleor/searches/useCategorySearch";
@ -54,7 +54,7 @@ import {
useMetadataUpdate, useMetadataUpdate,
usePrivateMetadataUpdate usePrivateMetadataUpdate
} from "@saleor/utils/metadata/updateMetadata"; } from "@saleor/utils/metadata/updateMetadata";
import React, { useMemo } from "react"; import React, { useMemo, useState } from "react";
import { FormattedMessage, useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import { categoryUrl } from "../../../categories/urls"; import { categoryUrl } from "../../../categories/urls";
@ -73,7 +73,6 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
params params
}) => { }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const notify = useNotifier(); const notify = useNotifier();
const shop = useShop(); const shop = useShop();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
@ -104,14 +103,17 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
const [updateMetadata] = useMetadataUpdate({}); const [updateMetadata] = useMetadataUpdate({});
const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
const paginationState = createPaginationState(PAGINATE_BY, params); const [activeTab, setActiveTab] = useState<VoucherDetailsPageTab>(
VoucherDetailsPageTab.categories
);
const [paginationState, setPaginationState] = useSectionLocalPaginationState(
PAGINATE_BY,
activeTab
);
const paginate = useLocalPaginator(setPaginationState);
const changeTab = (tab: VoucherDetailsPageTab) => { const changeTab = (tab: VoucherDetailsPageTab) => {
reset(); reset();
navigate( setActiveTab(tab);
voucherUrl(id, {
activeTab: tab
})
);
}; };
const { data, loading } = useVoucherDetails({ const { data, loading } = useVoucherDetails({
@ -246,10 +248,9 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
); );
const tabPageInfo = const tabPageInfo =
params.activeTab === VoucherDetailsPageTab.categories activeTab === VoucherDetailsPageTab.categories
? maybe(() => data.voucher.categories.pageInfo) ? maybe(() => data.voucher.categories.pageInfo)
: params.activeTab === : activeTab === VoucherDetailsPageTab.collections
VoucherDetailsPageTab.collections
? maybe(() => data.voucher.collections.pageInfo) ? maybe(() => data.voucher.collections.pageInfo)
: maybe(() => data.voucher.products.pageInfo); : maybe(() => data.voucher.products.pageInfo);
@ -290,7 +291,7 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
loadNextPage, loadNextPage,
loadPreviousPage, loadPreviousPage,
pageInfo pageInfo
} = paginate(tabPageInfo, paginationState, params); } = paginate(tabPageInfo, paginationState);
return ( return (
<> <>
@ -379,7 +380,7 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
} }
onProductClick={id => () => onProductClick={id => () =>
navigate(productUrl(id))} navigate(productUrl(id))}
activeTab={params.activeTab} activeTab={activeTab}
onBack={() => navigate(voucherListUrl())} onBack={() => navigate(voucherListUrl())}
onTabClick={changeTab} onTabClick={changeTab}
onSubmit={handleSubmit} onSubmit={handleSubmit}

View file

@ -14,6 +14,11 @@ export interface PaginationState {
last?: number; last?: number;
} }
/**
* Local pagination state.
* @param paginateBy Number of items per page.
* @returns Pagination state and setter.
*/
export function useLocalPaginationState( export function useLocalPaginationState(
paginateBy: number paginateBy: number
): [PaginationState, (paginationState: PaginationState) => void] { ): [PaginationState, (paginationState: PaginationState) => void] {
@ -46,6 +51,39 @@ export function useLocalPaginationState(
return [state, setPaginationState]; return [state, setPaginationState];
} }
/**
* Local pagination state persisted as long as section is not changed.
* @param paginateBy Number of items per page.
* @param section Section name. When changed, pagination state is reset.
* @returns Pagination state and setter.
*/
export function useSectionLocalPaginationState(
paginateBy: number,
section: string
): [PaginationState, (paginationState: PaginationState) => void] {
const [paginationSection, setPaginationSection] = useState(section);
const [paginationState, setPaginationState] = useLocalPaginationState(
paginateBy
);
useEffect(() => {
if (section !== paginationSection) {
setPaginationState({});
}
}, [section]);
useEffect(() => {
if (section !== paginationSection) {
setPaginationSection(section);
}
}, [paginationState]);
return [
section === paginationSection ? paginationState : {},
setPaginationState
];
}
function useLocalPaginator( function useLocalPaginator(
setPaginationState: (paginationState: PaginationState) => void setPaginationState: (paginationState: PaginationState) => void
) { ) {

View file

@ -16,7 +16,7 @@ function useNavigator(): UseNavigatorResult {
return ( return (
url: string, url: string,
{ replace = false, preserveQs = false, resetScroll = true } = {} { replace = false, preserveQs = false, resetScroll = false } = {}
) => { ) => {
const targetUrl = preserveQs ? url + search : url; const targetUrl = preserveQs ? url + search : url;
if (replace) { if (replace) {

View file

@ -52,7 +52,7 @@ function usePaginator() {
after: pageInfo.endCursor, after: pageInfo.endCursor,
before: undefined before: undefined
}), }),
{ replace: true } { replace: true, resetScroll: true }
); );
const loadPreviousPage = () => const loadPreviousPage = () =>
@ -63,7 +63,7 @@ function usePaginator() {
after: undefined, after: undefined,
before: pageInfo.startCursor before: pageInfo.startCursor
}), }),
{ replace: true } { replace: true, resetScroll: true }
); );
const newPageInfo = pageInfo const newPageInfo = pageInfo

View file

@ -34,8 +34,7 @@ export type ShippingZoneUrlQueryParams = Dialog<ShippingZoneUrlDialog> &
SingleAction & SingleAction &
Partial<{ Partial<{
type: ShippingMethodTypeEnum; type: ShippingMethodTypeEnum;
}> & }>;
Pagination;
export const shippingZoneUrl = ( export const shippingZoneUrl = (
id: string, id: string,
params?: ShippingZoneUrlQueryParams params?: ShippingZoneUrlQueryParams
@ -50,8 +49,7 @@ export type ShippingRateUrlDialog =
export type ShippingRateUrlQueryParams = Dialog<ShippingRateUrlDialog> & export type ShippingRateUrlQueryParams = Dialog<ShippingRateUrlDialog> &
SingleAction & SingleAction &
BulkAction & BulkAction;
Pagination;
export type ShippingRateCreateUrlDialog = ZipCodeRangeActions | ChannelsAction; export type ShippingRateCreateUrlDialog = ZipCodeRangeActions | ChannelsAction;
export type ShippingRateCreateUrlQueryParams = Dialog< export type ShippingRateCreateUrlQueryParams = Dialog<
ShippingRateCreateUrlDialog ShippingRateCreateUrlDialog

View file

@ -9,11 +9,11 @@ import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
import { PAGINATE_BY } from "@saleor/config"; import { PAGINATE_BY } from "@saleor/config";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useChannels from "@saleor/hooks/useChannels"; import useChannels from "@saleor/hooks/useChannels";
import useLocalPaginator, {
useLocalPaginationState
} from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import { sectionNames } from "@saleor/intl"; import { sectionNames } from "@saleor/intl";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { import {
@ -80,9 +80,11 @@ export const PriceRatesUpdate: React.FC<PriceRatesUpdateProps> = ({
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const intl = useIntl(); const intl = useIntl();
const paginate = usePaginator();
const paginationState = createPaginationState(PAGINATE_BY, params); const [paginationState, setPaginationState] = useLocalPaginationState(
PAGINATE_BY
);
const paginate = useLocalPaginator(setPaginationState);
const { data, loading, refetch } = useShippingZone({ const { data, loading, refetch } = useShippingZone({
displayLoader: true, displayLoader: true,
@ -110,8 +112,7 @@ export const PriceRatesUpdate: React.FC<PriceRatesUpdateProps> = ({
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
rate?.excludedProducts.pageInfo, rate?.excludedProducts.pageInfo,
paginationState, paginationState
params
); );
const [ const [

View file

@ -4,9 +4,9 @@ import useAppChannel from "@saleor/components/AppLayout/AppChannelContext";
import NotFoundPage from "@saleor/components/NotFoundPage"; import NotFoundPage from "@saleor/components/NotFoundPage";
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
import { PAGINATE_BY } from "@saleor/config"; import { PAGINATE_BY } from "@saleor/config";
import { useLocalPaginationState } from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { createPaginationState } from "@saleor/hooks/usePaginator";
import useShop from "@saleor/hooks/useShop"; import useShop from "@saleor/hooks/useShop";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; import { getById } from "@saleor/orders/components/OrderReturnPage/utils";
@ -61,7 +61,7 @@ const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
const intl = useIntl(); const intl = useIntl();
const shop = useShop(); const shop = useShop();
const paginationState = createPaginationState(PAGINATE_BY, params); const [paginationState] = useLocalPaginationState(PAGINATE_BY);
const { result: searchWarehousesOpts, loadMore, search } = useWarehouseSearch( const { result: searchWarehousesOpts, loadMore, search } = useWarehouseSearch(
{ {

View file

@ -9,11 +9,11 @@ import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
import { PAGINATE_BY } from "@saleor/config"; import { PAGINATE_BY } from "@saleor/config";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useChannels from "@saleor/hooks/useChannels"; import useChannels from "@saleor/hooks/useChannels";
import useLocalPaginator, {
useLocalPaginationState
} from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import { sectionNames } from "@saleor/intl"; import { sectionNames } from "@saleor/intl";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { import {
@ -80,9 +80,11 @@ export const WeightRatesUpdate: React.FC<WeightRatesUpdateProps> = ({
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const intl = useIntl(); const intl = useIntl();
const paginate = usePaginator();
const paginationState = createPaginationState(PAGINATE_BY, params); const [paginationState, setPaginationState] = useLocalPaginationState(
PAGINATE_BY
);
const paginate = useLocalPaginator(setPaginationState);
const { data, loading, refetch } = useShippingZone({ const { data, loading, refetch } = useShippingZone({
displayLoader: true, displayLoader: true,
@ -159,8 +161,7 @@ export const WeightRatesUpdate: React.FC<WeightRatesUpdateProps> = ({
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
rate?.excludedProducts.pageInfo, rate?.excludedProducts.pageInfo,
paginationState, paginationState
params
); );
const [ const [