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 */}
+ } size="sm" variant="outline">
+ Join Discord
+
+ }
+ size="sm"
+ onClick={() => setExpanded(!expanded)}
+ variant="outline"
+ >
+ View info
+
+ {canEdit && (
+ }
+ size="sm"
+ onClick={() => setShowModal(true)}
+ variant="outline"
+ >
+ Edit event
+
+ )}
+
+
+ {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 ({