From 73ae383d74652dfb89c0c4201c589852a70120f3 Mon Sep 17 00:00:00 2001 From: Aliaksei_Breilian Date: Sat, 15 Mar 2025 17:52:12 +0300 Subject: [PATCH] feat: copy to clipboard on the end of ide for VisualStudio --- packages/shared/index.js | 2 ++ .../ui/src/components/ChatBox/ChatBox.jsx | 24 +++++++++---------- packages/ui/src/context/DataContext.jsx | 1 + packages/ui/test/plugin/server.js | 5 +++- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/shared/index.js b/packages/shared/index.js index 9eaa490..2e44ae8 100644 --- a/packages/shared/index.js +++ b/packages/shared/index.js @@ -13,6 +13,7 @@ export const VsCodeMessageTypes = { copyCodeToEditor: 'extension.copyCodeToEditor', stopDatasourceTask: 'extension.stopDatasourceTask', stopApplicationTask: 'extension.stopApplicationTask', + copyMessageToClipboard: 'extension.copyMessageToClipboard', } export const UiMessageTypes = { @@ -36,4 +37,5 @@ export const UiMessageTypes = { stopApplicationTask: 'ui.stopApplicationTask', getPromptVersionDetail: 'ui.getPromptVersionDetail', getApplicationVersionDetail: 'ui.getApplicationVersionDetail', + copyMessageToClipboard: 'ui.copyMessageToClipboard', } diff --git a/packages/ui/src/components/ChatBox/ChatBox.jsx b/packages/ui/src/components/ChatBox/ChatBox.jsx index 079b9d9..6f79a36 100644 --- a/packages/ui/src/components/ChatBox/ChatBox.jsx +++ b/packages/ui/src/components/ChatBox/ChatBox.jsx @@ -176,7 +176,8 @@ const ChatBox = forwardRef(({ chatHistory = [], setChatHistory = () => { }, loadCoreData, - deployments + deployments, + sendMessage } = useContext(DataContext); const chatInput = useRef(null); const listRefs = useRef([]); @@ -559,20 +560,19 @@ const ChatBox = forwardRef(({ (id) => async () => { const message = chatHistory.find(item => item.id === id); if (message) { - if (message.exception) { - try { - await navigator.clipboard.writeText(JSON.stringify(message.exception)); - toastInfo('The exception has been copied to the clipboard'); - } catch (e) { - toastError('Failed to copy the exception!'); - } - } else { - await navigator.clipboard.writeText(message.content); - toastInfo('The message has been copied to the clipboard'); + const clipboardText = message.exception ? JSON.stringify(message.exception) : message.content; + + try { + navigator.clipboard + ? await navigator.clipboard.writeText(clipboardText) + : await sendMessage({ type: VsCodeMessageTypes.copyMessageToClipboard, data: clipboardText }); + toastInfo(`The ${message.exception ? 'exception' : 'message'} has been copied to the clipboard`); + } catch (e) { + toastError('Failed to copy to the clipboard!'); } } }, - [chatHistory, toastInfo, toastError], + [chatHistory, toastInfo, toastError, sendMessage], ); return ( diff --git a/packages/ui/src/context/DataContext.jsx b/packages/ui/src/context/DataContext.jsx index 5a1fd99..c5b2dba 100644 --- a/packages/ui/src/context/DataContext.jsx +++ b/packages/ui/src/context/DataContext.jsx @@ -112,6 +112,7 @@ export const DataProvider = ({ children }) => { switch (message.type) { case UiMessageTypes.stopApplicationTask: case UiMessageTypes.stopDatasourceTask: + case UiMessageTypes.copyMessageToClipboard: case UiMessageTypes.getSelectedText: if (messagePromises[message.id]) { messagePromises[message.id].resolve(message.data); diff --git a/packages/ui/test/plugin/server.js b/packages/ui/test/plugin/server.js index 7d027e5..36d8aac 100644 --- a/packages/ui/test/plugin/server.js +++ b/packages/ui/test/plugin/server.js @@ -72,7 +72,7 @@ app.get('/', async (req, res) => { data = (await getData(`datasources/datasources/prompt_lib/${projectId}`)).rows; break; case 'extension.getApplications': - data = (await getData(`applications/applications/prompt_lib/${projectId}`)).rows; + data = (await getData(`applications/applications/prompt_lib/${projectId}?offset=0&limit=1000`)).rows; break; case 'extension.getPromptDetail': data = (await getData(`prompt_lib/prompt/prompt_lib/${projectId}/${chatData}`)); @@ -89,6 +89,9 @@ app.get('/', async (req, res) => { case 'extension.copyCodeToEditor': data = ''; break; + case 'extension.copyMessageToClipboard': + data = ''; + break; default: data = `unexpected type of message: ${type}`; break;