feat(WEB-304): remaning UI from design system primitives
This commit is contained in:
5
server/routers/contentstack/languageSwitcher/index.ts
Normal file
5
server/routers/contentstack/languageSwitcher/index.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { mergeRouters } from "@/server/trpc"
|
||||
|
||||
import { languageSwitcherQueryRouter } from "./query"
|
||||
|
||||
export const languageSwitcherRouter = mergeRouters(languageSwitcherQueryRouter)
|
||||
14
server/routers/contentstack/languageSwitcher/output.ts
Normal file
14
server/routers/contentstack/languageSwitcher/output.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { z } from "zod"
|
||||
|
||||
const link = z
|
||||
.object({ url: z.string().optional(), isExternal: z.boolean() })
|
||||
.nullable()
|
||||
|
||||
export const validateLanguageSwitcherData = z.object({
|
||||
da: link,
|
||||
de: link,
|
||||
en: link,
|
||||
fi: link,
|
||||
no: link,
|
||||
sv: link,
|
||||
})
|
||||
127
server/routers/contentstack/languageSwitcher/query.ts
Normal file
127
server/routers/contentstack/languageSwitcher/query.ts
Normal file
@@ -0,0 +1,127 @@
|
||||
import { Lang } from "@/constants/languages"
|
||||
import { batchRequest } from "@/lib/graphql/batchRequest"
|
||||
import {
|
||||
GetDaDeEnUrlsAccountPage,
|
||||
GetFiNoSvUrlsAccountPage,
|
||||
} from "@/lib/graphql/Query/AccountPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsCurrentBlocksPage,
|
||||
GetFiNoSvUrlsCurrentBlocksPage,
|
||||
} from "@/lib/graphql/Query/LanguageSwitcherCurrent.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsLoyaltyPage,
|
||||
GetFiNoSvUrlsLoyaltyPage,
|
||||
} from "@/lib/graphql/Query/LoyaltyPage.graphql"
|
||||
import { internalServerError } from "@/server/errors/trpc"
|
||||
import { contentstackExtendedProcedureUID, router } from "@/server/trpc"
|
||||
|
||||
import { generateTag } from "@/utils/generateTag"
|
||||
|
||||
import { validateLanguageSwitcherData } from "./output"
|
||||
import { languageSwitcherAffix } from "./utils"
|
||||
|
||||
import type {
|
||||
LanguageSwitcherData,
|
||||
LanguageSwitcherQueryDataRaw,
|
||||
} from "@/types/requests/languageSwitcher"
|
||||
import { PageTypeEnum } from "@/types/requests/pageType"
|
||||
|
||||
interface LanguageSwitcherVariables {
|
||||
contentType: string
|
||||
uid: string
|
||||
}
|
||||
|
||||
async function getLanguageSwitcher(options: LanguageSwitcherVariables) {
|
||||
const variables = { uid: options.uid }
|
||||
const tagsDaDeEn = [
|
||||
generateTag(Lang.da, options.uid, languageSwitcherAffix),
|
||||
generateTag(Lang.de, options.uid, languageSwitcherAffix),
|
||||
generateTag(Lang.en, options.uid, languageSwitcherAffix),
|
||||
]
|
||||
const tagsFiNoSv = [
|
||||
generateTag(Lang.fi, options.uid, languageSwitcherAffix),
|
||||
generateTag(Lang.no, options.uid, languageSwitcherAffix),
|
||||
generateTag(Lang.sv, options.uid, languageSwitcherAffix),
|
||||
]
|
||||
switch (options.contentType) {
|
||||
case PageTypeEnum.accountPage:
|
||||
return await batchRequest<LanguageSwitcherQueryDataRaw>([
|
||||
{
|
||||
document: GetDaDeEnUrlsAccountPage,
|
||||
variables,
|
||||
tags: tagsDaDeEn,
|
||||
},
|
||||
{
|
||||
document: GetFiNoSvUrlsAccountPage,
|
||||
variables,
|
||||
tags: tagsFiNoSv,
|
||||
},
|
||||
])
|
||||
case PageTypeEnum.currentBlocksPage:
|
||||
return await batchRequest<LanguageSwitcherQueryDataRaw>([
|
||||
{
|
||||
document: GetDaDeEnUrlsCurrentBlocksPage,
|
||||
variables,
|
||||
tags: tagsDaDeEn,
|
||||
},
|
||||
{
|
||||
document: GetFiNoSvUrlsCurrentBlocksPage,
|
||||
variables,
|
||||
tags: tagsFiNoSv,
|
||||
},
|
||||
])
|
||||
case PageTypeEnum.loyaltyPage:
|
||||
return await batchRequest<LanguageSwitcherQueryDataRaw>([
|
||||
{
|
||||
document: GetDaDeEnUrlsLoyaltyPage,
|
||||
variables,
|
||||
tags: tagsDaDeEn,
|
||||
},
|
||||
{
|
||||
document: GetFiNoSvUrlsLoyaltyPage,
|
||||
variables,
|
||||
tags: tagsFiNoSv,
|
||||
},
|
||||
])
|
||||
default:
|
||||
console.info(`type: [${options.contentType}]`)
|
||||
console.error(`Trying to get a content type that is not supported`)
|
||||
throw internalServerError()
|
||||
}
|
||||
}
|
||||
|
||||
export const languageSwitcherQueryRouter = router({
|
||||
get: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
|
||||
const res = await getLanguageSwitcher({
|
||||
contentType: ctx.contentType!,
|
||||
uid: ctx.uid,
|
||||
})
|
||||
|
||||
const urls = Object.keys(res.data).reduce<LanguageSwitcherData>(
|
||||
(acc, key) => {
|
||||
const item = res.data[key as Lang]?.items[0]
|
||||
const url = item
|
||||
? item.web?.original_url || `/${key}${item.url}`
|
||||
: undefined
|
||||
|
||||
return {
|
||||
...acc,
|
||||
[key]: { url, isExternal: !!item?.web?.original_url },
|
||||
}
|
||||
},
|
||||
{} as LanguageSwitcherData
|
||||
)
|
||||
|
||||
const validatedLanguageSwitcherData =
|
||||
validateLanguageSwitcherData.safeParse(urls)
|
||||
|
||||
if (!validatedLanguageSwitcherData.success) {
|
||||
throw internalServerError(validatedLanguageSwitcherData.error)
|
||||
}
|
||||
|
||||
return {
|
||||
lang: ctx.lang,
|
||||
urls,
|
||||
}
|
||||
}),
|
||||
})
|
||||
1
server/routers/contentstack/languageSwitcher/utils.ts
Normal file
1
server/routers/contentstack/languageSwitcher/utils.ts
Normal file
@@ -0,0 +1 @@
|
||||
export const languageSwitcherAffix = "languageSwitcher"
|
||||
Reference in New Issue
Block a user