Files
twenty/packages/twenty-front-component-renderer/src/constants/applySerializedEventClipboardData.ts
T
Raphaël Bosi 07be5e0892 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. -->
2026-07-21 14:21:53 +00:00

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,
};
};