Skip to content

Commit d77e83f

Browse files
committed
perf(calendar): move day-grouping server-side via group=day
Drops the client-side `coalesceEpisodes` from the calendar feeds and asks the worker to collapse same-show-same-day episodes with `?group=day`. The shows, media and hot-releases queries now pass `group=day`; their mappers render the server's grouped cards directly (`mapToUpcomingEpisodeEntry` carries the nested `episodes` for `multiple_episodes` cards). Bumps @trakt/api to 0.4.25. `coalesceEpisodes` stays (still used by `coalesceBinges`). `mapToPostCredits` takes a structural param so it accepts the widened calendar episode.
1 parent 7d60547 commit d77e83f

7 files changed

Lines changed: 24 additions & 23 deletions

File tree

deno.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

projects/client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
"@tanstack/query-core": "5.101.2",
8282
"@tanstack/query-devtools": "5.101.2",
8383
"@tanstack/query-persist-client-core": "5.101.2",
84-
"@trakt/api": "npm:@jsr/trakt__api@0.4.23",
84+
"@trakt/api": "npm:@jsr/trakt__api@0.4.25",
8585
"@ts-rest/core": "3.52.1",
8686
"@use-gesture/vanilla": "10.3.1",
8787
"bits-ui": "2.18.1",

projects/client/src/lib/requests/_internal/mapToPostCredits.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import type { EpisodeResponse, MovieResponse } from '@trakt/api';
21
import type { PostCredits } from '../models/PostCreditsSchema.ts';
32

43
export function mapToPostCredits(
5-
response: EpisodeResponse | MovieResponse | Nil,
4+
response:
5+
| { during_credits?: boolean | null; after_credits?: boolean | null }
6+
| Nil,
67
): PostCredits[] {
78
const postCredits: PostCredits[] = [];
89

projects/client/src/lib/requests/_internal/mapToUpcomingEpisodeEntry.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@ export function mapToUpcomingEpisodeEntry(
99
return {
1010
show: mapToShowEntry(item.show),
1111
...mapToEpisodeEntry(item.episode),
12+
// `group=day` collapses multi-episode days into one card; the server sends
13+
// the grouped episodes on `episode.episodes` (absent for single entries).
14+
...(item.episode.episodes
15+
? { episodes: item.episode.episodes.map(mapToEpisodeEntry) }
16+
: {}),
1217
};
1318
}

projects/client/src/lib/requests/queries/calendars/releasesCalendarQuery.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { DiscoverMode } from '$lib/features/filters/models/DiscoverMode.ts';
22
import { defineQuery } from '$lib/features/query/defineQuery.ts';
3-
import { coalesceEpisodes } from '$lib/requests/_internal/coalesceEpisodes.ts';
43
import { getGlobalFilterDependencies } from '$lib/requests/_internal/getGlobalFilterDependencies.ts';
54
import { mapToMovieEntry } from '$lib/requests/_internal/mapToMovieEntry.ts';
65
import { mapToUpcomingEpisodeEntry } from '$lib/requests/_internal/mapToUpcomingEpisodeEntry.ts';
@@ -53,6 +52,7 @@ const releasesCalendarRequest = (
5352
.releasesHot({
5453
query: {
5554
extended: 'full,images',
55+
group: 'day',
5656
...filter,
5757
...(type === 'media' ? {} : { type }),
5858
},
@@ -87,11 +87,9 @@ export const releasesCalendarQuery = defineQuery({
8787
.filter(isCalendarMovie)
8888
.map((entry) => mapToMovieEntry(entry.movie));
8989

90-
const episodes = coalesceEpisodes(
91-
response.body
92-
.filter(isCalendarShow)
93-
.map(mapToUpcomingEpisodeEntry),
94-
);
90+
const episodes = response.body
91+
.filter(isCalendarShow)
92+
.map(mapToUpcomingEpisodeEntry);
9593

9694
return [...episodes, ...movies]
9795
.toSorted((a, b) =>

projects/client/src/lib/requests/queries/calendars/upcomingEpisodesQuery.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { defineQuery } from '$lib/features/query/defineQuery.ts';
2-
import { coalesceEpisodes } from '$lib/requests/_internal/coalesceEpisodes.ts';
32
import { mapToUpcomingEpisodeEntry } from '$lib/requests/_internal/mapToUpcomingEpisodeEntry.ts';
43
import { api, type ApiParams } from '$lib/requests/api.ts';
54
import { InvalidateAction } from '$lib/requests/models/InvalidateAction.ts';
@@ -35,6 +34,7 @@ export const upcomingEpisodesRequest = (
3534
.shows({
3635
query: {
3736
extended: 'full,images',
37+
group: 'day',
3838
...filterParams,
3939
},
4040
params: {
@@ -64,8 +64,7 @@ export const upcomingEpisodesQuery = defineQuery({
6464
),
6565
],
6666
request: upcomingEpisodesRequest,
67-
mapper: (response) =>
68-
coalesceEpisodes(response.body.map(mapToUpcomingEpisodeEntry)),
67+
mapper: (response) => response.body.map(mapToUpcomingEpisodeEntry),
6968
schema: UpcomingEpisodeEntrySchema.array(),
7069
ttl: time.minutes(30),
7170
refetchOnWindowFocus: true,

projects/client/src/lib/requests/queries/calendars/upcomingMediaQuery.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { defineQuery } from '$lib/features/query/defineQuery.ts';
2-
import { coalesceEpisodes } from '$lib/requests/_internal/coalesceEpisodes.ts';
32
import { mapToUpcomingEpisodeEntry } from '$lib/requests/_internal/mapToUpcomingEpisodeEntry.ts';
43
import { api, type ApiParams } from '$lib/requests/api.ts';
54
import { InvalidateAction } from '$lib/requests/models/InvalidateAction.ts';
@@ -66,6 +65,7 @@ export const upcomingMediaQuery = defineQuery({
6665
.media({
6766
query: {
6867
extended: 'full,images',
68+
group: 'day',
6969
...filter,
7070
},
7171
params: {
@@ -75,11 +75,9 @@ export const upcomingMediaQuery = defineQuery({
7575
},
7676
}),
7777
mapper: (response) => {
78-
const episodes = coalesceEpisodes(
79-
response.body
80-
.filter(isCalendarShow)
81-
.map(mapToUpcomingEpisodeEntry),
82-
);
78+
const episodes = response.body
79+
.filter(isCalendarShow)
80+
.map(mapToUpcomingEpisodeEntry);
8381

8482
const movies = response.body
8583
.filter(isCalendarMovie)

0 commit comments

Comments
 (0)