diff --git a/media/chatPanel.html b/media/chatPanel.html new file mode 100644 index 0000000..1fbc4f2 --- /dev/null +++ b/media/chatPanel.html @@ -0,0 +1,51 @@ + + + + + + + + Chat Panel + + + + + + + + + +
+
+ +
+
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + diff --git a/media/inputContainer.js b/media/inputContainer.js new file mode 100644 index 0000000..1f56517 --- /dev/null +++ b/media/inputContainer.js @@ -0,0 +1,165 @@ + +const messageInput = document.getElementById('message-input'); +const inputContainer = document.getElementById('input-container'); + +const defaultHeight = 16; + +function autoResizeTextarea() { + const lineCount = (messageInput.value.match(/\n/g) || []).length + 1; + messageInput.style.height = 'auto'; + messageInput.style.height = (lineCount <= 1 ? defaultHeight : messageInput.scrollHeight) + 'px'; + inputContainer.style.height = 'auto'; + inputContainer.style.height = messageInput.style.height + 25; +} + +messageInput.addEventListener('input', autoResizeTextarea); + +autoResizeTextarea(); + +function initInputContainer() { + const messageInput = document.getElementById('message-input'); + const sendButton = document.getElementById('send-button'); + const addContextButton = document.getElementById('add-context-button'); + const addCommandButton = document.getElementById('add-command-button'); + const popupContextMenu = document.getElementById('popupContextMenu'); + const popupCommandMenu = document.getElementById('popupCommandMenu'); + + let contextList = []; + let commandList = []; + + messageInput.addEventListener('keypress', function (e) { + if (e.key === 'Enter') { + if (e.ctrlKey) { + e.preventDefault(); + const message = messageInput.value.trim(); + if (message !== '') { + sendButton.click(); + } + } else if (!e.shiftKey) { + e.preventDefault(); + messageInput.setRangeText('\n', messageInput.selectionStart, messageInput.selectionEnd, 'end'); + autoResizeTextarea(); + } + } + }); + + sendButton.addEventListener('click', () => { + const message = messageInput.value; + if (message) { + // Add the user's message to the chat UI + addMessageToUI('user', message); + + // Clear the input field + messageInput.value = ''; + + // Process and send the message to the extension + messageUtil.sendMessage({ + command: 'sendMessage', + text: message + }); + autoResizeTextarea(); + } + }); + + addContextButton.addEventListener('click', (event) => { + popupContextMenu.style.display = popupContextMenu.style.display === 'block' ? 'none' : 'block'; + // 设置弹出菜单的位置 + popupContextMenu.style.left = event.pageX + 'px'; + popupContextMenu.style.top = event.pageY + 'px'; + }); + + addCommandButton.addEventListener('click', (event) => { + popupCommandMenu.style.display = popupCommandMenu.style.display === 'block' ? 'none' : 'block'; + // 设置弹出菜单的位置 + popupCommandMenu.style.left = event.pageX + 'px'; + popupCommandMenu.style.top = event.pageY + 'px'; + }); + + messageUtil.registerHandler('file_select', (message) => { + addFileToMessageInput(message.filePath); + }); + + messageUtil.registerHandler('code_select', (message) => { + addCodeToMessageInput(message.codeBlock); + }); + + messageUtil.registerHandler('appendContext', (message) => { + addCodeToMessageInput(message.context); + }); + + messageUtil.registerHandler('regContextList', (message) => { + contextList = message.result; + + const menuItems = []; + for (let i = 0; i < contextList.length; i++) { + menuItems.push({ + text: contextList[i].name, + href: contextList[i].name + }); + } + + menuItems.forEach(item => { + const menuItem = document.createElement('a'); + menuItem.textContent = 'add ' + item.text; + menuItem.href = item.text; + + popupContextMenu.appendChild(menuItem); + + // 为每个菜单项添加点击事件监听器 + menuItem.addEventListener('click', (event) => { + // 阻止标签的默认行为(例如导航到链接) + event.preventDefault(); + // 在此处定义点击处理逻辑 + messageUtil.sendMessage({command: 'addContext', selected: item.href}) + // 隐藏弹出菜单 + popupContextMenu.style.display = 'none'; + }); + }); + }); + + messageUtil.registerHandler('regCommandList', (message) => { + commandList = message.result; + + const menuItems = []; + for (let i = 0; i < commandList.length; i++) { + menuItems.push({ + text: commandList[i].pattern, + href: commandList[i].pattern + }); + } + + menuItems.forEach(item => { + const menuItem = document.createElement('a'); + menuItem.textContent = item.text; + menuItem.href = item.href; + + popupCommandMenu.appendChild(menuItem); + + // 为每个菜单项添加点击事件监听器 + menuItem.addEventListener('click', (event) => { + // 阻止标签的默认行为(例如导航到链接) + event.preventDefault(); + // 在此处定义点击处理逻辑 + addCodeToMessageInput("/" + item.href); + // 隐藏弹出菜单 + popupCommandMenu.style.display = 'none'; + }); + }); + }); + + messageUtil.sendMessage({command: 'regContextList'}); + messageUtil.sendMessage({command: 'regCommandList'}); +} + +function addFileToMessageInput(filePath) { + const messageInput = document.getElementById('message-input'); + const formattedPath = `[context|${filePath}] `; + messageInput.value = formattedPath + messageInput.value; + messageInput.focus(); +} + +function addCodeToMessageInput(codeBlock) { + const messageInput = document.getElementById('message-input'); + messageInput.value += "\n" + codeBlock + "\n"; + messageInput.focus(); +} diff --git a/package-lock.json b/package-lock.json index 21d2bd2..5bc3b8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21247,4 +21247,4 @@ "dev": true } } -} +} \ No newline at end of file