From 9a8d5ca0385bc4f38d6c4346ea7ad6e27c11e2aa Mon Sep 17 00:00:00 2001 From: smallstone <> Date: Wed, 27 Dec 2023 16:35:38 +0800 Subject: [PATCH] Remove unused files and code --- babel.config.js | 3 - gui | 2 +- package.json | 24 - src/index.html | 21 - src/index.tsx | 45 -- src/main.html | 19 - src/util/MessageUtil.ts | 77 --- src/util/bridge.md | 70 --- src/util/ideaBridge.ts | 487 ---------------- src/views/App.css | 12 - src/views/App.tsx | 26 - src/views/components/BalanceTip/index.tsx | 159 ------ src/views/components/ChatIcons/index.tsx | 69 --- src/views/components/ChatMark/index.tsx | 286 ---------- src/views/components/CurrentMessage/index.tsx | 95 ---- src/views/components/Header/index.tsx | 56 -- .../components/InputMessage/InputContexts.tsx | 101 ---- src/views/components/InputMessage/Topic.tsx | 111 ---- src/views/components/InputMessage/index.tsx | 522 ------------------ .../MessageAvatar/avatar_devchat.svg | 14 - .../MessageAvatar/avatar_spaceman.png | Bin 107798 -> 0 bytes .../components/MessageAvatar/avatar_user.svg | 9 - src/views/components/MessageAvatar/index.tsx | 111 ---- src/views/components/MessageBody/index.tsx | 48 -- src/views/components/MessageContext/index.tsx | 91 --- src/views/components/MessageList/index.tsx | 157 ------ .../MessageMarkdown/CodeButtons.tsx | 109 ---- .../MessageMarkdown/LanguageCorner.tsx | 24 - src/views/components/MessageMarkdown/Step.tsx | 106 ---- .../components/MessageMarkdown/index.tsx | 299 ---------- .../components/RegenerationButton/index.tsx | 43 -- src/views/components/StopButton/index.tsx | 49 -- src/views/pages/ChatPanel.tsx | 240 -------- src/views/stores/ChatStore.ts | 401 -------------- src/views/stores/InputStore.ts | 133 ----- src/views/stores/RootStore.ts | 27 - src/welcome.html | 21 - webpack.config.js | 113 ---- webpack.idea.config.js | 105 ---- 39 files changed, 1 insertion(+), 4284 deletions(-) delete mode 100644 babel.config.js delete mode 100644 src/index.html delete mode 100644 src/index.tsx delete mode 100644 src/main.html delete mode 100644 src/util/MessageUtil.ts delete mode 100644 src/util/bridge.md delete mode 100644 src/util/ideaBridge.ts delete mode 100644 src/views/App.css delete mode 100644 src/views/App.tsx delete mode 100644 src/views/components/BalanceTip/index.tsx delete mode 100644 src/views/components/ChatIcons/index.tsx delete mode 100644 src/views/components/ChatMark/index.tsx delete mode 100644 src/views/components/CurrentMessage/index.tsx delete mode 100644 src/views/components/Header/index.tsx delete mode 100644 src/views/components/InputMessage/InputContexts.tsx delete mode 100644 src/views/components/InputMessage/Topic.tsx delete mode 100644 src/views/components/InputMessage/index.tsx delete mode 100644 src/views/components/MessageAvatar/avatar_devchat.svg delete mode 100644 src/views/components/MessageAvatar/avatar_spaceman.png delete mode 100644 src/views/components/MessageAvatar/avatar_user.svg delete mode 100644 src/views/components/MessageAvatar/index.tsx delete mode 100644 src/views/components/MessageBody/index.tsx delete mode 100644 src/views/components/MessageContext/index.tsx delete mode 100644 src/views/components/MessageList/index.tsx delete mode 100644 src/views/components/MessageMarkdown/CodeButtons.tsx delete mode 100644 src/views/components/MessageMarkdown/LanguageCorner.tsx delete mode 100644 src/views/components/MessageMarkdown/Step.tsx delete mode 100644 src/views/components/MessageMarkdown/index.tsx delete mode 100644 src/views/components/RegenerationButton/index.tsx delete mode 100644 src/views/components/StopButton/index.tsx delete mode 100644 src/views/pages/ChatPanel.tsx delete mode 100644 src/views/stores/ChatStore.ts delete mode 100644 src/views/stores/InputStore.ts delete mode 100644 src/views/stores/RootStore.ts delete mode 100644 src/welcome.html delete mode 100644 webpack.idea.config.js diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 557f8d2..0000000 --- a/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ['@babel/preset-env', '@babel/preset-react'], -}; diff --git a/gui b/gui index 46aca68..a660eee 160000 --- a/gui +++ b/gui @@ -1 +1 @@ -Subproject commit 46aca6809f49bf51f92ab4fcf27f614e5edc8207 +Subproject commit a660eee25f73c81d0f9353462655853cbf5abc3a diff --git a/package.json b/package.json index 5b2d228..fb993bc 100644 --- a/package.json +++ b/package.json @@ -825,8 +825,6 @@ }, "devDependencies": { "@babel/core": "^7.21.8", - "@babel/preset-env": "^7.21.5", - "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.5", "@types/chai": "^4.3.5", "@types/glob": "^8.1.0", @@ -835,8 +833,6 @@ "@types/ncp": "^2.0.5", "@types/node": "16.x", "@types/proxyquire": "^1.3.28", - "@types/react-dom": "^18.2.3", - "@types/react-syntax-highlighter": "^15.5.6", "@types/shell-escape": "^0.2.1", "@types/sinon": "^10.0.15", "@types/uuid": "^9.0.1", @@ -847,7 +843,6 @@ "babel-loader": "^9.1.2", "chai": "^4.3.7", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.3", "dotenv": "^16.0.3", "eslint": "^8.36.0", "file-loader": "^6.2.0", @@ -858,31 +853,19 @@ "mocha": "^10.2.0", "mock-fs": "^5.2.0", "proxyquire": "^2.1.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", "sinon": "^15.1.0", - "style-loader": "^3.3.2", "ts-jest": "^29.1.0", "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "typescript": "^4.9.5", - "url-loader": "^4.1.1", "vscode-test": "^1.6.1", "webpack": "^5.76.3", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.13.3" }, "dependencies": { - "@emotion/react": "^11.10.8", - "@mantine/core": "^6.0.10", - "@mantine/dropzone": "^6.0.10", - "@mantine/hooks": "^6.0.10", - "@mantine/prism": "^6.0.10", - "@mantine/tiptap": "^6.0.10", - "@tabler/icons-react": "^2.17.0", "@tiptap/extension-link": "^2.0.3", "@tiptap/pm": "^2.0.0", - "@tiptap/react": "^2.0.3", "@tiptap/starter-kit": "^2.0.3", "axios": "^1.3.6", "clean-webpack-plugin": "^4.0.0", @@ -890,17 +873,10 @@ "dotenv": "^16.0.3", "js-yaml": "^4.1.0", "mdast": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.1.0", - "mobx": "^6.10.0", - "mobx-react": "^9.0.0", - "mobx-state-tree": "^5.1.8", "ncp": "^2.0.0", "node-fetch": "^3.3.1", "nonce": "^1.0.4", "quote": "^0.4.0", - "react-markdown": "^8.0.7", - "react-syntax-highlighter": "^15.5.0", "rehype-raw": "^6.1.1", "shell-escape": "^0.2.0", "string-argv": "^0.3.2", diff --git a/src/index.html b/src/index.html deleted file mode 100644 index 923b3cb..0000000 --- a/src/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - DevChat - - - - - -
- - - - \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx deleted file mode 100644 index 1065339..0000000 --- a/src/index.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import * as React from 'react'; -import { createRoot } from 'react-dom/client'; -import { MantineProvider, MantineThemeOverride } from '@mantine/core'; -import { Provider, rootStore } from '@/views/stores/RootStore'; -import App from '@/views/App'; - -const container = document.getElementById('app')!; -const root = createRoot(container); // createRoot(container!) if you use TypeScript -const myTheme: MantineThemeOverride = { - fontFamily: 'var(--vscode-editor-font-family)', - colors: { - "merico":[ - "#F9F5F4", - "#EADAD6", - "#E1C0B6", - "#DEA594", - "#E1886F", - "#ED6A45", - "#D75E3C", - "#BD573B", - "#9F5541", - "#865143", - ], - }, - primaryColor: 'merico', - components: { - Text: { - styles: { - root:{ - fontSize: 'var(--vscode-editor-font-size)', - } - } - }, - }, -}; - - -root.render( - - - - - -); diff --git a/src/main.html b/src/main.html deleted file mode 100644 index c8c08f5..0000000 --- a/src/main.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - DevChat - - - - - -
- - - diff --git a/src/util/MessageUtil.ts b/src/util/MessageUtil.ts deleted file mode 100644 index df83656..0000000 --- a/src/util/MessageUtil.ts +++ /dev/null @@ -1,77 +0,0 @@ -import IdeaBridge from "./ideaBridge"; - -class MessageUtil { - private static instance: MessageUtil; - - handlers: { [x: string]: any }; - vscodeApi: any; - messageListener: any; - - constructor() { - this.handlers = {}; - this.messageListener = null; - if (process.env.platform === "vscode") { - this.vscodeApi = window.acquireVsCodeApi(); - } - - if (!this.messageListener) { - this.messageListener = (event: { data: any }) => { - const message = event.data; - this.handleMessage(message); - }; - window.addEventListener("message", this.messageListener); - } else { - console.log("Message listener has already been bound."); - } - } - - public static getInstance(): MessageUtil { - if (!MessageUtil.instance) { - MessageUtil.instance = new MessageUtil(); - } - return MessageUtil.instance; - } - - // Register a message handler for a specific message type - registerHandler(messageType: string, handler: any) { - if (process.env.platform === "idea") { - IdeaBridge.registerHandler(messageType, handler); - } else { - if (!this.handlers[messageType]) { - this.handlers[messageType] = []; - } - this.handlers[messageType].push(handler); - } - } - - // Unregister a message handler for a specific message type - unregisterHandler(messageType: string | number, handler: any) { - if (this.handlers[messageType]) { - this.handlers[messageType] = this.handlers[messageType].filter( - (h: any) => h !== handler - ); - } - } - - // Handle a received message - handleMessage(message: { command: string | number }) { - const handlers = this.handlers[message.command]; - if (handlers) { - handlers.forEach((handler: (arg0: { command: string | number }) => any) => - handler(message) - ); - } - } - - // Send a message to the VSCode API - sendMessage(message: any) { - if (process.env.platform === "idea") { - IdeaBridge.sendMessage(message); - } else { - this.vscodeApi.postMessage(message); - } - } -} - -// Export the MessageUtil class as a module -export default MessageUtil.getInstance(); diff --git a/src/util/bridge.md b/src/util/bridge.md deleted file mode 100644 index 78a9240..0000000 --- a/src/util/bridge.md +++ /dev/null @@ -1,70 +0,0 @@ -## sendMessage - -- getUserAccessKey // 获取 access key -- doCommit // 提交代码 -- updateSetting // 更新设置(目前只有更换模型) -- getSetting // 获取默认模型 -- deleteChatMessage // 删除最近一条消息 -- show_diff // 调用 editor 代码对比 - -- later -- -- stopDevChat // 停止生成 -- doCommand // - -- content - // 1. 打开设置 - // 2. 启动 ask code 安装 - // 3. 设置 access key -- featureToggles ?? -- isDevChatInstalled // 判断 ask code 是否安装 - -- historyMessages // 页面的历史消息 -- contextDetail // 获取 appendContext 响应之后,发送次请求获取文件的内容 -- addContext // 点击 context 菜单(比如 git diff)之后发送到消息 -- code_file_apply // 代码应用到 editor,替换 current file -- code_apply // 代码应用到 editor 光标位置 -- sendMessage // 发送消息 -- regeneration // 错误时重新生成 -- regContextList // git diff 之类的列表 -- regModelList // model 列表 -- regCommandList // 输入 / 之后出现的列表 - -## registerHandler - -- getUserAccessKey // 获取 access key -- regCommandList // 获取 / 之后出现的列表 -- appendContext // 右键添加到 context 或者 context 菜单点击的响应 -- contextDetailResponse // 获取到的文件内容 -- loadHistoryMessages // 与 historyMessages 对应 -- isDevChatInstalled // 与 isDevChatInstalled 对应 -- deletedChatMessage // 与 deleteChatMessage 对应 -- regContextList // 与 regContextList 对应 -- regModelList // 与 regModelList -- receiveMessagePartial // 部分对话 -- receiveMessage // 对话 -- systemMessage // 没用了 - -# css - ---vscode-editor-font-familyy ---vscode-editor-font-size ---vscode-dropdown-background ---vscode-dropdown-border ---vscode-foreground ---vscode-sideBar-background ---vscode-dropdown-foreground ---vscode-menu-foreground ---vscode-commandCenter-activeForeground ---vscode-commandCenter-activeBackground ---vscode-menu-border ---vscode-menu-background ---vscode-commandCenter-border ---vscode-editor-foreground ---vscode-input-background ---vscode-input-border ---vscode-input-foreground ---vscode-disabledForeground ---vscode-toolbar-activeBackground - -1. 请求 loadHistoryMessages 根据全局 id 返回空/对应的消息 - 1.1. 参数只有分页 -2. 请求 loadConversations,用于切换全局的 id - 2.1 loadConversations 的响应里,请求 1 diff --git a/src/util/ideaBridge.ts b/src/util/ideaBridge.ts deleted file mode 100644 index b8c0fb7..0000000 --- a/src/util/ideaBridge.ts +++ /dev/null @@ -1,487 +0,0 @@ -const JStoIdea = { - 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: { - callback: "IdeaToJSMessage", - parent: parent, - }, - payload: { - contexts: paramsContext, - message: message, - }, - }; - console.log("ready to send message: ", params); - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - getModel: () => { - const params = { - action: "listModels/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: {}, - }; - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - getContextList: () => { - const params = { - action: "listContexts/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: {}, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - getCommandList: () => { - const params = { - action: "listCommands/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: {}, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - insertCode: (code) => { - const params = { - action: "insertCode/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - content: code, - }, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - replaceFileContent: (code) => { - const params = { - action: "replaceFileContent/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - content: code, - }, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - viewDiff: (code) => { - const params = { - action: "viewDiff/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - content: code, - }, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - getUserAccessKey: () => { - // 这里需要发送一个请求,获取完整的用户设置 - const params = { - action: "getSetting/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: {}, - }; - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - etcCommand: (command: any) => { - /** - * 有四种命令 - * 1. workbench.action.openSettings - * 2. AskCodeIndexStart - * 3. AccessKey.OpenAI - * 4. AccessKey.DevChat - */ - const content = Array.isArray(command.content) ? command.content[0] : ""; - switch (content) { - case "workbench.action.openSettings": - // 打开设置 - const params = { - action: "showSettingDialog/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: {}, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - break; - case "AccessKey.DevChat": - // 设置key - break; - default: - break; - } - }, - getTopicList: () => { - // 获取 topic 列表 - const params = { - action: "listTopics/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: {}, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - updateSetting: (value: string) => { - // 因为现在只有更换模型,所以直接取 value - const params = { - action: "updateSetting/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - setting: { - currentModel: value, - }, - }, - }; - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - commit: (code: string) => { - const params = { - action: "commitCode/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - message: code, - }, - }; - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - getTopicDetail: (topicHash: string) => { - const params = { - action: "loadConversations/request", - metadata: { - callback: "IdeaToJSMessage", - topicHash: topicHash, - }, - payload: {}, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - historyMessages: (message) => { - const params = { - action: "loadHistoryMessages/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - pageIndex: message?.page || 0, - }, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - deleteChatMessage: (message) => { - const params = { - action: "deleteLastConversation/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - promptHash: message?.hash || "", - }, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, - openLink: (message) => { - if (!message?.url) { - return false; - } - const params = { - action: "openLink/request", - metadata: { - callback: "IdeaToJSMessage", - }, - payload: { - url: message?.url || "", - }, - }; - - window.JSJavaBridge.callJava(JSON.stringify(params)); - }, -}; - -class IdeaBridge { - private static instance: IdeaBridge; - handle: any = {}; - - constructor() { - this.handle = {}; - // 注册全局的回调函数,用于接收来自IDEA的消息 - window.IdeaToJSMessage = (res: any) => { - console.log("IdeaToJSMessage: ", res); - switch (res.action) { - case "deleteLastConversation/response": - this.resviceDeleteMessage(res); - break; - case "loadHistoryMessages/response": - this.resviceHistoryMessages(res); - break; - case "sendMessage/response": - this.resviceMessage(res); - break; - case "listModels/response": - this.resviceModelList(res); - break; - case "listContexts/response": - this.resviceContextList(res); - break; - case "listCommands/response": - this.resviceCommandList(res); - break; - // 这里暂时不用,因为获取到的只有 key,信息不全 - // 所以用 resviceSettings 来获取 - // case "getKey/response": - // this.resviceAccessKey(res.payload.key); - // break; - case "addContext/notify": - this.resviesContext(res); - break; - case "getSetting/response": - this.resviceSettings(res); - break; - case "listTopics/response": - this.resviceTopicList(res); - break; - case "loadConversations/response": - this.resviceTopicDetail(res); - break; - default: - break; - } - }; - } - - resviceDeleteMessage(res) { - const hash = res?.payload?.promptHash || ""; - this.handle.deletedChatMessage({ - hash, - }); - } - - resviceHistoryMessages(res) { - const list: any = []; - if (res?.payload?.messages?.length > 0) { - res?.payload?.messages.forEach((item) => { - list.push({ - ...item, - response: item.responses?.join("\n"), - }); - }); - } - - this.handle.reloadMessage({ - entries: list.reverse(), - pageIndex: 0, - }); - } - - resviceTopicDetail(res) { - // 用于重置后端全局的 topic id - if (res?.payload?.reset) { - // 重置后请求历史消息 - JStoIdea.historyMessages({ page: 0 }); - } - } - - resviceTopicList(res) { - const list = res.payload.topics; - this.handle.listTopics(list); - } - - resviesContext(res) { - const params = { - file: res.payload.path, - result: "", - }; - const contextObj = { - path: res.payload.path, - content: res.payload.content, - command: "", - }; - params.result = JSON.stringify(contextObj); - this.handle.contextDetailResponse(params); - } - - resviceSettings(res) { - // 用户设置的回调 - const setting = res.payload.setting; - - // 当前的默认模型 - this.handle.getSetting({ - value: setting.currentModel, - }); - this.handle.getUserAccessKey({ - endPoint: setting.apiBase, - accessKey: setting.apiKey, - keyType: setting.apiKey.startsWith("DC") ? "DevChat" : "OpenAi", - }); - } - - resviceAccessKey(res: string = "") { - const params = { - endPoint: "", - accessKey: res, - keyType: res.startsWith("DC") ? "DevChat" : "OpenAi", - }; - this.handle.getUserAccessKey(params); - } - - resviceCommandList(res) { - const result = res.payload.commands.map((item) => ({ - name: item.name, - pattern: item.name, - description: item.description, - })); - this.handle.regCommandList({ - result, - }); - } - - resviceContextList(res) { - // 接受到的上下文列表 - - const result = res.payload.contexts.map((item) => ({ - name: item.command, - pattern: item.command, - description: item.description, - })); - - this.handle.regContextList({ result }); - } - - resviceModelList(response: any) { - // 接受到模型列表 - this.handle["regModelList"]({ - result: response.payload.models, - }); - } - - resviceMessage(response: any) { - console.log( - "response.metadata.isFinalChunk: ", - response.metadata.isFinalChunk - ); - // 接受到消息 - if (response.metadata?.isFinalChunk) { - // 结束对话 - this.handle["receiveMessage"]({ - text: response.payload?.message || response.metadata?.error || "", - isError: response.metadata?.error.length > 0, - hash: response.payload?.promptHash || "", - }); - } else { - this.handle["receiveMessagePartial"]({ - text: response?.payload?.message || "", - }); - } - } - - public static getInstance(): IdeaBridge { - if (!IdeaBridge.instance) { - IdeaBridge.instance = new IdeaBridge(); - } - return IdeaBridge.instance; - } - - registerHandler(messageType: string, handler: any) { - // 注册回调函数 - this.handle[messageType] = handler; - } - - sendMessage(message: any) { - // 根据 command 分发到不同的方法· - switch (message.command) { - // 发送消息 - case "sendMessage": - JStoIdea.sendMessage( - message.text, - message.contextInfo, - message.parent_hash - ); - break; - // 重新生成消息,用于发送失败时再次发送 - case "regeneration": - JStoIdea.sendMessage(message.text, message.context, message.parent); - break; - // 请求 model 列表 - case "regModelList": - JStoIdea.getModel(); - break; - case "regContextList": - JStoIdea.getContextList(); - break; - case "regCommandList": - JStoIdea.getCommandList(); - break; - case "code_apply": - JStoIdea.insertCode(message.content); - break; - case "code_file_apply": - JStoIdea.replaceFileContent(message.content); - break; - case "getUserAccessKey": - JStoIdea.getUserAccessKey(); - break; - case "doCommand": - JStoIdea.etcCommand(message); - break; - case "show_diff": - JStoIdea.viewDiff(message.content); - break; - case "updateSetting": - JStoIdea.updateSetting(message.value); - break; - case "doCommit": - JStoIdea.commit(message.content); - break; - case "listTopics": - JStoIdea.getTopicList(); - break; - case "getTopicDetail": - JStoIdea.getTopicDetail(message.topicHash); - break; - case "historyMessages": - JStoIdea.historyMessages(message); - break; - case "deleteChatMessage": - JStoIdea.deleteChatMessage(message); - break; - case "openLink": - JStoIdea.openLink(message); - break; - default: - break; - } - } -} - -export default IdeaBridge.getInstance(); diff --git a/src/views/App.css b/src/views/App.css deleted file mode 100644 index cd76a5f..0000000 --- a/src/views/App.css +++ /dev/null @@ -1,12 +0,0 @@ -::-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 deleted file mode 100644 index 4b4ab1b..0000000 --- a/src/views/App.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from 'react'; -import { - AppShell, - useMantineTheme, -} 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(); - return ( - } - styles={{ - main: { - padding:'40px 0 0 0', - fontFamily: 'var(--vscode-editor-font-family)', - fontSize: 'var(--vscode-editor-font-size)', - }, - }} - > - - - ); -} \ No newline at end of file diff --git a/src/views/components/BalanceTip/index.tsx b/src/views/components/BalanceTip/index.tsx deleted file mode 100644 index 32ff195..0000000 --- a/src/views/components/BalanceTip/index.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import React, { useEffect, useState } from "react"; -import axios from "axios"; -import messageUtil from "@/util/MessageUtil"; -import { IconWallet } from "@tabler/icons-react"; -import { - HoverCard, - Text, - ActionIcon, - Group, - LoadingOverlay, -} from "@mantine/core"; - -const currencyMap = { - USD: "$", - RMB: "¥", -}; - -function formatBalance(balance: number) { - return Math.round(balance * 1000) / 1000; -} - -function formatCurrency(balance: number, currency: string) { - return `${currencyMap[currency] || currency}${balance}`; -} - -const envMap = { - dev: { - requestUrl: "https://apptest.devchat.ai", - link: "https://webtest.devchat.ai", - }, - prod: { - requestUrl: "https://app.devchat.ai", - link: "https://web.devchat.ai", - }, -}; - -// eslint-disable-next-line @typescript-eslint/naming-convention -export default function WechatTip() { - const [bindWechat, setBindWechat] = useState(false); - const [balance, setBalance] = useState(null); - const [currency, setCurrency] = useState("USD"); - const [accessKey, setAccessKey] = useState(""); - const [env, setEnv] = useState("prod"); - const [loading, setLoading] = useState(false); - const platform = process.env.platform; - - const getSettings = () => { - messageUtil.sendMessage({ - command: "getUserAccessKey", - }); - }; - - const getBalance = () => { - if (!envMap[env].requestUrl || !accessKey) { - return; - } - setLoading(true); - axios - .get(`${envMap[env].requestUrl}/api/v1/users/profile`, { - headers: { Authorization: `Bearer ${accessKey}` }, - }) - .then((res) => { - if (res?.data?.user?.wechat_nickname) { - setBindWechat(true); - } - if (res?.data?.organization?.balance) { - setBalance(formatBalance(res?.data?.organization?.balance)); - setCurrency(res?.data?.organization?.currency); - } - }) - .finally(() => { - setLoading(false); - }); - }; - - useEffect(() => { - if (env && accessKey) { - getBalance(); - } - }, [env, accessKey]); - - useEffect(() => { - getSettings(); - messageUtil.registerHandler( - "getUserAccessKey", - (message: { endPoint: string; accessKey: string; keyType: string }) => { - if (message.keyType === "DevChat" && message.accessKey) { - if (message.endPoint.includes("api-test.devchat.ai")) { - setEnv("dev"); - } else { - setEnv("prod"); - } - setAccessKey(message.accessKey); - } - } - ); - }, []); - - const openLink = (e) => { - e.preventDefault(); - e.stopPropagation(); - messageUtil.sendMessage({ - command: "openLink", - url: envMap[env].link, - }); - }; - - if (balance === null || balance === undefined) { - return null; - } - - return ( - - -
- - - -
-
- - - - Your remaining credit is {formatCurrency(balance, currency)}. Sign - in to{" "} - {platform === "idea" ? ( - openLink(e)}> - web.devchat.ai{" "} - - ) : ( - - web.devchat.ai{" "} - - )} - to {bindWechat ? "purchase more tokens." : "earn additional ¥8"} - - - - -
- ); -} diff --git a/src/views/components/ChatIcons/index.tsx b/src/views/components/ChatIcons/index.tsx deleted file mode 100644 index c617963..0000000 --- a/src/views/components/ChatIcons/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import * as React from 'react'; - -// Create interface extending SVGProps -export interface TablerIconsProps extends Partial, 'stroke'>> { - size?: number, - stroke?: number -} - -export const IconMouseRightClick = (props: TablerIconsProps) => { - const { color, size, style } = props; - return ( - - - - ); -}; - - -export const IconGitBranchChecked = (props: TablerIconsProps) => { - const { color, size, style } = props; - return ( - - - - - - - ); -}; - - -export const IconGitBranch = (props: TablerIconsProps) => { - const { color, size, style } = props; - return ( - - - - - - ); -}; - -export const IconShellCommand = (props: TablerIconsProps) => { - const { color, size, style } = props; - return ( - - - - - ); -}; - - -export const IconBook = (props: TablerIconsProps) => { - const { color, size, style } = props; - return ( - - - - - - - - - - - - ); -}; \ No newline at end of file diff --git a/src/views/components/ChatMark/index.tsx b/src/views/components/ChatMark/index.tsx deleted file mode 100644 index 5e5ce42..0000000 --- a/src/views/components/ChatMark/index.tsx +++ /dev/null @@ -1,286 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Box, Button, Checkbox, Text, Radio, Textarea, createStyles } from '@mantine/core'; -import { useListState, useSetState } from '@mantine/hooks'; -import { useMst } from '@/views/stores/RootStore'; -import yaml from 'js-yaml'; - -const useStyles = createStyles((theme) => ({ - container:{ - padding:0, - margin:0, - }, - submit:{ - marginTop:theme.spacing.xs, - marginRight:theme.spacing.xs, - marginBottom:theme.spacing.xs, - }, - cancel:{ - }, - button:{ - marginTop:theme.spacing.xs, - marginRight:theme.spacing.xs, - marginBottom:theme.spacing.xs, - }, - checkbox:{ - marginTop:theme.spacing.xs, - marginBottom:theme.spacing.xs, - }, - label:{ - color:'var(--vscode-editor-foreground)', - }, - radio:{ - marginTop:theme.spacing.xs, - marginBottom:theme.spacing.xs, - }, - editor:{ - backgroundColor: 'var(--vscode-input-background)', - borderColor: 'var(--vscode-input-border)', - color: 'var(--vscode-input-foreground)', - }, - editorWrapper:{ - marginTop:theme.spacing.xs, - marginBottom:theme.spacing.xs, - } - })); - -interface Wdiget{ - id:string, - value:string, - title?:string, - type:'editor'|'checkbox'|'radio'|'button'|'text' -} - -const ChatMark = ({ children,value,messageDone }) => { - const {classes} = useStyles(); - const [widgets,widgetsHandlers] = useListState(); - const {chat} = useMst(); - const [autoForm,setAutoForm] = useState(false); // if any widget is checkbox,radio or editor wdiget, the form is auto around them - const values = value?yaml.load(value):{}; - const [disabled,setDisabled] = useState(messageDone||!!value); - - const handleSubmit = () => { - let formData = {}; - widgets.forEach((widget)=>{ - if(widget.type === 'text' - || widget.type === 'button' - || (widget.type === 'radio' && widget.value === 'unchecked') - || (widget.type === 'checkbox' && widget.value === 'unchecked')){ - // ignore - return; - } - formData[widget.id] = widget.value; - }); - chat.userInput(formData); - }; - - const handleCancel = () => { - chat.userInput({ - 'form':'canceled' - }); - }; - - const handleButtonClick = ({event,index}) => { - const widget = widgets[index]; - widget['value'] = event.currentTarget.value;; - widgetsHandlers.setItem(index,widget); - chat.userInput({ - [widget['id']]:'clicked' - }); - }; - - const handleCheckboxChange = ({event,index})=>{ - const widget = widgets[index]; - widget['value'] = event.currentTarget.checked?'checked':'unchecked'; - widgetsHandlers.setItem(index,widget); - }; - const handleRadioChange = ({event,allValues})=>{ - widgetsHandlers.apply((item, index) => { - if(allValues.includes(item.id)){ - if(item.id === event){ - item.value = 'checked'; - }else{ - item.value = 'unchecked'; - } - } - return item; - }); - }; - const handleEditorChange = ({event,index})=>{ - const widget = widgets[index]; - widget['value'] = event.currentTarget.value; - widgetsHandlers.setItem(index,widget); - }; - - useEffect(()=>{ - - const lines = children.split('\n'); - let detectEditorId = ''; - let editorContentRecorder = ''; - - const textRegex = /^([^>].*)/; // Text widget - const buttonRegex = /^>\s*\((.*?)\)\s*(.*)/; // Button widget - const checkboxRegex = /^>\s*\[([x ]*)\]\((.*?)\)\s*(.*)/; // Checkbox widget - const radioRegex = /^>\s*-\s*\((.*?)\)\s*(.*)/; // Radio button widget - const editorRegex = /^>\s*\|\s*\((.*?)\)/; // Editor widget - const editorContentRegex = /^>\s*(.*)/; // Editor widget - - lines.forEach((line, index) => { - - let match; - - if (match = line.match(textRegex)) { - widgetsHandlers.append({ - id:`text${index}`, - type:'text', - value:line, - }); - } else if (match = line.match(buttonRegex)) { - const [id, title] = match.slice(1); - widgetsHandlers.append({ - id, - title, - type:'button', - value:title, - }); - } else if (match = line.match(checkboxRegex)) { - const [status, id, title] = match.slice(1); - widgetsHandlers.append({ - id, - title, - type:'checkbox', - value: status === 'x'?'checked':'unchecked', - }); - setAutoForm(true); - } else if (match = line.match(radioRegex)) { - const [id, title] = match.slice(1); - widgetsHandlers.append({ - id, - title, - type:'radio', - value:'unchecked', - }); - setAutoForm(true); - } else if (match = line.match(editorRegex)) { - const [id] = match.slice(1); - detectEditorId = id; - widgetsHandlers.append({ - id, - type:'editor', - value: '', - }); - setAutoForm(true); - } else if(match = line.match(editorContentRegex)){ - const [content] = match.slice(1); - editorContentRecorder += content + '\n'; - } - // if next line is not editor, then end current editor - const nextLine = index + 1 < lines.length? lines[index + 1]:null; - if (detectEditorId && (!nextLine || !nextLine.startsWith('>'))) { - // remove last \n - editorContentRecorder = editorContentRecorder.substring(0, editorContentRecorder.length - 1); - // apply editor content to widget - ((editorId,editorContent) => widgetsHandlers.apply((item)=>{ - if(item.id === editorId){ - item.value = editorContent; - } - return item; - }))(detectEditorId,editorContentRecorder); - // reset editor - detectEditorId = ''; - editorContentRecorder = ''; - } - }); - for (const key in values) { - widgetsHandlers.apply((item)=>{ - if(item.id === key){ - item.value = values[key]; - } - return item; - }); - } - },[]); - - // Render markdown widgets - const renderWidgets = (widgets) => { - let radioGroupTemp:any = []; - let radioValuesTemp:any = []; - let wdigetsTemp:any = []; - widgets.map((widget, index) => { - if (widget.type === 'text') { - wdigetsTemp.push({widget.value}); - } else if (widget.type === 'button') { - wdigetsTemp.push(); - } else if (widget.type === 'checkbox') { - wdigetsTemp.push( handleCheckboxChange({event,index})}/>); - } else if (widget.type === 'radio') { - radioValuesTemp.push(widget.id); - radioGroupTemp.push(); - // if next widget is not radio, then end current group - const nextWidget = index + 1 < widgets.length? widgets[index + 1]:null; - if (!nextWidget || nextWidget.type !== 'radio') { - const radioGroup = ((radios,allValues)=> handleRadioChange({ - event, - allValues - }) - }> - {radios} - )(radioGroupTemp,radioValuesTemp); - radioGroupTemp = []; - radioValuesTemp = []; - wdigetsTemp.push(radioGroup); - } - } else if (widget.type === 'editor') { - wdigetsTemp.push(