Allow image pasting in plain mode in RTE (#11056)

* get rough funcitonality working

* try to tidy up types

* fix merge error

* fix signature change error

* type wrangling

* use onBeforeInput listener

* add onBeforeInput handler, add logic to onPaste

* fix type error

* bring plain text listeners in line with useInputEventProcessor

* extract common function to util file, move tests

* tidy comment

* tidy comments

* fix typo

* add util tests

* add text paste test
This commit is contained in:
alunturner 2023-06-12 12:28:00 +01:00 committed by GitHub
parent 47ab99f908
commit e32823e5fe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 188 additions and 104 deletions

View file

@ -290,4 +290,16 @@ describe("PlainTextComposer", () => {
expect(screen.getByTestId("autocomplete-wrapper")).toBeInTheDocument();
});
it("Should allow pasting of text values", async () => {
customRender();
const textBox = screen.getByRole("textbox");
await userEvent.click(textBox);
await userEvent.type(textBox, "hello");
await userEvent.paste(" world");
expect(textBox).toHaveTextContent("hello world");
});
});

View file

@ -16,11 +16,14 @@ limitations under the License.
import { IEventRelation, MatrixEvent } from "matrix-js-sdk/src/matrix";
import { waitFor } from "@testing-library/react";
import { handleClipboardEvent } from "../../../../../../src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor";
import { TimelineRenderingType } from "../../../../../../src/contexts/RoomContext";
import { mkStubRoom, stubClient } from "../../../../../test-utils";
import ContentMessages from "../../../../../../src/ContentMessages";
import { IRoomState } from "../../../../../../src/components/structures/RoomView";
import {
handleClipboardEvent,
isEventToHandleAsClipboardEvent,
} from "../../../../../../src/components/views/rooms/wysiwyg_composer/hooks/utils";
const mockClient = stubClient();
const mockRoom = mkStubRoom("mock room", "mock room", mockClient);
@ -285,3 +288,26 @@ describe("handleClipboardEvent", () => {
expect(output).toBe(true);
});
});
describe("isEventToHandleAsClipboardEvent", () => {
it("returns true for ClipboardEvent", () => {
const input = new ClipboardEvent("clipboard");
expect(isEventToHandleAsClipboardEvent(input)).toBe(true);
});
it("returns true for special case input", () => {
const input = new InputEvent("insertFromPaste", { inputType: "insertFromPaste" });
Object.assign(input, { dataTransfer: "not null" });
expect(isEventToHandleAsClipboardEvent(input)).toBe(true);
});
it("returns false for regular InputEvent", () => {
const input = new InputEvent("input");
expect(isEventToHandleAsClipboardEvent(input)).toBe(false);
});
it("returns false for other input", () => {
const input = new KeyboardEvent("keyboard");
expect(isEventToHandleAsClipboardEvent(input)).toBe(false);
});
});