import { ImageResponse } from "next/og"
import { getAllIcons } from "@/lib/api"
import { preloadAllIcons, readIconFile } from "@/lib/icon-cache"
export const revalidate = false
export async function generateStaticParams() {
const iconsData = await getAllIcons()
if (process.env.CI_MODE === "false") {
return Object.keys(iconsData)
.slice(0, 5)
.map((icon) => ({
icon,
}))
}
return Object.keys(iconsData).map((icon) => ({
icon,
}))
}
export const size = {
width: 1200,
height: 630,
}
export default async function Image({ params }: { params: Promise<{ icon: string }> }) {
const { icon } = await params
if (!icon) {
console.error(`[Opengraph Image] Icon not found for ${icon}`)
return new ImageResponse(
Icon not found
,
{ ...size },
)
}
await preloadAllIcons()
const iconsData = await getAllIcons()
const totalIcons = Object.keys(iconsData).length
const index = Object.keys(iconsData).indexOf(icon)
const formattedIconName = icon
.split("-")
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(" ")
const iconData = await readIconFile(icon)
const iconUrl = iconData ? `data:image/png;base64,${iconData.toString("base64")}` : null
return new ImageResponse(
{/* Background blur blobs */}
{/* Main content layout */}
{/* Icon container */}
{iconUrl ? (

) : (
{formattedIconName}
)}
{/* Text content */}
Download {formattedIconName} icon for free
Amongst {totalIcons} other high-quality dashboard icons
{["SVG", "PNG", "WEBP"].map((format) => (
{format}
))}
{/* Footer */}
,
{
...size,
},
)
}