Skip to content

Commit 5e63522

Browse files
authored
Merge pull request #57 from hasparus/events-rss
Add an RSS feed to Events page
2 parents 556b27e + 8e9d4b2 commit 5e63522

File tree

6 files changed

+125
-43
lines changed

6 files changed

+125
-43
lines changed

src/app/(main)/community/events/events-list.tsx

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ const ALL_SHOWN = {
6666
export function EventsList({
6767
events,
6868
className,
69+
children,
6970
}: {
7071
events: AnyEvent[]
7172
className?: string
73+
children?: React.ReactNode
7274
}) {
7375
const [kindFilters, setKindFilters] = useState(ALL_SHOWN)
7476

@@ -104,28 +106,31 @@ export function EventsList({
104106

105107
return (
106108
<div className={className}>
107-
<fieldset className="mb-8">
108-
<legend className="typography-menu mt-2">Event type</legend>
109-
<div className="mt-4 flex gap-3">
110-
{Array.from(tags).map(tag => (
111-
<EventFilterTag
112-
key={tag}
113-
kind={tag}
114-
checked={kindFilters[tag]}
115-
disabled={
116-
Object.values(kindFilters).filter(Boolean).length === 1 &&
117-
kindFilters[tag]
118-
}
119-
onChange={event => {
120-
setKindFilters(prev => ({
121-
...prev,
122-
[tag]: event.target.checked,
123-
}))
124-
}}
125-
/>
126-
))}
127-
</div>
128-
</fieldset>
109+
<div className="flex justify-between gap-2 max-lg:flex-col-reverse lg:mb-8 lg:items-end">
110+
<fieldset>
111+
<legend className="typography-menu mt-2">Event type</legend>
112+
<div className="mt-4 flex gap-3">
113+
{Array.from(tags).map(tag => (
114+
<EventFilterTag
115+
key={tag}
116+
kind={tag}
117+
checked={kindFilters[tag]}
118+
disabled={
119+
Object.values(kindFilters).filter(Boolean).length === 1 &&
120+
kindFilters[tag]
121+
}
122+
onChange={event => {
123+
setKindFilters(prev => ({
124+
...prev,
125+
[tag]: event.target.checked,
126+
}))
127+
}}
128+
/>
129+
))}
130+
</div>
131+
</fieldset>
132+
{children}
133+
</div>
129134
<EventsScrollview>
130135
{events.map(event =>
131136
"node" in event ? (
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import RSS from "rss"
2+
3+
import { getAllEvents } from "../get-all-events"
4+
5+
export const dynamic = "force-static"
6+
export const config = { runtime: "edge" }
7+
8+
export async function GET() {
9+
const { upcomingEvents, pastEvents } = await getAllEvents()
10+
11+
const allEvents = [...upcomingEvents, ...pastEvents]
12+
13+
const feed = new RSS({
14+
title: "GraphQL Community Events & Meetups",
15+
description:
16+
"Stay updated with the latest GraphQL community events and meetups.",
17+
feed_url: "https://the-guild.dev/graphql/community/events/feed.xml",
18+
site_url: "https://the-guild.dev/graphql/community/events",
19+
})
20+
21+
for (const event of allEvents) {
22+
if ("node" in event) {
23+
let date: Date
24+
if (event.node.next && new Date(event.node.next) > new Date()) {
25+
date = new Date(event.node.next)
26+
} else {
27+
date = new Date(event.node.prev)
28+
}
29+
30+
feed.item({
31+
title: event.node.name,
32+
date,
33+
url: event.node.link,
34+
description: "",
35+
lat: event.node.latitude,
36+
long: event.node.longitude,
37+
})
38+
} else if ("start" in event) {
39+
feed.item({
40+
title: event.summary || "GraphQL Working Group",
41+
date: event.start,
42+
url: event.htmlLink,
43+
description: event.description || "",
44+
})
45+
} else {
46+
feed.item({
47+
title: event.name,
48+
date: event.date,
49+
url: event.eventLink,
50+
description: `Host: ${event.host} | Location: ${event.location}`,
51+
})
52+
}
53+
}
54+
55+
return new Response(feed.xml({ indent: true }), {
56+
headers: {
57+
"Content-Type": "application/xml; charset=utf-8",
58+
},
59+
})
60+
}

src/app/(main)/community/events/get-all-events.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,20 @@ const WORKING_GROUP_MEETINGS_FILE = join(
1717
export async function getAllEvents() {
1818
const workingGroupMeetings = await loadWorkingGroupMeetings()
1919

20-
let {
21-
pastEvents,
22-
upcomingEvents,
23-
}: { pastEvents: AnyEvent[]; upcomingEvents: AnyEvent[] } = events.reduce(
24-
(acc, event) => {
25-
const now = new Date()
26-
const date = new Date(event.date)
27-
if (date < now) {
28-
acc.pastEvents.push(event)
29-
} else {
30-
acc.upcomingEvents.push(event)
31-
}
32-
return acc
33-
},
34-
{ pastEvents: [], upcomingEvents: [] } as {
35-
pastEvents: Event[]
36-
upcomingEvents: Event[]
37-
},
38-
)
20+
let pastEvents: AnyEvent[] = []
21+
let upcomingEvents: AnyEvent[] = []
3922

4023
const now = new Date()
4124

25+
for (const event of events) {
26+
const date = new Date(event.date)
27+
if (date < now) {
28+
pastEvents.push(event)
29+
} else {
30+
upcomingEvents.push(event)
31+
}
32+
}
33+
4234
for (const meeting of workingGroupMeetings) {
4335
if (meeting.start && new Date(meeting.start) < now) {
4436
pastEvents.push(meeting)

src/app/(main)/community/events/page.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { BenefitsSection } from "./benefits-section"
99
import { GetYourMeetupNoticedSection } from "./get-your-meetup-noticed-section"
1010
import { BringGraphQLToYourCommunity } from "./bring-graphql-to-your-community"
1111
import { getAllEvents } from "./get-all-events"
12+
import { SubscribeToRssLink } from "./subscribe-to-rss-link"
1213

1314
const ISSUE_TEMPLATE_LINK =
1415
"https://github.com/graphql/community-wg/issues/new?assignees=&labels=event&template=event-submission.yml"
@@ -61,13 +62,18 @@ export default async function EventsPage() {
6162
</p>
6263
</div>
6364
<Button
64-
className="w-fit self-end lg:row-span-2"
65+
className="w-fit self-end max-md:hidden lg:row-span-2"
6566
href={ISSUE_TEMPLATE_LINK}
6667
>
6768
Add a new event
6869
</Button>
6970
</header>
70-
<EventsList events={upcomingEvents} />
71+
<EventsList events={upcomingEvents}>
72+
<SubscribeToRssLink />
73+
</EventsList>
74+
<Button className="md:hidden" href={ISSUE_TEMPLATE_LINK}>
75+
Add a new event
76+
</Button>
7177
</section>
7278
)}
7379

2.1 KB
Loading
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import rssImage from "./rss.png"
2+
3+
export function SubscribeToRssLink() {
4+
return (
5+
<a
6+
href="/community/events/feed.xml"
7+
className="-mx-4 -my-2 flex items-center px-4 py-2 transition-colors hover:bg-neu-100 hover:duration-0 max-md:mb-6"
8+
>
9+
<span>Subscribe to Events RSS</span>
10+
<img
11+
src={rssImage.src}
12+
alt="RSS Feed"
13+
className="ml-2"
14+
width={24}
15+
height={24}
16+
/>
17+
</a>
18+
)
19+
}

0 commit comments

Comments
 (0)