+ )
+}
+
+const EventTemplate: FC<
+ PageProps<{}, { event: ScheduleSession; speakers: SchedSpeaker[] }>
+> = ({ pageContext }) => {
+ return (
+
+
+
+
+
+
+ )
+}
+
+export default EventTemplate
+
+export function Head() {
+ return
+}
+
+function renderPositionAndCompany(speaker: SchedSpeaker) {
+ // Reassign "-" if position or company are undefined
+ const position = speaker.position || "-"
+ const company = speaker.company || "-"
+
+ // Only include anchor element if url is not an empty string
+ const companyElement =
+ speaker.url !== "" ? (
+
+ {company}
+
+ ) : (
+ company
+ )
+
+ if (position !== "-" && company !== "-") {
+ return (
+ <>
+ {position} at {companyElement}
+ >
+ )
+ } else if (position !== "-") {
+ return position
+ } else if (company !== "-") {
+ return <>Works at {companyElement}>
+ } else {
+ return "-"
+ }
+}
diff --git a/src/templates/schedule.tsx b/src/templates/schedule.tsx
new file mode 100644
index 000000000..394030600
--- /dev/null
+++ b/src/templates/schedule.tsx
@@ -0,0 +1,71 @@
+import React, { FC } from "react"
+import FooterConf from "../components/Conf/Footer"
+import HeaderConf from "../components/Conf/Header"
+import LayoutConf from "../components/Conf/Layout"
+import SeoConf from "../components/Conf/Seo"
+import { PageProps } from "gatsby"
+import ScheduleList, {
+ ScheduleSession,
+} from "../components/Conf/Schedule/ScheduleList"
+
+export const eventsColors = [
+ ["Breaks", "#a7b7c4", "#171c24"], // Cool light blue with Dark Blue-Gray text
+ ["Keynote Sessions", "#a56be8", "#ffffff"], // Vibrant Purple with White text
+ ["Lightning Talks", "#16a596", "#ffffff"], // Turquoise with White text
+ ["Session Presentations", "#ec4646", "#ffffff"], // Vibrant Red with White text
+ ["Workshops", "#e6812f", "#ffffff"], // Slightly Darker Orange with White text
+]
+
+const ScheduleTemplate: FC> = ({
+ pageContext: { schedule },
+}) => {
+ return (
+
+
+
+
+
+
GraphQLConf 2023 Schedule
+
+
September 19-21, 2023 I San Francisco Bay Area, CA
+
+ Please note: All session times are in Pacific Daylight Time (UTC
+ -7). To view the schedule in your preferred timezone,
+ please select from the drop-down menu to the right, above “Filter
+ by Date.”
+
+
+ IMPORTANT NOTE: Timing of sessions and room locations are{" "}
+ subject to change.
+
+
+
+
+ Event Types:
+
+
+ {eventsColors.map(([event, color]) => (
+
+
+ {event}
+
+ ))}
+
+
+
+
+
+
+
+
+ )
+}
+
+export function Head() {
+ return
+}
+
+export default ScheduleTemplate
diff --git a/src/templates/speaker.tsx b/src/templates/speaker.tsx
new file mode 100644
index 000000000..826aacbcd
--- /dev/null
+++ b/src/templates/speaker.tsx
@@ -0,0 +1,178 @@
+import React, { FC } from "react"
+import FooterConf from "../components/Conf/Footer"
+import HeaderConf from "../components/Conf/Header"
+import LayoutConf from "../components/Conf/Layout"
+import SeoConf from "../components/Conf/Seo"
+import { PageProps } from "gatsby"
+import { SchedSpeaker } from "../components/Conf/Speakers/Speaker"
+import ScheduleList from "../components/Conf/Schedule/ScheduleList"
+import { Avatar } from "../components/Conf/Speakers/Avatar"
+import { ReactComponent as TwitterIcon } from "../../static/img/logos/twitter.svg"
+import { ReactComponent as FacebookIcon } from "../../static/img/logos/facebook.svg"
+import { ReactComponent as InstagramIcon } from "../../static/img/logos/instagram.svg"
+import { ReactComponent as SnapChatIcon } from "../../static/img/logos/snapchat.svg"
+import { ReactComponent as LinkedinIcon } from "../../static/img/logos/linkedin.svg"
+
+type SocialMediaIconServiceType =
+ | "twitter"
+ | "linkedin"
+ | "facebook"
+ | "instagram"
+ | "snapchat"
+
+const SocialMediaIcon = ({
+ service,
+}: {
+ service: SocialMediaIconServiceType
+}) => {
+ switch (service) {
+ case "twitter":
+ return
+ case "linkedin":
+ return
+ case "facebook":
+ return
+ case "instagram":
+ return
+ case "snapchat":
+ return
+ default:
+ return null
+ }
+}
+
+const SpeakersTemplate: FC<
+ PageProps<{}, { speaker: SchedSpeaker; schedule: any }>
+> = ({ pageContext: { schedule, speaker } }) => {
+ return (
+
+
+
+
+
+
+
+ )
+}
+
+export default SpeakersTemplate
+
+export function Head() {
+ return
+}
+
+function renderPositionAndCompany(speaker: SchedSpeaker) {
+ // Reassign "-" if position or company are undefined
+ const position = speaker.position || "-"
+ const company = speaker.company || "-"
+
+ // Only include anchor element if url is not an empty string
+ const companyElement =
+ speaker.url !== "" ? (
+
+ {company}
+
+ ) : (
+ company
+ )
+
+ if (position !== "-" && company !== "-") {
+ return (
+ <>
+ {position} at {companyElement}
+ >
+ )
+ } else if (position !== "-") {
+ return position
+ } else if (company !== "-") {
+ return <>Works at {companyElement}>
+ } else {
+ return "-"
+ }
+}
diff --git a/src/templates/speakers.tsx b/src/templates/speakers.tsx
new file mode 100644
index 000000000..ed3bd8b55
--- /dev/null
+++ b/src/templates/speakers.tsx
@@ -0,0 +1,78 @@
+import React, { FC, useEffect, useState } from "react"
+import FooterConf from "../components/Conf/Footer"
+import HeaderConf from "../components/Conf/Header"
+import LayoutConf from "../components/Conf/Layout"
+import SeoConf from "../components/Conf/Seo"
+import { keynoteSpeakers } from "../components/Conf/Speakers"
+import Speaker, { SchedSpeaker } from "../components/Conf/Speakers/Speaker"
+import { PageProps } from "gatsby"
+
+const SpeakersTemplate: FC> = ({
+ pageContext: { speakers: speakersData },
+}) => {
+ const [speakers, setSpeakers] = useState([])
+
+ useEffect(() => {
+ const keynoteNames = keynoteSpeakers.map(speaker => speaker.name)
+
+ // create an array for keynote speakers in fetched data maintaining the order in keynoteSpeakers
+ const keynoteSpeakersData = keynoteNames
+ .map(name => {
+ return speakersData.find(
+ (speaker: any) =>
+ speaker.name === name && speaker.role.includes("speaker")
+ )
+ })
+ .filter(Boolean) as SchedSpeaker[]
+
+ const otherSpeakersData = speakersData.filter(
+ (speaker: any) =>
+ speaker.role.includes("speaker") && !keynoteNames.includes(speaker.name)
+ )
+
+ // Sort other speakers by last name alphabetically
+ otherSpeakersData.sort((a: any, b: any) => {
+ const aLastName = a.name.split(" ").slice(-1)[0].toLowerCase()
+ const bLastName = b.name.split(" ").slice(-1)[0].toLowerCase()
+
+ return aLastName.localeCompare(bLastName)
+ })
+
+ setSpeakers([...keynoteSpeakersData, ...otherSpeakersData])
+ }, [])
+
+ return (
+
+
+
+
+
+
GraphQLConf 2023 Speakers
+
+ Meet the unique lineup of insightful speakers we've carefully
+ chosen, who are primed to share their groundbreaking ideas and
+ innovative practices in the realm of GraphQL at the conference.
+