From de85bb806faaf9b91f54b6a1e302d3c0b93da300 Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 9 Sep 2021 12:35:57 +0300 Subject: [PATCH] #69 : Fix showPage logic fot non infinite case --- src/components/Carousel/Carousel.svelte | 35 +++++++++++++++++++++---- src/utils/page.js | 13 +++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/components/Carousel/Carousel.svelte b/src/components/Carousel/Carousel.svelte index 1b50a77..ad2e6d1 100644 --- a/src/components/Carousel/Carousel.svelte +++ b/src/components/Carousel/Carousel.svelte @@ -23,6 +23,7 @@ getClonesCount, getPartialPageSize, getScrollsCount, + getPageIndexByScrollIndex, } from '../../utils/page' import { get } from '../../utils/object' import { ProgressManager } from '../../utils/ProgressManager' @@ -60,6 +61,7 @@ * Page to start on */ export let initialPageIndex = 0 + $: initialScrollIndex = initialPageIndex /** * Transition duration (ms) @@ -116,11 +118,19 @@ export let pagesToScroll = 1 export async function goTo(pageIndex, options) { + const scrollIndex = pageIndex const animated = get(options, 'animated', true) - if (typeof pageIndex !== 'number') { + if (typeof scrollIndex !== 'number') { throw new Error('pageIndex should be a number') } - await showPage(pageIndex * pagesToScroll + clonesCount.head, { animated }) + await showPage(getPageIndexByScrollIndex({ + infinite, + scrollIndex, + clonesCountHead: clonesCount.head, + pagesToScroll, + pagesCount, + pagesToShow, + }), { animated }) } export async function goToPrev(options) { @@ -269,9 +279,17 @@ await tick() infinite && addClones() - // TODO: validate initialPageIndex, initialPageIndex is an initialScrollIndex - store.init(initialPageIndex * pagesToScroll + clonesCount.head) initPageSizes() + + // TODO: validate initialScrollIndex + store.init(getPageIndexByScrollIndex({ + infinite, + scrollIndex: initialScrollIndex, + clonesCountHead: clonesCount.head, + pagesToScroll, + pagesCount, + pagesToShow, + })) } addResizeEventListener(initPageSizes) @@ -284,7 +302,14 @@ }) async function handlePageChange(pageIndex) { - await showPage(pageIndex * pagesToScroll + clonesCount.head) + await showPage(getPageIndexByScrollIndex({ + infinite, + scrollIndex: pageIndex, + clonesCountHead: clonesCount.head, + pagesToScroll, + pagesCount, + pagesToShow, + })) } function offsetPage(options) { diff --git a/src/utils/page.js b/src/utils/page.js index b8840f9..38aa44f 100644 --- a/src/utils/page.js +++ b/src/utils/page.js @@ -219,3 +219,16 @@ export function getScrollsCount({ ? Math.ceil(pagesCountWithoutClones / pagesToScroll) : Math.round(pagesCountWithoutClones / pagesToScroll) } + +export function getPageIndexByScrollIndex({ + infinite, + scrollIndex, + clonesCountHead, + pagesToScroll, + pagesCount, + pagesToShow, +}) { + return infinite + ? clonesCountHead + scrollIndex * pagesToScroll + : Math.min(scrollIndex * pagesToScroll, pagesCount - pagesToShow) +}