import { Hono } from "hono";
import { getCookie, setCookie } from "hono/cookie";
const theme = new Hono();
function readTheme(c: any): "dark" | "light" {
const v = getCookie(c, "theme");
return v === "light" ? "light" : "dark";
}
function writeTheme(c: any, value: "dark" | "light") {
setCookie(c, "theme", value, {
path: "/",
maxAge: 60 * 60 * 24 * 365,
sameSite: "Lax",
httpOnly: false,
});
}
function redirectBack(c: any): Response {
const ref = c.req.header("referer");
try {
if (ref) {
const u = new URL(ref);
const host = c.req.header("host");
if (u.host === host) return c.redirect(u.pathname + u.search);
}
} catch {
}
return c.redirect("/");
}
theme.get("/theme/toggle", (c) => {
const next = readTheme(c) === "light" ? "dark" : "light";
writeTheme(c, next);
return redirectBack(c);
});
theme.get("/theme/set", (c) => {
const mode = c.req.query("mode");
if (mode !== "dark" && mode !== "light") {
return c.json({ ok: false, error: "mode must be 'dark' or 'light'" }, 400);
}
writeTheme(c, mode);
if ((c.req.header("accept") || "").includes("application/json")) {
return c.json({ ok: true, theme: mode });
}
return redirectBack(c);
});
export { readTheme };
export default theme;
|