-
Notifications
You must be signed in to change notification settings - Fork 298
Expand file tree
/
Copy pathusePasteHandler.ts
More file actions
42 lines (38 loc) · 1.48 KB
/
Copy pathusePasteHandler.ts
File metadata and controls
42 lines (38 loc) · 1.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { useCallback } from 'react';
import { useMessageComposer } from './useMessageComposer';
import { dataTransferItemsToFiles } from '../../ReactFileUtilities';
export const usePasteHandler = () => {
const { attachmentManager, textComposer } = useMessageComposer();
const onPaste = useCallback(
(clipboardEvent: React.ClipboardEvent<HTMLTextAreaElement>) => {
(async (event) => {
const { items } = event.clipboardData;
event.preventDefault();
// Get a promise for the plain text in case no files are
// found. This needs to be done here because chrome cleans
// up the DataTransferItems after resolving of a promise.
let plainTextPromise: Promise<string> | undefined = undefined;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (item.kind === 'string' && item.type === 'text/plain') {
plainTextPromise = new Promise((resolve) => {
item.getAsString((string) => {
resolve(string);
});
});
break;
}
}
const fileLikes = await dataTransferItemsToFiles(Array.from(items));
if (plainTextPromise) {
const pastedText = await plainTextPromise;
textComposer.insertText({ text: pastedText });
} else {
attachmentManager.uploadFiles(fileLikes);
}
})(clipboardEvent);
},
[attachmentManager, textComposer],
);
return { onPaste };
};