Forward editing and clipboard events to front components (#22630)
Adds the text-editing events input-heavy front components need:
`beforeinput`, `compositionstart/update/end` and `copy/paste/cut`,
allowed on `input` and `textarea` only.
These events carry payload: `beforeinput` forwards `inputType`/`data`
through a native host listener (React synthesizes `onBeforeInput`
without them), composition events forward `data`, and paste forwards
`clipboardData.getData('text')` capped at 100k chars. Clipboard text is
read only on an explicit paste into the component's own input, never on
copy/cut, and the worker synthesizes a minimal `clipboardData` so
`onPaste` handlers work. `beforeinput` is observe-only: `preventDefault`
cannot cross the async worker boundary.
Allow-listing these events makes the host bind them, so the
`buildHostReactPropsFromRemoteProps` test that pinned them as rejected
now pins events that are still unmapped.
<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/22630?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
import { type SerializedEventData } from '@/types/SerializedEventData';
|
||||
|
||||
const CLIPBOARD_EVENT_TYPES = new Set(['copy', 'cut', 'paste']);
|
||||
const CLIPBOARD_TEXT_FORMATS = new Set(['text', 'text/plain']);
|
||||
|
||||
export const applySerializedEventClipboardData = (
|
||||
event: Record<string, unknown>,
|
||||
eventData: SerializedEventData,
|
||||
): void => {
|
||||
if (!CLIPBOARD_EVENT_TYPES.has(eventData.type)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const clipboardText = eventData.clipboardText ?? '';
|
||||
|
||||
event.clipboardData = {
|
||||
types: clipboardText === '' ? [] : ['text/plain'],
|
||||
getData: (format: string) =>
|
||||
CLIPBOARD_TEXT_FORMATS.has(format) ? clipboardText : '',
|
||||
setData: () => undefined,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user