Z ZPI 文档 v0.3.8
介绍页

源码

packages/desktop/src/renderer/DiffsWorkerPool.tsx

tsx44 行查看原文
// ZCode DiffsWorkerPoolProvider defaults (Apache-2.0).
import { useWorkerPool, WorkerPoolContextProvider } from "@pierre/diffs/react";
import { defaultCodePreview } from "@zpi-dev/ui/code-preview";
import { type ReactNode, useEffect, useMemo } from "react";
import { report, useStore } from "./store.ts";

const poolOptions = {
  workerFactory: () =>
    new Worker(new URL("./diffs.worker.ts", import.meta.url), { type: "module", name: "zpi-diffs-worker" }),
  poolSize: Math.max(1, Math.min(4, Math.floor((navigator.hardwareConcurrency || 4) / 2))),
};
const highlighterOptions = {
  theme: { light: "github-light", dark: "github-dark" },
  lineDiffType: "word-alt" as const,
  maxLineDiffLength: 1_000,
  tokenizeMaxLineLength: 1_000,
  useTokenTransformer: false,
  preferredHighlighter: "shiki-wasm" as const,
};
function WorkerOptionsSync({ options }: { options: typeof highlighterOptions }) {
  const pool = useWorkerPool();
  useEffect(() => {
    void pool?.setRenderOptions(options).catch(report);
  }, [pool, options]);
  return null;
}
export function DiffsWorkerPool({ children }: { children: ReactNode }) {
  const settings = useStore((state) => state.settings?.interface.codePreview ?? defaultCodePreview);
  const options = useMemo(
    () => ({
      ...highlighterOptions,
      theme: { light: settings.lightTheme, dark: settings.darkTheme },
    }),
    [settings.lightTheme, settings.darkTheme],
  );
  if (typeof Worker === "undefined") return children;
  return (
    <WorkerPoolContextProvider poolOptions={poolOptions} highlighterOptions={options}>
      <WorkerOptionsSync options={options} />
      {children}
    </WorkerPoolContextProvider>
  );
}