Files
website/lib/website-media.ts
T

57 lines
1.6 KiB
TypeScript

const API_BASE_URL =
process.env.NEXT_PUBLIC_MARKETPLACE_API_URL?.replace(/\/$/, "") ||
process.env.MARKETPLACE_API_URL?.replace(/\/$/, "") ||
"http://localhost:3001/api/v1";
export type WebsiteMediaItem = {
id: string;
imageUrl: string;
linkUrl: string;
title?: string;
subtitle?: string;
cta?: string;
};
export type WebsiteHomeMedia = {
slider: WebsiteMediaItem[];
standingBanners: WebsiteMediaItem[];
categories: WebsiteMediaItem[];
menuImages: WebsiteMediaItem[];
aboutUs: WebsiteMediaItem;
banners: WebsiteMediaItem[];
};
function resolveMediaUrl(url: string) {
if (!url) return url;
if (url.startsWith("http://") || url.startsWith("https://")) return url;
if (url.startsWith("/api/v1/")) {
const origin = API_BASE_URL.replace(/\/api\/v1$/, "");
return `${origin}${url}`;
}
return url;
}
function mapItem(item: WebsiteMediaItem): WebsiteMediaItem {
return { ...item, imageUrl: resolveMediaUrl(item.imageUrl) };
}
export async function getWebsiteHomeMedia(): Promise<WebsiteHomeMedia | null> {
try {
const response = await fetch(`${API_BASE_URL}/website/home-media`, {
next: { revalidate: 30 },
});
if (!response.ok) return null;
const data = (await response.json()) as WebsiteHomeMedia;
return {
slider: (data.slider ?? []).map(mapItem),
standingBanners: (data.standingBanners ?? []).map(mapItem),
categories: (data.categories ?? []).map(mapItem),
menuImages: (data.menuImages ?? []).map(mapItem),
aboutUs: mapItem(data.aboutUs),
banners: (data.banners ?? []).map(mapItem),
};
} catch {
return null;
}
}