onCapturePaste: stop propagation in more scenarios

This commit is contained in:
Scott Nonnenberg 2023-10-18 14:35:06 -07:00 committed by GitHub
parent 6c88c7c587
commit 5ccb3af040
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 29 deletions

View file

@ -35,6 +35,9 @@ export function ConversationView({
}: PropsType): JSX.Element {
const onDrop = React.useCallback(
(event: React.DragEvent<HTMLDivElement>) => {
event.stopPropagation();
event.preventDefault();
if (!event.dataTransfer) {
return;
}
@ -43,9 +46,6 @@ export function ConversationView({
return;
}
event.stopPropagation();
event.preventDefault();
const { files } = event.dataTransfer;
processAttachments({
conversationId,
@ -57,35 +57,42 @@ export function ConversationView({
const onPaste = React.useCallback(
(event: React.ClipboardEvent<HTMLDivElement>) => {
event.stopPropagation();
event.preventDefault();
if (!event.clipboardData) {
return;
}
const { items } = event.clipboardData;
const anyImages = [...items].some(
item => item.type.split('/')[0] === 'image'
);
if (!anyImages) {
return;
}
event.stopPropagation();
event.preventDefault();
const files: Array<File> = [];
for (let i = 0; i < items.length; i += 1) {
if (items[i].type.split('/')[0] === 'image') {
const allVisual = [...items].every(item => {
const type = item.type.split('/')[0];
return type === 'image' || type === 'video';
});
if (allVisual) {
const files: Array<File> = [];
for (let i = 0; i < items.length; i += 1) {
const file = items[i].getAsFile();
if (file) {
files.push(file);
}
}
processAttachments({
conversationId,
files,
});
return;
}
processAttachments({
conversationId,
files,
});
const firstAttachment = items[0]?.getAsFile();
if (firstAttachment) {
processAttachments({
conversationId,
files: [firstAttachment],
});
}
},
[conversationId, processAttachments]
);

View file

@ -30,29 +30,31 @@ export class SignalClipboard {
onCapturePaste(event: ClipboardEvent): void {
if (event.clipboardData == null) {
event.preventDefault();
event.stopPropagation();
return;
}
const clipboard = this.quill.getModule('clipboard');
const selection = this.quill.getSelection();
if (selection == null) {
return;
}
const text = event.clipboardData.getData('text/plain');
const signal = event.clipboardData.getData('text/signal');
if (!text && !signal) {
return;
}
const clipboardContainsFiles = event.clipboardData.files?.length > 0;
if (!clipboardContainsFiles) {
event.preventDefault();
event.stopPropagation();
}
if (selection == null) {
return;
}
if (!text && !signal) {
return;
}
const clipboardDelta = signal
? clipboard.convert(signal)
: clipboard.convert(prepareText(text));