Extract upload dropzone and queue UI with shared pick validation utils.

This commit is contained in:
2026-10-20 22:20:16 +02:00
parent 3ab66c250c
commit d82d451448
12 changed files with 547 additions and 94 deletions
@@ -0,0 +1,38 @@
import { describe, expect, it } from 'vitest';
import { analyzePickedUploadFiles } from '@/utils/upload/analyzePickedUploadFiles';
const makeFile = (name: string, type: string, size: number): File =>
new File([new Uint8Array(size)], name, { type });
describe('analyzePickedUploadFiles', () => {
const maxImageBytes = 100;
const maxQueueSize = 2;
it('accepts images within size and queue limits', () => {
const picked = [makeFile('a.png', 'image/png', 50), makeFile('b.jpg', 'image/jpeg', 80)];
const result = analyzePickedUploadFiles(picked, maxImageBytes, maxQueueSize);
expect(result.accepted).toHaveLength(2);
expect(result.nonImageCount).toBe(0);
expect(result.oversizedImagesCount).toBe(0);
expect(result.queueOmittedImagesCount).toBe(0);
});
it('skips non-images and oversized files and caps the queue', () => {
const picked = [
makeFile('doc.pdf', 'application/pdf', 10),
makeFile('big.png', 'image/png', 200),
makeFile('1.png', 'image/png', 10),
makeFile('2.png', 'image/png', 10),
makeFile('3.png', 'image/png', 10)
];
const result = analyzePickedUploadFiles(picked, maxImageBytes, maxQueueSize);
expect(result.accepted.map(f => f.name)).toEqual(['1.png', '2.png']);
expect(result.nonImageCount).toBe(1);
expect(result.oversizedImagesCount).toBe(1);
expect(result.queueOmittedImagesCount).toBe(1);
});
});