nico-martin's picture
nico-martin HF Staff
added tfjs v4
b77708b
raw
history blame
2.51 kB
import ChatSettingsModal from "@utils/context/chatSettings/ChatSettingsModal.tsx";
import {
getSettingsFromURL,
setSettingsToURL,
} from "@utils/context/chatSettings/routeParams.ts";
import { isModelCached } from "@utils/isModelCached.ts";
import { MODELS } from "@utils/models.ts";
import { type ReactNode, useEffect, useState } from "react";
import ChatSettingsContext from "./ChatSettingsContext.ts";
import type { ChatSettings } from "./types.ts";
export default function ChatSettingsContextProvider({
children,
}: {
children: ReactNode;
}) {
const [settings, setSettings] = useState<ChatSettings | null>(null);
const [downloadedModels, setDownloadedModels] = useState<Array<string>>([]);
const [modalOpen, setModalOpen] = useState<boolean>(false);
const hasAllSettings = (settings: ChatSettings | null): boolean =>
Boolean(settings) &&
Object.values(settings || {}).every(
(value) => value !== null && value !== undefined
);
useEffect(() => {
Promise.all(
Object.entries(MODELS).map(async ([modelKey, model]) => ({
modelKey,
cached: await isModelCached(model),
}))
).then((cachedModels) =>
setDownloadedModels(
cachedModels
.filter(({ cached }) => cached)
.map(({ modelKey }) => modelKey)
)
);
}, []);
useEffect(() => {
if (!settings) return;
hasAllSettings(settings) && setSettingsToURL(settings);
}, [settings]);
useEffect(() => {
const settings = getSettingsFromURL();
console.log(settings);
if (settings) {
setSettings({
tools: settings?.tools,
modelKey: settings?.modelKey,
systemPrompt: settings?.systemPrompt,
temperature: settings?.temperature,
enableThinking: settings?.enableThinking,
});
}
if (!hasAllSettings(settings)) {
setModalOpen(true);
}
}, []);
return (
<ChatSettingsContext
value={{
settings: hasAllSettings(settings) ? settings : null,
setSettings,
downloadedModels,
openSettingsModal: () => setModalOpen(true),
}}
>
<ChatSettingsModal
isOpen={modalOpen}
showCloseButton={hasAllSettings(settings)}
onClose={() => setModalOpen(false)}
settings={settings}
onChange={(settings) => {
setSettings(settings);
setModalOpen(false);
}}
downloadedModels={downloadedModels}
/>
{children}
</ChatSettingsContext>
);
}