feat(WEB-205, WEB-206): get breadcrumbs for my pages from contentstack
This commit is contained in:
@@ -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<LangParams>) {
|
||||
const href = benefits[params.lang].replace(`/${params.lang}`, "")
|
||||
const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({
|
||||
href: "/my-pages/benefits",
|
||||
href,
|
||||
locale: params.lang,
|
||||
})
|
||||
return <Breadcrumbs breadcrumbs={breadcrumbs} />
|
||||
}
|
||||
|
||||
@@ -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<LangParams>) {
|
||||
const href = overview[params.lang].replace(`/${params.lang}`, "")
|
||||
const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({
|
||||
href: "/my-pages/overview",
|
||||
href,
|
||||
locale: params.lang,
|
||||
})
|
||||
return <Breadcrumbs breadcrumbs={breadcrumbs} />
|
||||
}
|
||||
|
||||
@@ -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<LangParams>) {
|
||||
const href = profile[params.lang].replace(`/${params.lang}`, "")
|
||||
const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({
|
||||
href: "/my-pages/profile",
|
||||
href,
|
||||
locale: params.lang,
|
||||
})
|
||||
return <Breadcrumbs breadcrumbs={breadcrumbs} />
|
||||
}
|
||||
|
||||
@@ -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<LangParams>) {
|
||||
const href = profile[params.lang].replace(`/${params.lang}`, "")
|
||||
const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({
|
||||
href: "/my-pages/profile",
|
||||
href,
|
||||
locale: params.lang,
|
||||
})
|
||||
return <Breadcrumbs breadcrumbs={breadcrumbs} />
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
export default function Default() {
|
||||
return null
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export default function Default() {
|
||||
return null
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
import "../profileLayout.css"
|
||||
export default function EditProfilePage() {
|
||||
return null
|
||||
}
|
||||
@@ -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<ProfileLayoutProps>) {
|
||||
return (
|
||||
<MaxWidth className={styles.page} tag="main">
|
||||
<div className={styles.btns}>
|
||||
<MaxWidth className="profile-page" tag="main">
|
||||
<div className="profile-btns">
|
||||
{edit}
|
||||
{view}
|
||||
</div>
|
||||
{profile}
|
||||
<section className={styles.cards}>
|
||||
{children}
|
||||
<section className="profile-cards">
|
||||
{communication}
|
||||
{wishes}
|
||||
{membershipCard}
|
||||
|
||||
5
app/[lang]/(live)/(protected)/my-pages/profile/page.tsx
Normal file
5
app/[lang]/(live)/(protected)/my-pages/profile/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import "./profileLayout.css"
|
||||
|
||||
export default function ProfilePage() {
|
||||
return null
|
||||
}
|
||||
@@ -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;
|
||||
@@ -15,16 +15,15 @@ export default function Breadcrumbs({ breadcrumbs }: BreadcrumbsProps) {
|
||||
{breadcrumbs.map((breadcrumb) => {
|
||||
if (breadcrumb.href) {
|
||||
return (
|
||||
<BreadcrumbsWithLink
|
||||
key={breadcrumb.title}
|
||||
href={breadcrumb.href}
|
||||
>
|
||||
<BreadcrumbsWithLink key={breadcrumb.uid} href={breadcrumb.href}>
|
||||
{breadcrumb.title}
|
||||
</BreadcrumbsWithLink>
|
||||
)
|
||||
}
|
||||
|
||||
return <Breadcrumb>{breadcrumb.title}</Breadcrumb>
|
||||
return (
|
||||
<Breadcrumb key={breadcrumb.uid}>{breadcrumb.title}</Breadcrumb>
|
||||
)
|
||||
})}
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
@@ -43,11 +43,11 @@ export default function FormContent({ control }: EditFormContentProps) {
|
||||
<Field.Icon>
|
||||
<CalendarIcon />
|
||||
</Field.Icon>
|
||||
<Field.Label htmlFor="dob">*{_("Date of Birth")}</Field.Label>
|
||||
<Field.Label htmlFor="dateOfBirth">*{_("Date of Birth")}</Field.Label>
|
||||
<Field.Content>
|
||||
<DateSelect
|
||||
control={control}
|
||||
name="dob"
|
||||
name="dateOfBirth"
|
||||
registerOptions={{ required: true }}
|
||||
/>
|
||||
</Field.Content>
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 (
|
||||
<Container user={user}>
|
||||
<section className={styles.info}>
|
||||
@@ -32,8 +34,7 @@ export default async function Profile() {
|
||||
<CalendarIcon />
|
||||
</Field.Icon>
|
||||
<Field.TextLabel>{_("Date of Birth")}</Field.TextLabel>
|
||||
{/* TODO: Get this from user when API team adds it to payload */}
|
||||
<Field.Content>27/05/1977</Field.Content>
|
||||
<Field.Content>{dob}</Field.Content>
|
||||
</Field>
|
||||
<Field>
|
||||
<Field.Icon>
|
||||
@@ -61,7 +62,6 @@ export default async function Profile() {
|
||||
<HouseIcon />
|
||||
</Field.Icon>
|
||||
<Field.TextLabel>{_("City/State")}</Field.TextLabel>
|
||||
{/* TODO: Get this from user when API team adds it to payload */}
|
||||
<Field.Content>{user.address.city || "-"}</Field.Content>
|
||||
</Field>
|
||||
<Field>
|
||||
|
||||
@@ -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} */
|
||||
|
||||
@@ -11,6 +11,7 @@ import type { Endpoint } from "./endpoints"
|
||||
export { endpoints } from "./endpoints"
|
||||
|
||||
const defaultOptions: RequestInit = {
|
||||
cache: "no-store",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
|
||||
20
lib/graphql/Fragments/MyPages/Breadcrumbs.graphql
Normal file
20
lib/graphql/Fragments/MyPages/Breadcrumbs.graphql
Normal file
@@ -0,0 +1,20 @@
|
||||
fragment Breadcrumbs on AccountPage {
|
||||
breadcrumbs {
|
||||
title
|
||||
parents: parentsConnection {
|
||||
edges {
|
||||
node {
|
||||
... on AccountPage {
|
||||
breadcrumbs {
|
||||
title
|
||||
}
|
||||
system {
|
||||
uid
|
||||
}
|
||||
url
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
13
lib/graphql/Query/BreadcrumbsMyPages.graphql
Normal file
13
lib/graphql/Query/BreadcrumbsMyPages.graphql
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
106
package-lock.json
generated
106
package-lock.json
generated
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
10
server/routers/contentstack/breadcrumbs/input.ts
Normal file
10
server/routers/contentstack/breadcrumbs/input.ts
Normal file
@@ -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),
|
||||
})
|
||||
@@ -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(),
|
||||
})
|
||||
)
|
||||
|
||||
@@ -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<string, { title: string; href?: string }[]> =
|
||||
{
|
||||
"/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<GetMyPagesBreadcrumbsData>(
|
||||
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()
|
||||
}
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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,
|
||||
|
||||
2
types/auth.d.ts
vendored
2
types/auth.d.ts
vendored
@@ -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.
|
||||
|
||||
@@ -4,4 +4,4 @@ export interface RequestOptionsWithJSONBody
|
||||
}
|
||||
|
||||
export interface RequestOptionsWithOutBody
|
||||
extends Omit<RequestInit, "body" | "method"> {}
|
||||
extends Omit<RequestInit, "body" | "method"> { }
|
||||
|
||||
27
types/requests/myPages/breadcrumbs.ts
Normal file
27
types/requests/myPages/breadcrumbs.ts
Normal file
@@ -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<AccountPageBreadcrumbs> {}
|
||||
|
||||
export interface GetMyPagesBreadcrumbsData {
|
||||
all_account_page: AllAccountPageResponse
|
||||
}
|
||||
@@ -26,26 +26,21 @@ interface NavigationLink {
|
||||
locale: Lang
|
||||
uid: string
|
||||
}
|
||||
url: string
|
||||
title: string
|
||||
}
|
||||
|
||||
export interface AccountPageLink
|
||||
extends NavigationLink,
|
||||
TypenameInterface<PageLinkEnum.AccountPage> {
|
||||
url: string
|
||||
}
|
||||
TypenameInterface<PageLinkEnum.AccountPage> { }
|
||||
|
||||
export interface LoyaltyPageLink
|
||||
extends NavigationLink,
|
||||
TypenameInterface<PageLinkEnum.LoyaltyPage> {
|
||||
url: string
|
||||
}
|
||||
TypenameInterface<PageLinkEnum.LoyaltyPage> { }
|
||||
|
||||
export interface ContentPageLink
|
||||
extends NavigationLink,
|
||||
TypenameInterface<PageLinkEnum.ContentPage> {
|
||||
url: string
|
||||
}
|
||||
TypenameInterface<PageLinkEnum.ContentPage> { }
|
||||
|
||||
export type PageLink = ContentPageLink | AccountPageLink | LoyaltyPageLink
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export type AllRequestResponse<T> = {
|
||||
export interface AllRequestResponse<T> {
|
||||
items: T[]
|
||||
total: number
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,6 @@ type Victory = {
|
||||
* we have to get the values from elsewhere
|
||||
*/
|
||||
export interface User extends z.infer<typeof getUserSchema> {
|
||||
dob: string
|
||||
firstName: string
|
||||
journeys: Journey[]
|
||||
nights: number
|
||||
|
||||
Reference in New Issue
Block a user