Files
svelte-carousel/src/utils/lazy.js
2021-09-10 12:03:56 +03:00

62 lines
1.5 KiB
JavaScript

import { getValueInRange } from './math'
export function getIndexesOfPagesWithoutClonesInScroll({
scrollIndex,
pagesToShow,
pagesToScroll,
pagesCount,
}) {
const overlap = scrollIndex === 0 ? 0 : pagesToShow - pagesToScroll
const from = scrollIndex * pagesToShow - scrollIndex * overlap
const to = from + Math.max(pagesToShow, pagesToScroll) - 1
const indexes = []
for (let i=from; i<=Math.min(pagesCount - 1, to); i++) {
indexes.push(i)
}
return indexes
}
export function getAdjacentIndexes({
infinite,
scrollIndex,
scrollsCount,
pagesCount,
pagesToShow,
pagesToScroll,
}) {
const _scrollIndex = getValueInRange(0, scrollIndex, scrollsCount - 1)
let rangeStart = _scrollIndex - 1
let rangeEnd = _scrollIndex + 1
rangeStart = infinite
? rangeStart < 0 ? scrollsCount - 1 : rangeStart
: Math.max(0, rangeStart)
rangeEnd = infinite
? rangeEnd > scrollsCount - 1 ? 0 : rangeEnd
: Math.min(scrollsCount - 1, rangeEnd)
const scrollIndexes = [...new Set([
rangeStart,
_scrollIndex,
rangeEnd,
// because of these values outputs for infinite/non-infinites are the same
0, // needed to clone first scroll pages
scrollsCount - 1, // needed to clone last scroll pages
])].sort((a, b) => a - b)
const pageIndexes = scrollIndexes.flatMap(
scrollIndex => getIndexesOfPagesWithoutClonesInScroll({
scrollIndex,
pagesToShow,
pagesToScroll,
pagesCount,
})
)
return {
scrollIndexes,
pageIndexes: [...new Set(pageIndexes)].sort((a, b) => a - b),
}
}