|
import { TextField, Button, Box, Alert, Modal, Typography } from '@mui/material'; |
|
import { useState } from 'react'; |
|
|
|
function DocumentInput() { |
|
const [url, setUrl] = useState(''); |
|
const [showSuccess, setShowSuccess] = useState(false); |
|
const [isModalOpen, setIsModalOpen] = useState(false); |
|
const [topicName, setTopicName] = useState(''); |
|
|
|
const handleSubmit = async () => { |
|
try { |
|
const response = await fetch('/api/ingest/', { |
|
method: 'POST', |
|
headers: { |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify({ |
|
url, |
|
topic: topicName |
|
}), |
|
}); |
|
if (!response.ok) throw new Error('Network response was not ok'); |
|
setShowSuccess(true); |
|
setTopicName(''); |
|
setUrl(''); |
|
} catch (error) { |
|
console.error('Error:', error); |
|
} |
|
}; |
|
|
|
const handleModalConfirm = () => { |
|
setIsModalOpen(false); |
|
handleSubmit(); |
|
}; |
|
|
|
const handleModalClose = () => { |
|
setIsModalOpen(false); |
|
setTopicName(''); |
|
setUrl(''); |
|
}; |
|
|
|
const modalStyle = { |
|
position: 'absolute', |
|
top: '50%', |
|
left: '50%', |
|
transform: 'translate(-50%, -50%)', |
|
width: 400, |
|
bgcolor: 'background.paper', |
|
boxShadow: 24, |
|
p: 4, |
|
borderRadius: 2, |
|
}; |
|
|
|
const isFormValid = url.trim() && topicName.trim(); |
|
|
|
return ( |
|
<Box sx={{ mb: 4 }}> |
|
<Box sx={{ display: 'flex', justifyContent: 'center' }}> |
|
<Button |
|
variant="contained" |
|
onClick={() => setIsModalOpen(true)} |
|
sx={{ width: '300px' }} |
|
> |
|
Add New Docs |
|
</Button> |
|
</Box> |
|
|
|
{showSuccess && ( |
|
<Alert severity="success" sx={{ mt: 1 }}> |
|
Source documentation imported successfully! |
|
</Alert> |
|
)} |
|
|
|
<Modal |
|
open={isModalOpen} |
|
onClose={handleModalClose} |
|
aria-labelledby="topic-modal-title" |
|
> |
|
<Box sx={modalStyle}> |
|
<Typography id="topic-modal-title" variant="h6" component="h2" sx={{ mb: 3 }}> |
|
Add New Documentation |
|
</Typography> |
|
|
|
<TextField |
|
fullWidth |
|
label="Source Documentation URL" |
|
value={url} |
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setUrl(e.target.value)} |
|
sx={{ mb: 2 }} |
|
/> |
|
|
|
<TextField |
|
fullWidth |
|
label="Topic Name" |
|
value={topicName} |
|
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setTopicName(e.target.value)} |
|
sx={{ mb: 3 }} |
|
/> |
|
|
|
<Box sx={{ display: 'flex', gap: 2, justifyContent: 'flex-end' }}> |
|
<Button onClick={handleModalClose}>Cancel</Button> |
|
<Button |
|
variant="contained" |
|
onClick={handleModalConfirm} |
|
disabled={!isFormValid} |
|
> |
|
Confirm |
|
</Button> |
|
</Box> |
|
</Box> |
|
</Modal> |
|
</Box> |
|
); |
|
} |
|
|
|
export default DocumentInput; |
|
|