Add perPage, initialPage

This commit is contained in:
Vadim
2021-01-21 19:56:57 +03:00
parent 59f118641c
commit 2dcbd79f2c
4 changed files with 59 additions and 64 deletions

View File

@@ -10,10 +10,6 @@
const id = generateId() const id = generateId()
onMount(() => { onMount(() => {
store.setItem(id) store.setItem(id)
// console.log(container)
return () => {
store.removeItem(id)
}
}) })
let isActive = false let isActive = false

View File

@@ -11,21 +11,28 @@
getIsNotCompletePage getIsNotCompletePage
} from './utils/size' } from './utils/size'
/** /**
* Enable Next/Prev arrows * Enable Next/Prev arrows
*/ */
export let arrows = true; export let arrows = true
/** /**
* Infinite looping * Infinite looping
*/ */
export let infinite = true; export let infinite = true
/**
export let perPage = 2; * Elements per page
*/
export let perPage = 2
/**
* Page to start on
*/
export let initialPage = 1
let pagesCount = 0
let contentContainerWidth = 0 let contentContainerWidth = 0
let contentContainerElement let contentContainerElement
let innerContentContainerElement let innerContentContainerElement
@@ -34,47 +41,47 @@
const children = innerContentContainerElement.children const children = innerContentContainerElement.children
contentContainerWidth = contentContainerElement.clientWidth contentContainerWidth = contentContainerElement.clientWidth
// TODO: add event listener on resize
const slidesCount = children.length const slidesCount = children.length
const pagesCount = getPagesCount({ slidesCount, perPage }) pagesCount = getPagesCount({ slidesCount, perPage })
const perPageTail = getPerPageTail({ pagesCount, perPage, slidesCount }) const perPageTail = getPerPageTail({ pagesCount, perPage, slidesCount })
let pageIndex = 0; // TODO: init value from params
for (let slideIndex=0; slideIndex<children.length; slideIndex++) { for (let slideIndex=0; slideIndex<children.length; slideIndex++) {
pageIndex = getPageIndex({ slideIndex, perPage }) const pageIndex = getPageIndex({ slideIndex, perPage })
const isNotCompletePage = getIsNotCompletePage({ pageIndex, pagesCount }) const isNotCompletePage = getIsNotCompletePage({ pageIndex, pagesCount })
const slideSizePx = getSlideSize({ isNotCompletePage, contentContainerWidth, perPage, perPageTail }) const slideSizePx = getSlideSize({ isNotCompletePage, contentContainerWidth, perPage, perPageTail })
children[slideIndex].style.minWidth = `${slideSizePx}px` children[slideIndex].style.minWidth = `${slideSizePx}px`
children[slideIndex].style.maxWidth = `${slideSizePx}px` children[slideIndex].style.maxWidth = `${slideSizePx}px`
store.setItem() // TODO: remove
} }
moveToPage(initialPage)
} }
onMount(() => { onMount(() => {
store.reset() // to init after hot reload store.reset() // to init after hot reload
store.setCurrentItemIndex(0) // to init index after hot reload, check one more time
applySlideSizes() applySlideSizes()
window.addEventListener('resize', applySlideSizes) window.addEventListener('resize', applySlideSizes)
return () => { return () => {
window.removeEventListener('resize', applySlideSizes) window.removeEventListener('resize', applySlideSizes)
} }
}) })
function moveToPage(pageIndex) {
store.moveToPage({ pageIndex, pagesCount })
applyOffset()
}
let offset let offset
function handlePrevClick() { function applyOffset() {
store.prev({ infinite, perPage })
offset = -$store.currentItemIndex * contentContainerWidth offset = -$store.currentItemIndex * contentContainerWidth
} }
function handlePrevClick() {
store.prev({ infinite, pagesCount })
applyOffset()
}
function handleNextClick() { function handleNextClick() {
store.next({ infinite, perPage }) store.next({ infinite, pagesCount })
offset = -$store.currentItemIndex * contentContainerWidth applyOffset()
} }
</script> </script>

View File

@@ -1,15 +1,11 @@
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
import { v4 as uuid } from 'uuid'
import { getNextItemIndexFn, getPrevItemIndexFn } from './utils/item-index' import { getNextItemIndexFn, getPrevItemIndexFn } from './utils/item-index'
// TODO: try to split writable store items // TODO: try to split writable store items
// or try to use immer // or try to use immer
const initState = { const initState = {
items: [],
// currentItemId: null,
currentItemIndex: null, currentItemIndex: null,
action: 'next'
} }
function createStore() { function createStore() {
@@ -19,17 +15,6 @@ function createStore() {
set(initState) 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) { function setCurrentItemIndex(index) {
update(store => ({ update(store => ({
...store, ...store,
@@ -37,49 +22,44 @@ function createStore() {
})) }))
} }
function removeItem(id) { function moveToPage({ pageIndex, pagesCount }) {
update(store => ({
...store,
items: store.items.filter(item => item !== id)
}))
}
function next({ infinite, perPage }) {
update(store => { 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 { return {
...store, ...store,
// currentItemId: store.items[newCurrentItemIndex], currentItemIndex: pageIndex < 0 ? 0 : Math.min(pageIndex, pagesCount - 1),
currentItemIndex: newCurrentItemIndex,
action: 'next'
} }
}) })
} }
function prev({ infinite, perPage }) { function next({ infinite, pagesCount }) {
update(store => { update(store => {
const currentItemIndex = store.currentItemIndex // store.items.findIndex(item => item === store.currentItemId) const currentItemIndex = store.currentItemIndex
const newCurrentItemIndex = getPrevItemIndexFn(infinite)(currentItemIndex, Math.ceil(store.items.length / perPage)) 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 { return {
...store, ...store,
// currentItemId: store.items[newCurrentItemIndex],
currentItemIndex: newCurrentItemIndex, currentItemIndex: newCurrentItemIndex,
action: 'prev'
} }
}) })
} }
return { return {
subscribe, subscribe,
setItem,
removeItem,
next, next,
prev, prev,
setCurrentItemIndex, setCurrentItemIndex,
reset reset,
moveToPage,
}; };
} }

View File

@@ -11,12 +11,24 @@
* Infinite looping * Infinite looping
*/ */
export let infinite = true; export let infinite = true;
/**
* Elements per page
*/
export let perPage = 2;
/**
* Page to start on
*/
export let initialPage = 1
</script> </script>
<div class="main-container"> <div class="main-container">
<ImageCarousel <ImageCarousel
{arrows} {arrows}
{infinite} {infinite}
{perPage}
{initialPage}
> >
<div <div
class="child-content-container" class="child-content-container"