/* 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 (
);
})}
) : (
<>>
)}
{`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,
};
}