mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-09-04 10:11:46 +03:00
58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
import {
|
|
createContext,
|
|
useCallback,
|
|
useContext,
|
|
useMemo,
|
|
useRef,
|
|
type ReactNode,
|
|
} from "react";
|
|
|
|
import type { NanobotClient } from "@/lib/nanobot-client";
|
|
import type { WebUIIngressLimits } from "@/lib/types";
|
|
|
|
interface ClientContextValue {
|
|
client: NanobotClient;
|
|
token: string;
|
|
getToken: () => string;
|
|
modelName: string | null;
|
|
ingressLimits: WebUIIngressLimits | null;
|
|
}
|
|
|
|
const ClientContext = createContext<ClientContextValue | null>(null);
|
|
|
|
export function ClientProvider({
|
|
client,
|
|
token,
|
|
modelName = null,
|
|
ingressLimits = null,
|
|
children,
|
|
}: {
|
|
client: NanobotClient;
|
|
token: string;
|
|
modelName?: string | null;
|
|
ingressLimits?: WebUIIngressLimits | null;
|
|
children: ReactNode;
|
|
}) {
|
|
const tokenRef = useRef(token);
|
|
tokenRef.current = token;
|
|
const getToken = useCallback(() => tokenRef.current, []);
|
|
const value = useMemo(
|
|
() => ({ client, token, getToken, modelName, ingressLimits }),
|
|
[client, getToken, ingressLimits, modelName, token],
|
|
);
|
|
|
|
return (
|
|
<ClientContext.Provider value={value}>
|
|
{children}
|
|
</ClientContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useClient(): ClientContextValue {
|
|
const ctx = useContext(ClientContext);
|
|
if (!ctx) {
|
|
throw new Error("useClient must be used within a ClientProvider");
|
|
}
|
|
return ctx;
|
|
}
|