Add perPage, initialPage
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
56
src/store.js
56
src/store.js
@@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user