/g, '\n') // Convert
to newlines
+ .replace(/<\/div>/g, '') // Remove closing div tags
+ .replace(/ /g, ' ') // Convert to spaces
+ .replace(/<[^>]*>/g, '') // Remove any other HTML tags
+ .replace('\u200B', '') || ''
+ );
};
const reset = () => {
@@ -209,10 +217,49 @@ const Input = forwardRef(
const textarea = contentEditableRef.current;
if (!textarea || !onPaste) return;
- textarea.addEventListener('paste', onPaste);
+ const _onPaste = (event: ClipboardEvent) => {
+ event.preventDefault();
+
+ const text = event.clipboardData
+ ?.getData('text/plain')
+ .replace(/\n/g, '
');
+ if (text) {
+ const selection = window.getSelection();
+ if (selection?.rangeCount) {
+ const range = selection.getRangeAt(0);
+ range.deleteContents();
+
+ // Insert the HTML content
+ const tempDiv = document.createElement('div');
+ tempDiv.innerHTML = text;
+ const fragment = document.createDocumentFragment();
+ while (tempDiv.firstChild) {
+ fragment.appendChild(tempDiv.firstChild);
+ }
+ range.insertNode(fragment);
+
+ // Move cursor to end of pasted content
+ range.collapse(false);
+ selection.removeAllRanges();
+ selection.addRange(range);
+
+ // Force focus back to the content editable
+ textarea.focus();
+ textarea.scrollTop = textarea.scrollHeight;
+ }
+
+ // Trigger input event to update state
+ const inputEvent = new Event('input', { bubbles: true });
+ textarea.dispatchEvent(inputEvent);
+ }
+
+ onPaste(event);
+ };
+
+ textarea.addEventListener('paste', _onPaste);
return () => {
- textarea.removeEventListener('paste', onPaste);
+ textarea.removeEventListener('paste', _onPaste);
};
}, [onPaste]);
diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx
index 7e213258f6..039da506ed 100644
--- a/frontend/src/components/chat/MessageComposer/index.tsx
+++ b/frontend/src/components/chat/MessageComposer/index.tsx
@@ -55,15 +55,6 @@ export default function MessageComposer({
if (event.clipboardData && event.clipboardData.items) {
const items = Array.from(event.clipboardData.items);
- // Attempt to handle text data first
- const textData = event.clipboardData.getData('text/plain');
- if (textData) {
- // Skip file handling if text data is present
- return;
- }
-
- event.preventDefault();
-
// If no text data, check for files (e.g., images)
items.forEach((item) => {
if (item.kind === 'file') {
diff --git a/libs/copilot/package.json b/libs/copilot/package.json
index 41bbd47edc..072ff40918 100644
--- a/libs/copilot/package.json
+++ b/libs/copilot/package.json
@@ -76,8 +76,7 @@
"vite@>=4.0.0 <=4.5.3": ">=4.5.4",
"rollup@>=3.0.0 <3.29.5": ">=3.29.5",
"cookie@<0.7.0": ">=0.7.0",
- "cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5",
- "nanoid@<3.3.8": ">=3.3.8"
+ "cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5"
}
}
}
diff --git a/libs/copilot/pnpm-lock.yaml b/libs/copilot/pnpm-lock.yaml
index d5c91676d0..7f7be37cc1 100644
--- a/libs/copilot/pnpm-lock.yaml
+++ b/libs/copilot/pnpm-lock.yaml
@@ -24,7 +24,6 @@ overrides:
rollup@>=3.0.0 <3.29.5: '>=3.29.5'
cookie@<0.7.0: '>=0.7.0'
cross-spawn@>=7.0.0 <7.0.5: '>=7.0.5'
- nanoid@<3.3.8: '>=3.3.8'
importers:
@@ -1852,9 +1851,9 @@ packages:
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- nanoid@5.0.9:
- resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
- engines: {node: ^18 || >=20}
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
neo-async@2.6.2:
@@ -4236,7 +4235,7 @@ snapshots:
object-assign: 4.1.1
thenify-all: 1.6.0
- nanoid@5.0.9: {}
+ nanoid@3.3.8: {}
neo-async@2.6.2: {}
@@ -4397,7 +4396,7 @@ snapshots:
postcss@8.4.49:
dependencies:
- nanoid: 5.0.9
+ nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
diff --git a/libs/react-client/package.json b/libs/react-client/package.json
index 0778a6a460..71dee3b023 100644
--- a/libs/react-client/package.json
+++ b/libs/react-client/package.json
@@ -71,8 +71,7 @@
"vite@>=4.0.0 <4.5.4": ">=4.5.4",
"vite@>=4.0.0 <=4.5.3": ">=4.5.4",
"rollup@>=3.0.0 <3.29.5": ">=3.29.5",
- "cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5",
- "nanoid@<3.3.8": ">=3.3.8"
+ "cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5"
}
}
}
diff --git a/libs/react-client/pnpm-lock.yaml b/libs/react-client/pnpm-lock.yaml
index 32fe45885c..676246e319 100644
--- a/libs/react-client/pnpm-lock.yaml
+++ b/libs/react-client/pnpm-lock.yaml
@@ -16,7 +16,6 @@ overrides:
vite@>=4.0.0 <=4.5.3: '>=4.5.4'
rollup@>=3.0.0 <3.29.5: '>=3.29.5'
cross-spawn@>=7.0.0 <7.0.5: '>=7.0.5'
- nanoid@<3.3.8: '>=3.3.8'
importers:
@@ -1408,9 +1407,9 @@ packages:
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- nanoid@5.0.9:
- resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
- engines: {node: ^18 || >=20}
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
node-releases@2.0.13:
@@ -3259,7 +3258,7 @@ snapshots:
object-assign: 4.1.1
thenify-all: 1.6.0
- nanoid@5.0.9: {}
+ nanoid@3.3.8: {}
node-releases@2.0.13: {}
@@ -3338,7 +3337,7 @@ snapshots:
postcss@8.4.47:
dependencies:
- nanoid: 5.0.9
+ nanoid: 3.3.8
picocolors: 1.1.0
source-map-js: 1.2.1