Merged in feat/book-245-preferred-lang-redirect (pull request #2861)
Feat/book 245 preferred lang redirect * added cookie to save preferredLang and middleware to route accordingly * Cleaned up code, added noValidLang.ts middleware * cleaned a little more * Added headers in languageRedirect and set language cookie maxAge to 1 year Approved-by: Linus Flood
This commit is contained in:
@@ -20,6 +20,7 @@ import useLang from "@/hooks/useLang"
|
|||||||
|
|
||||||
import LanguageSwitcherContainer from "./LanguageSwitcherContainer"
|
import LanguageSwitcherContainer from "./LanguageSwitcherContainer"
|
||||||
import LanguageSwitcherContent from "./LanguageSwitcherContent"
|
import LanguageSwitcherContent from "./LanguageSwitcherContent"
|
||||||
|
import { setLanguageCookie } from "./setLanguageCookie"
|
||||||
import { languageSwitcherVariants } from "./variants"
|
import { languageSwitcherVariants } from "./variants"
|
||||||
|
|
||||||
import styles from "./languageSwitcher.module.css"
|
import styles from "./languageSwitcher.module.css"
|
||||||
@@ -97,6 +98,7 @@ export default function LanguageSwitcher({ type }: LanguageSwitcherProps) {
|
|||||||
|
|
||||||
function onLanguageSwitch(toLang: string) {
|
function onLanguageSwitch(toLang: string) {
|
||||||
trackLanguageSwitchClick(currentLanguage, toLang)
|
trackLanguageSwitchClick(currentLanguage, toLang)
|
||||||
|
setLanguageCookie(toLang)
|
||||||
toggleDropdown(dropdownType)
|
toggleDropdown(dropdownType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
"use server"
|
||||||
|
import { cookies } from "next/headers"
|
||||||
|
|
||||||
|
export async function setLanguageCookie(preferredLang: string) {
|
||||||
|
const cookieStore = await cookies()
|
||||||
|
cookieStore.set("preferredLang", preferredLang, {
|
||||||
|
maxAge: 60 * 60 * 24 * 365, // 1 year
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
import * as Sentry from "@sentry/nextjs"
|
import * as Sentry from "@sentry/nextjs"
|
||||||
import { type NextMiddleware, NextResponse } from "next/server"
|
import { type NextMiddleware, NextResponse } from "next/server"
|
||||||
|
|
||||||
import { Lang } from "@scandic-hotels/common/constants/language"
|
|
||||||
import { logger } from "@scandic-hotels/common/logger"
|
import { logger } from "@scandic-hotels/common/logger"
|
||||||
import { findLang } from "@scandic-hotels/common/utils/languages"
|
import { findLang } from "@scandic-hotels/common/utils/languages"
|
||||||
|
|
||||||
@@ -17,8 +16,10 @@ import * as familyAndFriends from "@/middlewares/familyAndFriends"
|
|||||||
import * as handleAuth from "@/middlewares/handleAuth"
|
import * as handleAuth from "@/middlewares/handleAuth"
|
||||||
import * as handleDTMC from "@/middlewares/handleDTMC"
|
import * as handleDTMC from "@/middlewares/handleDTMC"
|
||||||
import * as invalidUrl from "@/middlewares/invalidUrl"
|
import * as invalidUrl from "@/middlewares/invalidUrl"
|
||||||
|
import * as languageRedirect from "@/middlewares/languageRedirect"
|
||||||
import * as legacySearchParams from "@/middlewares/legacySearchParams"
|
import * as legacySearchParams from "@/middlewares/legacySearchParams"
|
||||||
import * as myPages from "@/middlewares/myPages"
|
import * as myPages from "@/middlewares/myPages"
|
||||||
|
import * as noValidLang from "@/middlewares/noValidLang"
|
||||||
import * as redirect from "@/middlewares/redirect"
|
import * as redirect from "@/middlewares/redirect"
|
||||||
import * as sasXScandic from "@/middlewares/sasXScandic"
|
import * as sasXScandic from "@/middlewares/sasXScandic"
|
||||||
import * as trailingSlash from "@/middlewares/trailingSlash"
|
import * as trailingSlash from "@/middlewares/trailingSlash"
|
||||||
@@ -33,28 +34,10 @@ export const middleware: NextMiddleware = async (request, event) => {
|
|||||||
const headers = getDefaultRequestHeaders(request)
|
const headers = getDefaultRequestHeaders(request)
|
||||||
const lang = findLang(request.nextUrl.pathname)
|
const lang = findLang(request.nextUrl.pathname)
|
||||||
|
|
||||||
if (!lang) {
|
|
||||||
// Lang is required for all our middleware.
|
|
||||||
// Without it we shortcircuit early.
|
|
||||||
// We use middleware-error route because notFound() requires a root layout
|
|
||||||
// which we do not want. We can move to that once all Current stuff is gone.
|
|
||||||
|
|
||||||
// Default to English if no lang is found.
|
|
||||||
headers.set("x-lang", Lang.en)
|
|
||||||
return NextResponse.rewrite(
|
|
||||||
new URL(`/${Lang.en}/middleware-error/404`, request.nextUrl),
|
|
||||||
{
|
|
||||||
request: {
|
|
||||||
headers,
|
|
||||||
},
|
|
||||||
status: 404,
|
|
||||||
statusText: "Not found",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note that the order of middlewares is important since that is the order they are matched by.
|
// Note that the order of middlewares is important since that is the order they are matched by.
|
||||||
const middlewares = [
|
const middlewares = [
|
||||||
|
languageRedirect,
|
||||||
|
noValidLang,
|
||||||
invalidUrl,
|
invalidUrl,
|
||||||
trailingSlash,
|
trailingSlash,
|
||||||
currentWebLogin,
|
currentWebLogin,
|
||||||
|
|||||||
26
apps/scandic-web/middlewares/languageRedirect.ts
Normal file
26
apps/scandic-web/middlewares/languageRedirect.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import { type NextMiddleware, NextResponse } from "next/server"
|
||||||
|
|
||||||
|
import { Lang } from "@scandic-hotels/common/constants/language"
|
||||||
|
|
||||||
|
import { getDefaultRequestHeaders } from "./utils"
|
||||||
|
|
||||||
|
import type { MiddlewareMatcher } from "@/types/middleware"
|
||||||
|
|
||||||
|
export const middleware: NextMiddleware = (request) => {
|
||||||
|
const headers = getDefaultRequestHeaders(request)
|
||||||
|
const preferredLang = request.cookies.get("preferredLang")?.value ?? Lang.en
|
||||||
|
|
||||||
|
// Set x-lang header
|
||||||
|
headers.set("x-lang", preferredLang)
|
||||||
|
|
||||||
|
// Redirect to new URL if no lang in URL
|
||||||
|
const newUrl = new URL(`/${preferredLang}`, request.url)
|
||||||
|
return NextResponse.redirect(newUrl, {
|
||||||
|
headers,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const matcher: MiddlewareMatcher = (request) => {
|
||||||
|
// if ULR is empty
|
||||||
|
return request.nextUrl.pathname.length <= 1
|
||||||
|
}
|
||||||
29
apps/scandic-web/middlewares/noValidLang.ts
Normal file
29
apps/scandic-web/middlewares/noValidLang.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { type NextMiddleware, NextResponse } from "next/server"
|
||||||
|
|
||||||
|
import { Lang } from "@scandic-hotels/common/constants/language"
|
||||||
|
import { findLang } from "@scandic-hotels/common/utils/languages"
|
||||||
|
|
||||||
|
import { getDefaultRequestHeaders } from "./utils"
|
||||||
|
|
||||||
|
import type { MiddlewareMatcher } from "@/types/middleware"
|
||||||
|
|
||||||
|
export const middleware: NextMiddleware = (request) => {
|
||||||
|
const headers = getDefaultRequestHeaders(request)
|
||||||
|
|
||||||
|
headers.set("x-lang", Lang.en)
|
||||||
|
return NextResponse.rewrite(
|
||||||
|
new URL(`/${Lang.en}/middleware-error/404`, request.nextUrl),
|
||||||
|
{
|
||||||
|
request: {
|
||||||
|
headers,
|
||||||
|
},
|
||||||
|
status: 404,
|
||||||
|
statusText: "Not found",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const matcher: MiddlewareMatcher = (request) => {
|
||||||
|
const lang = findLang(request.nextUrl.pathname)
|
||||||
|
return !lang
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user