feat(SW-360): Add signup verification route w. tracking for login

This commit is contained in:
Chuma McPhoy
2024-10-03 15:29:45 +02:00
parent 516f8555d5
commit 1f6fd4e980
17 changed files with 83 additions and 14 deletions

View File

@@ -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>
)
}

View File

@@ -0,0 +1,6 @@
.container {
display: flex;
flex-direction: column;
align-items: flex-start;
margin-top: var(--Spacing-x3);
}

View File

@@ -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} />
} }

View File

@@ -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:

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -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: {

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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,

View File

@@ -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
}
}

View File

@@ -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"

View File

@@ -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,
] ]