diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@communication/[...catchAll]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@communication/[...catchAll]/page.tsx deleted file mode 100644 index 03a82e5f5..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@communication/[...catchAll]/page.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from "../page" diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/[...catchAll]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/[...catchAll]/page.tsx deleted file mode 100644 index 03a82e5f5..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/[...catchAll]/page.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from "../page" diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/[...catchAll]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/[...catchAll]/page.tsx deleted file mode 100644 index 03a82e5f5..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/[...catchAll]/page.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from "../page" diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/default.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/edit/default.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/edit/default.tsx deleted file mode 100644 index b214932df..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/edit/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function DefaultEditProfileSlot() { - return null -} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/edit/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/edit/page.tsx deleted file mode 100644 index 80dc3c4de..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/edit/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { getProfile } from "@/lib/trpc/memoizedRequests" - -import Form from "@/components/Forms/Edit/Profile" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function EditProfileSlot({}: PageArgs) { - const user = await getProfile() - if (!user || "error" in user) { - return null - } - return
-} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx deleted file mode 100644 index 409dc9416..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/error.tsx +++ /dev/null @@ -1,20 +0,0 @@ -"use client" - -import * as Sentry from "@sentry/nextjs" -import { useEffect } from "react" -import { useIntl } from "react-intl" - -import type { ErrorPage } from "@/types/next/error" - -export default function ProfileError({ error }: ErrorPage) { - const intl = useIntl() - - useEffect(() => { - if (!error) return - - console.error(error) - Sentry.captureException(error) - }, [error]) - - return

{intl.formatMessage({ id: "Error happened, Profile" })}

-} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/layout.module.css b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/layout.module.css deleted file mode 100644 index 78336c027..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/layout.module.css +++ /dev/null @@ -1,6 +0,0 @@ -.container { - background-color: var(--Main-Grey-White); - border-radius: var(--Corner-radius-Large); - display: grid; - gap: var(--Spacing-x3); -} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/layout.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/layout.tsx deleted file mode 100644 index 90c657db2..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/layout.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import styles from "./layout.module.css" - -export default function ProfileSlotLayout({ - children, -}: React.PropsWithChildren) { - return
{children}
-} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx deleted file mode 100644 index 84a8aba22..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { languages, languageSelect } from "@/constants/languages" -import { profileEdit } from "@/constants/routes/myPages" -import { getProfile } from "@/lib/trpc/memoizedRequests" - -import { - CalendarIcon, - EmailIcon, - GlobeIcon, - LocationIcon, - LockIcon, - PhoneIcon, -} from "@/components/Icons" -import Header from "@/components/Profile/Header" -import Button from "@/components/TempDesignSystem/Button" -import Link from "@/components/TempDesignSystem/Link" -import Body from "@/components/TempDesignSystem/Text/Body" -import Title from "@/components/TempDesignSystem/Text/Title" -import { getIntl } from "@/i18n" - -import styles from "./page.module.css" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function Profile({ params }: PageArgs) { - const intl = await getIntl() - const user = await getProfile() - if (!user || "error" in user) { - return null - } - - const addressParts = [] - if (user.address.streetAddress) { - addressParts.push(user.address.streetAddress) - } - - if (user.address.city) { - addressParts.push(user.address.city) - } - - if (user.address.country) { - addressParts.push(user.address.country) - } - - const addressOutput = - addressParts.length > 0 - ? addressParts.join(", ") - : intl.formatMessage({ id: "N/A" }) - - const defaultLanguage = languages[params.lang] - const language = languageSelect.find((l) => l.value === user.language) - return ( - <> -
-
- - {intl.formatMessage({ id: "Welcome" })} - - - {user.name} - -
- -
-
-
-
- - - {intl.formatMessage({ id: "Date of Birth" })} - - {user.dateOfBirth} -
-
- - - {intl.formatMessage({ id: "Phone number" })} - - {user.phoneNumber} -
-
- - - {intl.formatMessage({ id: "Language" })} - - {language?.label ?? defaultLanguage} -
-
- - - {intl.formatMessage({ id: "Email" })} - - {user.email} -
-
- - - {intl.formatMessage({ id: "Address" })} - - {addressOutput} -
-
- - - {intl.formatMessage({ id: "Password" })} - - ********** -
-
-
- - ) -} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.module.css b/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.module.css new file mode 100644 index 000000000..f583c4b01 --- /dev/null +++ b/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.module.css @@ -0,0 +1,12 @@ +.container { + background-color: var(--Main-Grey-White); + border-radius: var(--Corner-radius-Large); + display: grid; + gap: var(--Spacing-x3); + padding: var(--Spacing-x2) var(--Spacing-x2) var(--Spacing-x4); +} +@media screen and (min-width: 768px) { + .container { + padding: var(--Spacing-x3) var(--Spacing-x3) var(--Spacing-x4); + } +} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx index c2d24fe62..f9f17783a 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx @@ -1,5 +1,19 @@ -import ProfilePage from "../page" +import { getProfile } from "@/lib/trpc/memoizedRequests" -export { generateMetadata } from "@/utils/generateMetadata" +import Form from "@/components/Forms/Edit/Profile" -export default ProfilePage +import styles from "./page.module.css" + +export default async function EditProfileSlot() { + const user = await getProfile() + if (!user || "error" in user) { + return null + } + return ( + <> +
+ +
+ + ) +} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx index 73496fe4e..cce9f07da 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx @@ -1,22 +1,3 @@ -import Divider from "@/components/TempDesignSystem/Divider" - -import type { ProfileLayoutProps } from "@/types/components/myPages/myProfile/layout" - -export default function ProfileLayout({ - children, - communication, - creditCards, - profile, -}: React.PropsWithChildren) { - return ( -
- {children} -
- {profile} - - {creditCards} - {communication} -
-
- ) +export default function ProfileLayout({ children }: React.PropsWithChildren) { + return
{children}
} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx index fb7a9fd2d..e15460359 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx @@ -1,7 +1,8 @@ -import "./profileLayout.css" +import { Suspense } from "react" import { serverClient } from "@/lib/trpc/server" +import Profile from "@/components/MyPages/myprofile/profile/profile" import TrackingSDK from "@/components/TrackingSDK" import type { LangParams, PageArgs } from "@/types/params" @@ -15,5 +16,12 @@ export default async function ProfilePage({}: PageArgs) { return null } - return + return ( + <> + + + + + + ) } diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/profileLayout.css b/app/[lang]/(live)/(protected)/my-pages/profile/profileLayout.css deleted file mode 100644 index 216869dbb..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/profileLayout.css +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Due to css import issues with parallel routes we are forced to - * use a regular css file and import it in the page.tsx - * This is addressed in Next 15: https: //github.com/vercel/next.js/pull/66300 - */ -.profile-layout { - background-color: var(--Main-Grey-White); - border-radius: var(--Corner-radius-xLarge); - display: grid; - gap: var(--Spacing-x4); - padding: var(--Spacing-x2) var(--Spacing-x2) var(--Spacing-x4); - margin: 0 calc(var(--Layout-Mobile-Margin-Margin-min) * -1); -} - -@media screen and (min-width: 768px) { - .profile-layout { - padding: var(--Spacing-x3) var(--Spacing-x3) var(--Spacing-x4); - margin: 0 calc(var(--Layout-Tablet-Margin-Margin-min) * -1); - } -} - -@media screen and (min-width: 1367px) { - .profile-layout { - margin: 0; - } -} diff --git a/components/Forms/Edit/Profile/index.tsx b/components/Forms/Edit/Profile/index.tsx index bbdc8ef13..4c7b70fea 100644 --- a/components/Forms/Edit/Profile/index.tsx +++ b/components/Forms/Edit/Profile/index.tsx @@ -95,6 +95,7 @@ export default function Form({ user }: EditFormProps) { window.location.href = logout[lang] } else { router.push(profile[lang]) + router.refresh() // Can be removed on NextJs 15 } break } @@ -110,7 +111,7 @@ export default function Form({ user }: EditFormProps) { return (
-
+
{intl.formatMessage({ id: "Welcome" })} @@ -123,7 +124,7 @@ export default function Form({ user }: EditFormProps) { > {user.name} -
+
) { +export default async function CommunicationSlot() { const intl = await getIntl() return (
diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/page.module.css b/components/MyPages/myprofile/creditCards/creditCards.module.css similarity index 99% rename from app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/page.module.css rename to components/MyPages/myprofile/creditCards/creditCards.module.css index 97be74fd6..b507f462e 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/page.module.css +++ b/components/MyPages/myprofile/creditCards/creditCards.module.css @@ -19,4 +19,4 @@ .container { gap: var(--Spacing-x3); } -} \ No newline at end of file +} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/page.tsx b/components/MyPages/myprofile/creditCards/creditCards.tsx similarity index 85% rename from app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/page.tsx rename to components/MyPages/myprofile/creditCards/creditCards.tsx index 7e8cb5f86..51f11ded5 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@creditCards/page.tsx +++ b/components/MyPages/myprofile/creditCards/creditCards.tsx @@ -6,11 +6,9 @@ import Body from "@/components/TempDesignSystem/Text/Body" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import { getIntl } from "@/i18n" -import styles from "./page.module.css" +import styles from "./creditCards.module.css" -import type { LangParams, PageArgs } from "@/types/params" - -export default async function CreditCardSlot({}: PageArgs) { +export default async function CreditCardSlot() { const intl = await getIntl() const creditCards = await serverClient().user.creditCards() diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.module.css b/components/MyPages/myprofile/membershipCards/membershipcards.module.css similarity index 100% rename from app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.module.css rename to components/MyPages/myprofile/membershipCards/membershipcards.module.css diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx b/components/MyPages/myprofile/membershipCards/membershipcards.tsx similarity index 92% rename from app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx rename to components/MyPages/myprofile/membershipCards/membershipcards.tsx index 4563cff0f..269616ae2 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@membershipCards/page.tsx +++ b/components/MyPages/myprofile/membershipCards/membershipcards.tsx @@ -6,11 +6,9 @@ import Body from "@/components/TempDesignSystem/Text/Body" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import { getIntl } from "@/i18n" -import styles from "./page.module.css" +import styles from "./membershipcards.module.css" -import type { LangParams, PageArgs } from "@/types/params" - -export default async function MembershipCardSlot({}: PageArgs) { +export default async function MembershipCardSlot() { const intl = await getIntl() const membershipCards = await getMembershipCards() diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.module.css b/components/MyPages/myprofile/profile/profile.module.css similarity index 50% rename from app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.module.css rename to components/MyPages/myprofile/profile/profile.module.css index 64091c9ba..99a15f20f 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@profile/page.module.css +++ b/components/MyPages/myprofile/profile/profile.module.css @@ -3,14 +3,12 @@ gap: var(--Spacing-x2); justify-content: space-between; } - .info { display: grid; gap: var(--Spacing-x-one-and-half) var(--Spacing-x7); width: 100%; justify-items: flex-start; } - .item { align-items: center; display: grid; @@ -19,7 +17,18 @@ justify-items: flex-end; width: 100%; } - +.content { + display: grid; + padding-bottom: var(--Spacing-x9); + position: relative; +} +.container { + background-color: var(--Main-Grey-White); + border-radius: var(--Corner-radius-Large); + display: grid; + gap: var(--Spacing-x3); + padding: var(--Spacing-x2) var(--Spacing-x2) var(--Spacing-x4); +} @media screen and (min-width: 768px) { .info { grid-template-columns: repeat(3, auto); @@ -27,4 +36,13 @@ .item { justify-items: flex-start; } + .container { + padding: var(--Spacing-x3) var(--Spacing-x3) var(--Spacing-x4); + } +} +@media screen and (min-width: 1367px) { + .content { + gap: var(--Spacing-x5); + grid-template-columns: max(340px) 1fr; + } } diff --git a/components/MyPages/myprofile/profile/profile.tsx b/components/MyPages/myprofile/profile/profile.tsx new file mode 100644 index 000000000..8f362a244 --- /dev/null +++ b/components/MyPages/myprofile/profile/profile.tsx @@ -0,0 +1,132 @@ +import { languages, languageSelect } from "@/constants/languages" +import { profileEdit } from "@/constants/routes/myPages" +import { getProfile } from "@/lib/trpc/memoizedRequests" + +import { + CalendarIcon, + EmailIcon, + GlobeIcon, + LocationIcon, + LockIcon, + PhoneIcon, +} from "@/components/Icons" +import CommunicationSlot from "@/components/MyPages/myprofile/communication/communication" +import CreditCardSlot from "@/components/MyPages/myprofile/creditCards/creditCards" +import MembershipCardSlot from "@/components/MyPages/myprofile/membershipCards/membershipcards" +import Header from "@/components/Profile/Header" +import Button from "@/components/TempDesignSystem/Button" +import Divider from "@/components/TempDesignSystem/Divider" +import Link from "@/components/TempDesignSystem/Link" +import Body from "@/components/TempDesignSystem/Text/Body" +import Title from "@/components/TempDesignSystem/Text/Title" +import { getIntl } from "@/i18n" +import { getLang } from "@/i18n/serverContext" + +import styles from "./profile.module.css" + +export default async function Profile() { + const intl = await getIntl() + const lang = getLang() + const user = await getProfile() + if (!user || "error" in user) { + return null + } + + const addressParts = [] + if (user.address.streetAddress) { + addressParts.push(user.address.streetAddress) + } + + if (user.address.city) { + addressParts.push(user.address.city) + } + + if (user.address.country) { + addressParts.push(user.address.country) + } + + const addressOutput = + addressParts.length > 0 + ? addressParts.join(", ") + : intl.formatMessage({ id: "N/A" }) + + const defaultLanguage = languages[lang] + const language = languageSelect.find((l) => l.value === user.language) + return ( + <> +
+
+
+ + {intl.formatMessage({ id: "Welcome" })} + + + {user.name} + +
+ +
+
+
+
+ + + {intl.formatMessage({ id: "Date of Birth" })} + + {user.dateOfBirth} +
+
+ + + {intl.formatMessage({ id: "Phone number" })} + + {user.phoneNumber} +
+
+ + + {intl.formatMessage({ id: "Language" })} + + {language?.label ?? defaultLanguage} +
+
+ + + {intl.formatMessage({ id: "Email" })} + + {user.email} +
+
+ + + {intl.formatMessage({ id: "Address" })} + + {addressOutput} +
+
+ + + {intl.formatMessage({ id: "Password" })} + + ********** +
+
+
+ + + + +
+ + ) +} diff --git a/components/Profile/AddCreditCardButton/index.tsx b/components/Profile/AddCreditCardButton/index.tsx index f91fbe4ba..1d1f22eed 100644 --- a/components/Profile/AddCreditCardButton/index.tsx +++ b/components/Profile/AddCreditCardButton/index.tsx @@ -67,6 +67,7 @@ export default function AddCreditCardButton() { onSuccess: (result) => { if (result?.attribute.link) { router.push(result.attribute.link) + router.refresh() // / Could be removed on NextJs 15 } else { toast.error( intl.formatMessage({