RAG_Backend / frontend /src /components /upload /UploadDocumentsModal.jsx
Madhesh4124's picture
feat: add auth-gated 3-mode workflow with admin chroma controls
7ac3a44
Raw
History Blame Contribute Delete
2.27 kB
import React from "react";
import { useRef } from "react";
import { Button } from "../common/index";
export default function UploadDocumentsModal({
open,
onClose,
onUpload,
uploading = false,
progress = 0,
allowMultiple = true,
title = "Upload Documents",
subtitle = "Supported: PDF, TXT, EPUB",
}) {
const inputRef = useRef(null);
if (!open) return null;
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4" onClick={onClose}>
<div
className="w-full max-w-lg rounded-2xl border border-gray-200 bg-white p-5 shadow-xl"
onClick={(event) => event.stopPropagation()}
>
<div className="flex items-start justify-between gap-4">
<div>
<h3 className="text-lg font-semibold text-gray-900">{title}</h3>
<p className="text-sm text-gray-500 mt-1">{subtitle}</p>
</div>
<button
type="button"
onClick={onClose}
className="rounded-md px-2 py-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600"
aria-label="Close upload dialog"
>
x
</button>
</div>
<div className="mt-4 rounded-xl border-2 border-dashed border-gray-300 p-8 text-center">
<input
ref={inputRef}
type="file"
multiple={allowMultiple}
accept=".pdf,.txt,.epub"
className="hidden"
onChange={(event) => {
const files = Array.from(event.target.files || []);
if (files.length) {
void onUpload(files);
}
event.target.value = "";
}}
/>
<p className="text-sm text-gray-600">Select one or more files to upload</p>
<div className="mt-3">
<Button onClick={() => inputRef.current?.click()} disabled={uploading}>
{uploading ? `Uploading... ${progress}%` : allowMultiple ? "Choose Files" : "Choose File"}
</Button>
</div>
</div>
<div className="mt-4 flex justify-end gap-2">
<Button variant="secondary" onClick={onClose} disabled={uploading}>Close</Button>
</div>
</div>
</div>
);
}