138 lines
3.7 KiB
JavaScript
138 lines
3.7 KiB
JavaScript
import PropertyDetail from "./PropertyDetail";
|
|
|
|
async function fetchPropertyForMeta(id, type) {
|
|
try {
|
|
const endpoint = type === "sale" ? "http://45.93.137.91/api/SaleProperties/GetSaleProperties" : "http://45.93.137.91/api/RentProperties/GetRentProperties";
|
|
|
|
const res = await fetch(endpoint, {
|
|
next: { revalidate: 60 },
|
|
});
|
|
|
|
if (!res.ok) return null;
|
|
|
|
const text = await res.text();
|
|
const json = JSON.parse(text);
|
|
|
|
const items = Array.isArray(json?.data) ? json.data : Array.isArray(json) ? json : [];
|
|
|
|
return items.find((p) => p.id == id) || items[0] || null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function mapProperty(item) {
|
|
const info = item.propertyInformation || item.PropertyInformation || {};
|
|
|
|
let details = {};
|
|
|
|
if (typeof info.detailsJSON === "object" && info.detailsJSON) {
|
|
details = info.detailsJSON;
|
|
} else if (typeof info.DetailsJSON === "object" && info.DetailsJSON) {
|
|
details = info.DetailsJSON;
|
|
} else {
|
|
try {
|
|
details = JSON.parse(info.detailsJSON || info.DetailsJSON || "{}");
|
|
} catch {}
|
|
}
|
|
|
|
const price = item.monthlyRent || item.MonthlyRent || item.dailyRent || item.DailyRent || 0;
|
|
|
|
const priceUnit = item.monthlyRent || item.MonthlyRent ? "monthly" : "daily";
|
|
|
|
const buildingType = info.buildingType ?? info.BuildingType ?? 0;
|
|
|
|
const type =
|
|
{
|
|
0: "apartment",
|
|
1: "villa",
|
|
2: "house",
|
|
}[buildingType] || "apartment";
|
|
|
|
const typeLabel =
|
|
{
|
|
0: "apartment",
|
|
1: "villa",
|
|
2: "house",
|
|
}[buildingType] || "apartment";
|
|
|
|
const address = info.address || info.Address || "";
|
|
const bedrooms = info.numberOfBedRooms || info.NumberOfBedRooms || 0;
|
|
const bathrooms = info.numberOfBathRooms || info.NumberOfBathRooms || 0;
|
|
const area = info.space || info.Space || 0;
|
|
const desc = info.description || info.Description || "";
|
|
const images = info.images || info.Images || [];
|
|
const firstImage = Array.isArray(images) && images[0] ? images[0] : "";
|
|
|
|
return {
|
|
title: `${typeLabel} في ${address}`,
|
|
description: desc || `${typeLabel} في ${address} · ${bedrooms} غرف نوم · ${bathrooms} حمامات · ${area} م²`,
|
|
price,
|
|
priceUnit,
|
|
typeLabel,
|
|
address,
|
|
bedrooms,
|
|
bathrooms,
|
|
area,
|
|
image: firstImage,
|
|
};
|
|
}
|
|
|
|
export async function generateMetadata({ params, searchParams }) {
|
|
const { id } = await params;
|
|
const { type } = await searchParams;
|
|
|
|
|
|
|
|
const raw = await fetchPropertyForMeta(id, type);
|
|
|
|
if (!raw) {
|
|
return {
|
|
title: "SweetHome - عقار",
|
|
description: "اكتشف أفضل العقارات للإيجار",
|
|
};
|
|
}
|
|
|
|
const p = mapProperty(raw);
|
|
|
|
const priceStr = `${p.price.toLocaleString()} ل.س / ${p.priceUnit === "daily" ? "يوم" : "شهر"}`;
|
|
|
|
const propertyImage = p.image ? (p.image.startsWith("http") ? p.image : `http://45.93.137.91${p.image}`) : "";
|
|
|
|
const logoUrl = "http://45.93.137.91/logo.png";
|
|
|
|
const ogImages = propertyImage
|
|
? [
|
|
{ url: propertyImage, width: 1200, height: 630 },
|
|
{ url: logoUrl, width: 512, height: 512 },
|
|
]
|
|
: [{ url: logoUrl, width: 512, height: 512 }];
|
|
|
|
return {
|
|
title: `${p.title} - ${priceStr}`,
|
|
description: p.description,
|
|
|
|
openGraph: {
|
|
title: `${p.title} - ${priceStr}`,
|
|
description: p.description,
|
|
images: ogImages,
|
|
url: `http://45.93.137.91/property/${id}?type=${type}`,
|
|
type: "website",
|
|
siteName: "SweetHome",
|
|
},
|
|
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: `${p.title} - ${priceStr}`,
|
|
description: p.description,
|
|
images: ogImages.map((i) => i.url),
|
|
},
|
|
};
|
|
}
|
|
|
|
export default async function PropertyPage({ params, searchParams }) {
|
|
const { type } = await searchParams;
|
|
|
|
return <PropertyDetail params={params} type={type} />;
|
|
}
|