Add actions

This commit is contained in:
Vadim
2021-04-20 12:21:42 +03:00
parent ac8b9c150f
commit 29d012dce0
2 changed files with 69 additions and 6 deletions

View File

@@ -5,6 +5,7 @@
import Arrow from '../Arrow/Arrow.svelte' import Arrow from '../Arrow/Arrow.svelte'
import { NEXT, PREV } from '../../direction' import { NEXT, PREV } from '../../direction'
import { swipeable } from '../../utils/swipeable' import { swipeable } from '../../utils/swipeable'
import { hoverable } from '../../utils/hoverable'
import { import {
addResizeEventListener, addResizeEventListener,
removeResizeEventListener removeResizeEventListener
@@ -76,6 +77,16 @@
let offset = 0 let offset = 0
let pageWindowElement let pageWindowElement
let pagesElement let pagesElement
let hovered = false
let autoplayIntervals = []
$: {
if (hovered) {
clearAutoplay()
} else {
applyAutoplay()
}
}
// used for lazy loading images, preloaded only current, adjacent and cloanable images // used for lazy loading images, preloaded only current, adjacent and cloanable images
$: loaded = getAdjacentIndexes(originalCurrentPageIndex, originalPagesCount, infinite) $: loaded = getAdjacentIndexes(originalCurrentPageIndex, originalPagesCount, infinite)
@@ -96,14 +107,16 @@
} }
function applyAutoplay() { function applyAutoplay() {
let interval
if (autoplay) { if (autoplay) {
interval = setInterval(() => { let autoplayInterval = setInterval(() => {
directionFnDescription[autoplayDirection]() directionFnDescription[autoplayDirection]()
}, autoplayDuration) }, autoplayDuration)
autoplayIntervals.push(autoplayInterval)
} }
return () => { }
interval && clearInterval(interval) function clearAutoplay() {
while(autoplayIntervals.length) {
clearInterval(autoplayIntervals.pop())
} }
} }
@@ -128,12 +141,13 @@
infinite && addClones() infinite && addClones()
applyPageSizes() applyPageSizes()
} }
cleanupFns.push(applyAutoplay()) applyAutoplay()
addResizeEventListener(applyPageSizes) addResizeEventListener(applyPageSizes)
})() })()
}) })
onDestroy(() => { onDestroy(() => {
clearAutoplay()
removeResizeEventListener(applyPageSizes) removeResizeEventListener(applyPageSizes)
cleanupFns.filter(fn => fn && typeof fn === 'function').forEach(fn => fn()) cleanupFns.filter(fn => fn && typeof fn === 'function').forEach(fn => fn())
}) })
@@ -198,8 +212,16 @@
function handleSwipeEnd() { function handleSwipeEnd() {
showPage(currentPageIndex, { offsetDelay: 0, animated: true }) showPage(currentPageIndex, { offsetDelay: 0, animated: true })
} }
function handleHovered(event) {
console.log('hovered', event.detail.value)
hovered = event.detail.value
}
</script> </script>
<div>
hovered={hovered}
</div>
<div class="sc-carousel__carousel-container"> <div class="sc-carousel__carousel-container">
<div class="sc-carousel__content-container"> <div class="sc-carousel__content-container">
{#if arrows} {#if arrows}
@@ -216,6 +238,8 @@
<div <div
class="sc-carousel__pages-window" class="sc-carousel__pages-window"
bind:this={pageWindowElement} bind:this={pageWindowElement}
use:hoverable
on:hovered={handleHovered}
> >
<div <div
class="sc-carousel__pages-container" class="sc-carousel__pages-container"

39
src/utils/hoverable.js Normal file
View File

@@ -0,0 +1,39 @@
import { createDispatcher } from './event'
export function hoverable(node) {
const dispatch = createDispatcher(node)
function handleMouseenter() {
dispatch('hovered', { value: true })
// node.addEventListener('mouseleave', handleMouseleave)
// node.addEventListener('touchend', handleMouseleave)
// node.addEventListener('touchcancel', handleMouseleave)
}
function handleMouseleave() {
dispatch('hovered', { value: false })
// node.removeEventListener('mouseleave', handleMouseleave)
// node.removeEventListener('touchend', handleMouseleave)
// node.removeEventListener('touchcancel', handleMouseleave)
}
node.addEventListener('mouseenter', handleMouseenter)
node.addEventListener('touchstart', handleMouseenter)
node.addEventListener('mouseleave', handleMouseleave)
node.addEventListener('touchend', handleMouseleave)
node.addEventListener('touchcancel', handleMouseleave)
return {
destroy() {
node.removeEventListener('mouseenter', handleMouseenter)
node.removeEventListener('touchstart', handleMouseenter)
node.removeEventListener('mouseleave', handleMouseleave)
node.removeEventListener('touchend', handleMouseleave)
node.removeEventListener('touchcancel', handleMouseleave)
},
}
}