Files
nanobot/webui/src/providers/ClientProvider.tsx
T

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;
}