diff --git a/frontend/package.json b/frontend/package.json index 61e3ebfb1c..82b81eb499 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -113,8 +113,7 @@ "vite@>=4.0.0 <=4.5.3": ">=4.5.4", "rollup@>=3.0.0 <3.29.5": ">=3.29.5", "rollup@>=4.0.0 <4.22.4": ">=4.22.4", - "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/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 298a49130e..c86204c734 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -19,7 +19,6 @@ overrides: rollup@>=3.0.0 <3.29.5: '>=3.29.5' rollup@>=4.0.0 <4.22.4: '>=4.22.4' cross-spawn@>=7.0.0 <7.0.5: '>=7.0.5' - nanoid@<3.3.8: '>=3.3.8' importers: @@ -3245,9 +3244,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 native-promise-only@0.8.1: @@ -7707,7 +7706,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@5.0.9: {} + nanoid@3.3.8: {} native-promise-only@0.8.1: {} @@ -7955,7 +7954,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/frontend/src/components/LeftSidebar/Search.tsx b/frontend/src/components/LeftSidebar/Search.tsx index 4a6f9e999f..14e438d200 100644 --- a/frontend/src/components/LeftSidebar/Search.tsx +++ b/frontend/src/components/LeftSidebar/Search.tsx @@ -135,7 +135,9 @@ export default function SearchChats() { navigate(`/thread/${thread.id}`); }} > - {thread.name || 'Untitled Conversation'} +
+ {thread.name || 'Untitled Conversation'} +
))} diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index e3d48690ed..60673699c4 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -73,7 +73,15 @@ const Input = forwardRef( commandSpan.remove(); } - return clone.textContent?.replace('\u200B', '') || ''; + return ( + clone.innerHTML + ?.replace(//g, '\n') // Convert
to newlines + .replace(/
/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