Files
userApp/src/pages/explore/index.tsx

135 lines
4.5 KiB
TypeScript

import { useMemo } from 'react';
import './explore.css';
import { Swiper, SwiperSlide } from 'swiper/react';
import { SwiperOptions } from 'swiper/types';
import { Grid, Pagination, Navigation } from 'swiper/modules';
import { useIsMobile } from '@/hooks/useIsMobile';
import ExploreCard from './+components/ExploreCard';
import ROUTES_OBJECT from '@/routes/RoutesObject';
import TopSlider from './+components/TopSlider';
import { useGetAllSurveyForms } from '@/services/SurveyForm';
import appointmentsIcon from '@/assets/images/glass-icons/appointments.png';
import heartIcon from '@/assets/images/glass-icons/heart.png';
import surveyIcon from '@/assets/images/glass-icons/survey.png';
import reportIcon from '@/assets/images/glass-icons/report.png';
import discountIcon from '@/assets/images/glass-icons/discount.png';
import learnIcon from '@/assets/images/glass-icons/learn.png';
import cardIcon from '@/assets/images/glass-icons/card.png';
import supportIcon from '@/assets/images/glass-icons/support.png';
import shopIcon from '@/assets/images/glass-icons/shop.png';
const sliderProps: SwiperOptions = {
slidesPerView: 1,
grid: { rows: 1, fill: 'row' },
spaceBetween: 0,
modules: [Grid, Pagination, Navigation],
pagination: { clickable: true },
navigation: true,
};
const Explore = () => {
const { data: surveyFormsData } = useGetAllSurveyForms();
const isMobile = useIsMobile();
const itemsPerSlide = isMobile ? 9 : 12;
const exploreCardsData = useMemo(
() => [
{
label: 'وفاداری',
icon: <img src={heartIcon} className="size-full" />,
link: ROUTES_OBJECT.loyaltyCards,
tooltip: 'جدید',
},
{
label: 'گزارش‌ها',
icon: <img src={reportIcon} className="size-full" />,
link: ROUTES_OBJECT.report,
},
{
label: 'نظرسنجی',
icon: <img src={surveyIcon} className="size-full" />,
link: ROUTES_OBJECT.surveyForms,
tooltip: 'جدید',
counter: surveyFormsData?.incomplete_count,
},
{
label: 'کیف پول',
icon: <img src={cardIcon} className="size-full" />,
link: '',
isLock: true,
},
{
label: 'نوبت‌های من',
icon: <img src={appointmentsIcon} className="size-full" />,
link: ROUTES_OBJECT.appointments,
tooltip: 'ویژه',
isBold: true,
},
{
label: 'تخفیف‌کده',
icon: <img src={discountIcon} className="size-full" />,
link: '',
isLock: true,
},
{
label: 'فروشگاه',
icon: <img src={shopIcon} className="size-full" />,
link: '',
isLock: true,
},
{
label: 'آموزش',
icon: <img src={learnIcon} className="size-full" />,
link: '',
isLock: true,
},
{
label: 'پشتیبانی',
icon: <img src={supportIcon} className="size-full" />,
link: ROUTES_OBJECT.support,
},
],
[],
);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const chunkArray = (array: any[], size: number) => {
const result = [];
for (let i = 0; i < array.length; i += size) {
result.push(array.slice(i, i + size));
}
return result;
};
const groupedCards = chunkArray(exploreCardsData, itemsPerSlide);
return (
<div className="explore-page-wrapper bg-slate-50 min-h-[100dvh] flex flex-col gap-4 pt-20">
<div className="absolute -top-1/3 -right-0 size-full bg-[url('@/assets/images/bg-light-effect.png')] bg-cover bg-no-repeat opacity-30 md:opacity-50 rotate-180" />
<div>
<TopSlider />
</div>
<div className="w-full relative p-2 flex-1 overflow-hidden">
<div
className="absolute bottom-0 -left-1/4 lg:left-0 size-full bg-[url('@/assets/images/bg-light-effect.png')]
bg-cover bg-no-repeat opacity-20 md:opacity-50"
/>
<Swiper dir="rtl" {...sliderProps} className="max-w-3xl mx-auto">
{groupedCards.map((slideGroup, index) => (
<SwiperSlide key={index} className="min-h-[480px]">
<div className="grid grid-cols-3 md:grid-cols-4 gap-y-2">
{slideGroup.map((card, cardIndex) => (
<ExploreCard
key={`${index}-${cardIndex}`}
index={cardIndex}
{...card}
/>
))}
</div>
</SwiperSlide>
))}
</Swiper>
</div>
</div>
);
};
export default Explore;