Skip to content

Commit 652ae33

Browse files
authored
fix: give preference to pasting text over files (#2552)
1 parent 949446b commit 652ae33

File tree

2 files changed

+62
-10
lines changed

2 files changed

+62
-10
lines changed

src/components/MessageInput/__tests__/MessageInput.test.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,64 @@ function axeNoViolations(container) {
333333
expect(results).toHaveNoViolations();
334334
});
335335

336+
it('gives preference to pasting text over files', async () => {
337+
const doImageUploadRequest = mockUploadApi();
338+
const doFileUploadRequest = mockUploadApi();
339+
const pastedString = 'pasted string';
340+
const { container } = await renderComponent({
341+
messageInputProps: {
342+
doFileUploadRequest,
343+
doImageUploadRequest,
344+
},
345+
});
346+
347+
const file = getFile();
348+
const image = getImage();
349+
350+
const clipboardEvent = new Event('paste', {
351+
bubbles: true,
352+
});
353+
// set `clipboardData`. Mock DataTransfer object
354+
clipboardEvent.clipboardData = {
355+
items: [
356+
{
357+
getAsFile: () => file,
358+
kind: 'file',
359+
},
360+
{
361+
getAsFile: () => image,
362+
kind: 'file',
363+
},
364+
{
365+
getAsString: (cb) => cb(pastedString),
366+
kind: 'string',
367+
type: 'text/plain',
368+
},
369+
],
370+
};
371+
const formElement = screen.getByPlaceholderText(inputPlaceholder);
372+
await act(async () => {
373+
await formElement.dispatchEvent(clipboardEvent);
374+
});
375+
376+
await waitFor(() => {
377+
expect(doFileUploadRequest).not.toHaveBeenCalled();
378+
expect(doImageUploadRequest).not.toHaveBeenCalled();
379+
expect(screen.queryByTestId(IMAGE_PREVIEW_TEST_ID)).not.toBeInTheDocument();
380+
expect(screen.queryByTestId(FILE_PREVIEW_TEST_ID)).not.toBeInTheDocument();
381+
expect(screen.queryByText(filename)).not.toBeInTheDocument();
382+
expect(screen.queryByTestId(ATTACHMENT_PREVIEW_LIST_TEST_ID)).not.toBeInTheDocument();
383+
if (componentName === 'EditMessageForm') {
384+
expect(formElement.value.startsWith(pastedString)).toBeTruthy();
385+
} else {
386+
expect(formElement).toHaveValue(pastedString);
387+
}
388+
});
389+
390+
const results = await axe(container);
391+
expect(results).toHaveNoViolations();
392+
});
393+
336394
it('Should upload an image when it is dropped on the dropzone', async () => {
337395
const doImageUploadRequest = mockUploadApi();
338396
const { container } = await renderComponent({

src/components/MessageInput/hooks/usePasteHandler.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import { useCallback } from 'react';
2-
import {
3-
// dataTransferItemsHaveFiles,
4-
dataTransferItemsToFiles,
5-
FileLike,
6-
} from '../../ReactFileUtilities';
2+
import { dataTransferItemsToFiles, FileLike } from '../../ReactFileUtilities';
73
import type { EnrichURLsController } from './useLinkPreviews';
84
import { SetLinkPreviewMode } from '../types';
95

@@ -35,17 +31,15 @@ export const usePasteHandler = (
3531
}
3632

3733
const fileLikes = await dataTransferItemsToFiles(Array.from(items));
38-
if (fileLikes.length && isUploadEnabled) {
39-
uploadNewFiles(fileLikes);
40-
return;
41-
}
4234

43-
// fallback to regular text paste
4435
if (plainTextPromise) {
4536
const pastedText = await plainTextPromise;
4637
insertText(pastedText);
4738
findAndEnqueueURLsToEnrich?.(pastedText, SetLinkPreviewMode.UPSERT);
4839
findAndEnqueueURLsToEnrich?.flush();
40+
} else if (fileLikes.length && isUploadEnabled) {
41+
uploadNewFiles(fileLikes);
42+
return;
4943
}
5044
})(clipboardEvent);
5145
},

0 commit comments

Comments
 (0)