feat(clinic): improve image handling and map integration in clinic components

This commit is contained in:
hamed
2026-06-18 15:21:19 +03:30
parent ecb77fcfa8
commit fdb5866562
4 changed files with 25 additions and 14 deletions
+13 -8
View File
@@ -2,6 +2,7 @@ import ClinicPage from "@/components/clinic";
import Layout from "@/components/layout/StLayout"; import Layout from "@/components/layout/StLayout";
import { fetchReq } from "@/lib/req"; import { fetchReq } from "@/lib/req";
import { getStateInfo } from "@/lib/getStateInfo"; import { getStateInfo } from "@/lib/getStateInfo";
import { imageUrl } from "@/helper";
export async function generateMetadata({ params }) { export async function generateMetadata({ params }) {
const { slug } = await params; const { slug } = await params;
@@ -10,7 +11,8 @@ export async function generateMetadata({ params }) {
const siteName = matchedCity?.site_name || "نوبت 724"; const siteName = matchedCity?.site_name || "نوبت 724";
try { try {
const clinic = await fetchReq(`${API_URL}/api/v1/clinic/${slug}`); const res = await fetchReq(`${API_URL}/api/v1/clinic/${slug}`);
const clinic = res?.data?.data;
if (!clinic) return {}; if (!clinic) return {};
const title = `${clinic.title} | ${siteName}`; const title = `${clinic.title} | ${siteName}`;
@@ -22,8 +24,8 @@ export async function generateMetadata({ params }) {
openGraph: { openGraph: {
title, title,
description, description,
images: clinic.images_clinic?.[0] images: clinic.images_clinic?.[0]?.url
? [clinic.images_clinic[0]] ? [imageUrl(clinic.images_clinic[0].url)]
: ["https://www.nobat724.com/assets/images/logo.png"], : ["https://www.nobat724.com/assets/images/logo.png"],
}, },
}; };
@@ -34,8 +36,9 @@ export async function generateMetadata({ params }) {
async function Clinic({ params, searchParams }) { async function Clinic({ params, searchParams }) {
const { slug } = await params; const { slug } = await params;
const sp = await searchParams;
const API_URL = process.env.NEXT_PUBLIC_API_URL; const API_URL = process.env.NEXT_PUBLIC_API_URL;
const page = Number(searchParams?.page) || 1; const page = Number(sp?.page) || 1;
const limit = 50; const limit = 50;
const reqClinics = await fetchReq(`${API_URL}/api/v1/clinic/${slug}`); const reqClinics = await fetchReq(`${API_URL}/api/v1/clinic/${slug}`);
@@ -43,16 +46,18 @@ async function Clinic({ params, searchParams }) {
`${API_URL}/api/v1/clinic/doctor-list/${slug}?page=${page}&limit=${limit}` `${API_URL}/api/v1/clinic/doctor-list/${slug}?page=${page}&limit=${limit}`
); );
const clinic = reqClinics; const clinic = reqClinics?.data?.data || null;
const doctors = reqDoctors?.data || []; const doctors = reqDoctors?.data?.data || [];
const pagedoctors = reqDoctors?.page; const pagedoctors = reqDoctors?.data?.meta;
const jsonLd = clinic const jsonLd = clinic
? { ? {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "MedicalClinic", "@type": "MedicalClinic",
name: clinic.title, name: clinic.title,
...(clinic.images_clinic?.[0] && { image: clinic.images_clinic[0] }), ...(clinic.images_clinic?.[0]?.url && {
image: imageUrl(clinic.images_clinic[0].url),
}),
} }
: null; : null;
@@ -2,9 +2,10 @@ import List from "./List";
import Slider from "./Slider"; import Slider from "./Slider";
import Image from "next/image"; import Image from "next/image";
import CustomLoading from "@/app/component/loading/Custom"; import CustomLoading from "@/app/component/loading/Custom";
import { imageUrl } from "@/helper";
function Images({ data }) { function Images({ data }) {
const images_clinic = data.images_clinic; const images_clinic = data?.images_clinic || [];
return ( return (
<div <div
@@ -16,12 +17,12 @@ function Images({ data }) {
<div className="w-full"> <div className="w-full">
<div <div
className={`grid grid-cols-1 grid-rows-1 gap-[12px] md:gap-[18px] lg:gap-[24px] h-[290px] max-h-[290px] className={`grid grid-cols-1 grid-rows-1 gap-[12px] md:gap-[18px] lg:gap-[24px] h-[290px] max-h-[290px]
${data.images_clinic.length === 1 ? "md:grid-cols-1 h-[350px] max-h-[350px]" : "md:grid-cols-2"}`} ${images_clinic.length === 1 ? "md:grid-cols-1 h-[350px] max-h-[350px]" : "md:grid-cols-2"}`}
> >
<CustomLoading width={600} height={400}> <CustomLoading width={600} height={400}>
<Image <Image
className="rounded-[8px] overflow-hidden w-full h-full object-cover" className="rounded-[8px] overflow-hidden w-full h-full object-cover"
src={images_clinic[0]?.url || "/assets/images/clinic-img.png"} src={imageUrl(images_clinic[0]?.url, "/assets/images/clinic-img.png")}
alt="img clinic" alt="img clinic"
height={432} height={432}
width={600} width={600}
@@ -1,8 +1,9 @@
import CustomLoading from "@/app/component/loading/Custom"; import CustomLoading from "@/app/component/loading/Custom";
import Image from "next/image"; import Image from "next/image";
import { imageUrl } from "@/helper";
function List({ data }) { function List({ data }) {
const images_clinic = data.images_clinic; const images_clinic = data?.images_clinic || [];
const lengthImgClinics = images_clinic.length; const lengthImgClinics = images_clinic.length;
return ( return (
@@ -36,7 +37,7 @@ function List({ data }) {
<CustomLoading width="full" height={190}> <CustomLoading width="full" height={190}>
<Image <Image
className="rounded-[8px] overflow-hidden w-full h-full object-cover" className="rounded-[8px] overflow-hidden w-full h-full object-cover"
src={img.url || "/assets/images/clinic-img.png"} src={imageUrl(img.url, "/assets/images/clinic-img.png")}
alt="img clinic" alt="img clinic"
height={204} height={204}
width={288} width={288}
@@ -41,7 +41,11 @@ function Contact({ data }) {
<div className="w-full relative h-[460px] mt-[24px]"> <div className="w-full relative h-[460px] mt-[24px]">
<CustomLoading width="full" height={400}> <CustomLoading width="full" height={400}>
<iframe <iframe
src={`https://maps.google.com/maps?q=${data.map.latitude},${data.map.longitude}&z=14&output=embed`} src={`https://maps.google.com/maps?q=${
data?.map?.latitude && data?.map?.longitude
? `${data.map.latitude},${data.map.longitude}`
: encodeURIComponent(data?.location || data?.title || "")
}&z=14&output=embed`}
className="w-full h-full rounded-lg" className="w-full h-full rounded-lg"
loading="lazy" loading="lazy"
></iframe> ></iframe>