From 64c53d7d831b5179d4354254d437d6fc581bcc49 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Mon, 22 Aug 2022 00:08:47 +0300 Subject: [PATCH] Front page upcomig events initial --- app/db/models/calendar/queries.server.ts | 30 +++++++++++++++++++++-- app/db/models/calendar/upcomingEvents.sql | 24 ++++++++++++++++++ app/routes/calendar/components/Tags.tsx | 2 +- app/routes/calendar/index.tsx | 9 +------ app/routes/index.tsx | 22 ++++++++++++++--- app/styles/front-page.css | 2 ++ public/locales/en/calendar.json | 9 ------- public/locales/en/common.json | 12 ++++++++- 8 files changed, 86 insertions(+), 24 deletions(-) create mode 100644 app/db/models/calendar/upcomingEvents.sql diff --git a/app/db/models/calendar/queries.server.ts b/app/db/models/calendar/queries.server.ts index c41c56661..0b1c02c68 100644 --- a/app/db/models/calendar/queries.server.ts +++ b/app/db/models/calendar/queries.server.ts @@ -30,6 +30,7 @@ import startTimesOfRangeSql from "./startTimesOfRange.sql"; import findBadgesByEventIdSql from "./findBadgesByEventId.sql"; import eventsToReportSql from "./eventsToReport.sql"; import recentWinnersSql from "./recentWinners.sql"; +import upcomingEventsSql from "./upcomingEvents.sql"; const createStm = sql.prepare(createSql); const updateStm = sql.prepare(updateSql); @@ -327,11 +328,10 @@ export function findAllBetweenTwoTimestamps({ } & { hasBadge: number } >; - return rows.map(addTagArray); + return rows.map(addTagArray).map(addBadges); } const findByIdStm = sql.prepare(findByIdSql); - export function findById(id: CalendarEvent["id"]) { const [firstRow, ...rest] = findByIdStm.all({ id }) as Array< Pick< @@ -361,6 +361,32 @@ export function findById(id: CalendarEvent["id"]) { }); } +const upcomingEventsStm = sql.prepare(upcomingEventsSql); +export function upcomingEvents() { + const rows = upcomingEventsStm.all({ + now: dateToDatabaseTimestamp(new Date()), + }) as Array<{ + eventId: CalendarEvent["id"]; + eventName: CalendarEvent["name"]; + tags: CalendarEvent["tags"]; + startTime: CalendarEventDate["startTime"]; + hasBadge: number; + }>; + + return rows.map(addTagArray).map(addBadges); +} + +function addBadges< + T extends { eventId: CalendarEvent["id"]; tags?: CalendarEvent["tags"] } +>(arg: T) { + return { + ...arg, + badgePrizes: arg.tags?.includes("BADGE") + ? findBadgesByEventId(arg.eventId) + : [], + }; +} + const startTimesOfRangeStm = sql.prepare(startTimesOfRangeSql); export function startTimesOfRange({ startTime, diff --git a/app/db/models/calendar/upcomingEvents.sql b/app/db/models/calendar/upcomingEvents.sql new file mode 100644 index 000000000..4199055cb --- /dev/null +++ b/app/db/models/calendar/upcomingEvents.sql @@ -0,0 +1,24 @@ +select + "CalendarEvent"."id" as "eventId", + "CalendarEvent"."name" as "eventName", + "CalendarEvent"."tags", + "CalendarEventDate"."startTime", + exists ( + select + 1 + from + "CalendarEventBadge" + where + "CalendarEventBadge"."eventId" = "CalendarEvent"."id" + ) as "hasBadge" +from + "CalendarEventDate" + inner join "CalendarEvent" on "CalendarEvent"."id" = "CalendarEventDate"."eventId" +where + "CalendarEventDate"."startTime" > @now +group by + "CalendarEventDate"."eventId" +order by + "CalendarEventDate"."startTime" asc +limit + 3 \ No newline at end of file diff --git a/app/routes/calendar/components/Tags.tsx b/app/routes/calendar/components/Tags.tsx index 8a6a7095a..4b47e5f43 100644 --- a/app/routes/calendar/components/Tags.tsx +++ b/app/routes/calendar/components/Tags.tsx @@ -17,7 +17,7 @@ export function Tags({ /** Called when tag delete button clicked. If undefined delete buttons won't be shown. */ onDelete?: (tag: CalendarEventTag) => void; }) { - const { t } = useTranslation("calendar"); + const { t } = useTranslation(); if (tags.length === 0) return null; diff --git a/app/routes/calendar/index.tsx b/app/routes/calendar/index.tsx index bba3901f0..4c52ceadd 100644 --- a/app/routes/calendar/index.tsx +++ b/app/routes/calendar/index.tsx @@ -120,14 +120,7 @@ function fetchEventsOfWeek(args: { week: number; year: number }) { startTime.setHours(startTime.getHours() - 12); endTime.setHours(endTime.getHours() + 12); - return db.calendarEvents - .findAllBetweenTwoTimestamps({ startTime, endTime }) - .map((event) => ({ - ...event, - badgePrizes: event.tags.includes("BADGE") - ? db.calendarEvents.findBadgesByEventId(event.eventId) - : [], - })); + return db.calendarEvents.findAllBetweenTwoTimestamps({ startTime, endTime }); } export default function CalendarPage() { diff --git a/app/routes/index.tsx b/app/routes/index.tsx index 4ae82eadf..49b96a70d 100644 --- a/app/routes/index.tsx +++ b/app/routes/index.tsx @@ -8,6 +8,7 @@ import styles from "~/styles/front-page.css"; import { databaseTimestampToDate } from "~/utils/dates"; import { discordFullName } from "~/utils/strings"; import { calendarEventPage, userPage } from "~/utils/urls"; +import { Tags } from "./calendar/components/Tags"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; @@ -15,7 +16,7 @@ export const links: LinksFunction = () => { export const loader = () => { return json({ - upcomingEvents: [], + upcomingEvents: db.calendarEvents.upcomingEvents(), recentWinners: db.calendarEvents.recentWinners(), }); }; @@ -79,8 +80,23 @@ function CalendarPeek() { ))}