design: implement multi-file selection support for research and existing-project onboarding uploaders

This commit is contained in:
2026-06-08 12:49:03 -07:00
parent 3ac861aaba
commit b8fcece14d

View File

@@ -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 ? (