From 929c47f79387421b0e19567dc54375bb6adb4130 Mon Sep 17 00:00:00 2001 From: Piotr Monwid-Olechnowicz Date: Tue, 18 Nov 2025 19:30:23 +0100 Subject: [PATCH 1/3] Add RSS route --- .../community/events/feed.xml/route.tsx | 60 +++++++++++++++++++ .../(main)/community/events/get-all-events.ts | 30 ++++------ 2 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 src/app/(main)/community/events/feed.xml/route.tsx diff --git a/src/app/(main)/community/events/feed.xml/route.tsx b/src/app/(main)/community/events/feed.xml/route.tsx new file mode 100644 index 0000000000..dd0750cc93 --- /dev/null +++ b/src/app/(main)/community/events/feed.xml/route.tsx @@ -0,0 +1,60 @@ +import RSS from "rss" + +import { getAllEvents } from "../get-all-events" + +export const dynamic = "force-static" +export const config = { runtime: "edge" } + +export async function GET() { + const { upcomingEvents, pastEvents } = await getAllEvents() + + const allEvents = [...upcomingEvents, ...pastEvents] + + const feed = new RSS({ + title: "GraphQL Community Events & Meetups", + description: + "Stay updated with the latest GraphQL community events and meetups.", + feed_url: "https://the-guild.dev/graphql/community/events/feed.xml", + site_url: "https://the-guild.dev/graphql/community/events", + }) + + for (const event of allEvents) { + if ("node" in event) { + let date: Date + if (event.node.next && new Date(event.node.next) > new Date()) { + date = new Date(event.node.next) + } else { + date = new Date(event.node.prev) + } + + feed.item({ + title: event.node.name, + date, + url: event.node.link, + description: "", + lat: event.node.latitude, + long: event.node.longitude, + }) + } else if ("start" in event) { + feed.item({ + title: event.summary || "GraphQL Working Group", + date: event.start, + url: event.htmlLink, + description: event.description || "", + }) + } else { + feed.item({ + title: event.name, + date: event.date, + url: event.eventLink, + description: `Host: ${event.host} | Location: ${event.location}`, + }) + } + } + + return new Response(feed.xml({ indent: true }), { + headers: { + "Content-Type": "application/xml; charset=utf-8", + }, + }) +} diff --git a/src/app/(main)/community/events/get-all-events.ts b/src/app/(main)/community/events/get-all-events.ts index 3c251cf956..6cf96757e5 100644 --- a/src/app/(main)/community/events/get-all-events.ts +++ b/src/app/(main)/community/events/get-all-events.ts @@ -17,28 +17,20 @@ const WORKING_GROUP_MEETINGS_FILE = join( export async function getAllEvents() { const workingGroupMeetings = await loadWorkingGroupMeetings() - let { - pastEvents, - upcomingEvents, - }: { pastEvents: AnyEvent[]; upcomingEvents: AnyEvent[] } = events.reduce( - (acc, event) => { - const now = new Date() - const date = new Date(event.date) - if (date < now) { - acc.pastEvents.push(event) - } else { - acc.upcomingEvents.push(event) - } - return acc - }, - { pastEvents: [], upcomingEvents: [] } as { - pastEvents: Event[] - upcomingEvents: Event[] - }, - ) + let pastEvents: AnyEvent[] = [] + let upcomingEvents: AnyEvent[] = [] const now = new Date() + for (const event of events) { + const date = new Date(event.date) + if (date < now) { + pastEvents.push(event) + } else { + upcomingEvents.push(event) + } + } + for (const meeting of workingGroupMeetings) { if (meeting.start && new Date(meeting.start) < now) { pastEvents.push(meeting) From 789964c1b0bbe9714d619905e2a01eb83b0adbe7 Mon Sep 17 00:00:00 2001 From: Piotr Monwid-Olechnowicz Date: Tue, 18 Nov 2025 19:58:38 +0100 Subject: [PATCH 2/3] Add RSS link --- .../(main)/community/events/events-list.tsx | 49 ++++++++++-------- src/app/(main)/community/events/page.tsx | 5 +- src/app/(main)/community/events/rss.png | Bin 0 -> 2155 bytes .../events/subscribe-to-rss-link.tsx | 16 ++++++ 4 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 src/app/(main)/community/events/rss.png create mode 100644 src/app/(main)/community/events/subscribe-to-rss-link.tsx diff --git a/src/app/(main)/community/events/events-list.tsx b/src/app/(main)/community/events/events-list.tsx index 2e4fd66077..621ce03152 100644 --- a/src/app/(main)/community/events/events-list.tsx +++ b/src/app/(main)/community/events/events-list.tsx @@ -66,9 +66,11 @@ const ALL_SHOWN = { export function EventsList({ events, className, + children, }: { events: AnyEvent[] className?: string + children?: React.ReactNode }) { const [kindFilters, setKindFilters] = useState(ALL_SHOWN) @@ -104,28 +106,31 @@ export function EventsList({ return (
-
- Event type -
- {Array.from(tags).map(tag => ( - { - setKindFilters(prev => ({ - ...prev, - [tag]: event.target.checked, - })) - }} - /> - ))} -
-
+
+
+ Event type +
+ {Array.from(tags).map(tag => ( + { + setKindFilters(prev => ({ + ...prev, + [tag]: event.target.checked, + })) + }} + /> + ))} +
+
+ {children} +
{events.map(event => "node" in event ? ( diff --git a/src/app/(main)/community/events/page.tsx b/src/app/(main)/community/events/page.tsx index 90e835920b..b9cc4e130d 100644 --- a/src/app/(main)/community/events/page.tsx +++ b/src/app/(main)/community/events/page.tsx @@ -9,6 +9,7 @@ import { BenefitsSection } from "./benefits-section" import { GetYourMeetupNoticedSection } from "./get-your-meetup-noticed-section" import { BringGraphQLToYourCommunity } from "./bring-graphql-to-your-community" import { getAllEvents } from "./get-all-events" +import { SubscribeToRssLink } from "./subscribe-to-rss-link" const ISSUE_TEMPLATE_LINK = "https://github.com/graphql/community-wg/issues/new?assignees=&labels=event&template=event-submission.yml" @@ -67,7 +68,9 @@ export default async function EventsPage() { Add a new event - + + + )} diff --git a/src/app/(main)/community/events/rss.png b/src/app/(main)/community/events/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..731283e7ec60e41568c2fc2e33c5941d63249be5 GIT binary patch literal 2155 zcmV-x2$c7UP)NYmUR28Wb?KUx3 z+fAz4324i9ihFK#jknSIrpV;zDYTcv9a_^iT z))l9ZcH}4FU6)2|wEUr-VThU7YlRh;IlH>U(we!VJQuEOPlv7VwneUpxbq9Xyw8fiVl^HKHL^rr&Dm`>Ye@maM2!3|s!YP$$cpZX#E8xJGAONH;de<824W7FabM{*XCX_y+9lmw{ zM%%BBK^@NnavtYGECKKc&W&~iWDDfnDqYJ(}_K|g$loT~f zT&}brVPstpLW`r}x^Y$lQVh1zlhR1scOBvzE`ypL)r*}W4U_U5L}+^)>R6`qcLQRb z#10PxUl-MD548_jO2R0$72_ofPvv-0SnyF>#ZnmgK?Ldj8==#%QJ96TZv+J%4~^}uNR&#ZARPHcZuU)hpl@lSut9byn3_eEFij?=~Qgy3Em6_ zfBr0acN8;`8RkGKd<5S-c<=Z-A`hk^1ulV-I918>WO=Ep6T{!}QeGrDeHmyV(wrq| zx@HwQy?$0|EQxii6Bx+}-(63@zu`$JgYQ*_3-P_wJr5(_3zH|Z#-5;jYWdbKsL5R2 zh3@Q>#mPl&7km`q-%~ym9F>Z4Pt5Pc$nC9@2|U#kOdktwex4|~zEHAeA*UPlJx$OR z4?gfFQEP8y|3jV-=Y@%8dnP?JCGlxY3||WS{6%#&f0l)eyIjrE!fr35&K@`x-wem1 zuT#evu&%nCO$bcl{%fI*9;={9EuVw?#*J`Y_oM3j={_|#j@Y^ofeE5v09Am98hN5h zk&EHG{SOq|SA9@f%|OI|I-d@5pPN^-3u^lUoX_E}(`RXRUO4pLcX;kH>7a=6JeGT&9i^e=pb6W5G z7ZhHx%akmhc!@}2y!u#%yx>@J3wbD6YxQXWpdzE?^VB(}AccD&g?i|WC|T-tPPGIBx-BOc@ECHyQ zH1#@vMANdqs%x&#-A%wKPK#y5ima~;y$1Qc{_2H!a{9Zd$#YkLQqvO@Mq`HS^P0nT zm@xpTPHL%dro{~^BPrzi?A_2NDmVOsKY;OvSD6$!4X$ffRe%#(JSe{Q7>rtSspE2J znJi`ofD+5O^z*1C_A5SKxj0YGfqu%Hl;M2G)whz>&s<}6C-R5>1|!Pk8!BeA!%8eX zKuU==)D)q5j@ar&zW<*FhrW!eIBhwz+43P2-#Q4>$9vmgxxDEW3W5Bg{ir2{V^3qM z^_bm(-1GZP*u@3G-c&KBB!*zBV6YQbV!b1ywj^wr#^q?@DOKzlfWaJM1m8_PcmN#O$5ob05+5c{XM(uHhP=V5l zmDI>QE@U42b@lnFWT#W^S70S|bff&BR4)By1{;#9=}hls4BIiD_-wj!C72!4^I?fz z9;fJS@iboYX=U|b8ki|=*>qT}-nnI>Xe=chiONrE`kVZ@C0ysjL&XEapN?eK`ux(Y z{MQ02@siFvUPymm*nKDyeKlI#ZI_sWIU)`ll(%E@?tk=W2X)IY+&bJB&1rjE0uq#2 z98MblXAjcxtqE<<#ScVzhxtKzb0FIF7dCaSU+&)dk&v{U($zC-UTrg7`P9*2`M@3u h`Mob>h9|G6?*nGTHpStk+kyZ9002ovPDHLkV1j0$1RVeX literal 0 HcmV?d00001 diff --git a/src/app/(main)/community/events/subscribe-to-rss-link.tsx b/src/app/(main)/community/events/subscribe-to-rss-link.tsx new file mode 100644 index 0000000000..9675c2af1a --- /dev/null +++ b/src/app/(main)/community/events/subscribe-to-rss-link.tsx @@ -0,0 +1,16 @@ +import rssImage from "./rss.png" + +export function SubscribeToRssLink() { + return ( + + Subscribe to Events RSS + RSS Feed + + ) +} From 8e9d4b24de0dd2ed2aa62359d769349a5cf40cf5 Mon Sep 17 00:00:00 2001 From: Piotr Monwid-Olechnowicz Date: Tue, 18 Nov 2025 20:21:59 +0100 Subject: [PATCH 3/3] Improve mobile layout --- src/app/(main)/community/events/events-list.tsx | 2 +- src/app/(main)/community/events/page.tsx | 5 ++++- src/app/(main)/community/events/subscribe-to-rss-link.tsx | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/(main)/community/events/events-list.tsx b/src/app/(main)/community/events/events-list.tsx index 621ce03152..824b251344 100644 --- a/src/app/(main)/community/events/events-list.tsx +++ b/src/app/(main)/community/events/events-list.tsx @@ -106,7 +106,7 @@ export function EventsList({ return (
-
+
Event type
diff --git a/src/app/(main)/community/events/page.tsx b/src/app/(main)/community/events/page.tsx index b9cc4e130d..376f5b648c 100644 --- a/src/app/(main)/community/events/page.tsx +++ b/src/app/(main)/community/events/page.tsx @@ -62,7 +62,7 @@ export default async function EventsPage() {

)} diff --git a/src/app/(main)/community/events/subscribe-to-rss-link.tsx b/src/app/(main)/community/events/subscribe-to-rss-link.tsx index 9675c2af1a..ed8ce1ddba 100644 --- a/src/app/(main)/community/events/subscribe-to-rss-link.tsx +++ b/src/app/(main)/community/events/subscribe-to-rss-link.tsx @@ -2,7 +2,10 @@ import rssImage from "./rss.png" export function SubscribeToRssLink() { return ( - + Subscribe to Events RSS