design: implement multi-file selection support for research and existing-project onboarding uploaders
This commit is contained in:
@@ -211,9 +211,14 @@ function EntrepResearch({ files = [], brief = "", onChange }) {
|
||||
const [progress, setProgress] = useState(0);
|
||||
|
||||
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const selected = e.target.files?.[0];
|
||||
if (!selected) return;
|
||||
setUploading(selected.name);
|
||||
const selectedFiles = Array.from(e.target.files ?? []);
|
||||
if (selectedFiles.length === 0) return;
|
||||
|
||||
const label =
|
||||
selectedFiles.length === 1
|
||||
? selectedFiles[0].name
|
||||
: `${selectedFiles.length} files`;
|
||||
setUploading(label);
|
||||
setProgress(0);
|
||||
|
||||
// Simulate a smooth upload progress bar
|
||||
@@ -222,14 +227,12 @@ function EntrepResearch({ files = [], brief = "", onChange }) {
|
||||
if (p >= 100) {
|
||||
clearInterval(interval);
|
||||
setTimeout(() => {
|
||||
const newFiles = selectedFiles.map((f) => ({
|
||||
name: f.name,
|
||||
size: `${(f.size / 1024).toFixed(1)} KB`,
|
||||
}));
|
||||
onChange({
|
||||
files: [
|
||||
...files,
|
||||
{
|
||||
name: selected.name,
|
||||
size: `${(selected.size / 1024).toFixed(1)} KB`,
|
||||
},
|
||||
],
|
||||
files: [...files, ...newFiles],
|
||||
});
|
||||
setUploading(null);
|
||||
}, 300);
|
||||
@@ -287,6 +290,7 @@ function EntrepResearch({ files = [], brief = "", onChange }) {
|
||||
<input
|
||||
type="file"
|
||||
onChange={handleFileChange}
|
||||
multiple
|
||||
style={{ display: "none" }}
|
||||
/>
|
||||
{uploading ? (
|
||||
@@ -473,8 +477,9 @@ function EntrepExisting({ checklist = {}, onChange }) {
|
||||
key: "designs" | "code",
|
||||
e: React.ChangeEvent<HTMLInputElement>,
|
||||
) => {
|
||||
const selected = e.target.files?.[0];
|
||||
if (!selected) return;
|
||||
const selectedFiles = Array.from(e.target.files ?? []);
|
||||
if (selectedFiles.length === 0) return;
|
||||
|
||||
setUploading(key);
|
||||
setProgress(0);
|
||||
|
||||
@@ -484,16 +489,14 @@ function EntrepExisting({ checklist = {}, onChange }) {
|
||||
clearInterval(interval);
|
||||
setTimeout(() => {
|
||||
const currentFiles = checklist[`${key}Files`] || [];
|
||||
const newFiles = selectedFiles.map((f) => ({
|
||||
name: f.name,
|
||||
size: `${(f.size / 1024).toFixed(1)} KB`,
|
||||
}));
|
||||
onChange({
|
||||
checklist: {
|
||||
...checklist,
|
||||
[`${key}Files`]: [
|
||||
...currentFiles,
|
||||
{
|
||||
name: selected.name,
|
||||
size: `${(selected.size / 1024).toFixed(1)} KB`,
|
||||
},
|
||||
],
|
||||
[`${key}Files`]: [...currentFiles, ...newFiles],
|
||||
},
|
||||
});
|
||||
setUploading(null);
|
||||
@@ -546,6 +549,7 @@ function EntrepExisting({ checklist = {}, onChange }) {
|
||||
<input
|
||||
type="file"
|
||||
onChange={(e) => handleFileChange(key, e)}
|
||||
multiple
|
||||
style={{ display: "none" }}
|
||||
/>
|
||||
{uploading === key ? (
|
||||
|
||||
Reference in New Issue
Block a user