Spaces:
Runtime error
Runtime error
| import React, { useState, useEffect } from 'react'; | |
| import './App.css'; | |
| function App() { | |
| const [file, setFile] = useState<File | null>(null); | |
| const [query, setQuery] = useState(''); | |
| const [answer, setAnswer] = useState(''); | |
| const [context, setContext] = useState<string[]>([]); | |
| const [loading, setLoading] = useState(false); | |
| const [uploadStatus, setUploadStatus] = useState(''); | |
| const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => { | |
| if (e.target.files && e.target.files[0]) { | |
| setFile(e.target.files[0]); | |
| const formData = new FormData(); | |
| formData.append('file', e.target.files[0]); | |
| setLoading(true); | |
| setUploadStatus('Uploading...'); | |
| try { | |
| const response = await fetch('http://localhost:8000/upload', { | |
| method: 'POST', | |
| body: formData, | |
| }); | |
| if (!response.ok) { | |
| const errorData = await response.json(); | |
| throw new Error(errorData.detail || 'Failed to upload file'); | |
| } | |
| const data = await response.json(); | |
| setUploadStatus(`Success! Processed ${data.chunks} chunks`); | |
| } catch (error) { | |
| console.error('Error:', error); | |
| setUploadStatus(error instanceof Error ? error.message : 'Error uploading file'); | |
| } | |
| setLoading(false); | |
| } | |
| }; | |
| const handleQuery = async (e: React.FormEvent) => { | |
| e.preventDefault(); | |
| if (!query.trim()) return; | |
| setLoading(true); | |
| try { | |
| const response = await fetch('http://localhost:8000/query', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ query: query.trim() }), | |
| }); | |
| if (!response.ok) { | |
| const errorData = await response.json(); | |
| throw new Error(errorData.detail || 'Failed to get response'); | |
| } | |
| const data = await response.json(); | |
| console.log(data); | |
| setAnswer(data.response); | |
| setContext(data.context); | |
| } catch (error) { | |
| console.error('Error:', error); | |
| setAnswer(error instanceof Error ? error.message : 'Error getting response'); | |
| } | |
| setLoading(false); | |
| }; | |
| const checkStatus = async () => { | |
| try { | |
| const response = await fetch('http://localhost:8000/status'); | |
| const data = await response.json(); | |
| if (data.ready) { | |
| setUploadStatus('Session initialized. Ready for document upload.'); | |
| } | |
| } catch (error) { | |
| console.error('Error checking status:', error); | |
| } | |
| }; | |
| useEffect(() => { | |
| checkStatus(); | |
| }, []); | |
| return ( | |
| <div className="App"> | |
| {loading && <div className="loader"> | |
| <p>Processing your document...</p> | |
| </div>} | |
| <header className="App-header"> | |
| <h1>Custom document Q&A System</h1> | |
| </header> | |
| <main className="App-main"> | |
| <section className="upload-section"> | |
| <h2>Upload Document</h2> | |
| <input | |
| type="file" | |
| accept=".txt,.pdf" | |
| onChange={handleFileUpload} | |
| disabled={loading} | |
| /> | |
| {uploadStatus && <p className="status">{uploadStatus}</p>} | |
| </section> | |
| <section className="query-section"> | |
| <h2>Ask a Question</h2> | |
| <form onSubmit={handleQuery}> | |
| <input | |
| type="text" | |
| value={query} | |
| onChange={(e) => setQuery(e.target.value)} | |
| placeholder="Enter your question..." | |
| disabled={loading || !uploadStatus.includes('Success')} | |
| /> | |
| <button | |
| type="submit" | |
| disabled={loading || !uploadStatus.includes('Success')} | |
| > | |
| Ask | |
| </button> | |
| </form> | |
| </section> | |
| {answer && ( | |
| <section className="answer-section"> | |
| <h2>Answer</h2> | |
| <p>{answer}</p> | |
| <h3>Relevant Context</h3> | |
| <div className="context"> | |
| {context.map((text, index) => ( | |
| <div key={index} className="context-item"> | |
| {text} | |
| </div> | |
| ))} | |
| </div> | |
| </section> | |
| )} | |
| </main> | |
| </div> | |
| ); | |
| } | |
| export default App; |