cleanup profile page html to be valid replace old temp design system components with new ones divider is now correctly an hr element less section elements to be valid html
183 lines
5.8 KiB
TypeScript
183 lines
5.8 KiB
TypeScript
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
|
|
import { Typography } from "@scandic-hotels/design-system/Typography"
|
|
|
|
import { countriesMap } from "@/constants/countries"
|
|
import { Lang, languages } from "@/constants/languages"
|
|
import { profileEdit } from "@/constants/routes/myPages"
|
|
import { getProfile } from "@/lib/trpc/memoizedRequests"
|
|
|
|
import ButtonLink from "@/components/ButtonLink"
|
|
import CommunicationSlot from "@/components/MyPages/Profile/Communication"
|
|
import CreditCardSlot from "@/components/MyPages/Profile/CreditCards"
|
|
import Header from "@/components/Profile/Header"
|
|
import Divider from "@/components/TempDesignSystem/Divider"
|
|
import { getIntl } from "@/i18n"
|
|
import { getLang } from "@/i18n/serverContext"
|
|
import { isValidCountry } from "@/utils/countries"
|
|
import { isValidLang } from "@/utils/languages"
|
|
|
|
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 = 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({
|
|
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]
|
|
|
|
return (
|
|
<section className={styles.container}>
|
|
<Header>
|
|
<Typography variant="Title/xs">
|
|
<h2 className={styles.title}>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Welcome",
|
|
})}
|
|
<br />
|
|
<span data-hj-suppress className={styles.titleName}>
|
|
{user.name}
|
|
</span>
|
|
</h2>
|
|
</Typography>
|
|
<ButtonLink
|
|
size="Small"
|
|
prefetch={false}
|
|
href={profileEdit[lang]}
|
|
typography="Body/Supporting text (caption)/smBold"
|
|
>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Edit profile",
|
|
})}
|
|
</ButtonLink>
|
|
</Header>
|
|
<div className={styles.info}>
|
|
<div className={styles.item}>
|
|
<MaterialIcon
|
|
icon="calendar_month"
|
|
color="Icon/Interactive/Default"
|
|
/>
|
|
<Typography variant="Body/Paragraph/mdBold">
|
|
<p>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Date of Birth",
|
|
})}
|
|
</p>
|
|
</Typography>
|
|
<Typography variant="Body/Paragraph/mdRegular">
|
|
<p>{user.dateOfBirth}</p>
|
|
</Typography>
|
|
</div>
|
|
<div className={styles.item}>
|
|
<MaterialIcon icon="phone" color="Icon/Interactive/Default" />
|
|
<Typography variant="Body/Paragraph/mdBold">
|
|
<p>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Phone number",
|
|
})}
|
|
</p>
|
|
</Typography>
|
|
<Typography variant="Body/Paragraph/mdRegular">
|
|
<p>{user.phoneNumber}</p>
|
|
</Typography>
|
|
</div>
|
|
<div className={styles.item}>
|
|
<MaterialIcon icon="globe" color="Icon/Interactive/Default" />
|
|
<Typography variant="Body/Paragraph/mdBold">
|
|
<p>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Language",
|
|
})}
|
|
</p>
|
|
</Typography>
|
|
<Typography variant="Body/Paragraph/mdRegular">
|
|
<p>{normalizedLanguage}</p>
|
|
</Typography>
|
|
</div>
|
|
<div className={styles.item}>
|
|
<MaterialIcon icon="mail" color="Icon/Interactive/Default" />
|
|
<Typography variant="Body/Paragraph/mdBold">
|
|
<p>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Email",
|
|
})}
|
|
</p>
|
|
</Typography>
|
|
<Typography variant="Body/Paragraph/mdRegular">
|
|
<p>{user.email}</p>
|
|
</Typography>
|
|
</div>
|
|
<div className={styles.item}>
|
|
<MaterialIcon icon="location_on" color="Icon/Interactive/Default" />
|
|
<Typography variant="Body/Paragraph/mdBold">
|
|
<p>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Address",
|
|
})}
|
|
</p>
|
|
</Typography>
|
|
<Typography variant="Body/Paragraph/mdRegular">
|
|
<p>{addressOutput}</p>
|
|
</Typography>
|
|
</div>
|
|
<div className={styles.item}>
|
|
<MaterialIcon icon="lock" color="Icon/Interactive/Default" />
|
|
<Typography variant="Body/Paragraph/mdBold">
|
|
<p>
|
|
{intl.formatMessage({
|
|
defaultMessage: "Password",
|
|
})}
|
|
</p>
|
|
</Typography>
|
|
<Typography variant="Body/Paragraph/mdRegular">
|
|
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
|
|
<p>**********</p>
|
|
</Typography>
|
|
</div>
|
|
</div>
|
|
<Divider color="burgundy" opacity={8} />
|
|
<CreditCardSlot />
|
|
{/* <MembershipCardSlot /> */}
|
|
<CommunicationSlot />
|
|
</section>
|
|
)
|
|
}
|