webapp/src/components/Feed/Slider.tsx

86 lines
2.4 KiB
TypeScript
Raw Normal View History

2022-09-09 11:53:35 +00:00
import { ArticleCard } from './Card'
import { Swiper, Navigation, Pagination } from 'swiper'
import type { SwiperOptions } from 'swiper'
import 'swiper/scss'
import 'swiper/scss/navigation'
import 'swiper/scss/pagination'
import './Slider.scss'
import type { Shout } from '../../graphql/types.gen'
2022-10-31 16:40:55 +00:00
import { createEffect, createMemo, createSignal, Show, For } from 'solid-js'
2022-09-22 09:37:49 +00:00
import { Icon } from '../Nav/Icon'
2022-09-09 11:53:35 +00:00
interface SliderProps {
title?: string
articles: Shout[]
}
export default (props: SliderProps) => {
let el: HTMLDivElement | undefined
let pagEl: HTMLDivElement | undefined
let nextEl: HTMLDivElement | undefined
let prevEl: HTMLDivElement | undefined
const opts: SwiperOptions = {
2022-11-04 14:25:55 +00:00
roundLengths: true,
2022-09-09 11:53:35 +00:00
loop: true,
centeredSlides: true,
slidesPerView: 1,
spaceBetween: 8,
modules: [Navigation, Pagination],
speed: 500,
navigation: { nextEl, prevEl },
pagination: {
el: pagEl,
type: 'bullets',
clickable: true
},
breakpoints: {
768: {
slidesPerView: 1.66666
}
}
}
const [swiper, setSwiper] = createSignal<Swiper>()
createEffect(() => {
if (!swiper() && !!el) {
setTimeout(() => {
setSwiper(new Swiper(el, opts))
}, 500)
}
})
const articles = createMemo(() => props.articles)
return (
<div class="floor floor--important">
<div class="wide-container row">
<h2 class="col-12">{props.title}</h2>
<Show when={!!articles()}>
<div class="swiper" ref={el}>
<div class="swiper-wrapper">
<For each={articles()}>
{(a: Shout) => (
<ArticleCard
article={a}
2022-10-19 14:26:49 +00:00
settings={{
additionalClass: 'swiper-slide',
isFloorImportant: true,
isWithCover: true,
nodate: true
}}
2022-09-09 11:53:35 +00:00
/>
)}
</For>
</div>
<div class="slider-arrow-next" ref={nextEl} onClick={() => swiper()?.slideNext()}>
<Icon name="slider-arrow" />
</div>
<div class="slider-arrow-prev" ref={prevEl} onClick={() => swiper()?.slidePrev()}>
<Icon name="slider-arrow" />
</div>
<div class="slider-pagination" ref={pagEl} />
</div>
</Show>
</div>
</div>
)
}