Skip to content

Commit 4e48750

Browse files
authored
fix(upload): fire input event when files change (#575)
1 parent 8ef481f commit 4e48750

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

src/__tests__/upload.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,30 @@ test.each([
192192
},
193193
)
194194

195-
test('should not trigger input event for empty list', () => {
196-
const {element, eventWasFired} = setup('<input type="file"/>')
197-
userEvent.upload(element, [])
195+
test('should not trigger input event when selected files are the same', () => {
196+
const {element, eventWasFired, clearEventCalls} = setup(
197+
'<input type="file" multiple/>',
198+
)
199+
const files = [
200+
new File(['hello'], 'hello.png', {type: 'image/png'}),
201+
new File(['there'], 'there.png', {type: 'image/png'}),
202+
]
198203

204+
userEvent.upload(element, [])
205+
expect(eventWasFired('input')).toBe(false)
199206
expect(element.files).toHaveLength(0)
207+
208+
userEvent.upload(element, files)
209+
expect(eventWasFired('input')).toBe(true)
210+
expect(element.files).toHaveLength(2)
211+
212+
clearEventCalls()
213+
214+
userEvent.upload(element, files)
200215
expect(eventWasFired('input')).toBe(false)
216+
expect(element.files).toHaveLength(2)
217+
218+
userEvent.upload(element, [])
219+
expect(eventWasFired('input')).toBe(true)
220+
expect(element.files).toHaveLength(0)
201221
})

src/upload.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ function upload(element, fileOrFiles, init, {applyAccept = false} = {}) {
1919
// focus fires when they make their selection
2020
focus(element, init)
2121

22-
// treat empty array as if the user just closed the file upload dialog
23-
if (files.length === 0) {
22+
// do not fire an input event if the file selection does not change
23+
if (
24+
files.length === input.files.length &&
25+
files.every((f, i) => f === input.files.item(i))
26+
) {
2427
return
2528
}
2629

0 commit comments

Comments
 (0)