Skip to content

Commit 66ef649

Browse files
committed
fix: smooth loop + draggable carousel
1 parent 3f3d293 commit 66ef649

File tree

5 files changed

+91
-79
lines changed

5 files changed

+91
-79
lines changed

components/Header/header.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import Heading from '../Typography/heading';
33
import Paragraph from '../Typography/paragraph';
44
import Button from '../Buttons/button';
5-
import ReactSlider from '../Slider/slider';
5+
import EmblaCarousel from '../Slider/slider';
66
import cities from '../../config/city-lists.json';
77
import Venue from '../Venue/venue';
88
import Announcement from '../announcement';
@@ -11,6 +11,10 @@ import { useMediaQuery } from 'react-responsive';
1111

1212
function Header() {
1313
const isMobile = useMediaQuery({ maxWidth: '590px' });
14+
const SLIDES = cities.map((city) => {
15+
return <Venue key={city.name} city={city}/>;
16+
})
17+
1418
return (
1519
<div className='relative'>
1620
<div className='container w-full flex items-center justify-center'>
@@ -46,11 +50,7 @@ function Header() {
4650
</div>
4751
</div>
4852
<div className='mt-24'>
49-
<ReactSlider>
50-
{cities.map((city) => {
51-
return <Venue key={city.name} city={city}/>;
52-
})}
53-
</ReactSlider>
53+
<EmblaCarousel slides={SLIDES} />
5454
</div>
5555
</div>
5656
);

components/Slider/slider.js

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,44 @@
1-
import Slider from 'react-slick';
2-
import Arrow from '../illustration/arrow';
3-
import React, { useEffect, useState, useRef } from 'react';
1+
import React, { useCallback, useEffect, useState } from 'react'
2+
import useEmblaCarousel from 'embla-carousel-react'
3+
import AutoScroll from 'embla-carousel-auto-scroll'
44
import { useMediaQuery } from 'react-responsive';
55

6-
function ReactSlider({ children }) {
6+
7+
function EmblaCarousel({ slides }) {
78
const isMobile = useMediaQuery({ maxWidth: '590px' });
8-
const [slides, setSlides] = useState(1);
9+
10+
const scrollOptions = {
11+
playOnInit: true,
12+
stopOnInteraction: false,
13+
stopOnMouseEnter: true,
14+
startDelay: 200,
15+
speed: 1
16+
}
917

10-
useEffect(() => {
11-
if (isMobile) {
12-
setSlides(1);
13-
}
14-
}, [isMobile]);
15-
const slider = useRef(null);
16-
const settings = {
17-
slidesToScroll: slides,
18-
infinite: true,
19-
autoplay: true,
20-
speed: 10000,
21-
autoplaySpeed: 0,
22-
centerMode: true,
23-
cssEase: 'linear',
24-
variableWidth: isMobile ? false : true,
25-
arrows: false,
26-
};
18+
const options = {
19+
loop: true,
20+
dragFree: true
21+
}
22+
23+
const [emblaRef] = useEmblaCarousel({ ...options }, [
24+
AutoScroll({ ...scrollOptions })
25+
]);
2726

2827
return (
2928
<>
30-
{ children.length > 4 || isMobile ?
31-
(<Slider ref={slider} {...settings}>
32-
{children}
33-
</Slider>):(
34-
<div className='flex m-2 justify-center'>{children}</div>)}
35-
</>
29+
{slides.length > 4 || isMobile ? (
30+
<div className="embla" ref={emblaRef}>
31+
<div className="embla__container">
32+
{slides.map((item, idx) => (
33+
<div className="embla__slide" key={`embla__slide_${idx}`}>{item}</div>
34+
))}
35+
</div>
36+
</div>
37+
) : (
38+
<div className='flex m-2 justify-center'>{slides}</div>
39+
)}
40+
</>
3641
);
3742
}
3843

39-
export default ReactSlider;
44+
export default EmblaCarousel;

package-lock.json

Lines changed: 38 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
"@googleapis/sheets": "^7.0.0",
1818
"axios": "^1.7.4",
1919
"d3": "^7.8.5",
20+
"embla-carousel-auto-scroll": "^8.5.1",
21+
"embla-carousel-react": "^8.5.1",
2022
"lucide-react": "^0.350.0",
2123
"net": "^1.0.2",
2224
"next": "^14.2.10",
@@ -32,7 +34,6 @@
3234
"react-hot-toast": "^2.4.1",
3335
"react-responsive": "^9.0.0",
3436
"react-select": "^5.7.5",
35-
"react-slick": "^0.29.0",
3637
"react-youtube-embed": "^1.0.3",
3738
"slick-carousel": "^1.8.1"
3839
},

styles/globals.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ body {
6969
bottom: 0 !important;
7070
}
7171

72+
.embla {
73+
overflow: hidden;
74+
}
75+
.embla__container {
76+
display: flex;
77+
}
78+
.embla__slide {
79+
flex: 0 0 75%;
80+
min-width: 0;
81+
}
82+
7283
.gradient-bg {
7384
background-image: linear-gradient(225deg, #2DCCFD 9.35%, #AD20E2 88.41%) !important;
7485
-webkit-mask-image: linear-gradient(45deg,#000 25%,rgba(0,0,0,.2) 50%,#000 75%);

0 commit comments

Comments
 (0)