From 891add558662413b54e03a05a5e8383e0d25ecb1 Mon Sep 17 00:00:00 2001 From: smallstone <> Date: Sun, 3 Dec 2023 18:47:50 +0800 Subject: [PATCH] feat: update topic --- src/util/ideaBridge.ts | 82 ++++++++++++++++-- src/views/App.css | 12 +++ src/views/App.tsx | 1 + src/views/components/InputMessage/Topic.tsx | 95 +++++++++++++++++++++ src/views/components/InputMessage/index.tsx | 5 ++ yarn.lock | 5 ++ 6 files changed, 192 insertions(+), 8 deletions(-) create mode 100644 src/views/App.css create mode 100644 src/views/components/InputMessage/Topic.tsx diff --git a/src/util/ideaBridge.ts b/src/util/ideaBridge.ts index 20e8719..243d0ed 100644 --- a/src/util/ideaBridge.ts +++ b/src/util/ideaBridge.ts @@ -1,5 +1,14 @@ const JStoIdea = { - sendMessage: (message: string, context: string = "", parent: string = "") => { + sendMessage: (message: string, context: any = [], parent: string = "") => { + const paramsContext: any = []; + if (Array.isArray(context) && context.length > 0) { + context.forEach((item) => { + paramsContext.push({ + type: "code", + ...item.context, + }); + }); + } const params = { action: "sendMessage/request", metadata: { @@ -7,11 +16,11 @@ const JStoIdea = { parent: parent, }, payload: { - contexts: [], + contexts: paramsContext, message: message, }, }; - + console.log("ready to call java send message", JSON.stringify(params)); window.JSJavaBridge.callJava(JSON.stringify(params)); }, getModel: () => { @@ -20,8 +29,8 @@ const JStoIdea = { metadata: { callback: "IdeaToJSMessage", }, + payload: {}, }; - window.JSJavaBridge.callJava(JSON.stringify(params)); }, getContextList: () => { @@ -30,6 +39,7 @@ const JStoIdea = { metadata: { callback: "IdeaToJSMessage", }, + payload: {}, }; window.JSJavaBridge.callJava(JSON.stringify(params)); @@ -40,8 +50,9 @@ const JStoIdea = { metadata: { callback: "IdeaToJSMessage", }, + payload: {}, }; - + console.log("reday to call java command list", JSON.stringify(params)); window.JSJavaBridge.callJava(JSON.stringify(params)); }, insertCode: (code) => { @@ -80,7 +91,7 @@ const JStoIdea = { content: code, }, }; - console.log("request viewDiff: ", params); + window.JSJavaBridge.callJava(JSON.stringify(params)); }, getUserAccessKey: () => { @@ -89,6 +100,7 @@ const JStoIdea = { metadata: { callback: "IdeaToJSMessage", }, + payload: {}, }; window.JSJavaBridge.callJava(JSON.stringify(params)); }, @@ -112,6 +124,18 @@ const JStoIdea = { break; } }, + getTopicList: () => { + // 获取 topic 列表 + const params = { + action: "listTopics/request", + metadata: { + callback: "IdeaToJSMessage", + }, + payload: {}, + }; + + window.JSJavaBridge.callJava(JSON.stringify(params)); + }, updateSetting: (value: string) => { // 因为现在只有更换模型,所以直接取 value const params = { @@ -139,6 +163,18 @@ const JStoIdea = { }; window.JSJavaBridge.callJava(JSON.stringify(params)); }, + getTopicDetail: (topicHash: string) => { + const params = { + action: "listConversations/request", + metadata: { + callback: "IdeaToJSMessage", + topicHash: topicHash, + }, + payload: {}, + }; + console.log("ready to call java getTopicDetail", params); + window.JSJavaBridge.callJava(JSON.stringify(params)); + }, }; class IdeaBridge { @@ -174,14 +210,36 @@ class IdeaBridge { case "getSetting/response": this.resviceSettings(res); break; + case "listTopics/response": + this.resviceTopicList(res); + break; + case "listConversations/response": + this.resviceTopicDetail(res); + break; default: break; } }; } + resviceTopicDetail(res) { + // 接收到这里需要触发 loadHistoryMessages + const list = res.payload.conversations.map((item) => ({ + ...item, + response: item.responses.join("\n"), + })); + this.handle.loadHistoryMessages({ + entries: list, + }); + } + + resviceTopicList(res) { + console.log("resviceTopicList res: ", res); + const list = res.payload.topics; + this.handle.listTopics(list); + } + resviesContext(res) { - console.log("resviesContextres: ", res); const params = { file: res.payload.path, result: "", @@ -277,11 +335,13 @@ class IdeaBridge { } sendMessage(message: any) { + console.log("sendMessage message: ", message); // 根据 command 分发到不同的方法· switch (message.command) { // 发送消息 case "sendMessage": - JStoIdea.sendMessage(message.text, message.context, message.parent); + console.log("message: ", message); + JStoIdea.sendMessage(message.text, message.contextInfo, message.parent); break; // 重新生成消息,用于发送失败时再次发送 case "regeneration": @@ -318,6 +378,12 @@ class IdeaBridge { case "doCommit": JStoIdea.commit(message.content); break; + case "listTopics": + JStoIdea.getTopicList(); + break; + case "getTopicDetail": + JStoIdea.getTopicDetail(message.topicHash); + break; default: break; } diff --git a/src/views/App.css b/src/views/App.css new file mode 100644 index 0000000..cd76a5f --- /dev/null +++ b/src/views/App.css @@ -0,0 +1,12 @@ +::-webkit-scrollbar { + background-color: transparent; + width: 6px; + height: 6px; +} +::-webkit-scrollbar-track { + background-color: transparent; +} +::-webkit-scrollbar-thumb { + background-color: grey; + border-radius: 6px; +} diff --git a/src/views/App.tsx b/src/views/App.tsx index 3b5b568..4b4ab1b 100644 --- a/src/views/App.tsx +++ b/src/views/App.tsx @@ -5,6 +5,7 @@ import { } from '@mantine/core'; import ChatPanel from '@/views/pages/ChatPanel'; import Head from '@/views/components/Header'; +import './App.css'; export default function App() { const theme = useMantineTheme(); diff --git a/src/views/components/InputMessage/Topic.tsx b/src/views/components/InputMessage/Topic.tsx new file mode 100644 index 0000000..11f98b5 --- /dev/null +++ b/src/views/components/InputMessage/Topic.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState } from "react"; +import { ActionIcon, Drawer, Text, Box, Flex, Divider } from "@mantine/core"; +import { IconClock, IconChevronDown } from "@tabler/icons-react"; +import { useDisclosure } from "@mantine/hooks"; +import messageUtil from "@/util/MessageUtil"; +import dayjs from "dayjs"; + +export default function Topic({ styleName }) { + const [topicList, setTopicList] = useState([]); + useEffect(() => { + messageUtil.sendMessage({ + command: "listTopics", + }); + messageUtil.registerHandler("listTopics", (data) => { + console.log("listTopics data: ", data); + setTopicList(data); + }); + }, []); + const [drawerOpened, { open: openDrawer, close: closeDrawer }] = + useDisclosure(false); + + const showTopic = (root_prompt: any) => { + console.log("root_prompt: ", root_prompt); + closeDrawer(); + messageUtil.sendMessage({ + command: "getTopicDetail", + topicHash: root_prompt.hash, + }); + }; + + return ( + <> + }} + styles={{ + content: { + background: "var(--vscode-sideBar-background)", + color: "var(--vscode-editor-foreground)", + overflowY: "auto", + }, + header: { + background: "var(--vscode-sideBar-background)", + color: "var(--vscode-editor-foreground)", + }, + }} + > + {topicList.map((item: any, index) => ( + showTopic(item?.root_prompt)} + > + + + {item?.root_prompt.request} + + + {dayjs(item?.latest_time * 1000).format("YYYY-MM-DD HH:mm:ss")} + + + + + {item?.root_prompt.responses?.[0]} + + {index !== topicList.length - 1 && ( + + )} + + ))} + + + + + + ); +} diff --git a/src/views/components/InputMessage/index.tsx b/src/views/components/InputMessage/index.tsx index efdd2bb..cd58f36 100644 --- a/src/views/components/InputMessage/index.tsx +++ b/src/views/components/InputMessage/index.tsx @@ -5,6 +5,7 @@ import React, { useState, useEffect } from "react"; import { IconGitBranchChecked, IconShellCommand } from "@/views/components/ChatIcons"; import messageUtil from '@/util/MessageUtil'; import InputContexts from './InputContexts'; +import Topic from './Topic'; import { observer } from "mobx-react-lite"; import { useMst } from "@/views/stores/RootStore"; import { ChatContext } from "@/views/stores/InputStore"; @@ -36,6 +37,7 @@ const InputMessage = observer((props: any) => { const { input, chat } = useMst(); const { contexts, menuOpend, menuType, currentMenuIndex, contextMenus, commandMenus,modelMenus } = input; const { generating } = chat; + const showTopic = process.env.platform === 'idea'; const [drawerOpened, { open: openDrawer, close: closeDrawer }] = useDisclosure(false); @@ -388,6 +390,9 @@ const InputMessage = observer((props: any) => { })} + { + showTopic && + } {contexts && contexts.length > 0 &&