|
3 | 3 | import { useState, type ComponentPropsWithoutRef } from "react" |
4 | 4 | import { clsx } from "clsx" |
5 | 5 |
|
| 6 | +import type { WorkingGroupMeeting } from "@/../scripts/sync-working-groups/sync-working-groups" |
| 7 | + |
6 | 8 | import { EventCard } from "./event-card" |
7 | 9 | import { EventsScrollview } from "./events-scrollview" |
8 | 10 | import type { Event, Meetup } from "./events" |
9 | 11 | import { EventFilterTag, EventKind } from "./event-filter-tag" |
10 | | -import { WorkingGroupMeeting } from "../../../../../scripts/sync-working-groups/sync-working-groups" |
11 | 12 |
|
12 | 13 | interface FilterChipProps extends ComponentPropsWithoutRef<"button"> { |
13 | 14 | active?: boolean |
@@ -71,75 +72,88 @@ export function EventsList({ |
71 | 72 | }) { |
72 | 73 | const [kindFilters, setKindFilters] = useState(ALL_SHOWN) |
73 | 74 |
|
74 | | - if (events.length === 0) return null |
75 | | - |
76 | 75 | const tags: Set<EventKind> = new Set() |
77 | 76 | events.forEach(event => { |
78 | 77 | if ("start" in event) tags.add("working-group") |
79 | 78 | if ("node" in event) tags.add("meetup") |
80 | 79 | else tags.add("conference") |
81 | 80 | }) |
82 | 81 |
|
| 82 | + events = events.filter(event => { |
| 83 | + if ("node" in event) { |
| 84 | + return kindFilters.meetup |
| 85 | + } |
| 86 | + if ("start" in event) { |
| 87 | + return kindFilters["working-group"] |
| 88 | + } |
| 89 | + if ("slug" in event) { |
| 90 | + return kindFilters.conference |
| 91 | + } |
| 92 | + }) |
| 93 | + |
| 94 | + // we filter out all working groups further in the future than 30 days |
| 95 | + const FUTURE_DAYS_TO_SHOW = 30 |
| 96 | + const DAY_IN_MS = 24 * 60 * 60 * 1000 |
| 97 | + const thirtyDaysFromNow = Date.now() + FUTURE_DAYS_TO_SHOW * DAY_IN_MS |
| 98 | + events = events.filter(event => { |
| 99 | + if ("start" in event) { |
| 100 | + return new Date(event.start).getTime() <= thirtyDaysFromNow |
| 101 | + } |
| 102 | + return true |
| 103 | + }) |
| 104 | + |
83 | 105 | return ( |
84 | 106 | <div className={className}> |
85 | | - {tags.size > 1 && events.length > 4 ? ( |
86 | | - <fieldset className="mb-8"> |
87 | | - <legend className="typography-menu mt-2">Event type</legend> |
88 | | - <div className="mt-4 flex gap-3"> |
89 | | - {Array.from(tags).map(tag => ( |
90 | | - <EventFilterTag |
91 | | - key={tag} |
92 | | - kind={tag} |
93 | | - checked={kindFilters[tag]} |
94 | | - onChange={event => { |
95 | | - setKindFilters(prev => ({ |
96 | | - ...prev, |
97 | | - [tag]: event.target.checked, |
98 | | - })) |
99 | | - }} |
100 | | - /> |
101 | | - ))} |
102 | | - </div> |
103 | | - </fieldset> |
104 | | - ) : null} |
| 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 | + onChange={event => { |
| 116 | + setKindFilters(prev => ({ |
| 117 | + ...prev, |
| 118 | + [tag]: event.target.checked, |
| 119 | + })) |
| 120 | + }} |
| 121 | + /> |
| 122 | + ))} |
| 123 | + </div> |
| 124 | + </fieldset> |
105 | 125 | <EventsScrollview> |
106 | | - {events |
107 | | - .filter(event => { |
108 | | - if ("node" in event) return kindFilters["meetup"] |
109 | | - else return kindFilters["conference"] |
110 | | - }) |
111 | | - .map(event => |
112 | | - "node" in event ? ( |
113 | | - <EventCard |
114 | | - key={event.node.id} |
115 | | - name={event.node.name} |
116 | | - href={event.node.link} |
117 | | - city={event.node.city + ", " + event.node.country} |
118 | | - official={event.node.official} |
119 | | - date={event.node.next || event.node.prev} |
120 | | - kind="meetup" |
121 | | - /> |
122 | | - ) : "start" in event ? ( |
123 | | - <EventCard |
124 | | - key={event.id} |
125 | | - href={event.htmlLink} |
126 | | - date={new Date(event.start)} |
127 | | - name={event.summary ?? "Working Group"} |
128 | | - city="Online" // event.location is a zoom link, we could potentially use but we'd have to refactor the event-card to avoid nested anchors |
129 | | - kind="working-group" |
130 | | - /> |
131 | | - ) : ( |
132 | | - <EventCard |
133 | | - key={event.slug} |
134 | | - href={event.eventLink} |
135 | | - date={new Date(event.date)} |
136 | | - meta={event.host} |
137 | | - name={event.name} |
138 | | - city={event.location} |
139 | | - kind="conference" |
140 | | - /> |
141 | | - ), |
142 | | - )} |
| 126 | + {events.map(event => |
| 127 | + "node" in event ? ( |
| 128 | + <EventCard |
| 129 | + key={event.node.id} |
| 130 | + name={event.node.name} |
| 131 | + href={event.node.link} |
| 132 | + city={event.node.city + ", " + event.node.country} |
| 133 | + date={event.node.next || event.node.prev} |
| 134 | + kind="meetup" |
| 135 | + /> |
| 136 | + ) : "start" in event ? ( |
| 137 | + <EventCard |
| 138 | + key={event.id} |
| 139 | + href={event.htmlLink} |
| 140 | + date={new Date(event.start)} |
| 141 | + name={event.summary ?? "Working Group"} |
| 142 | + city="Online" // event.location is a zoom link, we could potentially use but we'd have to refactor the event-card to avoid nested anchors |
| 143 | + kind="working-group" |
| 144 | + /> |
| 145 | + ) : ( |
| 146 | + <EventCard |
| 147 | + key={event.slug} |
| 148 | + href={event.eventLink} |
| 149 | + date={new Date(event.date)} |
| 150 | + meta={event.host} |
| 151 | + name={event.name} |
| 152 | + city={event.location} |
| 153 | + kind="conference" |
| 154 | + /> |
| 155 | + ), |
| 156 | + )} |
143 | 157 | </EventsScrollview> |
144 | 158 | </div> |
145 | 159 | ) |
|
0 commit comments