|
1 |
| -import { Component, For, createEffect, createSignal } from 'solid-js' |
| 1 | +import { Component, For, Show, createEffect, createSignal } from 'solid-js' |
2 | 2 | import { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel'
|
3 |
| -import createEmblaCarousel from 'embla-carousel-solid' |
| 3 | +import useEmblaCarousel from 'embla-carousel-solid' |
4 | 4 | import { DotButton, NextButton, PrevButton } from './Buttons'
|
5 | 5 |
|
6 | 6 | type PropType = {
|
7 | 7 | slides: number[]
|
| 8 | + isSsr: boolean |
8 | 9 | options?: EmblaOptionsType
|
9 | 10 | }
|
10 | 11 |
|
11 | 12 | export const EmblaCarousel: Component<PropType> = (props) => {
|
12 |
| - const [emblaRef, emblaApi] = createEmblaCarousel(() => props.options) |
13 |
| - const [prevBtnEnabled, setPrevBtnEnabled] = createSignal(false) |
14 |
| - const [nextBtnEnabled, setNextBtnEnabled] = createSignal(false) |
15 |
| - const [selectedIndex, setSelectedIndex] = createSignal(0) |
| 13 | + const [refAttached, setRefAttached] = createSignal(false) |
| 14 | + const [emblaRef, emblaApi, emblaServerApi] = useEmblaCarousel( |
| 15 | + () => props.options |
| 16 | + ) |
| 17 | + const [prevBtnEnabled, setPrevBtnEnabled] = createSignal( |
| 18 | + emblaServerApi.canScrollPrev() |
| 19 | + ) |
| 20 | + const [nextBtnEnabled, setNextBtnEnabled] = createSignal( |
| 21 | + emblaServerApi.canScrollNext() |
| 22 | + ) |
| 23 | + const [selectedIndex, setSelectedIndex] = createSignal( |
| 24 | + emblaServerApi.selectedSnap() |
| 25 | + ) |
16 | 26 | const [scrollSnaps, setScrollSnaps] = createSignal<number[]>([])
|
| 27 | + const [showSsr, setShowSsr] = createSignal(props.isSsr && !emblaApi()) |
17 | 28 |
|
18 | 29 | function scrollPrev(): void {
|
19 | 30 | emblaApi()?.scrollPrev()
|
@@ -46,20 +57,54 @@ export const EmblaCarousel: Component<PropType> = (props) => {
|
46 | 57 | api.on('reinit', onInit).on('reinit', onSelect).on('select', onSelect)
|
47 | 58 | })
|
48 | 59 |
|
| 60 | + setTimeout( |
| 61 | + () => { |
| 62 | + setRefAttached(true) |
| 63 | + setShowSsr(false) |
| 64 | + }, |
| 65 | + props.isSsr ? 2000 : 0 |
| 66 | + ) |
| 67 | + |
49 | 68 | return (
|
50 | 69 | <>
|
| 70 | + {showSsr() && ( |
| 71 | + <style id="embla-ssr-styles"> |
| 72 | + {emblaServerApi.ssrStyles('.embla__container', '.embla__slide')} |
| 73 | + </style> |
| 74 | + )} |
| 75 | + |
| 76 | + <div class="playground__ssr-text"> |
| 77 | + <strong>SSR:</strong> <span>{showSsr().toString()}</span> |
| 78 | + </div> |
| 79 | + |
51 | 80 | <div class="embla">
|
52 |
| - <div class="embla__viewport" ref={emblaRef}> |
53 |
| - <div class="embla__container"> |
54 |
| - <For each={props.slides}> |
55 |
| - {(slide) => ( |
56 |
| - <div class="embla__slide"> |
57 |
| - <div class="embla__slide__number">{slide + 1}</div> |
58 |
| - </div> |
59 |
| - )} |
60 |
| - </For> |
| 81 | + <Show when={!refAttached()}> |
| 82 | + <div class="embla__viewport"> |
| 83 | + <div class="embla__container"> |
| 84 | + <For each={props.slides}> |
| 85 | + {(slide) => ( |
| 86 | + <div class="embla__slide"> |
| 87 | + <div class="embla__slide__number">{slide + 1}</div> |
| 88 | + </div> |
| 89 | + )} |
| 90 | + </For> |
| 91 | + </div> |
61 | 92 | </div>
|
62 |
| - </div> |
| 93 | + </Show> |
| 94 | + |
| 95 | + <Show when={refAttached()}> |
| 96 | + <div class="embla__viewport" ref={emblaRef}> |
| 97 | + <div class="embla__container"> |
| 98 | + <For each={props.slides}> |
| 99 | + {(slide) => ( |
| 100 | + <div class="embla__slide"> |
| 101 | + <div class="embla__slide__number">{slide + 1}</div> |
| 102 | + </div> |
| 103 | + )} |
| 104 | + </For> |
| 105 | + </div> |
| 106 | + </div> |
| 107 | + </Show> |
63 | 108 |
|
64 | 109 | <div class="embla__controls">
|
65 | 110 | <div class="embla__buttons">
|
|
0 commit comments