diff --git a/apps/partner-sas/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 b/apps/partner-sas/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 deleted file mode 100644 index 3b360cdf2..000000000 Binary files a/apps/partner-sas/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 and /dev/null differ diff --git a/apps/partner-sas/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 b/apps/partner-sas/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 new file mode 100644 index 000000000..5b6458b2d Binary files /dev/null and b/apps/partner-sas/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 differ diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/SasBoostStatus.tsx b/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/SasBoostStatus.tsx index 4d3b6c017..d37b673d6 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/SasBoostStatus.tsx +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/SasBoostStatus.tsx @@ -20,7 +20,9 @@ export default async function SasBoostStatus({ }: SasBoostStatusProps) { const lang = await getLang() - if (!sasMembership.boostedTierExpires) return null + if (!sasMembership.boostedTierExpires || sasMembership.boostedByScandic) { + return null + } const sasBoostExpiryText = intl.formatMessage( { diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/index.tsx b/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/index.tsx index 9fe6abb65..2ba263461 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/index.tsx +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/index.tsx @@ -37,10 +37,13 @@ export default async function MembershipOverviewCard({ ? getEurobonusMembership(user.loyalty) : null + const showSasBoostIcon = + sasMembership?.boostedTierExpires && !sasMembership.boostedByScandic + return (
- {sasMembership?.boostedTierExpires && ( + {showSasBoostIcon && ( )} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressCardHighestLevel.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressCardHighestLevel.tsx new file mode 100644 index 000000000..498e77d48 --- /dev/null +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressCardHighestLevel.tsx @@ -0,0 +1,30 @@ +import { calculateProgress } from "../utils" +import ProgressSection from "./ProgressSection" +import StatsSection from "./StatsSection" + +import styles from "../levelProgressCard.module.css" + +interface ProgressCardHighestLevelProps { + earned: number + required: number + toKeepCurrent?: number +} + +export default function ProgressCardHighestLevel({ + earned, + required, + toKeepCurrent, +}: ProgressCardHighestLevelProps) { + const progress = calculateProgress(earned, required, toKeepCurrent) + + return ( +
+ + +
+ ) +} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressCardLowerLevel.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressCardLowerLevel.tsx new file mode 100644 index 000000000..e87401ffe --- /dev/null +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressCardLowerLevel.tsx @@ -0,0 +1,30 @@ +import { calculateProgress } from "../utils" +import ProgressSection from "./ProgressSection" +import StatsSection from "./StatsSection" + +import styles from "../levelProgressCard.module.css" + +interface ProgressCardLowerLevelProps { + earned: number + toNext: number + toKeepCurrent?: number +} + +export default function ProgressCardLowerLevel({ + earned, + toNext, + toKeepCurrent, +}: ProgressCardLowerLevelProps) { + const progress = calculateProgress(earned, earned + toNext, toKeepCurrent) + + return ( +
+ + +
+ ) +} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressSection/index.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressSection/index.tsx new file mode 100644 index 000000000..6b8d2bf6a --- /dev/null +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressSection/index.tsx @@ -0,0 +1,97 @@ +"use client" + +import { cx } from "class-variance-authority" +import { useIntl } from "react-intl" + +import { Progress } from "@scandic-hotels/design-system/Progress" +import { Typography } from "@scandic-hotels/design-system/Typography" + +import styles from "./progressSection.module.css" + +import type { ProgressCalculation } from "../../types" + +export interface ProgressSectionProps { + earned: number + progress: ProgressCalculation + toKeepCurrent?: number +} + +export default function ProgressSection({ + earned, + progress, + toKeepCurrent, +}: ProgressSectionProps) { + const intl = useIntl() + const hasMarkerPosition = progress.markerPosition !== undefined + + return ( +
+
+ + + {hasMarkerPosition && toKeepCurrent && ( +
+
+
+
+ )} +
+ + {hasMarkerPosition && toKeepCurrent && ( +
+ + {intl.formatMessage( + { + defaultMessage: + "{pointsAmount} POINTS left to keep level", + }, + { + pointsAmount: ( + + {intl.formatNumber(toKeepCurrent)} + + ), + points: (str) => ( + + {str} + + ), + support: (str) => ( + + {str} + + ), + } + )} + +
+ )} +
+ ) +} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelCard/progressLevelCard.module.css b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressSection/progressSection.module.css similarity index 68% rename from apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelCard/progressLevelCard.module.css rename to apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressSection/progressSection.module.css index c6bcbbdf1..48ae0e95c 100644 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelCard/progressLevelCard.module.css +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/ProgressSection/progressSection.module.css @@ -1,39 +1,3 @@ -.card { - background: var(--Surface-Primary-Default); - border-radius: var(--Corner-radius-lg); - display: flex; - flex-direction: column; - gap: var(--Space-x2); - padding: var(--Space-x3) 0; -} - -.statsContainer { - display: flex; - padding: 0 var(--Space-x3); - justify-content: space-between; - align-items: center; - align-self: stretch; -} - -.statItem { - display: flex; - flex-direction: column; - gap: var(--Space-x05); -} - -.statItem:last-child { - text-align: right; -} - -.label { - color: var(--Text-Secondary); -} - -.value { - color: var(--Text-Accent-Primary); - word-break: break-all; -} - .progressSection { padding: 0 var(--Space-x3); display: flex; diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/StatsSection/index.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/StatsSection/index.tsx new file mode 100644 index 000000000..2c8e6fcb8 --- /dev/null +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/StatsSection/index.tsx @@ -0,0 +1,69 @@ +import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" +import { Typography } from "@scandic-hotels/design-system/Typography" + +import { getIntl } from "@/i18n" + +import styles from "./statsSection.module.css" + +interface StatsSectionProps { + earned: number + remaining?: number + showTrophy?: boolean +} + +export default async function StatsSection({ + earned, + remaining, + showTrophy = false, +}: StatsSectionProps) { + const intl = await getIntl() + return ( +
+
+ + + {intl.formatMessage({ + defaultMessage: "Points Earned", + })} + + + + + + {intl.formatNumber(earned)} + + +
+ +
+ {showTrophy ? ( + + ) : ( + <> + + + {intl.formatMessage({ + defaultMessage: "Left to level up", + })} + + + + + + {intl.formatNumber(remaining ?? 0)} + + + + )} +
+
+ ) +} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/StatsSection/statsSection.module.css b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/StatsSection/statsSection.module.css new file mode 100644 index 000000000..b9ce365e4 --- /dev/null +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/StatsSection/statsSection.module.css @@ -0,0 +1,30 @@ +.statsContainer { + display: flex; + padding: 0 var(--Space-x3); + justify-content: space-between; + align-items: center; + align-self: stretch; +} + +.statItem { + display: flex; + flex-direction: column; + gap: var(--Space-x05); +} + +.statItem:last-child { + text-align: right; +} + +.statItem:has(.trophyIcon) { + align-self: end; +} + +.label { + color: var(--Text-Secondary); +} + +.value { + color: var(--Text-Accent-Primary); + word-break: break-all; +} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/HighestLevelCard/index.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/SuccessCard/index.tsx similarity index 56% rename from apps/scandic-web/components/MyPages/LevelProgressCard/HighestLevelCard/index.tsx rename to apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/SuccessCard/index.tsx index e60ab68b3..ec9eb8b7f 100644 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/HighestLevelCard/index.tsx +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/SuccessCard/index.tsx @@ -1,25 +1,16 @@ -import { MembershipLevelEnum } from "@scandic-hotels/common/constants/membershipLevels" import TrophyIcon from "@scandic-hotels/design-system/Icons/TrophyIcon" import { Typography } from "@scandic-hotels/design-system/Typography" -import { serverClient } from "@/lib/trpc/server" +import { getIntl } from "@/i18n" -import styles from "./highestLevelCard.module.css" +import styles from "./successCard.module.css" -import type { HighestLevelCardProps } from "../types" - -export default async function HighestLevelCard({ - membershipLevel, - intl, -}: HighestLevelCardProps) { - const caller = await serverClient() - - const highestLevel = await caller.contentstack.loyaltyLevels.byLevel({ - level: MembershipLevelEnum[membershipLevel], - }) - - const pointsEarned = highestLevel?.required_points +export interface SuccessCardProps { + pointsEarned?: number | null +} +export default async function SuccessCard({ pointsEarned }: SuccessCardProps) { + const intl = await getIntl() return (
@@ -37,13 +28,12 @@ export default async function HighestLevelCard({ {intl.formatMessage( { defaultMessage: - "you've made it to the top by earning {pointAmount} points! Continue earning points for more points to spend.", + "You've earned {pointAmount} points this member year.", }, { pointAmount: ( {intl.formatNumber(pointsEarned)} ), - strong: (str) => {str}, } )}

diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/HighestLevelCard/highestLevelCard.module.css b/apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/SuccessCard/successCard.module.css similarity index 100% rename from apps/scandic-web/components/MyPages/LevelProgressCard/HighestLevelCard/highestLevelCard.module.css rename to apps/scandic-web/components/MyPages/LevelProgressCard/InnerCard/SuccessCard/successCard.module.css diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelCard/index.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelCard/index.tsx deleted file mode 100644 index 46970be47..000000000 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelCard/index.tsx +++ /dev/null @@ -1,144 +0,0 @@ -"use client" - -import { useIntl } from "react-intl" - -import { Progress } from "@scandic-hotels/design-system/Progress" -import { Typography } from "@scandic-hotels/design-system/Typography" - -import styles from "./progressLevelCard.module.css" - -import type { ProgressLevelCardProps } from "../types" - -export default function ProgressLevelCard({ - pointsEarned, - pointsToNextLevel, - pointsNeededToKeepLevel, -}: ProgressLevelCardProps) { - const intl = useIntl() - - // TODO: Awaiting proper UX/UI specs on missing point data scenarios. - if ( - typeof pointsEarned !== "number" || - typeof pointsToNextLevel !== "number" - ) { - return null - } - - const totalPointsForCurrentLevel = pointsEarned + pointsToNextLevel - const progressPercentage = (pointsEarned / totalPointsForCurrentLevel) * 100 - - // Calculate marker position (minimum threshold to keep current level) - const markerPosition = pointsNeededToKeepLevel - ? ((pointsEarned + pointsNeededToKeepLevel) / totalPointsForCurrentLevel) * - 100 - : null - - return ( -
-
-
- - - {intl.formatMessage({ - defaultMessage: "Points Earned", - })} - - - - - - {intl.formatNumber(pointsEarned)} - - -
- -
- - - {intl.formatMessage({ - defaultMessage: "Left to level up", - })} - - - - - - {intl.formatNumber(pointsToNextLevel)} - - -
-
- -
-
- - - {markerPosition !== null && pointsNeededToKeepLevel && ( -
-
-
-
- )} -
- - {markerPosition !== null && pointsNeededToKeepLevel && ( -
- - {intl.formatMessage( - { - defaultMessage: - "{pointsAmount} POINTS left to keep level", - }, - { - pointsAmount: ( - - {intl.formatNumber(pointsNeededToKeepLevel)} - - ), - points: (str) => ( - - {str} - - ), - support: (str) => ( - - {str} - - ), - } - )} - -
- )} -
-
- ) -} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelWrapper.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelWrapper.tsx deleted file mode 100644 index ed235e485..000000000 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/ProgressLevelWrapper.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { MembershipLevelEnum } from "@scandic-hotels/common/constants/membershipLevels" - -import { serverClient } from "@/lib/trpc/server" - -import ProgressLevelCard from "./ProgressLevelCard" - -import type { ProgressLevelWrapperProps } from "./types" - -export default async function ProgressLevelWrapper({ - user, -}: ProgressLevelWrapperProps) { - const caller = await serverClient() - - if (!user.membership || !user.membership.membershipLevel) { - return null - } - - // NOTE: We currently rely on the CMS to get "required_points" for a given level, - // but API is working on including them in the Profile endpoint. - const [currentLevel, nextLevel] = await Promise.all([ - caller.contentstack.loyaltyLevels.byLevel({ - level: MembershipLevelEnum[user.membership.membershipLevel], - }), - - user.membership.nextLevel && MembershipLevelEnum[user.membership.nextLevel] - ? caller.contentstack.loyaltyLevels.byLevel({ - level: MembershipLevelEnum[user.membership.nextLevel], - }) - : null, - ]) - - const pointsToNextLevel = user.membership.pointsRequiredToNextlevel - - // Relying on user.loyalty.points.earned isn't suffice here as it isn't limited to loyalty-level specific earnings, - // nor limited to earnings in the current member year. - // TODO: API is working on adding a tierEarnings field which we'll be able to use for this. - // Once that's out we won't need the nextLevel call above. - const currentEarnings = - nextLevel?.required_points && pointsToNextLevel - ? nextLevel?.required_points - pointsToNextLevel - : null - - let pointsNeededToKeepLevel = null - - if (currentEarnings !== null && currentLevel?.required_points) { - if (currentEarnings < currentLevel.required_points) { - pointsNeededToKeepLevel = currentLevel.required_points - currentEarnings - } - } - - return ( - - ) -} diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/index.tsx b/apps/scandic-web/components/MyPages/LevelProgressCard/index.tsx index c71871162..1e006363c 100644 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/index.tsx +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/index.tsx @@ -4,10 +4,11 @@ import { Typography } from "@scandic-hotels/design-system/Typography" import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" -import { isHighestMembership } from "@/utils/user" -import HighestLevelCard from "./HighestLevelCard" -import ProgressLevelWrapper from "./ProgressLevelWrapper" +import ProgressCardHighestLevel from "./InnerCard/ProgressCardHighestLevel" +import ProgressCardLowerLevel from "./InnerCard/ProgressCardLowerLevel" +import SuccessCard from "./InnerCard/SuccessCard" +import { getLevelProgressData } from "./utils" import { levelProgressCardVariants } from "./variants" import styles from "./levelProgressCard.module.css" @@ -19,13 +20,13 @@ export default async function LevelProgressCard({ className, color = "Surface/Brand/Primary 1/OnSurface/Default", }: levelProgressCardProps) { - const intl = await getIntl() - const lang = await getLang() - if (!user.membership?.membershipLevel) { return null } + const intl = await getIntl() + const lang = await getLang() + const data = await getLevelProgressData(user.membership) const classNames = levelProgressCardVariants({ className, color }) return ( @@ -60,13 +61,25 @@ export default async function LevelProgressCard({ } />
- {isHighestMembership(user.membership.membershipLevel) ? ( - + )} + + {data.type === "highest-incomplete" && ( + + )} + + {data.type === "lower-level" && ( + - ) : ( - )}
) diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/levelProgressCard.module.css b/apps/scandic-web/components/MyPages/LevelProgressCard/levelProgressCard.module.css index 680d78a5d..a73293f9d 100644 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/levelProgressCard.module.css +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/levelProgressCard.module.css @@ -54,6 +54,15 @@ align-self: start; } +.innerCard { + background: var(--Surface-Primary-Default); + border-radius: var(--Corner-radius-lg); + display: flex; + flex-direction: column; + gap: var(--Space-x2); + padding: var(--Space-x3) 0; +} + @media screen and (min-width: 1367px) { .levelProgressCard { padding: var(--Space-x3) var(--Space-x4); diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/types.ts b/apps/scandic-web/components/MyPages/LevelProgressCard/types.ts index f039bb12a..7f601de66 100644 --- a/apps/scandic-web/components/MyPages/LevelProgressCard/types.ts +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/types.ts @@ -1,7 +1,5 @@ -import type { MembershipLevel } from "@scandic-hotels/common/constants/membershipLevels" import type { User } from "@scandic-hotels/trpc/types/user" import type { VariantProps } from "class-variance-authority" -import type { IntlShape } from "react-intl" import type { levelProgressCardVariants } from "./variants" @@ -11,17 +9,23 @@ export interface levelProgressCardProps user: User } -export interface ProgressLevelWrapperProps { - user: User -} +export type LevelProgressData = + | { type: "highest-complete"; earned: number } + | { + type: "highest-incomplete" + earned: number + toKeepCurrent?: number + required: number + } + | { + type: "lower-level" + earned: number + toNext: number + toKeepCurrent?: number + } -export interface ProgressLevelCardProps { - pointsEarned?: number | null - pointsToNextLevel?: number | null - pointsNeededToKeepLevel: number | null -} - -export interface HighestLevelCardProps { - membershipLevel: MembershipLevel - intl: IntlShape +export interface ProgressCalculation { + percentage: number + markerPosition?: number + total: number } diff --git a/apps/scandic-web/components/MyPages/LevelProgressCard/utils.ts b/apps/scandic-web/components/MyPages/LevelProgressCard/utils.ts new file mode 100644 index 000000000..395f5f653 --- /dev/null +++ b/apps/scandic-web/components/MyPages/LevelProgressCard/utils.ts @@ -0,0 +1,57 @@ +import { MembershipLevelEnum } from "@scandic-hotels/common/constants/membershipLevels" + +import { serverClient } from "@/lib/trpc/server" + +import { isHighestMembership } from "@/utils/user" + +import { type LevelProgressData, type ProgressCalculation } from "./types" + +import type { FriendsMembership } from "@scandic-hotels/trpc/types/user" + +export async function getLevelProgressData( + membership: NonNullable +): Promise { + const caller = await serverClient() + const currentLevel = await caller.contentstack.loyaltyLevels.byLevel({ + level: MembershipLevelEnum[membership.membershipLevel], + }) + + const earned = membership.tierPoints ?? 0 + + // Check if user has points left to retain their current level. + const toKeepCurrent = + currentLevel?.required_points && earned < currentLevel.required_points + ? currentLevel.required_points - earned + : undefined + + if (isHighestMembership(membership.membershipLevel)) { + return toKeepCurrent + ? { + type: "highest-incomplete", + earned, + toKeepCurrent, + required: currentLevel!.required_points, + } + : { type: "highest-complete", earned } + } + + return { + type: "lower-level", + earned, + toNext: membership.pointsRequiredToNextlevel ?? 0, + toKeepCurrent, + } +} + +export function calculateProgress( + earned: number, + total: number, + keepThreshold?: number +): ProgressCalculation { + const percentage = (earned / total) * 100 + const markerPosition = keepThreshold + ? ((earned + keepThreshold) / total) * 100 + : undefined + + return { percentage, markerPosition, total } +} diff --git a/apps/scandic-web/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 b/apps/scandic-web/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 deleted file mode 100644 index 3b360cdf2..000000000 Binary files a/apps/scandic-web/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 and /dev/null differ diff --git a/apps/scandic-web/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 b/apps/scandic-web/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 new file mode 100644 index 000000000..5b6458b2d Binary files /dev/null and b/apps/scandic-web/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 differ diff --git a/packages/design-system/lib/components/Icons/IconByCSSelect.tsx b/packages/design-system/lib/components/Icons/IconByCSSelect.tsx index 6fbc8a328..b099f0ea9 100644 --- a/packages/design-system/lib/components/Icons/IconByCSSelect.tsx +++ b/packages/design-system/lib/components/Icons/IconByCSSelect.tsx @@ -71,6 +71,7 @@ export default function IconByCSSelect({ case 'tram': case 'transit_ticket': case 'travel': + case 'trophy': case 'travel_luggage_and_bags': case 'favorite': return ( diff --git a/packages/design-system/lib/components/Icons/IconByIconName.tsx b/packages/design-system/lib/components/Icons/IconByIconName.tsx index 8eca2e7c5..d8ec734e7 100644 --- a/packages/design-system/lib/components/Icons/IconByIconName.tsx +++ b/packages/design-system/lib/components/Icons/IconByIconName.tsx @@ -347,6 +347,8 @@ export function IconByIconName({ return case IconName.Tripadvisor: return + case IconName.Trophy: + return case IconName.TshirtWash: return case IconName.TvCasting: 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 db74d63fc..52c974c17 100644 --- a/packages/design-system/lib/components/Icons/MaterialIcon/MaterialSymbol/consts.ts +++ b/packages/design-system/lib/components/Icons/MaterialIcon/MaterialSymbol/consts.ts @@ -3177,6 +3177,7 @@ export const SymbolCodepointsArray = [ 'train', 'tram', 'transit_ticket', + 'trophy', 'transcribe', 'transfer_within_a_station', 'transform', diff --git a/packages/design-system/lib/fonts.css b/packages/design-system/lib/fonts.css index 35877a742..813ee4190 100644 --- a/packages/design-system/lib/fonts.css +++ b/packages/design-system/lib/fonts.css @@ -269,7 +269,7 @@ font-style: normal; font-weight: 400; font-display: block; - src: url(/_static/fonts/material-symbols/rounded-93de53b3.woff2) + src: url(/_static/fonts/material-symbols/rounded-f2d895e1.woff2) format('woff2'); } diff --git a/packages/design-system/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 b/packages/design-system/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 deleted file mode 100644 index 3b360cdf2..000000000 Binary files a/packages/design-system/public/_static/fonts/material-symbols/rounded-93de53b3.woff2 and /dev/null differ diff --git a/packages/design-system/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 b/packages/design-system/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 new file mode 100644 index 000000000..5b6458b2d Binary files /dev/null and b/packages/design-system/public/_static/fonts/material-symbols/rounded-f2d895e1.woff2 differ diff --git a/packages/trpc/lib/routers/user/helpers.ts b/packages/trpc/lib/routers/user/helpers.ts index bee4620df..1dfe5d648 100644 --- a/packages/trpc/lib/routers/user/helpers.ts +++ b/packages/trpc/lib/routers/user/helpers.ts @@ -40,6 +40,7 @@ export function getFriendsMembership(userLoyalty: UserLoyalty) { nightsToTopTier: friendsMembership.nightsToTopTier, pointsRequiredToNextlevel: friendsMembership.pointsToNextTier, tierExpirationDate: loyalty.tierExpires, + tierPoints: friendsMembership.tierPoints, pointsExpiryDate: pointExpiration?.expires, pointsToExpire: pointExpiration?.points, memberSince: friendsMembership.memberSince, diff --git a/packages/trpc/lib/routers/user/output.ts b/packages/trpc/lib/routers/user/output.ts index 066f42e06..32b6ab2cb 100644 --- a/packages/trpc/lib/routers/user/output.ts +++ b/packages/trpc/lib/routers/user/output.ts @@ -47,6 +47,7 @@ export const friendsMembershipSchema = z tier: scandicFriendsTier, nextTier: scandicFriendsTier.nullish(), pointsToNextTier: z.number().nullish(), + tierPoints: z.number().nullish(), nightsToTopTier: z.number().nullish(), }) .merge(commonMembershipSchema) diff --git a/scripts/material-symbols-update.mjs b/scripts/material-symbols-update.mjs index 6ccfff306..1571b4752 100644 --- a/scripts/material-symbols-update.mjs +++ b/scripts/material-symbols-update.mjs @@ -209,6 +209,7 @@ const icons = [ 'tram', 'transit_ticket', 'travel', + 'trophy', 'travel_luggage_and_bags', 'tv_guide', 'tv_remote',