feat(SW-360): Add signup verification route w. tracking for login
This commit is contained in:
@@ -0,0 +1,26 @@
|
|||||||
|
import LoginButton from "@/components/Current/Header/LoginButton"
|
||||||
|
import { getIntl } from "@/i18n"
|
||||||
|
|
||||||
|
import styles from "./signUpVerification.module.css"
|
||||||
|
|
||||||
|
import type { SignUpVerificationProps } from "@/types/components/blocks/dynamicContent"
|
||||||
|
|
||||||
|
export default async function SignUpVerification({
|
||||||
|
title,
|
||||||
|
subtitle,
|
||||||
|
}: SignUpVerificationProps) {
|
||||||
|
const intl = await getIntl()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.container}>
|
||||||
|
<LoginButton
|
||||||
|
className={styles.loginButton}
|
||||||
|
trackingId="signUpVerificationLogin"
|
||||||
|
position="sign up verification"
|
||||||
|
variant="signupVerification"
|
||||||
|
>
|
||||||
|
{intl.formatMessage({ id: "Proceed to login" })}
|
||||||
|
</LoginButton>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin-top: var(--Spacing-x3);
|
||||||
|
}
|
||||||
@@ -3,21 +3,20 @@ import { redirect } from "next/navigation"
|
|||||||
import { overview } from "@/constants/routes/myPages"
|
import { overview } from "@/constants/routes/myPages"
|
||||||
|
|
||||||
import { auth } from "@/auth"
|
import { auth } from "@/auth"
|
||||||
|
import Form from "@/components/Forms/Register"
|
||||||
import { getLang } from "@/i18n/serverContext"
|
import { getLang } from "@/i18n/serverContext"
|
||||||
|
|
||||||
import Form from "../index"
|
import type { RegisterFormProps } from "@/types/components/form/registerForm"
|
||||||
|
|
||||||
import { RegisterFormProps } from "@/types/components/form/registerForm"
|
export default async function SignupFormWrapper({
|
||||||
|
dynamic_content,
|
||||||
export default async function ServerRegisterForm({
|
}: {
|
||||||
link,
|
dynamic_content: RegisterFormProps
|
||||||
subtitle,
|
}) {
|
||||||
title,
|
|
||||||
}: RegisterFormProps) {
|
|
||||||
const session = await auth()
|
const session = await auth()
|
||||||
if (session) {
|
if (session) {
|
||||||
// We don't want to allow users to signup if they are already authenticated.
|
// We don't want to allow users to signup if they are already authenticated.
|
||||||
redirect(overview[getLang()])
|
redirect(overview[getLang()])
|
||||||
}
|
}
|
||||||
return <Form link={link} subtitle={subtitle} title={title} />
|
return <Form {...dynamic_content} />
|
||||||
}
|
}
|
||||||
@@ -7,10 +7,11 @@ import ExpiringPoints from "@/components/Blocks/DynamicContent/Points/ExpiringPo
|
|||||||
import PointsOverview from "@/components/Blocks/DynamicContent/Points/Overview"
|
import PointsOverview from "@/components/Blocks/DynamicContent/Points/Overview"
|
||||||
import CurrentRewardsBlock from "@/components/Blocks/DynamicContent/Rewards/CurrentLevel"
|
import CurrentRewardsBlock from "@/components/Blocks/DynamicContent/Rewards/CurrentLevel"
|
||||||
import NextLevelRewardsBlock from "@/components/Blocks/DynamicContent/Rewards/NextLevel"
|
import NextLevelRewardsBlock from "@/components/Blocks/DynamicContent/Rewards/NextLevel"
|
||||||
|
import SignupFormWrapper from "@/components/Blocks/DynamicContent/SignupFormWrapper"
|
||||||
|
import SignUpVerification from "@/components/Blocks/DynamicContent/SignUpVerification"
|
||||||
import PreviousStays from "@/components/Blocks/DynamicContent/Stays/Previous"
|
import PreviousStays from "@/components/Blocks/DynamicContent/Stays/Previous"
|
||||||
import SoonestStays from "@/components/Blocks/DynamicContent/Stays/Soonest"
|
import SoonestStays from "@/components/Blocks/DynamicContent/Stays/Soonest"
|
||||||
import UpcomingStays from "@/components/Blocks/DynamicContent/Stays/Upcoming"
|
import UpcomingStays from "@/components/Blocks/DynamicContent/Stays/Upcoming"
|
||||||
import ServerRegisterForm from "@/components/Forms/Register/ServerRegisterForm"
|
|
||||||
|
|
||||||
import type { DynamicContentProps } from "@/types/components/blocks/dynamicContent"
|
import type { DynamicContentProps } from "@/types/components/blocks/dynamicContent"
|
||||||
import { DynamicContentEnum } from "@/types/enums/dynamicContent"
|
import { DynamicContentEnum } from "@/types/enums/dynamicContent"
|
||||||
@@ -53,7 +54,9 @@ export default async function DynamicContent({
|
|||||||
case DynamicContentEnum.Blocks.components.previous_stays:
|
case DynamicContentEnum.Blocks.components.previous_stays:
|
||||||
return <PreviousStays {...dynamic_content} />
|
return <PreviousStays {...dynamic_content} />
|
||||||
case DynamicContentEnum.Blocks.components.sign_up_form:
|
case DynamicContentEnum.Blocks.components.sign_up_form:
|
||||||
return <ServerRegisterForm {...dynamic_content} />
|
return <SignupFormWrapper dynamic_content={dynamic_content} />
|
||||||
|
case DynamicContentEnum.Blocks.components.sign_up_verification:
|
||||||
|
return <SignUpVerification {...dynamic_content} />
|
||||||
case DynamicContentEnum.Blocks.components.soonest_stays:
|
case DynamicContentEnum.Blocks.components.soonest_stays:
|
||||||
return <SoonestStays {...dynamic_content} />
|
return <SoonestStays {...dynamic_content} />
|
||||||
case DynamicContentEnum.Blocks.components.upcoming_stays:
|
case DynamicContentEnum.Blocks.components.upcoming_stays:
|
||||||
|
|||||||
@@ -18,11 +18,13 @@ export default function LoginButton({
|
|||||||
trackingId,
|
trackingId,
|
||||||
children,
|
children,
|
||||||
color = "black",
|
color = "black",
|
||||||
|
variant = "default",
|
||||||
}: PropsWithChildren<{
|
}: PropsWithChildren<{
|
||||||
className: string
|
className: string
|
||||||
trackingId: string
|
trackingId: string
|
||||||
position: TrackingPosition
|
position: TrackingPosition
|
||||||
color?: LinkProps["color"]
|
color?: LinkProps["color"]
|
||||||
|
variant?: "default" | "signupVerification"
|
||||||
}>) {
|
}>) {
|
||||||
const lang = useLang()
|
const lang = useLang()
|
||||||
const pathName = useLazyPathname()
|
const pathName = useLazyPathname()
|
||||||
@@ -49,6 +51,7 @@ export default function LoginButton({
|
|||||||
color={color}
|
color={color}
|
||||||
href={href}
|
href={href}
|
||||||
prefetch={false}
|
prefetch={false}
|
||||||
|
variant={variant}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -218,3 +218,15 @@
|
|||||||
color: var(--Base-Text-High-contrast);
|
color: var(--Base-Text-High-contrast);
|
||||||
background-color: var(--Base-Surface-Primary-light-Hover-alt);
|
background-color: var(--Base-Surface-Primary-light-Hover-alt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.signupVerification {
|
||||||
|
background-color: var(--Base-Button-Primary-Fill-Normal);
|
||||||
|
color: var(--Base-Button-Inverted-Fill-Normal);
|
||||||
|
cursor: pointer;
|
||||||
|
padding: var(--Spacing-x-one-and-half) var(--Spacing-x2);
|
||||||
|
border-radius: var(--Corner-radius-Rounded);
|
||||||
|
text-decoration: none;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export const linkVariants = cva(styles.link, {
|
|||||||
shortcut: styles.shortcut,
|
shortcut: styles.shortcut,
|
||||||
sidebar: styles.sidebar,
|
sidebar: styles.sidebar,
|
||||||
tab: styles.tab,
|
tab: styles.tab,
|
||||||
|
signupVerification: styles.signupVerification,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
defaultVariants: {
|
defaultVariants: {
|
||||||
|
|||||||
@@ -202,6 +202,7 @@
|
|||||||
"Points needed to level up": "Point nødvendige for at stige i niveau",
|
"Points needed to level up": "Point nødvendige for at stige i niveau",
|
||||||
"Points needed to stay on level": "Point nødvendige for at holde sig på niveau",
|
"Points needed to stay on level": "Point nødvendige for at holde sig på niveau",
|
||||||
"Previous victories": "Tidligere sejre",
|
"Previous victories": "Tidligere sejre",
|
||||||
|
"Proceed to login": "Fortsæt til login",
|
||||||
"Proceed to payment method": "Fortsæt til betalingsmetode",
|
"Proceed to payment method": "Fortsæt til betalingsmetode",
|
||||||
"Public price from": "Offentlig pris fra",
|
"Public price from": "Offentlig pris fra",
|
||||||
"Public transport": "Offentlig transport",
|
"Public transport": "Offentlig transport",
|
||||||
|
|||||||
@@ -195,13 +195,13 @@
|
|||||||
"Phone number": "Telefonnummer",
|
"Phone number": "Telefonnummer",
|
||||||
"Please enter a valid phone number": "Bitte geben Sie eine gültige Telefonnummer ein",
|
"Please enter a valid phone number": "Bitte geben Sie eine gültige Telefonnummer ein",
|
||||||
"Points": "Punkte",
|
"Points": "Punkte",
|
||||||
"points": "Punkte",
|
|
||||||
"Points being calculated": "Punkte werden berechnet",
|
"Points being calculated": "Punkte werden berechnet",
|
||||||
"Points earned prior to May 1, 2021": "Zusammengeführte Punkte vor dem 1. Mai 2021",
|
"Points earned prior to May 1, 2021": "Zusammengeführte Punkte vor dem 1. Mai 2021",
|
||||||
"Points may take up to 10 days to be displayed.": "Es kann bis zu 10 Tage dauern, bis Punkte angezeigt werden.",
|
"Points may take up to 10 days to be displayed.": "Es kann bis zu 10 Tage dauern, bis Punkte angezeigt werden.",
|
||||||
"Points needed to level up": "Punkte, die zum Levelaufstieg benötigt werden",
|
"Points needed to level up": "Punkte, die zum Levelaufstieg benötigt werden",
|
||||||
"Points needed to stay on level": "Erforderliche Punkte, um auf diesem Level zu bleiben",
|
"Points needed to stay on level": "Erforderliche Punkte, um auf diesem Level zu bleiben",
|
||||||
"Previous victories": "Bisherige Siege",
|
"Previous victories": "Bisherige Siege",
|
||||||
|
"Proceed to login": "Weiter zum Login",
|
||||||
"Proceed to payment method": "Weiter zur Zahlungsmethode",
|
"Proceed to payment method": "Weiter zur Zahlungsmethode",
|
||||||
"Public price from": "Öffentlicher Preis ab",
|
"Public price from": "Öffentlicher Preis ab",
|
||||||
"Public transport": "Öffentliche Verkehrsmittel",
|
"Public transport": "Öffentliche Verkehrsmittel",
|
||||||
|
|||||||
@@ -201,6 +201,7 @@
|
|||||||
"Points needed to level up": "Points needed to level up",
|
"Points needed to level up": "Points needed to level up",
|
||||||
"Points needed to stay on level": "Points needed to stay on level",
|
"Points needed to stay on level": "Points needed to stay on level",
|
||||||
"Previous victories": "Previous victories",
|
"Previous victories": "Previous victories",
|
||||||
|
"Proceed to login": "Proceed to login",
|
||||||
"Proceed to payment method": "Proceed to payment method",
|
"Proceed to payment method": "Proceed to payment method",
|
||||||
"Public price from": "Public price from",
|
"Public price from": "Public price from",
|
||||||
"Public transport": "Public transport",
|
"Public transport": "Public transport",
|
||||||
|
|||||||
@@ -202,6 +202,7 @@
|
|||||||
"Points needed to level up": "Tarvitset vielä",
|
"Points needed to level up": "Tarvitset vielä",
|
||||||
"Points needed to stay on level": "Tällä tasolla pysymiseen tarvittavat pisteet",
|
"Points needed to stay on level": "Tällä tasolla pysymiseen tarvittavat pisteet",
|
||||||
"Previous victories": "Edelliset voitot",
|
"Previous victories": "Edelliset voitot",
|
||||||
|
"Proceed to login": "Jatka kirjautumiseen",
|
||||||
"Proceed to payment method": "Siirry maksutavalle",
|
"Proceed to payment method": "Siirry maksutavalle",
|
||||||
"Public price from": "Julkinen hinta alkaen",
|
"Public price from": "Julkinen hinta alkaen",
|
||||||
"Public transport": "Julkinen liikenne",
|
"Public transport": "Julkinen liikenne",
|
||||||
|
|||||||
@@ -200,6 +200,7 @@
|
|||||||
"Points needed to level up": "Poeng som trengs for å komme opp i nivå",
|
"Points needed to level up": "Poeng som trengs for å komme opp i nivå",
|
||||||
"Points needed to stay on level": "Poeng som trengs for å holde seg på nivå",
|
"Points needed to stay on level": "Poeng som trengs for å holde seg på nivå",
|
||||||
"Previous victories": "Tidligere seire",
|
"Previous victories": "Tidligere seire",
|
||||||
|
"Proceed to login": "Fortsett til innlogging",
|
||||||
"Proceed to payment method": "Fortsett til betalingsmetode",
|
"Proceed to payment method": "Fortsett til betalingsmetode",
|
||||||
"Public price from": "Offentlig pris fra",
|
"Public price from": "Offentlig pris fra",
|
||||||
"Public transport": "Offentlig transport",
|
"Public transport": "Offentlig transport",
|
||||||
|
|||||||
@@ -201,6 +201,7 @@
|
|||||||
"Points needed to level up": "Poäng som behövs för att gå upp i nivå",
|
"Points needed to level up": "Poäng som behövs för att gå upp i nivå",
|
||||||
"Points needed to stay on level": "Poäng som behövs för att hålla sig på nivå",
|
"Points needed to stay on level": "Poäng som behövs för att hålla sig på nivå",
|
||||||
"Previous victories": "Tidigare segrar",
|
"Previous victories": "Tidigare segrar",
|
||||||
|
"Proceed to login": "Fortsätt till inloggning",
|
||||||
"Proceed to payment method": "Gå vidare till betalningsmetod",
|
"Proceed to payment method": "Gå vidare till betalningsmetod",
|
||||||
"Public price from": "Offentligt pris från",
|
"Public price from": "Offentligt pris från",
|
||||||
"Public transport": "Kollektivtrafik",
|
"Public transport": "Kollektivtrafik",
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ export const contentPageQueryRouter = router({
|
|||||||
get: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
|
get: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
|
||||||
const { lang, uid } = ctx
|
const { lang, uid } = ctx
|
||||||
|
|
||||||
// TODO: Add logic to: check if Authed & Content Page URL is a "signup page", if so, redirect to home page.
|
|
||||||
|
|
||||||
const contentPageRefsData = await fetchContentPageRefs(lang, uid)
|
const contentPageRefsData = await fetchContentPageRefs(lang, uid)
|
||||||
const contentPageRefs = validateContentPageRefs(
|
const contentPageRefs = validateContentPageRefs(
|
||||||
contentPageRefsData,
|
contentPageRefsData,
|
||||||
|
|||||||
@@ -18,3 +18,16 @@ export interface LoyaltyLevelsProps extends PartialDynamicContent {
|
|||||||
export interface OverviewTableProps extends PartialDynamicContent {
|
export interface OverviewTableProps extends PartialDynamicContent {
|
||||||
firstItem: boolean
|
firstItem: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface SignUpVerificationProps {
|
||||||
|
title: string
|
||||||
|
subtitle: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SignupFormWrapperProps {
|
||||||
|
dynamic_content: {
|
||||||
|
link: string
|
||||||
|
subtitle: string
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -78,3 +78,4 @@ export type TrackingPosition =
|
|||||||
| "top menu"
|
| "top menu"
|
||||||
| "hamburger menu"
|
| "hamburger menu"
|
||||||
| "join scandic friends sidebar"
|
| "join scandic friends sidebar"
|
||||||
|
| "sign up verification"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export namespace DynamicContentEnum {
|
|||||||
points_overview = "points_overview",
|
points_overview = "points_overview",
|
||||||
previous_stays = "previous_stays",
|
previous_stays = "previous_stays",
|
||||||
sign_up_form = "sign_up_form",
|
sign_up_form = "sign_up_form",
|
||||||
|
sign_up_verification = "sign_up_verification",
|
||||||
soonest_stays = "soonest_stays",
|
soonest_stays = "soonest_stays",
|
||||||
upcoming_stays = "upcoming_stays",
|
upcoming_stays = "upcoming_stays",
|
||||||
}
|
}
|
||||||
@@ -31,6 +32,7 @@ export namespace DynamicContentEnum {
|
|||||||
components.points_overview,
|
components.points_overview,
|
||||||
components.previous_stays,
|
components.previous_stays,
|
||||||
components.sign_up_form,
|
components.sign_up_form,
|
||||||
|
components.sign_up_verification,
|
||||||
components.soonest_stays,
|
components.soonest_stays,
|
||||||
components.upcoming_stays,
|
components.upcoming_stays,
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user