1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2024-09-09 17:45:53 +02:00
.profile/middleware.ts

59 lines
1.5 KiB
TypeScript

import { NextResponse } from "next/server"
import type { NextRequest } from "next/server"
import { match } from "@formatjs/intl-localematcher"
import Negotiator from "negotiator"
import type { Locale, Theme } from "@/utils/constants"
import {
COOKIE_MAX_AGE,
DEFAULT_LOCALE,
DEFAULT_THEME,
LOCALES,
THEMES,
} from "@/utils/constants"
export const middleware = (request: NextRequest): NextResponse => {
const response = NextResponse.next()
let locale = request.cookies.get("locale")?.value
if (locale == null || !LOCALES.includes(locale as Locale)) {
try {
const headers = {
"accept-language":
request.headers.get("accept-language") ?? DEFAULT_LOCALE,
}
const languages = new Negotiator({ headers }).languages()
locale = match(languages, LOCALES.slice(), DEFAULT_LOCALE)
} catch {
locale = DEFAULT_LOCALE
}
response.cookies.set("locale", locale, {
path: "/",
maxAge: COOKIE_MAX_AGE,
})
}
const theme = request.cookies.get("theme")?.value
if (theme == null || !THEMES.includes(theme as Theme)) {
response.cookies.set("theme", DEFAULT_THEME, {
path: "/",
maxAge: COOKIE_MAX_AGE,
})
}
return response
}
export const config = {
matcher: [
/*
* Match all request paths except for the ones starting with:
* - api (API routes)
* - _next/static (static files)
* - _next/image (image optimization files)
* - favicon.ico (favicon file)
*/
"/((?!api|_next/static|_next/image|favicon.ico).*)",
],
}