diff --git a/frontend/src/features/upload/UploadPage.tsx b/frontend/src/features/upload/UploadPage.tsx
index 61ec58c..c4fc73c 100644
--- a/frontend/src/features/upload/UploadPage.tsx
+++ b/frontend/src/features/upload/UploadPage.tsx
@@ -679,6 +679,10 @@ export default function UploadPage() {
const [processing, setProcessing] = useState(false);
const [checkingIds, setCheckingIds] = useState([]);
const [checkErrors, setCheckErrors] = useState>({});
+ const [iqdbProgress, setIqdbProgress] = useState<{
+ done: number;
+ total: number;
+ } | null>(null);
const [modalId, setModalId] = useState(null);
const [bulkOpen, setBulkOpen] = useState(false);
@@ -796,6 +800,10 @@ export default function UploadPage() {
for (const temp of targets) {
if (!temp.file_url) continue;
if (/\.(mp4|webm)$/i.test(temp.original_filename)) continue;
+ setIqdbProgress((current) => ({
+ done: current?.done ?? 0,
+ total: (current?.total ?? 0) + 1,
+ }));
try {
const blob = await fetchTempBlob(temp.file_url);
const results = await iqdbSearch(
@@ -822,6 +830,9 @@ export default function UploadPage() {
[temp.temp_id]: describeError(error),
}));
} finally {
+ setIqdbProgress((current) =>
+ current ? { ...current, done: current.done + 1 } : current,
+ );
setCheckingIds((current) =>
current.filter((value) => value !== temp.temp_id),
);
@@ -830,6 +841,9 @@ export default function UploadPage() {
} finally {
setProcessing(false);
setCheckingIds([]);
+ setIqdbProgress((current) =>
+ current === null || current.done >= current.total ? null : current,
+ );
invalidateUploads();
}
}
@@ -1010,14 +1024,30 @@ export default function UploadPage() {
{busy || processing ? (
-
-
- {busy
- ? `Uploading ${Math.min(uploadedCount + 1, entries.length)}/${entries.length}…`
- : checkingIds.length > 0
- ? `Checking ${checkingIds.length} file(s) against IQDB…`
- : "Processing uploads…"}
-
+
+
+
+
+ {busy
+ ? `Uploading ${Math.min(uploadedCount + 1, entries.length)}/${entries.length}…`
+ : iqdbProgress
+ ? `Checking IQDB — ${iqdbProgress.done}/${iqdbProgress.total}`
+ : "Processing uploads…"}
+
+
+ {!busy && iqdbProgress ? (
+
+ ) : null}
+
) : null}
@@ -1120,7 +1150,10 @@ export default function UploadPage() {
))}
) : null}
-
+ {/* auto-rows-max: when the grid is its own scroll container Firefox
+ sizes auto rows to min-content and squashes the tiles; max-content
+ keeps every tile at its aspect-ratio size and scrolls instead. */}
+
{entries.map((entry) => (