From 60a4b8b29e308f0f68052b3b1ea94cd53b15e8d3 Mon Sep 17 00:00:00 2001 From: femyeda Date: Fri, 13 Aug 2021 14:46:42 -0500 Subject: [PATCH] add page for teams --- components/team/screens/Team.tsx | 83 ++++++++++++++++++++++++++++++++ lib/teams/getTeam.ts | 54 +++++++++++++++++++++ pages/team/[idOrSlug].tsx | 54 +++++++++++++++++++++ tailwind.config.js | 26 ++++++++-- 4 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 components/team/screens/Team.tsx create mode 100644 lib/teams/getTeam.ts create mode 100644 pages/team/[idOrSlug].tsx diff --git a/components/team/screens/Team.tsx b/components/team/screens/Team.tsx new file mode 100644 index 00000000..b064788d --- /dev/null +++ b/components/team/screens/Team.tsx @@ -0,0 +1,83 @@ +import React from "react"; +import Text from "@components/ui/Text"; +import Link from "next/link"; +import Avatar from "@components/Avatar"; +import { ArrowRightIcon } from "@heroicons/react/outline"; +import useTheme from "@components/Theme"; +import classnames from "classnames"; + +const Team = ({ team }) => { + useTheme(); + + const Member = ({ member }) => { + const classes = classnames( + "group", + "relative", + "flex flex-col", + "space-y-4", + "p-4", + "bg-white dark:bg-opacity-8", + "border border-neutral-200", + "hover:cursor-pointer", + "hover:border-black hover:border-2 dark:border-neutral-700 dark:hover:border-neutral-600", + "rounded-sm", + "hover:shadow-md" + ); + + return ( + +
+ + + + +
+ {member.user.name} + + {member.user.bio} + +
+
+ + ); + }; + + const Members = ({ members }) => { + if (!members || members.length === 0) { + return null; + } + + return ( +
+ {members.map((member) => { + return ; + })} +
+ ); + }; + + return ( +
+
+ + {team.name} +
+ +
+ ); +}; + +export default Team; diff --git a/lib/teams/getTeam.ts b/lib/teams/getTeam.ts new file mode 100644 index 00000000..60939d07 --- /dev/null +++ b/lib/teams/getTeam.ts @@ -0,0 +1,54 @@ +import { Team } from "@prisma/client"; +import prisma from "@lib/prisma"; +import logger from "@lib/logger"; + +const log = logger.getChildLogger({ prefix: ["[lib] getTeam"] }); +export const getTeam = async (idOrSlug: string): Promise => { + const teamIdOrSlug = idOrSlug; + + let team = null; + + log.debug(`{teamIdOrSlug} ${teamIdOrSlug}`); + + const teamSelectInput = { + id: true, + name: true, + slug: true, + members: { + where: { + accepted: true, + }, + select: { + user: { + select: { + id: true, + username: true, + email: true, + name: true, + bio: true, + avatar: true, + theme: true, + }, + }, + }, + }, + }; + + team = await prisma.team.findFirst({ + where: { + OR: [ + { + id: parseInt(teamIdOrSlug) || undefined, + }, + { + slug: teamIdOrSlug, + }, + ], + }, + select: teamSelectInput, + }); + + log.debug(`{team}`, { team }); + + return team; +}; diff --git a/pages/team/[idOrSlug].tsx b/pages/team/[idOrSlug].tsx new file mode 100644 index 00000000..ab0d9614 --- /dev/null +++ b/pages/team/[idOrSlug].tsx @@ -0,0 +1,54 @@ +import { GetServerSideProps } from "next"; +import Head from "next/head"; + +import Theme from "@components/Theme"; +import { getTeam } from "@lib/teams/getTeam"; +import Team from "@components/team/screens/Team"; + +export default function Page(props) { + const { isReady } = Theme(); + + return ( + isReady && ( +
+ + {props.team.name} | Calendso + + + +
+ +
+
+ ) + ); +} + +export const getServerSideProps: GetServerSideProps = async (context) => { + const teamIdOrSlug = Array.isArray(context.query?.idOrSlug) + ? context.query.idOrSlug.pop() + : context.query.idOrSlug; + + const team = await getTeam(teamIdOrSlug); + + if (!team) { + return { + notFound: true, + }; + } + + return { + props: { + team, + }, + }; +}; + +// Auxiliary methods +export function getRandomColorCode(): string { + let color = "#"; + for (let idx = 0; idx < 6; idx++) { + color += Math.floor(Math.random() * 10); + } + return color; +} diff --git a/tailwind.config.js b/tailwind.config.js index 73d36b92..ccdace05 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -95,22 +95,28 @@ module.exports = { inter: ["Inter", "sans-serif"], kollektif: ["Kollektif", "sans-serif"], }, - maxHeight: (theme) => ({ + maxHeight: (theme, { breakpoints }) => ({ 0: "0", 97: "25rem", ...theme("spacing"), + ...breakpoints(theme("screens")), + ...theme("screens"), full: "100%", screen: "100vh", }), - minHeight: (theme) => ({ + minHeight: (theme, { breakpoints }) => ({ 0: "0", ...theme("spacing"), + ...breakpoints(theme("screens")), + ...theme("screens"), full: "100%", screen: "100vh", }), - minWidth: (theme) => ({ + minWidth: (theme, { breakpoints }) => ({ 0: "0", ...theme("spacing"), + ...breakpoints(theme("screens")), + ...theme("screens"), full: "100%", screen: "100vw", }), @@ -118,9 +124,23 @@ module.exports = { 0: "0", ...theme("spacing"), ...breakpoints(theme("screens")), + ...theme("screens"), full: "100%", screen: "100vw", }), + opacity: { + 0: "0", + 8: "0.08", + 10: "0.10", + 20: "0.20", + 40: "0.40", + 60: "0.60", + 80: "0.80", + 25: "0.25", + 50: "0.5", + 75: "0.75", + 100: "1", + }, }, }, variants: {