Spaces:
Running
Running
import { ImageResponse } from "next/og"; | |
import { createClient } from "@vercel/kv"; | |
import { shareString2Json } from "@/util/use-share"; | |
const kv = | |
process.env?.KV_REST_API_URL && process.env?.KV_REST_API_TOKEN | |
? createClient({ | |
url: process.env.KV_REST_API_URL, | |
token: process.env.KV_REST_API_TOKEN, | |
}) | |
: null; | |
export const runtime = "edge"; | |
const siteUrl = | |
process.env.NODE_ENV === "production" | |
? "https://www.tryemoji.com/" | |
: "http://localhost:3000/"; | |
export async function GET(request: Request) { | |
const { searchParams } = new URL(request.url); | |
const image = await fetch(new URL("./image.png", import.meta.url)).then( | |
(res) => res.arrayBuffer(), | |
); | |
let base64URL = ""; | |
let emoji = ""; | |
const share = searchParams.get("share"); | |
const option = share ? shareString2Json(share as string) : null; | |
const apiURL = new URL("api/share", siteUrl); | |
if (share) { | |
apiURL.searchParams.set("share", share); | |
const res = await fetch(apiURL.toString()); | |
base64URL = await res.text(); | |
emoji = option?.emoji || "👍"; | |
} | |
return new ImageResponse( | |
( | |
<div | |
style={{ | |
display: "flex", | |
background: "#f6f6f6", | |
width: "100%", | |
height: "100%", | |
flexDirection: "column", | |
justifyContent: "center", | |
alignItems: "center", | |
position: "relative", | |
}} | |
> | |
<img | |
style={{ | |
position: "absolute", | |
top: 0, | |
left: 0, | |
width: "100%", | |
height: "100%", | |
objectFit: "cover", | |
objectPosition: "center", | |
}} | |
width="800" | |
height="471" | |
src={image as unknown as string} | |
/> | |
{emoji && ( | |
<span | |
style={{ | |
width: 45, | |
height: 45, | |
textAlign: "center", | |
lineHeight: "40px", | |
background: "#0a0a0b", | |
position: "absolute", | |
top: 38, | |
left: 305, | |
fontSize: 40, | |
fontFamily: "sans-serif", | |
}} | |
> | |
{emoji} | |
</span> | |
)} | |
{base64URL && ( | |
<img | |
src={base64URL} | |
width="302" | |
height="302" | |
style={{ | |
position: "absolute", | |
borderRadius: 8, | |
top: 125, | |
right: 150, | |
width: 302, | |
height: 302, | |
objectFit: "cover", | |
objectPosition: "center", | |
}} | |
/> | |
)} | |
</div> | |
), | |
{ | |
width: 800, | |
height: 471, | |
}, | |
); | |
} | |