Spaces:
Paused
Paused
| import React, { useState, useEffect } from "react"; | |
| import './App.css'; | |
| import ChatBox from './ChatBox'; | |
| import axios from 'axios'; | |
| import { getHost } from '../../helpers/getHost'; | |
| interface ChatBoxSettings { | |
| report_source: string; | |
| report_type: string; | |
| tone: string; | |
| } | |
| interface ChatBoxProps { | |
| chatBoxSettings: ChatBoxSettings; | |
| setChatBoxSettings: React.Dispatch<React.SetStateAction<ChatBoxSettings>>; | |
| } | |
| export default function Modal({ setChatBoxSettings, chatBoxSettings }: ChatBoxProps) { | |
| const [showModal, setShowModal] = useState(false); | |
| const [activeTab, setActiveTab] = useState('search'); | |
| const [apiVariables, setApiVariables] = useState({ | |
| ANTHROPIC_API_KEY: '', | |
| TAVILY_API_KEY: '', | |
| LANGCHAIN_TRACING_V2: 'true', | |
| LANGCHAIN_API_KEY: '', | |
| OPENAI_API_KEY: '', | |
| DOC_PATH: './my-docs', | |
| RETRIEVER: 'tavily', // Set default retriever to Tavily | |
| GOOGLE_API_KEY: '', | |
| GOOGLE_CX_KEY: '', | |
| BING_API_KEY: '', | |
| SEARCHAPI_API_KEY: '', | |
| SERPAPI_API_KEY: '', | |
| SERPER_API_KEY: '', | |
| SEARX_URL: '', | |
| LANGGRAPH_HOST_URL: '' | |
| }); | |
| useEffect(() => { | |
| const storedConfig = localStorage.getItem('apiVariables'); | |
| if (storedConfig) { | |
| setApiVariables(JSON.parse(storedConfig)); | |
| } else { | |
| axios.get(`${getHost()}/getConfig`) | |
| .then(response => { | |
| setApiVariables(response.data); | |
| localStorage.setItem('apiVariables', JSON.stringify(response.data)); | |
| }) | |
| .catch(error => { | |
| console.error('Error fetching config:', error); | |
| }); | |
| } | |
| }, [showModal]); | |
| const handleSaveChanges = () => { | |
| setChatBoxSettings(chatBoxSettings); | |
| localStorage.setItem('apiVariables', JSON.stringify(apiVariables)); | |
| setShowModal(false); | |
| }; | |
| const handleInputChange = (e: { target: { name: any; value: any; }; }) => { | |
| const { name, value } = e.target; | |
| setApiVariables(prevState => ({ | |
| ...prevState, | |
| [name]: value | |
| })); | |
| localStorage.setItem('apiVariables', JSON.stringify({ | |
| ...apiVariables, | |
| [name]: value | |
| })); | |
| }; | |
| const renderConditionalInputs = () => { | |
| switch (apiVariables.RETRIEVER) { | |
| case 'google': | |
| return ( | |
| <> | |
| <div className="form-group"> | |
| <label className="form-group-label">GOOGLE_API_KEY</label> | |
| <input type="text" name="GOOGLE_API_KEY" value={apiVariables.GOOGLE_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| <div className="form-group"> | |
| <label className="form-group-label">GOOGLE_CX_KEY</label> | |
| <input type="text" name="GOOGLE_CX_KEY" value={apiVariables.GOOGLE_CX_KEY} onChange={handleInputChange} /> | |
| </div> | |
| </> | |
| ); | |
| case 'bing': | |
| return ( | |
| <div className="form-group"> | |
| <label className="form-group-label">BING_API_KEY</label> | |
| <input type="text" name="BING_API_KEY" value={apiVariables.BING_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| ); | |
| case 'searchapi': | |
| return ( | |
| <div className="form-group"> | |
| <label className="form-group-label">SEARCHAPI_API_KEY</label> | |
| <input type="text" name="SEARCHAPI_API_KEY" value={apiVariables.SEARCHAPI_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| ); | |
| case 'serpapi': | |
| return ( | |
| <div className="form-group"> | |
| <label className="form-group-label">SERPAPI_API_KEY</label> | |
| <input type="text" name="SERPAPI_API_KEY" value={apiVariables.SERPAPI_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| ); | |
| case 'googleSerp': | |
| return ( | |
| <div className="form-group"> | |
| <label className="form-group-label">SERPER_API_KEY</label> | |
| <input type="text" name="SERPER_API_KEY" value={apiVariables.SERPER_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| ); | |
| case 'searx': | |
| return ( | |
| <div className="form-group"> | |
| <label className="form-group-label">SEARX_URL</label> | |
| <input type="text" name="SEARX_URL" value={apiVariables.SEARX_URL} onChange={handleInputChange} /> | |
| </div> | |
| ); | |
| // Add cases for other retrievers if needed | |
| default: | |
| return null; | |
| } | |
| }; | |
| return ( | |
| <div className="settings"> | |
| <button | |
| className="bg-purple-500 text-white active:bg-purple-600 font-bold uppercase text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150" | |
| type="button" | |
| onClick={() => setShowModal(true)} | |
| > | |
| Preferences | |
| </button> | |
| {showModal ? ( | |
| <> | |
| <div | |
| className="justify-center items-center flex overflow-x-hidden overflow-y-auto fixed inset-0 z-50 outline-none focus:outline-none" | |
| > | |
| <div className="relative w-auto my-6 mx-auto max-w-3xl"> | |
| <div className="border-0 rounded-lg shadow-lg relative flex flex-col w-full bg-white outline-none focus:outline-none"> | |
| <div className="relative p-6 flex-auto"> | |
| <div className="tabs"> | |
| <button onClick={() => setActiveTab('search')} className={`tab-button ${activeTab === 'search' ? 'active' : ''}`}>Search Settings</button> | |
| </div> | |
| {activeTab === 'search' && ( | |
| <div className="App"> | |
| <header className="App-header"> | |
| <ChatBox setChatBoxSettings={setChatBoxSettings} chatBoxSettings={chatBoxSettings} /> | |
| </header> | |
| </div> | |
| )} | |
| {activeTab === 'api' && ( | |
| <main className="container" id="form"> | |
| <form method="POST" className="report_settings"> | |
| <div className="form-group"> | |
| <label className="form-group-label">Search Engine</label> | |
| <select name="RETRIEVER" value={apiVariables.RETRIEVER} onChange={handleInputChange}> | |
| <option value="" disabled>Select Retriever</option> | |
| <option value="tavily">Tavily</option> | |
| <option value="google">Google</option> | |
| <option value="searx">Searx</option> | |
| <option value="searchapi">SearchApi</option> | |
| <option value="serpapi">SerpApi</option> | |
| <option value="googleSerp">GoogleSerp</option> | |
| <option value="duckduckgo">DuckDuckGo</option> | |
| <option value="bing">Bing</option> | |
| </select> | |
| </div> | |
| {renderConditionalInputs()} | |
| <div className="form-group"> | |
| <label className="form-group-label">OPENAI_API_KEY</label> | |
| <input type="text" name="OPENAI_API_KEY" value={apiVariables.OPENAI_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| <div className="form-group"> | |
| <label className="form-group-label">DOC_PATH</label> | |
| <input type="text" name="DOC_PATH" value={apiVariables.DOC_PATH} onChange={handleInputChange} /> | |
| </div> | |
| <div className="form-group"> | |
| <label className="form-group-label">TAVILY_API_KEY</label> | |
| <input type="text" name="TAVILY_API_KEY" value={apiVariables.TAVILY_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| <div className="form-group"> | |
| <label className="form-group-label">LANGCHAIN_API_KEY</label> | |
| <input type="text" name="LANGCHAIN_API_KEY" value={apiVariables.LANGCHAIN_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| {apiVariables.LANGCHAIN_API_KEY && ( | |
| <> | |
| <div className="form-group"> | |
| <label className="form-group-label">LANGGRAPH_HOST_URL</label> | |
| <input type="text" name="LANGGRAPH_HOST_URL" value={apiVariables.LANGGRAPH_HOST_URL} onChange={handleInputChange} /> | |
| </div> | |
| <div className="form-group"> | |
| <label className="form-group-label">ANTHROPIC_API_KEY</label> | |
| <input type="text" name="ANTHROPIC_API_KEY" value={apiVariables.ANTHROPIC_API_KEY} onChange={handleInputChange} /> | |
| </div> | |
| </> | |
| )} | |
| </form> | |
| </main> | |
| )} | |
| </div> | |
| <div className="flex items-center justify-end p-3"> | |
| <button | |
| className="bg-emerald-500 text-white active:bg-emerald-600 font-bold uppercase text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150" | |
| type="button" | |
| onClick={handleSaveChanges} | |
| > | |
| Save & Close | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div className="opacity-25 fixed inset-0 z-40 bg-black"></div> | |
| </> | |
| ) : null} | |
| </div> | |
| ); | |
| } | |