First steps towards the SAS partnership * otp flow now pretends to do the linking * Update LinkAccountForm header * Update redirect times * Clean up comments * Set maxAge on sas cookies * make all SAS routes protected * Merge remote-tracking branch 'refs/remotes/origin/feature/sas-login' into feature/sas-login * Require auth for sas link flow * Fix resend otp * Add error support to OneTimePasswordForm * Add Sentry to SAS error boundary * Move SAS_REQUEST_OTP_STATE_STORAGE_COOKIE_NAME * Add missing translations * Merge branch 'master' of bitbucket.org:scandic-swap/web into feature/sas-login * Merge branch 'feature/sas-login' of bitbucket.org:scandic-swap/web into feature/sas-login * Add TooManyCodesError component * Refactor GenericError to support new errors * Add FailedAttemptsError * remove removed component <VWOScript/> * Merge branch 'feature/sas-login' of bitbucket.org:scandic-swap/web into feature/sas-login * remove local cookie-bot reference * Fix sas campaign logo scaling * feature toggle the SAS stuff * Merge branch 'feature/sas-login' of bitbucket.org:scandic-swap/web into feature/sas-login * fix: use env vars for SAS endpoints Approved-by: Linus Flood
73 lines
1.7 KiB
TypeScript
73 lines
1.7 KiB
TypeScript
import { cookies, headers } from "next/headers"
|
|
import { type Session } from "next-auth"
|
|
import { cache } from "react"
|
|
|
|
import { auth } from "@/auth"
|
|
|
|
import type { Lang } from "@/constants/languages"
|
|
|
|
typeof auth
|
|
|
|
type CreateContextOptions = {
|
|
auth: () => Promise<Session | null>
|
|
lang: Lang
|
|
pathname: string
|
|
uid?: string | null
|
|
url: string
|
|
webToken?: string
|
|
contentType?: string
|
|
}
|
|
|
|
/** Use this helper for:
|
|
* - testing, where we dont have to Mock Next.js' req/res
|
|
* - trpc's `createSSGHelpers` where we don't have req/res
|
|
**/
|
|
export function createContextInner(opts: CreateContextOptions) {
|
|
return {
|
|
auth: opts.auth,
|
|
lang: opts.lang,
|
|
pathname: opts.pathname,
|
|
uid: opts.uid,
|
|
url: opts.url,
|
|
webToken: opts.webToken,
|
|
contentType: opts.contentType,
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This is the actual context you'll use in your router
|
|
* @link https://trpc.io/docs/context
|
|
**/
|
|
export const createContext = cache(function () {
|
|
const h = headers()
|
|
|
|
const cookie = cookies()
|
|
const webviewTokenCookie = cookie.get("webviewToken")
|
|
const loginType = h.get("loginType")
|
|
|
|
return createContextInner({
|
|
auth: async () => {
|
|
const session = await auth()
|
|
const webToken = webviewTokenCookie?.value
|
|
if (!session?.token && !webToken) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
session ||
|
|
({
|
|
token: { access_token: webToken, loginType },
|
|
} as Session)
|
|
)
|
|
},
|
|
lang: h.get("x-lang") as Lang,
|
|
pathname: h.get("x-pathname")!,
|
|
uid: h.get("x-uid"),
|
|
url: h.get("x-url")!,
|
|
webToken: webviewTokenCookie?.value,
|
|
contentType: h.get("x-contenttype")!,
|
|
})
|
|
})
|
|
|
|
export type Context = ReturnType<typeof createContext>
|