Shreyas094's picture
Upload 528 files
372531f verified
raw
history blame
9.94 kB
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>
);
}