transformers.js-text-generation
/
src
/utils
/context
/chatSettings
/ChatSettingsContextProvider.tsx
| 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> | |
| ); | |
| } | |