Files
openchamber/packages/ui/src/components/chat/composer/editor/hostMouseDown.ts
T

26 lines
940 B
TypeScript

import type { EditorView } from '@codemirror/view';
import type { MouseEvent } from 'react';
type ComposerHostMouseDownEvent = Pick<
MouseEvent,
'target' | 'clientX' | 'clientY' | 'preventDefault'
>;
export function handleComposerHostMouseDown(
view: EditorView | null,
event: ComposerHostMouseDownEvent,
): void {
if (!view || view.state.readOnly || !view.contentDOM.isContentEditable) return;
// A click that already landed in the text needs no help, and
// forwarding it would break drag-selection.
if (view.contentDOM.contains(event.target as Node)) return;
event.preventDefault();
const position = view.posAtCoords({ x: event.clientX, y: event.clientY })
?? view.state.doc.length;
// Focus before dispatching so CodeMirror updates the drawn caret's
// visibility while applying the selection update.
view.focus();
view.dispatch({ selection: { anchor: position } });
}