From 96b9fcef3bee43bd034f8fe5b3445fc1b6cc2813 Mon Sep 17 00:00:00 2001 From: duanfuxiang Date: Thu, 24 Apr 2025 16:08:44 +0800 Subject: [PATCH] update, use json database replace pglite, for sync --- src/components/chat-view/CommandsView.tsx | 83 ++++------ .../chat-view/chat-input/ModelSelect.tsx | 28 ++-- src/constants.ts | 2 +- src/core/rag/rag-engine.ts | 9 +- src/database/database-manager.ts | 115 +------------- src/database/json/base.ts | 85 ++++++++++ src/database/json/chat/ChatManager.ts | 115 ++++++++++++++ src/database/json/chat/types.ts | 19 +++ src/database/json/command/TemplateManager.ts | 148 ++++++++++++++++++ src/database/json/command/types.ts | 18 +++ src/database/json/constants.ts | 4 + src/database/json/exception.ts | 20 +++ src/database/json/migrateToJsonDatabase.ts | 118 ++++++++++++++ src/database/json/utils.ts | 63 ++++++++ .../modules/command/command-repository.ts | 2 +- .../conversation/conversation-manager.ts | 6 +- src/hooks/use-chat-history.ts | 129 +++++++++------ src/hooks/use-commands.ts | 86 ++++++++++ src/main.ts | 39 +++++ src/pgworker/pglite.worker.ts | 3 +- 20 files changed, 863 insertions(+), 229 deletions(-) create mode 100644 src/database/json/base.ts create mode 100644 src/database/json/chat/ChatManager.ts create mode 100644 src/database/json/chat/types.ts create mode 100755 src/database/json/command/TemplateManager.ts create mode 100644 src/database/json/command/types.ts create mode 100644 src/database/json/constants.ts create mode 100644 src/database/json/exception.ts create mode 100644 src/database/json/migrateToJsonDatabase.ts create mode 100644 src/database/json/utils.ts create mode 100644 src/hooks/use-commands.ts diff --git a/src/components/chat-view/CommandsView.tsx b/src/components/chat-view/CommandsView.tsx index ff33423..87ff091 100644 --- a/src/components/chat-view/CommandsView.tsx +++ b/src/components/chat-view/CommandsView.tsx @@ -4,20 +4,19 @@ import { InitialEditorStateType } from '@lexical/react/LexicalComposer' import { $getRoot, $insertNodes, LexicalEditor } from 'lexical' import { Pencil, Search, Trash2 } from 'lucide-react' import { Notice } from 'obsidian' -import React, { useCallback, useEffect, useRef, useState } from 'react' -// import { v4 as uuidv4 } from 'uuid' +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { lexicalNodeToPlainText } from '../../components/chat-view/chat-input/utils/editor-state-to-plain-text' -import { useDatabase } from '../../contexts/DatabaseContext' -import { DBManager } from '../../database/database-manager' import { TemplateContent } from '../../database/schema' +import { useCommands } from '../../hooks/use-commands' import LexicalContentEditable from './chat-input/LexicalContentEditable' + export interface QuickCommand { id: string name: string content: TemplateContent + contentText: string createdAt: Date | undefined updatedAt: Date | undefined } @@ -29,30 +28,12 @@ const CommandsView = ( selectedSerializedNodes?: BaseSerializedNode[] } ) => { - const [commands, setCommands] = useState([]) - - const { getDatabaseManager } = useDatabase() - const getManager = useCallback(async (): Promise => { - return await getDatabaseManager() - }, [getDatabaseManager]) - - // init get all commands - const fetchCommands = useCallback(async () => { - const dbManager = await getManager() - dbManager.getCommandManager().getAllCommands((rows) => { - setCommands(rows.map((row) => ({ - id: row.id, - name: row.name, - content: row.content, - createdAt: row.createdAt, - updatedAt: row.updatedAt, - }))) - }) - }, [getManager]) - - useEffect(() => { - void fetchCommands() - }, [fetchCommands]) + const { + createCommand, + deleteCommand, + updateCommand, + commandList, + } = useCommands() // new command name const [newCommandName, setNewCommandName] = useState('') @@ -66,13 +47,13 @@ const CommandsView = ( const nameInputRefs = useRef>(new Map()) const contentEditorRefs = useRef>(new Map()) - // 为每个正在编辑的命令创建refs + // create refs for each command const commandEditRefs = useRef, contentEditableRef: React.RefObject }>>(new Map()); - // 获取或创建命令编辑refs + // get or create command edit refs const getCommandEditRefs = useCallback((id: string) => { if (!commandEditRefs.current.has(id)) { commandEditRefs.current.set(id, { @@ -94,7 +75,7 @@ const CommandsView = ( return refs; }, []); - // 当编辑状态改变时更新refs + // update command edit refs when editing command id changes useEffect(() => { if (editingCommandId) { const refs = getCommandEditRefs(editingCommandId); @@ -133,25 +114,20 @@ const CommandsView = ( new Notice('Please enter a name for your template') return } - const dbManager = await getManager() - dbManager.getCommandManager().createCommand({ - name: newCommandName, - content: { nodes }, - }) + + await createCommand(newCommandName, { nodes }) // clear editor content editorRef.current.update(() => { const root = $getRoot() root.clear() }) - setNewCommandName('') } // delete command const handleDeleteCommand = async (id: string) => { - const dbManager = await getManager() - await dbManager.getCommandManager().deleteCommand(id) + await deleteCommand(id) } // edit command @@ -173,11 +149,11 @@ const CommandsView = ( new Notice('Please enter a content for your template') return } - const dbManager = await getManager() - await dbManager.getCommandManager().updateCommand(id, { - name: nameInput.value, - content: { nodes }, - }) + await updateCommand( + id, + nameInput.value, + { nodes }, + ) setEditingCommandId(null) } @@ -187,11 +163,16 @@ const CommandsView = ( } // filter commands list - const filteredCommands = commands.filter( - command => - command.name.toLowerCase().includes(searchTerm.toLowerCase()) || - command.content.nodes.map(lexicalNodeToPlainText).join('').toLowerCase().includes(searchTerm.toLowerCase()) - ) + const filteredCommands = useMemo(() => { + if (!searchTerm.trim()) { + return commandList; + } + return commandList.filter( + command => + command.name.toLowerCase().includes(searchTerm.toLowerCase()) || + command.contentText.toLowerCase().includes(searchTerm.toLowerCase()) + ); + }, [commandList, searchTerm]); const getCommandEditorState = (commandContent: TemplateContent): InitialEditorStateType => { return (editor: LexicalEditor) => { @@ -287,7 +268,7 @@ const CommandsView = ( // view mode
{command.name}
-
{command.content.nodes.map(lexicalNodeToPlainText).join('')}
+
{command.contentText}