From a3410ca3bf68fe6d1529b7cd3343e345681fb1f5 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Sun, 28 Mar 2021 00:14:55 +0200 Subject: [PATCH] event info --- app/calendar/components/CalendarPage.tsx | 86 +++++++++++++--- app/calendar/components/EventInfo.tsx | 122 +++++++++++++++++++++++ app/calendar/service.ts | 8 +- 3 files changed, 201 insertions(+), 15 deletions(-) create mode 100644 app/calendar/components/EventInfo.tsx diff --git a/app/calendar/components/CalendarPage.tsx b/app/calendar/components/CalendarPage.tsx index a315f2634..4dd0e2ffe 100644 --- a/app/calendar/components/CalendarPage.tsx +++ b/app/calendar/components/CalendarPage.tsx @@ -1,27 +1,85 @@ import { Button } from "@chakra-ui/button"; -import { Trans } from "@lingui/macro"; -import { useState } from "react"; +import { Input } from "@chakra-ui/input"; +import { Box } from "@chakra-ui/layout"; +import { t, Trans } from "@lingui/macro"; +import SubText from "components/common/SubText"; +import { useMyTheme } from "hooks/common"; +import { Fragment, useState } from "react"; import { trpc } from "utils/trpc"; +import EventInfo from "./EventInfo"; import { EventModal } from "./EventModal"; export default function CalendarPage() { + const { gray } = useMyTheme(); const events = trpc.useQuery(["calendar.events"], { enabled: false }); const [modalIsOpen, setModalIsOpen] = useState(false); + const [filter, setFilter] = useState(""); console.log("events", events.data); + let lastPrintedWeek: number | null = null; + const thisWeekNumber = getWeekNumber(new Date()); + return ( -
- - {modalIsOpen && ( - setModalIsOpen(false)} - event={false} - refetchQuery={events.refetch} - /> - )} -
+ <> +
+ + {modalIsOpen && ( + setModalIsOpen(false)} + event={false} + refetchQuery={events.refetch} + /> + )} +
+ setFilter(e.target.value)} + m="3rem 0 2rem" + /> + {(events.data ?? []).map((event) => { + const weekNumber = getWeekNumber(event.date); + const printWeekHeader = weekNumber !== lastPrintedWeek; + + if (printWeekHeader) { + lastPrintedWeek = weekNumber; + } + + return ( + + {printWeekHeader && ( + + + Week {weekNumber}{" "} + {thisWeekNumber === weekNumber && <>({t`This week`})} + + + )} +
+ +
+
+ ); + })} + All events listed in your local time: + ); } + +function getWeekNumber(d: Date) { + // Copy date so don't modify original + d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate())); + // Set to nearest Thursday: current date + 4 - current day number + // Make Sunday's day number 7 + d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7)); + // Get first day of year + const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); + // Calculate full weeks to nearest Thursday + const weekNo = Math.ceil( + ((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7 + ); + // Return array of year and week number + return weekNo; +} diff --git a/app/calendar/components/EventInfo.tsx b/app/calendar/components/EventInfo.tsx new file mode 100644 index 000000000..e337de986 --- /dev/null +++ b/app/calendar/components/EventInfo.tsx @@ -0,0 +1,122 @@ +import { Box, Button, Flex, Grid, Heading } from "@chakra-ui/react"; +import Markdown from "components/common/Markdown"; +import MyLink from "components/common/MyLink"; +import UserAvatar from "components/common/UserAvatar"; +import { useMyTheme, useUser } from "hooks/common"; +import React, { useState } from "react"; +import { FaDiscord } from "react-icons/fa"; +import { FiClock, FiEdit, FiInfo } from "react-icons/fi"; +import { ADMIN_ID } from "utils/constants"; +import { Unpacked } from "utils/types"; +import { Events } from "../service"; + +interface EventInfoProps { + event: Unpacked; +} + +const TournamentInfo = ({ event }: EventInfoProps) => { + const { + secondaryBgColor, + themeColorHex, + gray, + themeColorShade, + } = useMyTheme(); + const [expanded, setExpanded] = useState(false); + const [showModal, setShowModal] = useState(false); + const poster = event.poster; + + const [user] = useUser(); + + const canEdit = user?.id === poster.id || user?.id === ADMIN_ID; + + return ( + + + + + {event.name} + + + + {/* TODO */} + {event.date.toLocaleString("en", { + weekday: "long", + month: "long", + day: "numeric", + hour: "numeric", + minute: "numeric", + })} + + + + + + {" "} + + + {poster.username}#{poster.discriminator} + + + + + + + {/* TODO */} + + + {canEdit && ( + + )} + + + {expanded && ( + + + + )} + + ); +}; + +export default TournamentInfo; diff --git a/app/calendar/service.ts b/app/calendar/service.ts index 0cb677c36..a8547a265 100644 --- a/app/calendar/service.ts +++ b/app/calendar/service.ts @@ -1,9 +1,15 @@ +import { Prisma } from "@prisma/client"; import prisma from "prisma/client"; import { eventSchema } from "utils/validators/event"; import * as z from "zod"; +export type Events = Prisma.PromiseReturnType; + const events = () => { - return prisma.calendarEvent.findMany({ where: { date: { gt: new Date() } } }); + return prisma.calendarEvent.findMany({ + where: { date: { gt: new Date() } }, + include: { poster: true }, + }); }; const addEvent = async ({