From 06691d5898a9209e89b430723016f6f84f75f101 Mon Sep 17 00:00:00 2001 From: Dimitri POSTOLOV Date: Wed, 4 Oct 2023 21:52:09 +0200 Subject: [PATCH 01/10] add new speakers/:id --- gatsby-node.ts | 13 +- src/components/Conf/Schedule/ScheduleList.tsx | 297 ++++++++---------- src/pages/conf/faq.tsx | 1 - src/templates/event.tsx | 4 +- src/templates/speaker.tsx | 9 +- 5 files changed, 146 insertions(+), 178 deletions(-) diff --git a/gatsby-node.ts b/gatsby-node.ts index dc54a44833..7843ad1afa 100644 --- a/gatsby-node.ts +++ b/gatsby-node.ts @@ -4,7 +4,6 @@ import { GatsbyNode } from "gatsby" import { createOpenGraphImage } from "gatsby-plugin-dynamic-open-graph-images" import * as path from "path" import { glob } from "glob" -import _ from "lodash" import { updateCodeData } from "./scripts/update-code-data/update-code-data" import { organizeCodeData } from "./scripts/update-code-data/organize-code-data" import { sortCodeData } from "./scripts/update-code-data/sort-code-data" @@ -239,7 +238,17 @@ export const createPages: GatsbyNode["createPages"] = async ({ createPage({ path: `/conf/speakers/${speaker.username}`, component: path.resolve("./src/templates/speaker.tsx"), - context: { speaker, schedule: speakerSessions }, + context: { + speaker, + schedule: speakerSessions.map(session => ({ + ...session, + speakers: session.speakers + .map(speaker => + speakers.find(s => s.username === speaker.username) + ) + .filter(Boolean), + })), + }, }) if (!process.env.GATSBY_CLOUD && !process.env.GITHUB_ACTIONS) { diff --git a/src/components/Conf/Schedule/ScheduleList.tsx b/src/components/Conf/Schedule/ScheduleList.tsx index 61e4341100..4646ddcd7e 100644 --- a/src/components/Conf/Schedule/ScheduleList.tsx +++ b/src/components/Conf/Schedule/ScheduleList.tsx @@ -134,182 +134,143 @@ const ScheduleList: FC = ({ filterSchedule, scheduleData, }) => { - const [filtersState, setFiltersState] = useState< - Record - >({ - Audience: [], - "Talk category": [], - "Event type": [], - }) - const [sessionsState, setSessionState] = useState( - () => { - return getSessionsByDay(scheduleData, filterSchedule, filtersState) - } - ) - - useEffect(() => { - setSessionState( - getSessionsByDay(scheduleData, filterSchedule, filtersState) - ) - }, [filtersState, scheduleData]) + // const [filtersState, setFiltersState] = useState< + // Record + // >({ + // Audience: [], + // "Talk category": [], + // "Event type": [], + // }) + // const [sessionsState, setSessionState] = useState( + // () => { + // return getSessionsByDay(scheduleData, filterSchedule, filtersState) + // } + // ) + // + // useEffect(() => { + // setSessionState( + // getSessionsByDay(scheduleData, filterSchedule, filtersState) + // ) + // }, [filtersState, scheduleData]) return ( - <> -
- {showFilter && ( - { - setFiltersState(prev => ({ - ...prev, - [category]: checked - ? [...prev[category as CategoryName], option] - : prev[category as CategoryName].filter( - option => option !== option - ), - })) - }} - onReset={() => { - setFiltersState({ - Audience: [], - "Talk category": [], - "Event type": [], - }) - }} - /> - )} - {Object.entries(sessionsState).length === 0 ? ( -
-

No sessions found

-
- ) : ( - <> -
- {Object.keys(sessionsState).map((date, index) => ( - - Day {index + 1} - - ))} -
- {Object.entries(sessionsState).map( - ([date, concurrentSessionsGroup], index) => ( -
-

- {format(parseISO(date), "EEEE, MMMM d")} -

- {Object.entries(concurrentSessionsGroup).map( - ([sessionDate, sessions]) => ( -
-
-
- - {format(parseISO(sessionDate), "hh:mmaaaa 'PDT'")} - -
-
-
-
+
+ {scheduleData.map(session => { + const eventType = session.event_type.endsWith("s") + ? session.event_type.slice(0, -1) + : session.event_type - {sessions.map(session => { - const eventType = session.event_type.endsWith("s") - ? session.event_type.slice(0, -1) - : session.event_type + const speakers = session.speakers + const formattedSpeakers = isString(speakers || []) + ? (speakers as string)?.split(",") + : (speakers as SchedSpeaker[])?.map(e => e.name) + const eventTitle = getEventTitle(session, formattedSpeakers) - const speakers = session.speakers - const formattedSpeakers = isString(speakers || []) - ? (speakers as string)?.split(",") - : (speakers as SchedSpeaker[])?.map(e => e.name) - const eventTitle = getEventTitle( - session, - formattedSpeakers - ) + const borderColor = eventsColors[session.event_type] - const borderColor = eventsColors[session.event_type] + const countSpeakers = + session.speakers.length > 3 ? 3 : session.speakers.length - return session.event_type === "Breaks" ? ( -
- {showEventType ? eventType + " / " : ""} - {eventTitle} -
- ) : ( - -
- {borderColor && ( - - {eventType} - - )} -
- {showEventType ? eventType + " / " : ""} - {eventTitle} -
- {(speakers?.length || 0) > 0 && ( - - {formattedSpeakers.join(", ")} - - )} - - - {/* */} - - - {session.venue} - -
-
-
-
- ) - })} -
-
+ const gridColumn = `span ${countSpeakers} / span ${countSpeakers}` + + return session.event_type === "Breaks" ? ( +
+ {showEventType ? eventType + " / " : ""} + {eventTitle} +
+ ) : ( + +
+
+
+
+ Recording +
+
+ + {(Number(new Date(session.event_end)) - + Number(new Date(session.event_start))) / + 1000 / + 60} + m +
+
+ +
+ ▶ +
+
+
+ + {session.event_type} + + {session.name} +
+ {session.speakers!.map(s => ( +
+ +
+ {s.name} + {s.company}
- ) - )} +
+ ))}
- ) - )} - - )} - +
+
+ ) + })} +
+ ) +} + +function ClockIcon(props) { + return ( + + + + ) } diff --git a/src/pages/conf/faq.tsx b/src/pages/conf/faq.tsx index 8db33f2dde..a79b9e77b8 100644 --- a/src/pages/conf/faq.tsx +++ b/src/pages/conf/faq.tsx @@ -2,7 +2,6 @@ import React, { ReactNode } from "react" import FooterConf from "../../components/Conf/Footer" import HeaderConf from "../../components/Conf/Header" import LayoutConf from "../../components/Conf/Layout" -import ButtonConf from "../../components/Conf/Button" import SectionConf from "../../components/Conf/Section" import SeoConf from "../../components/Conf/Seo" diff --git a/src/templates/event.tsx b/src/templates/event.tsx index e25fab95a5..3c80d8d482 100644 --- a/src/templates/event.tsx +++ b/src/templates/event.tsx @@ -116,7 +116,7 @@ export const EventComponent: FC<{

{speakers?.map(speaker => ( - + {speaker.name} {speaker.company && ", "} @@ -133,7 +133,7 @@ export const EventComponent: FC<{ />
{speakers?.map(speaker => ( -
+
-
+

{speaker.name}

- {speaker.company && speaker.company} + {speaker.company} {speaker.company && ", "} {speaker.position} ){2,}/g, '')} rehypePlugins={[rehypeRaw]} remarkPlugins={[remarkGfm]} /> @@ -75,14 +75,13 @@ const SpeakersTemplate: FC< />
-

Sessions

+ -
From 460677ea57da528fc29010eeed45881441ab60a2 Mon Sep 17 00:00:00 2001 From: Dimitri POSTOLOV Date: Wed, 4 Oct 2023 22:13:11 +0200 Subject: [PATCH 02/10] fixes --- gatsby-node.ts | 22 ++- src/components/Conf/Schedule/ScheduleList.tsx | 175 ++---------------- 2 files changed, 25 insertions(+), 172 deletions(-) diff --git a/gatsby-node.ts b/gatsby-node.ts index 7843ad1afa..63e431bff2 100644 --- a/gatsby-node.ts +++ b/gatsby-node.ts @@ -180,7 +180,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ createPage({ path: "/conf/schedule", component: path.resolve("./src/templates/schedule.tsx"), - context: { schedule }, + context: { schedule: withSpeakerInfo(schedule.filter(session => session.speakers)) }, }) // Create schedule events' pages @@ -221,6 +221,17 @@ export const createPages: GatsbyNode["createPages"] = async ({ } }) + function withSpeakerInfo(session: ScheduleSession[]) { + return session.map(session => ({ + ...session, + speakers: session.speakers + .map(speaker => + speakers.find(s => s.username === speaker.username) + ) + .filter(Boolean), + })) + } + // Create speakers list page createPage({ path: "/conf/speakers", @@ -240,14 +251,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ component: path.resolve("./src/templates/speaker.tsx"), context: { speaker, - schedule: speakerSessions.map(session => ({ - ...session, - speakers: session.speakers - .map(speaker => - speakers.find(s => s.username === speaker.username) - ) - .filter(Boolean), - })), + schedule: withSpeakerInfo(speakerSessions), }, }) diff --git a/src/components/Conf/Schedule/ScheduleList.tsx b/src/components/Conf/Schedule/ScheduleList.tsx index 4646ddcd7e..f704aa0e52 100644 --- a/src/components/Conf/Schedule/ScheduleList.tsx +++ b/src/components/Conf/Schedule/ScheduleList.tsx @@ -1,14 +1,7 @@ -import { format, parseISO, compareAsc } from "date-fns" -import React, { FC, useEffect, useState } from "react" +import React, { ComponentProps, FC } from "react" import { eventsColors } from "../../../utils/eventsColors" -import { getEventTitle } from "../../../utils/eventTitle" -import Filters from "./Filters" import { SchedSpeaker } from "../Speakers/Speaker" -function isString(x: any) { - return Object.prototype.toString.call(x) === "[object String]" -} - export interface ScheduleSession { id: string audience: string @@ -23,171 +16,24 @@ export interface ScheduleSession { files?: { name: string; path: string }[] } -export interface ConcurrentSessions { - [date: string]: ScheduleSession[] -} - -export interface ScheduleSessionsByDay { - [date: string]: ConcurrentSessions -} - -export type CategoryName = "Audience" | "Talk category" | "Event type" - -const filterCategories: Array<{ name: CategoryName; options: string[] }> = [ - { - name: "Audience", - options: ["Beginner", "Intermediate", "Advanced"], - }, - { - name: "Talk category", - options: [ - "Beyond Javascript", - "Spec Fusion", - "Platform and Backend", - "GraphQL and Data", - "GraphQL Security", - "GraphQL in Production", - "GraphQL Clients", - "GraphQL Core", - "Scaling", - "Emerging Community Trends", - ], - }, - { - name: "Event type", - options: [ - "Workshops", - "Unconference", - "Keynote Sessions", - "Sponsor Showcase", - "Session Presentations", - "Lightning Talks", - "Events & Experiences", - ], - }, -] - -function getSessionsByDay( - scheduleData: ScheduleSession[], - initialFilter: - | ((sessions: ScheduleSession[]) => ScheduleSession[]) - | undefined, - filters: Record -) { - const data = initialFilter ? initialFilter(scheduleData) : scheduleData - const filteredSortedSchedule = (data || []).sort((a, b) => - compareAsc(new Date(a.event_start), new Date(b.event_start)) - ) - - const concurrentSessions: ConcurrentSessions = {} - filteredSortedSchedule.forEach(session => { - const audienceFilter = filters.Audience - const talkCategoryFilter = filters["Talk category"] - const eventTypeFilter = filters["Event type"] - - let include = true - if (audienceFilter.length > 0) { - include = include && audienceFilter.includes(session.audience) - } - if (talkCategoryFilter.length > 0) { - include = include && talkCategoryFilter.includes(session.event_subtype) - } - if (eventTypeFilter.length > 0) { - include = include && eventTypeFilter.includes(session.event_type) - } - - if (!include) { - return - } - - if (!concurrentSessions[session.event_start]) { - concurrentSessions[session.event_start] = [] - } - concurrentSessions[session.event_start].push(session) - }) - - const sessionsByDay: ScheduleSessionsByDay = {} - Object.entries(concurrentSessions).forEach(([date, sessions]) => { - const day = date.split(" ")[0] - if (!sessionsByDay[day]) { - sessionsByDay[day] = {} - } - sessionsByDay[day] = { - ...sessionsByDay[day], - [date]: sessions.sort((a, b) => a.venue.localeCompare(b.venue)), - } - }) - - return sessionsByDay -} - interface Props { - showEventType?: boolean - showFilter?: boolean scheduleData: ScheduleSession[] - filterSchedule?: (sessions: ScheduleSession[]) => ScheduleSession[] } -const ScheduleList: FC = ({ - showEventType, - showFilter = true, - filterSchedule, - scheduleData, -}) => { - // const [filtersState, setFiltersState] = useState< - // Record - // >({ - // Audience: [], - // "Talk category": [], - // "Event type": [], - // }) - // const [sessionsState, setSessionState] = useState( - // () => { - // return getSessionsByDay(scheduleData, filterSchedule, filtersState) - // } - // ) - // - // useEffect(() => { - // setSessionState( - // getSessionsByDay(scheduleData, filterSchedule, filtersState) - // ) - // }, [filtersState, scheduleData]) - +const ScheduleList: FC = ({ scheduleData }) => { return (
{scheduleData.map(session => { - const eventType = session.event_type.endsWith("s") - ? session.event_type.slice(0, -1) - : session.event_type - - const speakers = session.speakers - const formattedSpeakers = isString(speakers || []) - ? (speakers as string)?.split(",") - : (speakers as SchedSpeaker[])?.map(e => e.name) - const eventTitle = getEventTitle(session, formattedSpeakers) + const speakers = session.speakers as SchedSpeaker[] const borderColor = eventsColors[session.event_type] - const countSpeakers = - session.speakers.length > 3 ? 3 : session.speakers.length + const countSpeakers = speakers.length > 3 ? 3 : speakers.length const gridColumn = `span ${countSpeakers} / span ${countSpeakers}` - - return session.event_type === "Breaks" ? ( -
- {showEventType ? eventType + " / " : ""} - {eventTitle} -
- ) : ( + return ( = ({ {session.name}
- {session.speakers!.map(s => ( -
+ {speakers.map(s => ( +
= ({ ) } -function ClockIcon(props) { +function ClockIcon(props: ComponentProps<"svg">) { return ( Date: Wed, 4 Oct 2023 22:49:20 +0200 Subject: [PATCH 03/10] fixes --- src/components/Conf/Schedule/Filters.tsx | 185 +++++------ src/components/Conf/Schedule/ScheduleList.tsx | 305 ++++++++++++++---- src/templates/schedule.tsx | 61 +--- src/templates/speaker.tsx | 3 +- 4 files changed, 322 insertions(+), 232 deletions(-) diff --git a/src/components/Conf/Schedule/Filters.tsx b/src/components/Conf/Schedule/Filters.tsx index 551f128fe2..86c32cc5f4 100644 --- a/src/components/Conf/Schedule/Filters.tsx +++ b/src/components/Conf/Schedule/Filters.tsx @@ -17,108 +17,93 @@ export default function Filters({ onReset, }: FiltersProps) { return ( -
-
-
-
- {Object.values(filterState).flat().length > 0 && ( - - )} - - - -
- {categories.map(option => ( - - 0 - ? "font-medium text-gray-900" - : "text-gray-500" - )} - > - {option.name} - - - ))} -
-
-
-
+
+ {Object.values(filterState).flat().length > 0 && ( + + )} + + + +
+ {categories.map(option => ( + + 0 + ? "font-medium text-gray-900" + : "text-gray-500" + )} + > + {option.name} + + + ))} +
+
+
+
+ + {categories.map((section, sectionIdx) => ( + + + {section.name} + {filterState[section.name].length ? ( + + {filterState[section.name].length} + + ) : null} + -
-
- - {categories.map((section, sectionIdx) => ( - +
+ {section.options.map((option, optionIdx) => ( +
+ { + const { checked, value } = e.target + onFilterChange(section.name, value, checked) + }} + checked={filterState[section.name].includes(option)} + type="checkbox" + className="cursor-pointer h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500" + /> +
-
-
-
-
+ {option} + +
+ ))} + + + + ))} +
) } diff --git a/src/components/Conf/Schedule/ScheduleList.tsx b/src/components/Conf/Schedule/ScheduleList.tsx index f704aa0e52..49df608e24 100644 --- a/src/components/Conf/Schedule/ScheduleList.tsx +++ b/src/components/Conf/Schedule/ScheduleList.tsx @@ -1,5 +1,7 @@ -import React, { ComponentProps, FC } from "react" +import { compareAsc } from "date-fns" +import React, { ComponentProps, FC, useEffect, useState } from "react" import { eventsColors } from "../../../utils/eventsColors" +import Filters from "./Filters" import { SchedSpeaker } from "../Speakers/Speaker" export interface ScheduleSession { @@ -16,81 +18,242 @@ export interface ScheduleSession { files?: { name: string; path: string }[] } +export interface ConcurrentSessions { + [date: string]: ScheduleSession[] +} + +export interface ScheduleSessionsByDay { + [date: string]: ConcurrentSessions +} + +export type CategoryName = "Audience" | "Talk category" | "Event type" + +const filterCategories: Array<{ name: CategoryName; options: string[] }> = [ + { + name: "Audience", + options: ["Beginner", "Intermediate", "Advanced"], + }, + { + name: "Talk category", + options: [ + "Beyond Javascript", + "Spec Fusion", + "Platform and Backend", + "GraphQL and Data", + "GraphQL Security", + "GraphQL in Production", + "GraphQL Clients", + "GraphQL Core", + "Scaling", + "Emerging Community Trends", + ], + }, + { + name: "Event type", + options: [ + "Workshops", + "Unconference", + "Keynote Sessions", + "Sponsor Showcase", + "Session Presentations", + "Lightning Talks", + "Events & Experiences", + ], + }, +] + +function getSessionsByDay( + scheduleData: ScheduleSession[], + initialFilter: + | ((sessions: ScheduleSession[]) => ScheduleSession[]) + | undefined, + filters: Record +) { + const data = initialFilter ? initialFilter(scheduleData) : scheduleData + const filteredSortedSchedule = (data || []).sort((a, b) => + compareAsc(new Date(a.event_start), new Date(b.event_start)) + ) + + const concurrentSessions: ConcurrentSessions = {} + filteredSortedSchedule.forEach(session => { + const audienceFilter = filters.Audience + const talkCategoryFilter = filters["Talk category"] + const eventTypeFilter = filters["Event type"] + + let include = true + if (audienceFilter.length > 0) { + include = include && audienceFilter.includes(session.audience) + } + if (talkCategoryFilter.length > 0) { + include = include && talkCategoryFilter.includes(session.event_subtype) + } + if (eventTypeFilter.length > 0) { + include = include && eventTypeFilter.includes(session.event_type) + } + + if (!include) { + return + } + + if (!concurrentSessions[session.event_start]) { + concurrentSessions[session.event_start] = [] + } + concurrentSessions[session.event_start].push(session) + }) + + const sessionsByDay: ScheduleSessionsByDay = {} + Object.entries(concurrentSessions).forEach(([date, sessions]) => { + const day = date.split(" ")[0] + if (!sessionsByDay[day]) { + sessionsByDay[day] = {} + } + sessionsByDay[day] = { + ...sessionsByDay[day], + [date]: sessions.sort((a, b) => a.venue.localeCompare(b.venue)), + } + }) + + return sessionsByDay +} + interface Props { + showFilter?: boolean scheduleData: ScheduleSession[] + filterSchedule?: (sessions: ScheduleSession[]) => ScheduleSession[] } -const ScheduleList: FC = ({ scheduleData }) => { +const ScheduleList: FC = ({ + showFilter = true, + filterSchedule, + scheduleData, +}) => { + const [filtersState, setFiltersState] = useState< + Record + >({ + Audience: [], + "Talk category": [], + "Event type": [], + }) + const [sessionsState, setSessionState] = useState(() => + getSessionsByDay(scheduleData, filterSchedule, filtersState) + ) + + useEffect(() => { + setSessionState( + getSessionsByDay(scheduleData, filterSchedule, filtersState) + ) + }, [filtersState, scheduleData]) + return ( -
- {scheduleData.map(session => { - const speakers = session.speakers as SchedSpeaker[] - - const borderColor = eventsColors[session.event_type] - - const countSpeakers = speakers.length > 3 ? 3 : speakers.length - - const gridColumn = `span ${countSpeakers} / span ${countSpeakers}` - return ( - -
-
-
-
- Recording -
-
- - {(Number(new Date(session.event_end)) - - Number(new Date(session.event_start))) / - 1000 / - 60} - m -
-
- -
- ▶ -
-
-
- - {session.event_type} - - {session.name} -
- {speakers.map(s => ( -
- -
- {s.name} - {s.company} -
-
- ))} -
-
-
- ) - })} +
+ {showFilter && ( + { + setFiltersState(prev => ({ + ...prev, + [category]: checked + ? [...prev[category as CategoryName], option] + : prev[category as CategoryName].filter( + option => option !== option + ), + })) + }} + onReset={() => { + setFiltersState({ + Audience: [], + "Talk category": [], + "Event type": [], + }) + }} + /> + )} + {Object.entries(sessionsState).length === 0 ? ( +
+

No sessions found

+
+ ) : ( +
+ {Object.entries(sessionsState).flatMap( + ([date, concurrentSessionsGroup]) => + Object.entries(concurrentSessionsGroup).flatMap( + ([sessionDate, sessions]) => + sessions.flatMap(session => { + const speakers = session.speakers as SchedSpeaker[] + + const borderColor = eventsColors[session.event_type] + + const countSpeakers = + speakers.length > 3 ? 3 : speakers.length + + const gridColumn = `span ${countSpeakers} / span ${countSpeakers}` + return ( + +
+
+
+
+ Recording +
+
+ + {(Number(new Date(session.event_end)) - + Number(new Date(session.event_start))) / + 1000 / + 60} + m +
+
+ + ↗ + +
+ ▶ +
+
+
+ + {session.event_type} + + {session.name} +
+ {speakers.map(s => ( +
+ +
+ {s.name} + {s.company} +
+
+ ))} +
+
+
+ ) + }) + ) + )} +
+ )}
) } diff --git a/src/templates/schedule.tsx b/src/templates/schedule.tsx index 17b8246413..702650ec05 100644 --- a/src/templates/schedule.tsx +++ b/src/templates/schedule.tsx @@ -15,65 +15,8 @@ const ScheduleTemplate: FC> = ({ -
-
-
-

GraphQLConf 2023 Schedule

-
-
- - - {/* */} - - - September 19-21, 2023 - - - - {/* */} - - - San Francisco Bay Area, CA - -
-

Important Notes

-
    -
  • - All session times are in Pacific Daylight Time (UTC -7). -
  • -
  • - Timing of sessions and room locations are subject to change. -
  • -
-
-
-
- -
- - 🔗 Bookmark sessions & plan your days on Sched - +
+
diff --git a/src/templates/speaker.tsx b/src/templates/speaker.tsx index e6d23f92e8..212e7cbd18 100644 --- a/src/templates/speaker.tsx +++ b/src/templates/speaker.tsx @@ -30,7 +30,7 @@ const SpeakersTemplate: FC<
-
+

{speaker.name}

@@ -79,7 +79,6 @@ const SpeakersTemplate: FC<
From bf973bbb2e844e1fbb1294ff9f7b28bef442e5a1 Mon Sep 17 00:00:00 2001 From: Dimitri POSTOLOV Date: Wed, 4 Oct 2023 23:08:15 +0200 Subject: [PATCH 04/10] update --- src/components/Conf/Speakers/SocialMedia.tsx | 2 +- src/templates/event.tsx | 126 +++++-------------- static/img/logos/twitter.svg | 4 +- 3 files changed, 32 insertions(+), 100 deletions(-) diff --git a/src/components/Conf/Speakers/SocialMedia.tsx b/src/components/Conf/Speakers/SocialMedia.tsx index 939d27f137..a09c7cb895 100644 --- a/src/components/Conf/Speakers/SocialMedia.tsx +++ b/src/components/Conf/Speakers/SocialMedia.tsx @@ -27,7 +27,7 @@ export const SocialMediaIcon = ({ switch (service) { case "twitter": - return + return case "linkedin": return case "facebook": diff --git a/src/templates/event.tsx b/src/templates/event.tsx index 3c80d8d482..0664671904 100644 --- a/src/templates/event.tsx +++ b/src/templates/event.tsx @@ -64,47 +64,19 @@ export const EventComponent: FC<{
{!hideBackButton && } -
-
- - - {/* */} - - - - {format(parseISO(event.event_start), "EEEE, MMM d")} - - - - {/* */} - - + {recordingTitle.rating > 0.5 && ( + - - ))} -
- )} +
+ {event.files?.map(({ path }) => ( + <> + + View Full PDF{" "} + + +