Files
web/apps/scandic-web/components/MyPages/Profile/index.tsx
Linus Flood cd59102ef4 Merged in feat/svg-instead-of-fonts (pull request #3411)
feat(SW-3695): use svg icons instead of font icons

* feat(icons): use svg instead of font icons

* feat(icons): use webpack/svgr for inlined svgs. Now support for isFilled again

* Merge master

* Remove old font icon


Approved-by: Joakim Jäderberg
2026-01-09 13:14:09 +00:00

173 lines
4.8 KiB
TypeScript

import { Lang, languages } from "@scandic-hotels/common/constants/language"
import { profileEdit } from "@scandic-hotels/common/constants/routes/myPages"
import { isValidLang } from "@scandic-hotels/common/utils/languages"
import ButtonLink from "@scandic-hotels/design-system/ButtonLink"
import { Divider } from "@scandic-hotels/design-system/Divider"
import {
MaterialIcon,
type MaterialIconProps,
} from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { countriesMap } from "@scandic-hotels/trpc/constants/countries"
import { getProfile } from "@/lib/trpc/memoizedRequests"
import Header from "@/components/Profile/Header"
import { getIntl } from "@/i18n"
import { getLang } from "@/i18n/serverContext"
import { isValidCountry } from "@/utils/countries"
import ChangeNameDisclaimer from "./ChangeNameDisclaimer"
import { CommunicationSettings } from "./CommunicationSettings"
import { Payment } from "./Payment"
import styles from "./profile.module.css"
export default async function Profile() {
const user = await getProfile()
if (!user || "error" in user) {
return null
}
const intl = await getIntl()
const lang = await getLang()
const addressParts = []
if (user.address?.streetAddress) {
addressParts.push(user.address.streetAddress)
}
if (user.address?.city) {
addressParts.push(user.address.city)
}
const displayNames = {
language: new Intl.DisplayNames([lang], { type: "language" }),
region: new Intl.DisplayNames([lang], { type: "region" }),
}
if (user.address?.country) {
const countryCode = isValidCountry(user.address?.country)
? countriesMap[user.address.country]
: null
const localizedCountry = countryCode
? displayNames.region.of(countryCode)
: user.address.country
addressParts.push(localizedCountry)
}
const addressOutput =
addressParts.length > 0
? addressParts.join(", ")
: intl.formatMessage({
id: "common.NA",
defaultMessage: "N/A",
})
const userLang = isValidLang(user.language) ? user.language : Lang.en
const localizedLanguage = displayNames.language.of(userLang)
const normalizedLanguage = localizedLanguage
? localizedLanguage.charAt(0).toUpperCase() + localizedLanguage.slice(1)
: languages[userLang]
const userDataItems: {
icon: MaterialIconProps["icon"]
label: string
value: string
}[] = [
{
icon: "calendar_month",
label: intl.formatMessage({
id: "profile.dateOfBirth",
defaultMessage: "Date of birth",
}),
value: user.dateOfBirth,
},
{
icon: "phone_enabled",
label: intl.formatMessage({
id: "common.phoneNumber",
defaultMessage: "Phone number",
}),
value: user.phoneNumber ?? "",
},
{
icon: "globe",
label: intl.formatMessage({
id: "profile.language",
defaultMessage: "Language",
}),
value: normalizedLanguage,
},
{
icon: "mail",
label: intl.formatMessage({
id: "common.email",
defaultMessage: "Email",
}),
value: user.email,
},
{
icon: "location_on",
label: intl.formatMessage({
id: "common.address",
defaultMessage: "Address",
}),
value: addressOutput,
},
{
icon: "lock",
label: intl.formatMessage({
id: "profile.password",
defaultMessage: "Password",
}),
value: "**********",
},
]
return (
<section className={styles.container}>
<Header>
<Typography variant="Title/xs">
<h2 className={styles.title}>
{intl.formatMessage({
id: "common.welcome",
defaultMessage: "Welcome",
})}
<br />
<span data-hj-suppress className={styles.titleName}>
{user.name}
</span>
</h2>
</Typography>
<ButtonLink size="sm" prefetch={false} href={profileEdit[lang]}>
{intl.formatMessage({
id: "myPages.editProfile",
defaultMessage: "Edit profile",
})}
</ButtonLink>
</Header>
<div className={styles.info}>
{userDataItems.map(({ icon, label, value }) => (
<div className={styles.item} key={label}>
<MaterialIcon icon={icon} color="Icon/Interactive/Default" />
<Typography variant="Body/Paragraph/mdBold">
<p>{label}</p>
</Typography>
<Typography variant="Body/Paragraph/mdRegular">
<p data-hj-suppress>{value}</p>
</Typography>
</div>
))}
</div>
<ChangeNameDisclaimer />
<Divider />
<CommunicationSettings />
<Payment />
{/* <MembershipCardSlot /> */}
</section>
)
}