From 2dcbd79f2c7f079abc0b06f85558ed9097fb68ae Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 21 Jan 2021 19:56:57 +0300 Subject: [PATCH] Add perPage, initialPage --- src/CarouselChild.svelte | 4 -- src/ImageCarousel.svelte | 51 ++++++++++++++----------- src/store.js | 56 +++++++++------------------- src/stories/ImageCarouselView.svelte | 12 ++++++ 4 files changed, 59 insertions(+), 64 deletions(-) diff --git a/src/CarouselChild.svelte b/src/CarouselChild.svelte index d43e876..d6092bd 100644 --- a/src/CarouselChild.svelte +++ b/src/CarouselChild.svelte @@ -10,10 +10,6 @@ const id = generateId() onMount(() => { store.setItem(id) - // console.log(container) - return () => { - store.removeItem(id) - } }) let isActive = false diff --git a/src/ImageCarousel.svelte b/src/ImageCarousel.svelte index 97d5737..57d25c9 100644 --- a/src/ImageCarousel.svelte +++ b/src/ImageCarousel.svelte @@ -11,21 +11,28 @@ getIsNotCompletePage } from './utils/size' - /** * Enable Next/Prev arrows */ - export let arrows = true; + export let arrows = true /** * Infinite looping */ - export let infinite = true; - - - export let perPage = 2; + export let infinite = true + + /** + * Elements per page + */ + export let perPage = 2 + + /** + * Page to start on + */ + export let initialPage = 1 + let pagesCount = 0 let contentContainerWidth = 0 let contentContainerElement let innerContentContainerElement @@ -34,47 +41,47 @@ const children = innerContentContainerElement.children contentContainerWidth = contentContainerElement.clientWidth - // TODO: add event listener on resize const slidesCount = children.length - const pagesCount = getPagesCount({ slidesCount, perPage }) + pagesCount = getPagesCount({ slidesCount, perPage }) const perPageTail = getPerPageTail({ pagesCount, perPage, slidesCount }) - let pageIndex = 0; // TODO: init value from params for (let slideIndex=0; slideIndex { store.reset() // to init after hot reload - store.setCurrentItemIndex(0) // to init index after hot reload, check one more time applySlideSizes() window.addEventListener('resize', applySlideSizes) - - return () => { window.removeEventListener('resize', applySlideSizes) } - - }) + function moveToPage(pageIndex) { + store.moveToPage({ pageIndex, pagesCount }) + applyOffset() + } + let offset - function handlePrevClick() { - store.prev({ infinite, perPage }) + function applyOffset() { offset = -$store.currentItemIndex * contentContainerWidth } + + function handlePrevClick() { + store.prev({ infinite, pagesCount }) + applyOffset() + } function handleNextClick() { - store.next({ infinite, perPage }) - offset = -$store.currentItemIndex * contentContainerWidth + store.next({ infinite, pagesCount }) + applyOffset() } diff --git a/src/store.js b/src/store.js index eebb4ba..b8b9e0c 100644 --- a/src/store.js +++ b/src/store.js @@ -1,15 +1,11 @@ import { writable } from 'svelte/store'; -import { v4 as uuid } from 'uuid' import { getNextItemIndexFn, getPrevItemIndexFn } from './utils/item-index' // TODO: try to split writable store items // or try to use immer const initState = { - items: [], - // currentItemId: null, currentItemIndex: null, - action: 'next' } function createStore() { @@ -19,17 +15,6 @@ function createStore() { set(initState) } - function setItem(id = uuid()) { - update(store => ({ - ...store, - // currentItemId: id, // TODO: seems is not used at all, can be removed - items: [ - ...store.items, - id - ] - })) - } - function setCurrentItemIndex(index) { update(store => ({ ...store, @@ -37,49 +22,44 @@ function createStore() { })) } - function removeItem(id) { - update(store => ({ - ...store, - items: store.items.filter(item => item !== id) - })) - } - - function next({ infinite, perPage }) { + function moveToPage({ pageIndex, pagesCount }) { update(store => { - const currentItemIndex = store.currentItemIndex // store.items.findIndex(item => item === store.currentItemId) - // console.log('next old currentItemIndex', currentItemIndex) - const newCurrentItemIndex = getNextItemIndexFn(infinite)(currentItemIndex, Math.ceil(store.items.length / perPage)) - // console.log('newCurrentItemIndex', newCurrentItemIndex) return { ...store, - // currentItemId: store.items[newCurrentItemIndex], - currentItemIndex: newCurrentItemIndex, - action: 'next' + currentItemIndex: pageIndex < 0 ? 0 : Math.min(pageIndex, pagesCount - 1), } }) } - function prev({ infinite, perPage }) { + function next({ infinite, pagesCount }) { update(store => { - const currentItemIndex = store.currentItemIndex // store.items.findIndex(item => item === store.currentItemId) - const newCurrentItemIndex = getPrevItemIndexFn(infinite)(currentItemIndex, Math.ceil(store.items.length / perPage)) + const currentItemIndex = store.currentItemIndex + const newCurrentItemIndex = getNextItemIndexFn(infinite)(currentItemIndex, pagesCount) + return { + ...store, + currentItemIndex: newCurrentItemIndex, + } + }) + } + + function prev({ infinite, pagesCount }) { + update(store => { + const currentItemIndex = store.currentItemIndex + const newCurrentItemIndex = getPrevItemIndexFn(infinite)(currentItemIndex, pagesCount) return { ...store, - // currentItemId: store.items[newCurrentItemIndex], currentItemIndex: newCurrentItemIndex, - action: 'prev' } }) } return { subscribe, - setItem, - removeItem, next, prev, setCurrentItemIndex, - reset + reset, + moveToPage, }; } diff --git a/src/stories/ImageCarouselView.svelte b/src/stories/ImageCarouselView.svelte index 02dd89d..61f4ed2 100644 --- a/src/stories/ImageCarouselView.svelte +++ b/src/stories/ImageCarouselView.svelte @@ -11,12 +11,24 @@ * Infinite looping */ export let infinite = true; + + /** + * Elements per page + */ + export let perPage = 2; + + /** + * Page to start on + */ + export let initialPage = 1