diff --git a/src/pages/service/DetailService.tsx b/src/pages/service/DetailService.tsx index bb71bbc..c716d60 100644 --- a/src/pages/service/DetailService.tsx +++ b/src/pages/service/DetailService.tsx @@ -2,6 +2,7 @@ import { FC, Fragment, useState } from 'react' import { useTranslation } from 'react-i18next' import Rate from 'rc-rate' import ServiceImages from './components/ServiceImages' +import ServiceAudios from './components/ServiceAudios' import AvatarImage from '../../assets/images/avatar_image.png' import ServiceHeader from './components/ServiceHeader' import { useGetServiceBySlug } from './hooks/useServiceData' @@ -82,12 +83,15 @@ const DetailService: FC = () => { - +
{t('service.compelete_description')}
+ + +

= ({ item }) => { + if (!item?.audios || item.audios.length === 0) { + return null + } + + return ( +

+ +
+ {item.audios.map((audio) => ( +
+
+ فایل صوتی +
+ +
+ ))} +
+
+ ) +} + +export default ServiceAudios diff --git a/src/pages/service/components/ServiceImages.tsx b/src/pages/service/components/ServiceImages.tsx index 8efa75f..282fac9 100644 --- a/src/pages/service/components/ServiceImages.tsx +++ b/src/pages/service/components/ServiceImages.tsx @@ -1,5 +1,7 @@ -import { FC } from 'react' +import { FC, useState, useRef } from 'react' import { Swiper, SwiperSlide } from 'swiper/react' +import { ServiceDetailDataType } from '../types/ServiecTypes' +import { Play, Pause } from 'iconsax-react' const SWIPER_SLIDE_STYLE = { overflow: 'visible !important', @@ -7,10 +9,46 @@ const SWIPER_SLIDE_STYLE = { } type Props = { - images: { id: string, imageUrl: string }[] + item: ServiceDetailDataType } -const ServiceImages: FC = ({ images }) => { +const ServiceImages: FC = ({ item }) => { + const [playingVideos, setPlayingVideos] = useState<{ [key: string]: boolean }>({}) + const videoRefs = useRef<{ [key: string]: HTMLVideoElement | null }>({}) + + const toggleVideo = (videoId: string) => { + const video = videoRefs.current[videoId] + if (!video) return + + if (playingVideos[videoId]) { + video.pause() + setPlayingVideos(prev => ({ + ...prev, + [videoId]: false + })) + } else { + video.play() + setPlayingVideos(prev => ({ + ...prev, + [videoId]: true + })) + } + } + + const handleVideoPlay = (videoId: string) => { + setPlayingVideos(prev => ({ + ...prev, + [videoId]: true + })) + } + + const handleVideoPause = (videoId: string) => { + setPlayingVideos(prev => ({ + ...prev, + [videoId]: false + })) + } + return (
= ({ images }) => { spaceBetween={20} // فاصله پیش‌فرض بین اسلایدها slidesPerView='auto' > + {/* نمایش ویدیوها */} + {item?.videos?.map((video) => ( + +
+
+
+ ))} - { - images.map((item) => { - return ( - -
- -
-
- ) - }) - } + {/* نمایش تصاویر */} + {item?.images?.map((image) => ( + +
+ +
+
+ ))}
) diff --git a/src/pages/service/types/ServiecTypes.ts b/src/pages/service/types/ServiecTypes.ts index 5b2ae6f..075c014 100644 --- a/src/pages/service/types/ServiecTypes.ts +++ b/src/pages/service/types/ServiecTypes.ts @@ -36,6 +36,8 @@ export type ServiceDetailDataType = { icon: string; id: string; images: { id: string; createdAt: string; imageUrl: string }[]; + videos: { id: string; createdAt: string; videoUrl: string }[]; + audios: { id: string; createdAt: string; audioUrl: string }[]; isActive: boolean; isDanakSuggest: boolean; link: string;