diff --git a/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/query.ts b/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/query.ts index a87813ad0..dafaaf01c 100644 --- a/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/query.ts +++ b/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/query.ts @@ -32,6 +32,7 @@ import { destinationOverviewPageRefsSchema, destinationOverviewPageSchema, } from "./output" +import { getSortedDestinationsByLanguage } from "./utils" import type { City, @@ -170,17 +171,17 @@ export const destinationOverviewPageQueryRouter = router({ if (useStaticData) { switch (ctx.lang) { case Lang.da: - return destinationsDataDa + return getSortedDestinationsByLanguage(destinationsDataDa, ctx.lang) case Lang.de: - return destinationsDataDe + return getSortedDestinationsByLanguage(destinationsDataDe, ctx.lang) case Lang.fi: - return destinationsDataFi + return getSortedDestinationsByLanguage(destinationsDataFi, ctx.lang) case Lang.en: - return destinationsDataEn + return getSortedDestinationsByLanguage(destinationsDataEn, ctx.lang) case Lang.no: - return destinationsDataNo + return getSortedDestinationsByLanguage(destinationsDataNo, ctx.lang) case Lang.sv: - return destinationsDataSv + return getSortedDestinationsByLanguage(destinationsDataSv, ctx.lang) default: return [] } @@ -258,9 +259,7 @@ export const destinationOverviewPageQueryRouter = router({ }) ) - const data = destinations.sort((a, b) => - a.country.localeCompare(b.country) - ) + const data = getSortedDestinationsByLanguage(destinations, lang) const fs = await import("node:fs") fs.writeFileSync( `./server/routers/contentstack/destinationOverviewPage/destinations-${lang}.json`, diff --git a/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/utils.ts b/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/utils.ts new file mode 100644 index 000000000..ce5b9cdf7 --- /dev/null +++ b/apps/scandic-web/server/routers/contentstack/destinationOverviewPage/utils.ts @@ -0,0 +1,56 @@ +import { Lang } from "@/constants/languages" + +import type { DestinationsData } from "@/types/components/destinationOverviewPage/destinationsList/destinationsData" +import { ApiCountry, Country } from "@/types/enums/country" + +/** + * Sorts destination data based on language preference: + * - en: alphabetical order + * - de: Germany first, then alphabetical + * - da: Denmark first, then alphabetical + * - no: Norway first, then alphabetical + * - sv: Sweden first, then alphabetical + * - fi: Finland first, then alphabetical + * + * @param destinations DestinationsData + * @param language Lang + * @returns Sorted array of destinations + */ +export function getSortedDestinationsByLanguage( + destinations: DestinationsData, + language: Lang +) { + const destinationsToSort = [...destinations] + const firstCountryByLanguage: Record = { + [Lang.de]: Country.Germany, + [Lang.da]: Country.Denmark, + [Lang.no]: Country.Norway, + [Lang.sv]: Country.Sweden, + [Lang.fi]: Country.Finland, + [Lang.en]: null, + } + + const firstCountry = firstCountryByLanguage[language] + + // If no country is defined for this language, sort alphabetically + if (!firstCountry) { + return destinationsToSort.sort((a, b) => + a.country.localeCompare(b.country, language) + ) + } + + // Get the localized name of the first country + const localizedCountryName = ApiCountry[language][firstCountry] + + return destinationsToSort.sort((a, b) => { + if (a.country === localizedCountryName) { + return -1 + } + + if (b.country === localizedCountryName) { + return 1 + } + + return a.country.localeCompare(b.country, language) + }) +}