/* eslint-disable @next/next/no-img-element */ import { Flex, Grid, View, Text, Button, useBreakpointValue, Heading, } from "@aws-amplify/ui-react"; import { withSSRContext } from "aws-amplify"; import { serializeModel, deserializeModel } from "@aws-amplify/datastore/ssr"; import { useRouter } from "next/router"; import { useCallback } from "react"; import { Contributor, ContributorCourse } from "../../models"; import { CardLayoutCollection } from "../../components/CardLayoutCollection"; import { SocialMediaButton } from "../../components/SocialMediaButton"; import { capitalizeEnum } from "../../utils/capitalizeEnum"; import { Fallback } from "../../components/Fallback"; import ArrowRightIconCustom from "../../ui-components/ArrowRightIconCustom"; import { ContributorCollection } from "../../components/ContributorCollection"; import { GetStaticPaths, GetStaticPathsResult, GetStaticPropsContext, GetStaticPropsResult, } from "next"; import { CardLayoutData, Context, MetaInfo } from "../../types/models"; import { ParsedUrlQuery } from "querystring"; import { getCardLayoutData } from "../../lib/getData"; import { MetaLayout } from "../../components/MetaLayout"; const profilePicBorderSize = { base: "128px", small: "128px", medium: "128px", large: "256px", }; const profilePicSize = { base: "104px", small: "104px", medium: "104px", large: "232px", }; export default function ContributorPage(data: { contributor: Contributor; cardLayoutData: string; otherContributors: Contributor[]; }) { const router = useRouter(); const profilePicBorderSizeBreak = useBreakpointValue(profilePicBorderSize); const profilePicSizeBreak = useBreakpointValue(profilePicSize); const otherContributorsLimit = useBreakpointValue({ base: 2, small: 2, medium: 2, large: 3, xl: 4, }) as number; const contributorSectionTitle = useBreakpointValue({ base: "none", small: "none", medium: "block", }) || "block"; const sectionButtonClassNames = useBreakpointValue({ base: { justifySelf: "stretch" }, small: { justifySelf: "stretch" }, medium: { justifySelf: "flex-end" }, }); function contributorBreadcrumbCallback( pathnameArray: string[], asPathArray: string[] ) { if (pathnameArray.length === asPathArray.length) { const breadcrumbs = pathnameArray.map((path, index) => { const result = { href: "", label: "", isCurrent: index === pathnameArray.length - 1, }; result["href"] = "/" + asPathArray.slice(0, index + 1).join("/"); if (path === "about") { result["label"] = "About"; } else if (path === "[contributor]") { result["label"] = "Contributor"; } return result; }); return breadcrumbs; } } const callback = useCallback(contributorBreadcrumbCallback, []); if (router.isFallback) { return ; } const contributor: Contributor = deserializeModel( Contributor, data.contributor ); const cardLayoutData: CardLayoutData[] = JSON.parse(data.cardLayoutData); const otherContributors: Contributor[] = deserializeModel( Contributor, data.otherContributors ); // Contributor page meta data const metaInfo: MetaInfo = { title: `${contributor.firstName} ${contributor.lastName}`, description: contributor.bio, image: contributor.profilePic, }; return ( {`${contributor.firstName} ${contributor.lastName}`} {contributor.jobTitle} {contributor.bio} {contributor.socialNetwork && contributor.socialNetwork.length > 0 ? ( {contributor.socialNetwork?.map((e, index: number) => { return ( ); })} ) : ( <> )} {`Profile {`Courses by ${contributor.firstName}`} 3} itemsPerPage={cardLayoutData.length > 3 ? 3 : undefined} /> Other Contributors e.username !== contributor.username} limit={otherContributorsLimit} /> ); } interface ContributorPageParams extends ParsedUrlQuery { contributor: string; } interface ContributorPageProps { contributor: JSON; cardLayoutData: string; otherContributors: JSON; } export async function getStaticPaths( context: GetStaticPaths & Context ): Promise> { const { DataStore } = withSSRContext(context); const contributors: Contributor[] = await DataStore.query(Contributor); return { paths: contributors.map((contributor) => ({ params: { contributor: contributor.username, }, })), fallback: false, }; } export async function getStaticProps( context: GetStaticPropsContext & Context ): Promise> { if (context.params) { const { DataStore } = withSSRContext(context); const { contributor: username } = context.params; let contributorResults: Contributor[] = await DataStore.query( Contributor, (c: any) => c.username("eq", username) ); const contributorCoursesRelationships: ContributorCourse[] = await DataStore.query(ContributorCourse); const filteredCourses = contributorCoursesRelationships .filter((e) => e.contributor.username === username) .map((e) => e.course); const cardLayoutData = await getCardLayoutData(context); const filteredCardLayoutData = cardLayoutData.filter((cardLayout) => filteredCourses.find((e) => e.id === cardLayout.course.id) ); const otherContributors = await DataStore.query(Contributor, (c: any) => c.username("ne", username) ); if (contributorResults.length > 0) { return { props: { contributor: serializeModel(contributorResults[0]), cardLayoutData: JSON.stringify(filteredCardLayoutData), otherContributors: serializeModel(otherContributors), }, }; } } return { notFound: true, }; }