Files
homarr/packages/widgets/src/prefetch.ts
T

54 lines
1.7 KiB
TypeScript

import type { QueryClient } from "@tanstack/react-query";
import { getRscServerSettingsAsync } from "@homarr/api/server-settings-server";
import type { WidgetKind } from "@homarr/definitions";
import { createSettings } from "@homarr/settings/creator";
import { loadWidgetDefinition, reduceWidgetOptionsWithDefinition } from "./manifest";
import type { PrefetchLoader } from "./definition";
const definePrefetchLoaders = <TLoaders extends Partial<Record<WidgetKind, PrefetchLoader>>>(loaders: TLoaders) =>
loaders;
// Keep these imports explicit so Next.js can trace each optional prefetch
// module without loading its database-specific implementation eagerly.
const prefetchLoaders = definePrefetchLoaders({
app: () => import("./app/prefetch"),
bookmarks: () => import("./bookmarks/prefetch"),
});
type PrefetchWidgetKind = keyof typeof prefetchLoaders;
const hasPrefetchLoader = (kind: WidgetKind): kind is PrefetchWidgetKind =>
Object.prototype.hasOwnProperty.call(prefetchLoaders, kind);
export const prefetchForKindAsync = async (
kind: WidgetKind,
queryClient: QueryClient,
items: {
options: Record<string, unknown>;
integrationIds: string[];
}[],
) => {
if (!hasPrefetchLoader(kind)) {
return;
}
const [{ default: callback }, serverSettings, definition] = await Promise.all([
prefetchLoaders[kind](),
getRscServerSettingsAsync(),
loadWidgetDefinition(kind),
]);
const itemsWithDefaultOptions = items.map((item) => ({
...item,
options: reduceWidgetOptionsWithDefinition(
definition,
createSettings({ user: null, serverSettings }),
item.options,
),
}));
await callback(queryClient, itemsWithDefaultOptions);
};