Skip to content

Commit f621124

Browse files
committed
Actually use the equality sets
1 parent 3646a5d commit f621124

File tree

3 files changed

+50
-29
lines changed

3 files changed

+50
-29
lines changed

scripts/sync-sched/sync.ts

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
getSchedule,
1111
getSpeakerDetails,
1212
getSpeakers,
13+
mergeSpeaker,
1314
RequestContext,
1415
} from "@/app/conf/_api/sched-client"
1516
import type { ConferenceYear, SchedSpeaker } from "@/app/conf/_api/sched-types"
@@ -491,27 +492,4 @@ function deepStrictEqualWithoutInternals(a: unknown, b: unknown): boolean {
491492
return true
492493
}
493494

494-
/**
495-
* Merges speaker data from API with existing local data,
496-
* preserving important local fields when API returns empty values.
497-
*/
498-
function mergeSpeaker(
499-
oldSpeaker: SchedSpeaker,
500-
newSpeaker: SchedSpeaker,
501-
): SchedSpeaker {
502-
return {
503-
...oldSpeaker,
504-
...newSpeaker,
505-
socialurls: newSpeaker.socialurls?.length
506-
? newSpeaker.socialurls
507-
: oldSpeaker.socialurls,
508-
["_years"]: [
509-
...new Set([
510-
...(oldSpeaker["_years"] || []),
511-
...(newSpeaker["_years"] || []),
512-
]),
513-
].sort(),
514-
}
515-
}
516-
517495
// #endregion utility

src/app/conf/_api/sched-client.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,26 @@ function shapeSpeaker(user: SchedSpeaker): SchedSpeaker {
213213

214214
return res
215215
}
216+
217+
/**
218+
* Merges speaker data from API with existing local data,
219+
* preserving important local fields when API returns empty values.
220+
*/
221+
export function mergeSpeaker(
222+
oldSpeaker: SchedSpeaker,
223+
newSpeaker: SchedSpeaker,
224+
): SchedSpeaker {
225+
return {
226+
...oldSpeaker,
227+
...newSpeaker,
228+
socialurls: newSpeaker.socialurls?.length
229+
? newSpeaker.socialurls
230+
: oldSpeaker.socialurls,
231+
["_years"]: [
232+
...new Set([
233+
...(oldSpeaker["_years"] || []),
234+
...(newSpeaker["_years"] || []),
235+
]),
236+
].sort(),
237+
}
238+
}

src/app/conf/_api/sched-data.tsx

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
import { ConferenceYear, SchedSpeaker } from "./sched-types"
2+
import { mergeSpeaker } from "./sched-client"
23

3-
const allSpeakers: SchedSpeaker[] = require("../../../../scripts/sync-sched/speakers.json")
4+
const speakersData = require("../../../../scripts/sync-sched/speakers.json")
5+
const allSpeakers: SchedSpeaker[] = speakersData.speakers
6+
const equalitySets: string[][] = speakersData.equal || []
47

58
export function readSpeakers(year: ConferenceYear): SchedSpeaker[] {
9+
const speakersThisYear = allSpeakers.filter(speaker =>
10+
speaker._years.includes(year),
11+
)
12+
13+
const speakersWithDuplicates = new Set(equalitySets.flat())
14+
15+
const res = speakersThisYear.map(speaker => {
16+
if (speakersWithDuplicates.has(speaker.username)) {
17+
return (
18+
equalitySets
19+
.find(set => set.includes(speaker.username))! // we will definitely find, because we checked .has above
20+
.map(username => allSpeakers.find(s => s.username === username))
21+
.filter(x => !!x)
22+
// we prefer the data from the most recent years
23+
.sort((a, b) => Math.max(...a._years) - Math.max(...b._years))
24+
.reduce(mergeSpeaker)
25+
)
26+
}
27+
return speaker
28+
})
29+
630
return (
7-
allSpeakers
8-
.filter(speaker => speaker._years.includes(year))
31+
res
932
.sort((a, b) => a.name.localeCompare(b.name))
1033
// show speakers without avatars last
1134
.sort((a, b) => {
@@ -15,6 +38,3 @@ export function readSpeakers(year: ConferenceYear): SchedSpeaker[] {
1538
})
1639
)
1740
}
18-
19-
// TODO: We need to be able to say that a speaker is returning even if they don't share username, only first name and last name.
20-
// But this needs to be done without adding to `_years` so we don't show duplicates.

0 commit comments

Comments
 (0)