| 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, | |
| }, | |
| ); | |
| } | |