202 lines
7.9 KiB
JavaScript

'use client'
import React, { useState, useEffect } from 'react';
import Link from "next/link";
import { Autoplay, Navigation, Pagination } from "swiper/modules";
import { Swiper, SwiperSlide } from "swiper/react";
import { motion, AnimatePresence } from "framer-motion";
import "swiper/css";
import "swiper/css/navigation";
import "swiper/css/pagination";
const swiperOptions = {
modules: [Autoplay, Pagination, Navigation],
slidesPerView: 1,
spaceBetween: 0,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
loop: true,
navigation: {
nextEl: '.h1n',
prevEl: '.h1p',
},
pagination: {
el: '.swiper-pagination',
clickable: true,
},
};
const variants = {
topToBottom: {
initial: { y: '-100vh', opacity: 0 },
animate: { y: 0, opacity: 1 },
exit: { y: '100vh', opacity: 0 }
},
bottomToTop: {
initial: { y: '100vh', opacity: 0 },
animate: { y: 0, opacity: 1 },
exit: { y: '-100vh', opacity: 0 }
},
leftToRight: {
initial: { x: '-100vw', opacity: 0 },
animate: { x: 0, opacity: 1 },
exit: { x: '100vw', opacity: 0 }
},
rightToLeft: {
initial: { x: '100vw', opacity: 0 },
animate: { x: 0, opacity: 1 },
exit: { x: '-100vw', opacity: 0 }
},
};
const transition = {
type: "tween",
ease: [0.4, 0.0, 0.2, 1],
duration: 1.2
};
export default function Banner() {
const [activeIndex, setActiveIndex] = useState(0);
const [isAnimating, setIsAnimating] = useState(false);
const slides = [
{
id: 0,
variant: 'topToBottom',
bgImage: '/assets/images/banner/desktopBanner/home-banner-1.png',
upperText: 'Begin Your Health Journey',
title: 'Better',
titleSpan: 'health',
titleEnd: 'Forever',
// subtitle: 'Expert Physiotherapy in Mississauga for You.',
description: 'Our expert physiotherapists help you restore movement, reduce pain, and live healthier with personalized care in Mississauga.',
buttonText: 'Book Your Appointment',
buttonLink: 'tel:+647-722-3434',
// contentStyle: 'mobile-style'
},
{
id: 1,
variant: 'bottomToTop',
bgImage: '/assets/images/banner/desktopBanner/home-banner-2.png',
upperText: 'Care That Heals Gently',
title: 'Relaxing',
titleSpan: 'Massage',
titleEnd: 'Therapy',
// subtitle: 'Expert Hand Massage Techniques for Relief',
description: 'Experience soothing massage techniques that release tension, promote circulation, and support your overall wellness.',
buttonText: 'Schedule a Massage',
buttonLink: '/contact',
// contentStyle: 'with-background'
},
{
id: 2,
variant: 'leftToRight',
bgImage: '/assets/images/banner/desktopBanner/home-banner-3.png',
upperText: 'Wellness Near You Always',
title: 'Trusted',
titleSpan: 'Physio',
titleEnd: 'Experts',
// subtitle: 'Physiotherapy Etobicoke & Rehab Care.',
description: 'Comprehensive physiotherapy and rehab services designed to restore your strength, mobility, and long-term wellness.',
buttonText: 'Explore Our Service',
buttonLink: '/etobicoke-treatment-service',
// contentStyle: 'with-background'
},
{
id: 3,
variant: 'rightToLeft',
bgImage: '/assets/images/banner/desktopBanner/home-banner-4.png',
upperText: 'Healing With Caring Hands',
title: 'Holistic',
titleSpan: 'Wellness',
titleEnd: 'Care',
// subtitle: 'Waterfront Physio and Rehab Services.',
description: 'Discover holistic physiotherapy and rehab services designed to restore balance, ease pain, and support long-term recovery.',
buttonText: 'Visit Our Location',
buttonLink: '/contact',
// contentStyle: 'with-background'
}
];
const handleSlideChange = (swiper) => {
setIsAnimating(true);
setActiveIndex(swiper.realIndex || 0);
setTimeout(() => {
setIsAnimating(false);
}, 1200);
};
return (
<section className="banner-style-two p_relative">
<Swiper
{...swiperOptions}
className="banner-carousel owl-theme owl-carousel owl-nav-none owl-dots-none"
onSwiper={(swiper) => {
setActiveIndex(swiper.realIndex || 0);
}}
onSlideChange={handleSlideChange}
>
{slides.map((slide, index) => (
<SwiperSlide key={slide.id}>
<AnimatePresence mode="wait">
{activeIndex === index && (
<motion.div
key={`slide-${index}`}
className="slide-item banner-slide"
variants={variants[slide.variant]}
initial="initial"
animate="animate"
exit="exit"
transition={transition}
>
<div
className={`bg-layer ${slide.id === 0 ? "bg-slide-0" : ""}`}
style={{
backgroundImage: `url(${slide.bgImage})`,
}}
></div>
<div className="auto-container">
<div
className={`content-box custom-content-box ${slide.contentStyle || ''}`}
style={slide.contentStyle === 'with-background' ? {
backgroundColor: '#fff',
opacity: 0.8,
borderRadius: '20px',
padding: '30px'
} : {}}
>
<span className="upper-text">
{slide.upperText}
</span>
<h2>
{slide.title} <span>{slide.titleSpan}</span> {slide.titleEnd}
</h2>
<p>
{slide.subtitle}
</p>
<p>
{slide.description}
</p>
<div className="btn-box mt-3">
<Link href={slide.buttonLink} className="theme-btn btn-one">
<span>{slide.buttonText}</span>
</Link>
</div>
</div>
</div>
</motion.div>
)}
</AnimatePresence>
</SwiperSlide>
))}
</Swiper>
</section>
);
};