From b2e992c69a2d006fa85eeb420793acd7aa03a723 Mon Sep 17 00:00:00 2001 From: Simon Emanuelsson Date: Tue, 16 Apr 2024 12:42:44 +0200 Subject: [PATCH] feat(WEB-205, WEB-206): get breadcrumbs for my pages from contentstack --- .../my-pages/@breadcrumbs/benefits/page.tsx | 11 +- .../my-pages/@breadcrumbs/overview/page.tsx | 11 +- .../profile/[...catchAll]/page.tsx | 11 +- .../my-pages/@breadcrumbs/profile/page.tsx | 11 +- .../my-pages/profile/@edit/default.tsx | 3 - .../my-pages/profile/@edit/edit/default.tsx | 3 - .../my-pages/profile/edit/page.tsx | 4 + .../(protected)/my-pages/profile/layout.tsx | 10 +- .../(protected)/my-pages/profile/page.tsx | 5 + .../{layout.module.css => profileLayout.css} | 10 +- components/MyPages/Breadcrumbs/index.tsx | 9 +- .../MyProfile/Profile/Edit/Form/Content.tsx | 4 +- .../MyProfile/Profile/Edit/Form/schema.ts | 2 +- components/MyProfile/Profile/index.tsx | 6 +- constants/routes/myPages.js | 10 +- lib/api/index.ts | 1 + .../Fragments/MyPages/Breadcrumbs.graphql | 20 ++++ lib/graphql/Query/BreadcrumbsMyPages.graphql | 13 +++ package-lock.json | 106 ++++++++++-------- package.json | 4 +- .../routers/contentstack/breadcrumbs/input.ts | 10 ++ .../contentstack/breadcrumbs/output.ts | 32 ++++++ .../routers/contentstack/breadcrumbs/query.ts | 83 ++++++++------ server/routers/user/output.ts | 1 + server/routers/user/temp.ts | 1 - types/auth.d.ts | 2 +- types/fetch.ts | 2 +- types/requests/myPages/breadcrumbs.ts | 27 +++++ types/requests/myPages/navigation.ts | 13 +-- types/requests/utils/all.ts | 4 +- types/user.ts | 1 - 31 files changed, 291 insertions(+), 139 deletions(-) delete mode 100644 app/[lang]/(live)/(protected)/my-pages/profile/@edit/default.tsx delete mode 100644 app/[lang]/(live)/(protected)/my-pages/profile/@edit/edit/default.tsx create mode 100644 app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx create mode 100644 app/[lang]/(live)/(protected)/my-pages/profile/page.tsx rename app/[lang]/(live)/(protected)/my-pages/profile/{layout.module.css => profileLayout.css} (66%) create mode 100644 lib/graphql/Fragments/MyPages/Breadcrumbs.graphql create mode 100644 lib/graphql/Query/BreadcrumbsMyPages.graphql create mode 100644 server/routers/contentstack/breadcrumbs/input.ts create mode 100644 types/requests/myPages/breadcrumbs.ts diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/benefits/page.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/benefits/page.tsx index 1310cca51..c09ee2b83 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/benefits/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/benefits/page.tsx @@ -1,10 +1,17 @@ import { serverClient } from "@/lib/trpc/server" +import { benefits } from "@/constants/routes/myPages" import Breadcrumbs from "@/components/MyPages/Breadcrumbs" -export default async function BenefitsBreadcrumbs() { +import type { LangParams, PageArgs } from "@/types/params" + +export default async function BenefitsBreadcrumbs({ + params, +}: PageArgs) { + const href = benefits[params.lang].replace(`/${params.lang}`, "") const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href: "/my-pages/benefits", + href, + locale: params.lang, }) return } diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/overview/page.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/overview/page.tsx index 4fc49d9aa..67c3a5789 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/overview/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/overview/page.tsx @@ -1,10 +1,17 @@ import { serverClient } from "@/lib/trpc/server" +import { overview } from "@/constants/routes/myPages" import Breadcrumbs from "@/components/MyPages/Breadcrumbs" -export default async function OverviewBreadcrumbs() { +import type { LangParams, PageArgs } from "@/types/params" + +export default async function OverviewBreadcrumbs({ + params, +}: PageArgs) { + const href = overview[params.lang].replace(`/${params.lang}`, "") const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href: "/my-pages/overview", + href, + locale: params.lang, }) return } diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/[...catchAll]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/[...catchAll]/page.tsx index 6db544bc7..61a2d172a 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/[...catchAll]/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/[...catchAll]/page.tsx @@ -1,10 +1,17 @@ import { serverClient } from "@/lib/trpc/server" +import { profile } from "@/constants/routes/myPages" import Breadcrumbs from "@/components/MyPages/Breadcrumbs" -export default async function ProfileBreadcrumbs() { +import type { LangParams, PageArgs } from "@/types/params" + +export default async function ProfileBreadcrumbs({ + params, +}: PageArgs) { + const href = profile[params.lang].replace(`/${params.lang}`, "") const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href: "/my-pages/profile", + href, + locale: params.lang, }) return } diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/page.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/page.tsx index 6db544bc7..61a2d172a 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/profile/page.tsx @@ -1,10 +1,17 @@ import { serverClient } from "@/lib/trpc/server" +import { profile } from "@/constants/routes/myPages" import Breadcrumbs from "@/components/MyPages/Breadcrumbs" -export default async function ProfileBreadcrumbs() { +import type { LangParams, PageArgs } from "@/types/params" + +export default async function ProfileBreadcrumbs({ + params, +}: PageArgs) { + const href = profile[params.lang].replace(`/${params.lang}`, "") const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href: "/my-pages/profile", + href, + locale: params.lang, }) return } diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@edit/default.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@edit/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@edit/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/@edit/edit/default.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/@edit/edit/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/profile/@edit/edit/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx new file mode 100644 index 000000000..7732dd7f1 --- /dev/null +++ b/app/[lang]/(live)/(protected)/my-pages/profile/edit/page.tsx @@ -0,0 +1,4 @@ +import "../profileLayout.css" +export default function EditProfilePage() { + return null +} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx index 13678b37f..26c1df4d6 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/profile/layout.tsx @@ -1,10 +1,9 @@ import MaxWidth from "@/components/MaxWidth" -import styles from "./layout.module.css" - import type { ProfileLayoutProps } from "@/types/components/myPages/myProfile/layout" export default function ProfileLayout({ + children, communication, creditCards, edit, @@ -15,13 +14,14 @@ export default function ProfileLayout({ wishes, }: React.PropsWithChildren) { return ( - -
+ +
{edit} {view}
{profile} -
+ {children} +
{communication} {wishes} {membershipCard} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx b/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx new file mode 100644 index 000000000..cc60f11d8 --- /dev/null +++ b/app/[lang]/(live)/(protected)/my-pages/profile/page.tsx @@ -0,0 +1,5 @@ +import "./profileLayout.css" + +export default function ProfilePage() { + return null +} diff --git a/app/[lang]/(live)/(protected)/my-pages/profile/layout.module.css b/app/[lang]/(live)/(protected)/my-pages/profile/profileLayout.css similarity index 66% rename from app/[lang]/(live)/(protected)/my-pages/profile/layout.module.css rename to app/[lang]/(live)/(protected)/my-pages/profile/profileLayout.css index abde89e1c..6246001ca 100644 --- a/app/[lang]/(live)/(protected)/my-pages/profile/layout.module.css +++ b/app/[lang]/(live)/(protected)/my-pages/profile/profileLayout.css @@ -1,9 +1,13 @@ -.page { +/** + * Due to css import issues with parallell routes we are forced to + * use a regular css file and import it in the page.tsx + */ +.profile-page { display: grid; gap: 3rem; } -.btns { +.profile-btns { align-items: center; display: flex; gap: 1rem; @@ -16,7 +20,7 @@ transform: translateY(-100%); } -.cards { +.profile-cards { display: grid; gap: 0.4rem; grid-template-columns: 1fr 1fr; diff --git a/components/MyPages/Breadcrumbs/index.tsx b/components/MyPages/Breadcrumbs/index.tsx index afe919a16..ebd84b318 100644 --- a/components/MyPages/Breadcrumbs/index.tsx +++ b/components/MyPages/Breadcrumbs/index.tsx @@ -15,16 +15,15 @@ export default function Breadcrumbs({ breadcrumbs }: BreadcrumbsProps) { {breadcrumbs.map((breadcrumb) => { if (breadcrumb.href) { return ( - + {breadcrumb.title} ) } - return {breadcrumb.title} + return ( + {breadcrumb.title} + ) })} diff --git a/components/MyProfile/Profile/Edit/Form/Content.tsx b/components/MyProfile/Profile/Edit/Form/Content.tsx index 38d0a20a7..a852cb972 100644 --- a/components/MyProfile/Profile/Edit/Form/Content.tsx +++ b/components/MyProfile/Profile/Edit/Form/Content.tsx @@ -43,11 +43,11 @@ export default function FormContent({ control }: EditFormContentProps) { - *{_("Date of Birth")} + *{_("Date of Birth")} diff --git a/components/MyProfile/Profile/Edit/Form/schema.ts b/components/MyProfile/Profile/Edit/Form/schema.ts index f12ff067c..de850263a 100644 --- a/components/MyProfile/Profile/Edit/Form/schema.ts +++ b/components/MyProfile/Profile/Edit/Form/schema.ts @@ -12,7 +12,7 @@ export const editProfileSchema = z.object({ "address.zipCode": z .string({ required_error: _("Zip code is required") }) .min(1, { message: _("Zip code is required") }), - dob: z + dateOfBirth: z .string({ required_error: _("Date of Birth is required") }) .min(1, { message: _("Date of Birth is required") }), email: z.string().email(), diff --git a/components/MyProfile/Profile/index.tsx b/components/MyProfile/Profile/index.tsx index 0893819fa..fc00c2866 100644 --- a/components/MyProfile/Profile/index.tsx +++ b/components/MyProfile/Profile/index.tsx @@ -13,12 +13,14 @@ import Field from "../Field" import styles from "./profile.module.css" import { serverClient } from "@/lib/trpc/server" +import { dt } from "@/lib/dt" export default async function Profile() { const user = await serverClient().user.get() const countryName = countries.find( (country) => country.code === user.address.country ) + const dob = dt(user.dateOfBirth).format("DD/MM/YYYY") return (
@@ -32,8 +34,7 @@ export default async function Profile() { {_("Date of Birth")} - {/* TODO: Get this from user when API team adds it to payload */} - 27/05/1977 + {dob} @@ -61,7 +62,6 @@ export default async function Profile() { {_("City/State")} - {/* TODO: Get this from user when API team adds it to payload */} {user.address.city || "-"} diff --git a/constants/routes/myPages.js b/constants/routes/myPages.js index 7444c9fb6..26655350c 100644 --- a/constants/routes/myPages.js +++ b/constants/routes/myPages.js @@ -40,12 +40,12 @@ export const profile = { /** @type {import('@/types/routes').LangRoute} */ export const profileEdit = { - da: `${profile.da}/edit`, - de: `${profile.de}/edit`, + da: `${profile.da}/rediger`, + de: `${profile.de}/bearbeiten`, en: `${profile.en}/edit`, - fi: `${profile.fi}/edit`, - no: `${profile.no}/edit`, - sv: `${profile.sv}/edit`, + fi: `${profile.fi}/muokkaa`, + no: `${profile.no}/rediger`, + sv: `${profile.sv}/redigera`, } /** @type {import('@/types/routes').LangRoute} */ diff --git a/lib/api/index.ts b/lib/api/index.ts index e8adb5be8..108381e11 100644 --- a/lib/api/index.ts +++ b/lib/api/index.ts @@ -11,6 +11,7 @@ import type { Endpoint } from "./endpoints" export { endpoints } from "./endpoints" const defaultOptions: RequestInit = { + cache: "no-store", headers: { "Content-Type": "application/json", }, diff --git a/lib/graphql/Fragments/MyPages/Breadcrumbs.graphql b/lib/graphql/Fragments/MyPages/Breadcrumbs.graphql new file mode 100644 index 000000000..a7410bb8a --- /dev/null +++ b/lib/graphql/Fragments/MyPages/Breadcrumbs.graphql @@ -0,0 +1,20 @@ +fragment Breadcrumbs on AccountPage { + breadcrumbs { + title + parents: parentsConnection { + edges { + node { + ... on AccountPage { + breadcrumbs { + title + } + system { + uid + } + url + } + } + } + } + } +} diff --git a/lib/graphql/Query/BreadcrumbsMyPages.graphql b/lib/graphql/Query/BreadcrumbsMyPages.graphql new file mode 100644 index 000000000..e9e14544c --- /dev/null +++ b/lib/graphql/Query/BreadcrumbsMyPages.graphql @@ -0,0 +1,13 @@ +#import "../Fragments/MyPages/Breadcrumbs.graphql" + +query GetMyPagesBreadcrumbs($locale: String!, $url: String!) { + all_account_page(locale: $locale, where: { url: $url }) { + items { + ...Breadcrumbs + system { + uid + } + } + total + } +} diff --git a/package-lock.json b/package-lock.json index b35017f0c..ec3466520 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "graphql-request": "^6.1.0", "graphql-tag": "^2.12.6", "libphonenumber-js": "^1.10.60", - "next": "^14.1.0", + "next": "^14.2.0", "next-auth": "^5.0.0-beta.15", "react": "^18", "react-dom": "^18", @@ -476,9 +476,9 @@ } }, "node_modules/@next/env": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz", - "integrity": "sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==" + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.2.tgz", + "integrity": "sha512-sk72qRfM1Q90XZWYRoJKu/UWlTgihrASiYw/scb15u+tyzcze3bOuJ/UV6TBOQEeUaxOkRqGeuGUdiiuxc5oqw==" }, "node_modules/@next/eslint-plugin-next": { "version": "14.1.4", @@ -490,9 +490,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz", - "integrity": "sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.2.tgz", + "integrity": "sha512-3iPgMhzbalizGwHNFUcGnDhFPSgVBHQ8aqSTAMxB5BvJG0oYrDf1WOJZlbXBgunOEj/8KMVbejEur/FpvFsgFQ==", "cpu": [ "arm64" ], @@ -505,9 +505,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz", - "integrity": "sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.2.tgz", + "integrity": "sha512-x7Afi/jt0ZBRUZHTi49yyej4o8znfIMHO4RvThuoc0P+uli8Jd99y5GKjxoYunPKsXL09xBXEM1+OQy2xEL0Ag==", "cpu": [ "x64" ], @@ -520,9 +520,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz", - "integrity": "sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.2.tgz", + "integrity": "sha512-zbfPtkk7L41ODMJwSp5VbmPozPmMMQrzAc0HAUomVeVIIwlDGs/UCqLJvLNDt4jpWgc21SjjyIn762lNGrMaUA==", "cpu": [ "arm64" ], @@ -535,9 +535,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz", - "integrity": "sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.2.tgz", + "integrity": "sha512-wPbS3pI/JU16rm3XdLvvTmlsmm1nd+sBa2ohXgBZcShX4TgOjD4R+RqHKlI1cjo/jDZKXt6OxmcU0Iys0OC/yg==", "cpu": [ "arm64" ], @@ -550,9 +550,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz", - "integrity": "sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.2.tgz", + "integrity": "sha512-NqWOHqqq8iC9tuHvZxjQ2tX+jWy2X9y8NX2mcB4sj2bIccuCxbIZrU/ThFPZZPauygajZuVQ6zediejQHwZHwQ==", "cpu": [ "x64" ], @@ -565,9 +565,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz", - "integrity": "sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.2.tgz", + "integrity": "sha512-lGepHhwb9sGhCcU7999+iK1ZZT+6rrIoVg40MP7DZski9GIZP80wORSbt5kJzh9v2x2ev2lxC6VgwMQT0PcgTA==", "cpu": [ "x64" ], @@ -580,9 +580,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz", - "integrity": "sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.2.tgz", + "integrity": "sha512-TZSh/48SfcLEQ4rD25VVn2kdIgUWmMflRX3OiyPwGNXn3NiyPqhqei/BaqCYXViIQ+6QsG9R0C8LftMqy8JPMA==", "cpu": [ "arm64" ], @@ -595,9 +595,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz", - "integrity": "sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.2.tgz", + "integrity": "sha512-M0tBVNMEBJN2ZNQWlcekMn6pvLria7Sa2Fai5znm7CCJz4pP3lrvlSxhKdkCerk0D9E0bqx5yAo3o2Q7RrD4gA==", "cpu": [ "ia32" ], @@ -610,9 +610,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz", - "integrity": "sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.2.tgz", + "integrity": "sha512-a/20E/wtTJZ3Ykv3f/8F0l7TtgQa2LWHU2oNB9bsu0VjqGuGGHmm/q6waoUNQYTVPYrrlxxaHjJcDV6aiSTt/w==", "cpu": [ "x64" ], @@ -2273,11 +2273,17 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -8086,12 +8092,12 @@ } }, "node_modules/next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.1.4.tgz", - "integrity": "sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.2.tgz", + "integrity": "sha512-oGwUaa2bCs47FbuxWMpOoXtBMPYpvTPgdZr3UAo+pu7Ns00z9otmYpoeV1HEiYL06AlRQQIA/ypK526KjJfaxg==", "dependencies": { - "@next/env": "14.1.4", - "@swc/helpers": "0.5.2", + "@next/env": "14.2.2", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", @@ -8105,18 +8111,19 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.1.4", - "@next/swc-darwin-x64": "14.1.4", - "@next/swc-linux-arm64-gnu": "14.1.4", - "@next/swc-linux-arm64-musl": "14.1.4", - "@next/swc-linux-x64-gnu": "14.1.4", - "@next/swc-linux-x64-musl": "14.1.4", - "@next/swc-win32-arm64-msvc": "14.1.4", - "@next/swc-win32-ia32-msvc": "14.1.4", - "@next/swc-win32-x64-msvc": "14.1.4" + "@next/swc-darwin-arm64": "14.2.2", + "@next/swc-darwin-x64": "14.2.2", + "@next/swc-linux-arm64-gnu": "14.2.2", + "@next/swc-linux-arm64-musl": "14.2.2", + "@next/swc-linux-x64-gnu": "14.2.2", + "@next/swc-linux-x64-musl": "14.2.2", + "@next/swc-win32-arm64-msvc": "14.2.2", + "@next/swc-win32-ia32-msvc": "14.2.2", + "@next/swc-win32-x64-msvc": "14.2.2" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -8125,6 +8132,9 @@ "@opentelemetry/api": { "optional": true }, + "@playwright/test": { + "optional": true + }, "sass": { "optional": true } diff --git a/package.json b/package.json index 2c4077e7f..7f31e5219 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "graphql-request": "^6.1.0", "graphql-tag": "^2.12.6", "libphonenumber-js": "^1.10.60", - "next": "^14.1.0", + "next": "^14.2.0", "next-auth": "^5.0.0-beta.15", "react": "^18", "react-dom": "^18", @@ -67,4 +67,4 @@ "engines": { "node": "18" } -} +} \ No newline at end of file diff --git a/server/routers/contentstack/breadcrumbs/input.ts b/server/routers/contentstack/breadcrumbs/input.ts new file mode 100644 index 000000000..b21c5f84b --- /dev/null +++ b/server/routers/contentstack/breadcrumbs/input.ts @@ -0,0 +1,10 @@ +import { z } from "zod"; + +import { Lang } from "@/constants/languages"; + +const langs = Object.keys(Lang) as [keyof typeof Lang] + +export const getBreadcrumbsInput = z.object({ + href: z.string().min(1, { message: "href is required" }), + locale: z.enum(langs), +}) diff --git a/server/routers/contentstack/breadcrumbs/output.ts b/server/routers/contentstack/breadcrumbs/output.ts index 3cfcf28bb..ae8dad97b 100644 --- a/server/routers/contentstack/breadcrumbs/output.ts +++ b/server/routers/contentstack/breadcrumbs/output.ts @@ -1,8 +1,40 @@ import { z } from "zod" +export const validateBreadcrumbsConstenstackSchema = z.object({ + all_account_page: z.object({ + items: z.array( + z.object({ + breadcrumbs: z.object({ + title: z.string(), + parents: z.object({ + edges: z.array( + z.object({ + node: z.object({ + breadcrumbs: z.object({ + title: z.string(), + }), + system: z.object({ + uid: z.string(), + }), + url: z.string(), + }), + }) + ), + }), + }), + system: z.object({ + uid: z.string(), + }), + }) + ), + total: z.number(), + }), +}) + export const getBreadcrumbsSchema = z.array( z.object({ href: z.string().optional(), title: z.string(), + uid: z.string(), }) ) diff --git a/server/routers/contentstack/breadcrumbs/query.ts b/server/routers/contentstack/breadcrumbs/query.ts index 6e318652a..7fe6db0f7 100644 --- a/server/routers/contentstack/breadcrumbs/query.ts +++ b/server/routers/contentstack/breadcrumbs/query.ts @@ -1,43 +1,54 @@ -import { z } from "zod" - -import { badRequestError } from "@/server/errors/trpc" -import { getBreadcrumbsSchema } from "./output" +import { badRequestError, internalServerError } from "@/server/errors/trpc" +import { validateBreadcrumbsConstenstackSchema } from "./output" import { publicProcedure, router } from "@/server/trpc" -const rootMyPagesBreadcrumb = { - href: "/en/my-pages", - title: "My Pages", -} - -enum paths { - "/my-pages", - "/my-pages/benefits", - "/my-pages/overview", - "/my-pages/profile", -} - -const keys = Object.keys(paths) as [keyof typeof paths] - -const possibleBreadcrumbs: Record = - { - "/my-pages": [ - { - title: rootMyPagesBreadcrumb.title, - }, - ], - "/my-pages/benefits": [rootMyPagesBreadcrumb, { title: "Benefits" }], - "/my-pages/overview": [rootMyPagesBreadcrumb, { title: "Overview" }], - "/my-pages/profile": [rootMyPagesBreadcrumb, { title: "Profile" }], - } +import { request } from "@/lib/graphql/request" +import { GetMyPagesBreadcrumbs } from "@/lib/graphql/Query/BreadcrumbsMyPages.graphql" +import { getBreadcrumbsInput } from "./input" +import { GetMyPagesBreadcrumbsData } from "@/types/requests/myPages/breadcrumbs" export const breadcrumbsQueryRouter = router({ - get: publicProcedure.input(z.object({ href: z.enum(keys) })).query((opts) => { - const breadcrumbs = possibleBreadcrumbs[opts.input.href] - const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs) - if (validatedBreadcrumbs.success) { - return breadcrumbs - } + get: publicProcedure.input(getBreadcrumbsInput).query(async ({ input }) => { + try { + const response = await request( + GetMyPagesBreadcrumbs, + { locale: input.locale, url: input.href } + ) + if (!response.data) { + throw badRequestError() + } - throw badRequestError() + const validatedBreadcrumbs = + validateBreadcrumbsConstenstackSchema.safeParse(response.data) + if (!validatedBreadcrumbs.success) { + throw badRequestError() + } + + const parentBreadcrumbs = + validatedBreadcrumbs.data.all_account_page.items[0].breadcrumbs.parents.edges.map( + (breadcrumb) => { + return { + href: breadcrumb.node.url, + title: breadcrumb.node.breadcrumbs.title, + uid: breadcrumb.node.system.uid, + } + } + ) + const pageBreadcrumb = + validatedBreadcrumbs.data.all_account_page.items.map((breadcrumb) => { + return { + href: "", + title: breadcrumb.breadcrumbs.title, + uid: breadcrumb.system.uid, + } + }) + const breadcrumbs = [parentBreadcrumbs, pageBreadcrumb].flat() + + return breadcrumbs + } catch (error) { + console.info(`Get My Pages Breadcrumbs Error`) + console.error(error) + throw internalServerError() + } }), }) diff --git a/server/routers/user/output.ts b/server/routers/user/output.ts index f7f0ae23e..4735f4eed 100644 --- a/server/routers/user/output.ts +++ b/server/routers/user/output.ts @@ -8,6 +8,7 @@ export const getUserSchema = z.object({ streetAddress: z.string().optional(), zipCode: z.string(), }), + dateOfBirth: z.string(), email: z.string().email(), gender: z.string(), name: z.string(), diff --git a/server/routers/user/temp.ts b/server/routers/user/temp.ts index b7d555b3c..e4a529fd1 100644 --- a/server/routers/user/temp.ts +++ b/server/routers/user/temp.ts @@ -135,7 +135,6 @@ export const stays = [ ] export const extendedUser = { - dob: dt("1977-07-05").format("YYYY-MM-DD"), journeys: challenges.journeys, nights: 14, shortcuts, diff --git a/types/auth.d.ts b/types/auth.d.ts index ace3d3ff9..1b06c1234 100644 --- a/types/auth.d.ts +++ b/types/auth.d.ts @@ -15,7 +15,7 @@ declare module "next-auth" { * The shape of the account object returned in the OAuth providers' `account` callback, * Usually contains information about the provider being used, like OAuth tokens (`access_token`, etc). */ - interface Account {} + interface Account { } /** * Returned by `useSession`, `auth`, contains information about the active session. diff --git a/types/fetch.ts b/types/fetch.ts index 585421fd4..5f71dc355 100644 --- a/types/fetch.ts +++ b/types/fetch.ts @@ -4,4 +4,4 @@ export interface RequestOptionsWithJSONBody } export interface RequestOptionsWithOutBody - extends Omit {} + extends Omit { } diff --git a/types/requests/myPages/breadcrumbs.ts b/types/requests/myPages/breadcrumbs.ts new file mode 100644 index 000000000..78285a1e8 --- /dev/null +++ b/types/requests/myPages/breadcrumbs.ts @@ -0,0 +1,27 @@ +import type { AllRequestResponse } from "../utils/all" +import type { Edges } from "../utils/edges" + +interface AccountPageBreadcrumbs { + breadcrumbs: { + title: string + parents: Edges<{ + breadcrumbs: { + title: string + } + system: { + uid: string + } + url: string + }> + } + system: { + uid: string + } +} + +interface AllAccountPageResponse + extends AllRequestResponse {} + +export interface GetMyPagesBreadcrumbsData { + all_account_page: AllAccountPageResponse +} diff --git a/types/requests/myPages/navigation.ts b/types/requests/myPages/navigation.ts index 762f22a37..82dda1411 100644 --- a/types/requests/myPages/navigation.ts +++ b/types/requests/myPages/navigation.ts @@ -26,26 +26,21 @@ interface NavigationLink { locale: Lang uid: string } + url: string title: string } export interface AccountPageLink extends NavigationLink, - TypenameInterface { - url: string -} + TypenameInterface { } export interface LoyaltyPageLink extends NavigationLink, - TypenameInterface { - url: string -} + TypenameInterface { } export interface ContentPageLink extends NavigationLink, - TypenameInterface { - url: string -} + TypenameInterface { } export type PageLink = ContentPageLink | AccountPageLink | LoyaltyPageLink diff --git a/types/requests/utils/all.ts b/types/requests/utils/all.ts index 6fdd81098..22bc5f6b8 100644 --- a/types/requests/utils/all.ts +++ b/types/requests/utils/all.ts @@ -1,4 +1,4 @@ -export type AllRequestResponse = { +export interface AllRequestResponse { items: T[] total: number -} +} \ No newline at end of file diff --git a/types/user.ts b/types/user.ts index 599da605f..8021ab5bf 100644 --- a/types/user.ts +++ b/types/user.ts @@ -29,7 +29,6 @@ type Victory = { * we have to get the values from elsewhere */ export interface User extends z.infer { - dob: string firstName: string journeys: Journey[] nights: number