07be5e0892
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. -->
23 lines
675 B
TypeScript
23 lines
675 B
TypeScript
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,
|
|
};
|
|
};
|