mirror of
https://github.com/theoludwig/theoludwig.git
synced 2024-11-12 23:33:14 +01:00
59 lines
1.5 KiB
TypeScript
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).*)",
|
|
],
|
|
}
|