@@ -15,11 +15,15 @@ import Footer from "../components/Footer";
15import Header from "../components/Header";
15import Header from "../components/Header";
16import EventPreview from "../components/EventPreview";
16import EventPreview from "../components/EventPreview";
17import { getAllEvents, pair } from "../lib/lib";
17import { getAllEvents, pair } from "../lib/lib";
18+import { useRouter } from "next/router";
19import { eventKeys } from "../lib/constants";
20import { eventKeys } from "../lib/constants";
21export default function Events({ events, search }) {
22export default function Events({ events, search }) {
22 const [selected, setSelected] = useState("All");
23 const [selected, setSelected] = useState("All");
24+ const router = useRouter();
25+ const { tag } = router.query;
23 const post = {
27 const post = {
24 title: "Events",
28 title: "Events",
25 description: "In-person, remote, and recorded events about Urbit.",
29 description: "In-person, remote, and recorded events about Urbit.",
@@ -27,6 +31,13 @@ export default function Events({ events, search }) {
28 const now = DateTime.now();
32 const now = DateTime.now();
34+ const tagFilter = (event) => {
36+ return event?.tags?.includes(tag)
30 const selectionFilter = (event) => {
41 const selectionFilter = (event) => {
31 if (selected === "All") {
42 if (selected === "All") {
32 return true;
43 return true;
@@ -38,7 +49,7 @@ export default function Events({ events, search }) {
40 const pastEvents = pair(
51 const pastEvents = pair(
41− events.filter(selectionFilter).filter((event) => {
52+ events.filter(selectionFilter).filter(tagFilter).filter((event) => {
42 const ends = generateRealtimeDate(event.ends);
53 const ends = generateRealtimeDate(event.ends);
43 return ends < now;
54 return ends < now;
@@ -47,6 +58,7 @@ export default function Events({ events, search }) {
47 const futureEvents = pair(
58 const futureEvents = pair(
49 .filter(selectionFilter)
60 .filter(selectionFilter)
50 .filter((event) => {
62 .filter((event) => {
51 const starts = generateRealtimeDate(event.starts);
63 const starts = generateRealtimeDate(event.starts);
52 return starts > now;
64 return starts > now;
@@ -64,7 +76,7 @@ export default function Events({ events, search }) {
66 const happeningNow = pair(
78 const happeningNow = pair(
67− events.filter(selectionFilter).filter((event) => {
79+ events.filter(selectionFilter).filter(tagFilter).filter((event) => {
68 const starts = generateRealtimeDate(event.starts);
80 const starts = generateRealtimeDate(event.starts);
69 const ends = generateRealtimeDate(event.ends);
81 const ends = generateRealtimeDate(event.ends);
70 return starts < DateTime.now() && ends > now;
82 return starts < DateTime.now() && ends > now;
@@ -96,7 +108,9 @@ export default function Events({ events, search }) {
96 <Header search={search} />
108 <Header search={search} />
97 <Section>
109 <Section>
98 <div className="measure">
110 <div className="measure">
112+ ? <h1 className="pb-16">{events.filter(tagFilter).length} events tagged "{tag}"</h1>
99− <h1 className="pb-16">Events</h1>
113+ : <h1 className="pb-16">Events</h1>}
100 <div className="flex space-x-2">
114 <div className="flex space-x-2">
101 <SelectedButton selection="All" text="All Events" />
115 <SelectedButton selection="All" text="All Events" />
102 <SelectedButton selection="In-person" text="In-person" />
116 <SelectedButton selection="In-person" text="In-person" />