From a9868dac9cee451cf4e936f68e9e075385c43c87 Mon Sep 17 00:00:00 2001 From: "Chuma Mcphoy (We Ahead)" Date: Wed, 2 Jul 2025 11:50:27 +0000 Subject: [PATCH] Merged in feat/LOY-203-connected-state-employee-benefits (pull request #2496) feat(LOY-203): Enable Opening Team Member Card from Employee Benefits Page When Connected * feat(LOY-203): add support for opening team member card modal from employee benefits page when connected * fix(LOY-203): add id_card to material symbol icons * fix(LOY-203): remove uneeded dtmc btb style Approved-by: Erik Tiekstra Approved-by: Linus Flood --- .../Blocks/DynamicContent/Overview/index.tsx | 20 ++++- .../Overview/overview.module.css | 10 +++ .../EmployeeBenefits/CallToActions/index.tsx | 31 +++++-- .../DigitalTeamMemberCard/Trigger.tsx | 16 ++++ apps/scandic-web/components/Modal/index.tsx | 6 +- apps/scandic-web/components/Modal/modal.ts | 8 +- .../MyPages/DigitalTeamMemberCard/Client.tsx | 82 ++++++++----------- .../digitalTeamMemberCard.module.css | 17 ---- .../MyPages/DigitalTeamMemberCard/index.tsx | 8 +- .../MaterialIcon/MaterialSymbol/consts.ts | 1 + 10 files changed, 122 insertions(+), 77 deletions(-) create mode 100644 apps/scandic-web/components/DigitalTeamMemberCard/Trigger.tsx diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/index.tsx b/apps/scandic-web/components/Blocks/DynamicContent/Overview/index.tsx index ad772614b..631f5c6e8 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/index.tsx +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/index.tsx @@ -1,13 +1,16 @@ import { Divider } from "@scandic-hotels/design-system/Divider" +import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { env } from "@/env/server" import { getProfile } from "@/lib/trpc/memoizedRequests" +import { TeamMemberCardTrigger } from "@/components/DigitalTeamMemberCard/Trigger" import DigitalTeamMemberCard from "@/components/MyPages/DigitalTeamMemberCard" import DigitalTeamMemberCardAlert from "@/components/MyPages/DigitalTeamMemberCard/Alert" import SectionContainer from "@/components/Section/Container" import SectionHeader from "@/components/Section/Header" import SectionLink from "@/components/Section/Link" +import { getIntl } from "@/i18n" import Hero from "./Friend/Hero" import MembershipNumber from "./Friend/MembershipNumber" @@ -23,6 +26,7 @@ export default async function Overview({ subtitle, title, }: AccountPageComponentProps) { + const intl = await getIntl() const user = await getProfile() if (!user || "error" in user) { return null @@ -38,7 +42,21 @@ export default async function Overview({ headingAs="h3" headingLevel="h1" /> - + + + <> + + {intl.formatMessage({ + defaultMessage: "Show Team Member Card", + })} + + + diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/overview.module.css b/apps/scandic-web/components/Blocks/DynamicContent/Overview/overview.module.css index b1b2b62a0..f64bf5954 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/overview.module.css +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/overview.module.css @@ -2,6 +2,16 @@ margin-top: var(--Spacing-x2); } +.teamMemberCardButton { + border-radius: var(--Corner-radius-md); + color: var(--Text-Brand-OnPrimary-3-Accent); + + &:focus, + &:not(:disabled):hover { + color: var(--Text-Brand-OnPrimary-3-Accent); + } +} + @media screen and (max-width: 767px) { .container { /* Full-width override styling */ diff --git a/apps/scandic-web/components/DigitalTeamMemberCard/EmployeeBenefits/CallToActions/index.tsx b/apps/scandic-web/components/DigitalTeamMemberCard/EmployeeBenefits/CallToActions/index.tsx index cfa6e8faa..e6d13ab65 100644 --- a/apps/scandic-web/components/DigitalTeamMemberCard/EmployeeBenefits/CallToActions/index.tsx +++ b/apps/scandic-web/components/DigitalTeamMemberCard/EmployeeBenefits/CallToActions/index.tsx @@ -2,26 +2,28 @@ import React from "react" import { signup } from "@scandic-hotels/common/constants/routes/signup" import { Typography } from "@scandic-hotels/design-system/Typography" -import { isValidSession } from "@scandic-hotels/trpc/utils/session" import { dtmcLogin } from "@/constants/routes/dtmc" import { login } from "@/constants/routes/handleAuth" +import { getProfileSafely } from "@/lib/trpc/memoizedRequests" -import { auth } from "@/auth" import ButtonLink from "@/components/ButtonLink" +import { TeamMemberCardTrigger } from "@/components/DigitalTeamMemberCard/Trigger" +import DigitalTeamMemberCard from "@/components/MyPages/DigitalTeamMemberCard" import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" +import { isEmployeeLinked } from "@/utils/user" import styles from "./callToActions.module.css" export default async function EmployeeBenefitsCallToActions() { - const session = await auth() + const user = await getProfileSafely() const intl = await getIntl() const lang = await getLang() const loginAndLinkURL = `${login[lang]}?redirectTo=${encodeURIComponent(dtmcLogin[lang])}` - if (!isValidSession(session)) { + if (!user) { return ( <>
@@ -57,9 +59,24 @@ export default async function EmployeeBenefitsCallToActions() { ) } - // -- TODO [LOY-196] -- - // Handle case of authed user and already connected work account. - // Show member card modal. + if (isEmployeeLinked(user)) { + return ( +
+ + + {intl.formatMessage({ + defaultMessage: "Show Team Member Card", + })} + + +
+ ) + } return (
diff --git a/apps/scandic-web/components/DigitalTeamMemberCard/Trigger.tsx b/apps/scandic-web/components/DigitalTeamMemberCard/Trigger.tsx new file mode 100644 index 000000000..b6c86062f --- /dev/null +++ b/apps/scandic-web/components/DigitalTeamMemberCard/Trigger.tsx @@ -0,0 +1,16 @@ +"use client" + +import { type ComponentProps } from "react" + +import { Button } from "@scandic-hotels/design-system/Button" + +interface TeamMemberCardTriggerProps extends ComponentProps { + children: React.ReactNode +} + +export function TeamMemberCardTrigger({ + children, + ...props +}: TeamMemberCardTriggerProps) { + return +} diff --git a/apps/scandic-web/components/Modal/index.tsx b/apps/scandic-web/components/Modal/index.tsx index 835e40ec0..a67614bce 100644 --- a/apps/scandic-web/components/Modal/index.tsx +++ b/apps/scandic-web/components/Modal/index.tsx @@ -136,6 +136,7 @@ export default function Modal({ trigger, isOpen, onToggle, + onOpenChange, title, subtitle, children, @@ -185,11 +186,12 @@ export default function Modal({ return ( + onOpenChange={(isOpen) => { setAnimation( isOpen ? AnimationStateEnum.visible : AnimationStateEnum.hidden ) - } + onOpenChange?.(isOpen) + }} > {trigger} diff --git a/apps/scandic-web/components/Modal/modal.ts b/apps/scandic-web/components/Modal/modal.ts index 0b8492743..6de0813ad 100644 --- a/apps/scandic-web/components/Modal/modal.ts +++ b/apps/scandic-web/components/Modal/modal.ts @@ -16,11 +16,17 @@ export type ModalProps = { hideHeader?: boolean className?: string } & ( - | { trigger: JSX.Element; isOpen?: never; onToggle?: never } + | { + trigger: JSX.Element + isOpen?: never + onToggle?: never + onOpenChange?: (open: boolean) => void + } | { trigger?: never isOpen: boolean onToggle: (open: boolean) => void + onOpenChange?: never } ) diff --git a/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/Client.tsx b/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/Client.tsx index 6cc809ffa..f2c7e325f 100644 --- a/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/Client.tsx +++ b/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/Client.tsx @@ -1,9 +1,7 @@ "use client" -import { useState } from "react" import { useIntl } from "react-intl" -import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" @@ -19,68 +17,56 @@ import type { User } from "@scandic-hotels/trpc/types/user" interface DigitalTeamMemberCardClientProps { user: User + children: React.ReactElement } export default function DigitalTeamMemberCardClient({ user, + children, }: DigitalTeamMemberCardClientProps) { const intl = useIntl() - const [isOpen, setIsOpen] = useState(false) const { release, request } = useWakeLock({ reacquireOnPageVisible: true, }) - function onToggle(modalState: boolean) { - setIsOpen(modalState) - if (modalState) { - request() + function onOpenChange(isOpen: boolean) { + if (isOpen) { + request() // Acquire wake lock when modal opens } else { - release() + release() // Release wake lock when modal closes } } return ( - <> - - - + + - -

- {intl.formatMessage({ - defaultMessage: - "Book discounted stays for yourself, family and friends!", - })} -

-
- - - {intl.formatMessage({ - defaultMessage: "Check out all your benefits", - })} - - - -
- + +

+ {intl.formatMessage({ + defaultMessage: + "Book discounted stays for yourself, family and friends!", + })} +

+
+ + + {intl.formatMessage({ + defaultMessage: "Check out all your benefits", + })} + + + +
) } diff --git a/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/digitalTeamMemberCard.module.css b/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/digitalTeamMemberCard.module.css index 831f962cd..74ebcc01d 100644 --- a/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/digitalTeamMemberCard.module.css +++ b/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/digitalTeamMemberCard.module.css @@ -1,20 +1,3 @@ -.button { - border-radius: var(--Corner-radius-md); - color: var(--Text-Brand-OnPrimary-3-Accent); - - &:focus, - &:not(:disabled):hover { - color: var(--Text-Brand-OnPrimary-3-Accent); - } -} - -.text { - display: flex; - justify-content: center; - align-items: center; - gap: var(--Space-x1); -} - .title { color: var(--Text-Accent-Primary); } diff --git a/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/index.tsx b/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/index.tsx index 167d45aca..a577d3def 100644 --- a/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/index.tsx +++ b/apps/scandic-web/components/MyPages/DigitalTeamMemberCard/index.tsx @@ -8,10 +8,12 @@ import type { User } from "@scandic-hotels/trpc/types/user" interface DigitalTeamMemberCardProps { user: User + children: React.ReactElement } export default async function DigitalTeamMemberCard({ user, + children, }: DigitalTeamMemberCardProps) { if (!env.ENABLE_DTMC) { return null @@ -21,5 +23,9 @@ export default async function DigitalTeamMemberCard({ if (!hasEmploymentData) { return null } - return + return ( + + {children} + + ) } diff --git a/packages/design-system/lib/components/Icons/MaterialIcon/MaterialSymbol/consts.ts b/packages/design-system/lib/components/Icons/MaterialIcon/MaterialSymbol/consts.ts index c4f57dfec..cb1c7d1f9 100644 --- a/packages/design-system/lib/components/Icons/MaterialIcon/MaterialSymbol/consts.ts +++ b/packages/design-system/lib/components/Icons/MaterialIcon/MaterialSymbol/consts.ts @@ -1551,6 +1551,7 @@ export const SymbolCodepointsArray = [ 'hvac', 'ice_skating', 'icecream', + 'id_card', 'ifl', 'iframe', 'iframe_off',