mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-10-16 05:25:42 -04:00
refactor(api): share tracking-dependent query key lists between web and native
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
4 files changed
+47
-19
No files matched your search
@@ -4,20 +4,23 @@ import { client, orpc } from "@/lib/orpc";
|
||||
import { queryClient } from "@/lib/query-client";
|
||||
import { toast } from "@/lib/toast";
|
||||
import { refreshWidgets } from "@/lib/widgets";
|
||||
import { trackingDerivedQueryKeys, trackingStateQueryKeys } from "@sofa/api/query-keys";
|
||||
import { i18n } from "@sofa/i18n";
|
||||
|
||||
let widgetRefreshTimer: ReturnType<typeof setTimeout> | null = null;
|
||||
|
||||
/**
|
||||
* Mark every query that depends on the user's tracking state as stale. Title details
|
||||
* (`titles.get`) are excluded — they don't depend on tracking (same rule as the web's
|
||||
* invalidateTrackingQueries). Resolves once tracking and library queries have refetched,
|
||||
* so mutations can stay pending until the UI reflects the change.
|
||||
* Mark every query that depends on the user's tracking state as stale — the shared
|
||||
* `trackingStateQueryKeys` and `trackingDerivedQueryKeys` lists from `@sofa/api/query-keys`.
|
||||
* Title details (`titles.get`) are excluded — they don't depend on tracking (same rule as the
|
||||
* web's invalidateTrackingQueries). Derived queries are fire-and-forget; resolves once the
|
||||
* tracking-state queries (tracking + library) have refetched, so mutations can stay pending
|
||||
* until the UI reflects the change.
|
||||
*/
|
||||
export function invalidateTitleQueries(): Promise<unknown> {
|
||||
void queryClient.invalidateQueries({ queryKey: orpc.discover.key() });
|
||||
void queryClient.invalidateQueries({ queryKey: orpc.people.key() });
|
||||
void queryClient.invalidateQueries({ queryKey: orpc.titles.similar.key() });
|
||||
for (const queryKey of trackingDerivedQueryKeys(orpc)) {
|
||||
void queryClient.invalidateQueries({ queryKey });
|
||||
}
|
||||
|
||||
// Debounce widget refresh to batch rapid mutations (e.g. watching multiple episodes)
|
||||
if (widgetRefreshTimer) clearTimeout(widgetRefreshTimer);
|
||||
@@ -26,10 +29,9 @@ export function invalidateTitleQueries(): Promise<unknown> {
|
||||
widgetRefreshTimer = null;
|
||||
}, 2000);
|
||||
|
||||
return Promise.all([
|
||||
queryClient.invalidateQueries({ queryKey: orpc.tracking.key() }),
|
||||
queryClient.invalidateQueries({ queryKey: orpc.library.key() }),
|
||||
]);
|
||||
return Promise.all(
|
||||
trackingStateQueryKeys(orpc).map((queryKey) => queryClient.invalidateQueries({ queryKey })),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user