From a2b278d60089639d35d6d10f7f0e3aa9bf6088e7 Mon Sep 17 00:00:00 2001 From: 1708-huayu <57060237+1708-huayu@users.noreply.github.com> Date: Sat, 7 Dec 2024 10:20:24 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=BC=80=E5=A7=8B=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 2 +- src/App.js | 6 +- src/components/ItemTree/index.less | 2 +- src/pages/Note/Hlexical/index.less | 9 +- .../Note/Hlexical/plugins/SaveFilePlugin.js | 215 +++++++++--------- src/pages/Note/index.jsx | 57 +++-- src/pages/Note/index.less | 29 ++- 7 files changed, 168 insertions(+), 152 deletions(-) diff --git a/main.js b/main.js index 792d715..4f320b6 100644 --- a/main.js +++ b/main.js @@ -31,7 +31,7 @@ const createWindow = () => { // 加载 index.html win.loadFile('./index.html') } - + win.maximize() // let okPush =false win.webContents.on('before-input-event', (event, input) => { console.log("input.type.toLowerCase()", input) diff --git a/src/App.js b/src/App.js index a53b6f8..244fff6 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React, {useId} from 'react'; +import React, {Fragment, useId} from 'react'; import routes from './routes' import {Outlet, useNavigate, useRoutes} from 'react-router-dom' import useIpcRenderer from '../src/utils/useIpcRenderer' @@ -31,11 +31,11 @@ function App() { useIpcRenderer({'openDirectory':addNewDir}) // useIpcRenderer({'pushHotkeys':pushHotkeysAction}) return ( - <> + {/* 注册路由 */} {/*{element}*/} - + ) } diff --git a/src/components/ItemTree/index.less b/src/components/ItemTree/index.less index 5e77ed5..3dcf346 100644 --- a/src/components/ItemTree/index.less +++ b/src/components/ItemTree/index.less @@ -1,6 +1,6 @@ @import '~antd/dist/reset.css'; .ant-tree{ - overflow: auto scroll; + overflow: auto; height: 95.7%; } .ant-tree-node-content-wrapper { diff --git a/src/pages/Note/Hlexical/index.less b/src/pages/Note/Hlexical/index.less index b8a75f5..3ee2fa8 100644 --- a/src/pages/Note/Hlexical/index.less +++ b/src/pages/Note/Hlexical/index.less @@ -55,12 +55,6 @@ h1 { border-top-right-radius: 10px; height: 100%; } - -.toolbar { - height: 4.9%; - margin-bottom: 0.1% -} - .editor-inner { background: #fff; position: relative; @@ -187,6 +181,9 @@ pre::-webkit-scrollbar-thumb { } .toolbar { + margin-left: 20px; + margin-right: 20px; + height: 46px; display: flex; margin-bottom: 1px; background: #fff; diff --git a/src/pages/Note/Hlexical/plugins/SaveFilePlugin.js b/src/pages/Note/Hlexical/plugins/SaveFilePlugin.js index 9044619..42f0c42 100644 --- a/src/pages/Note/Hlexical/plugins/SaveFilePlugin.js +++ b/src/pages/Note/Hlexical/plugins/SaveFilePlugin.js @@ -1,130 +1,133 @@ -import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext"; -import {Fragment, useEffect, useState} from "react"; +import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext"; +import {useEffect, useState} from "react"; import {importFile, overWriteFile, saveFileWithName} from "../../../../utils/File"; import {isEmpty} from "../../../../utils/ObjectUtils"; -import {CLEAR_HISTORY_COMMAND} from "lexical"; -import {TRANSFORMERS, $convertFromMarkdownString, $convertToMarkdownString,} from "@lexical/markdown"; +import {TRANSFORMERS, $convertToMarkdownString,} from "@lexical/markdown"; import {getFileExtByPath, getFileFullNameByPath, getFileNameByPath} from "../../../../utils/PathOperate"; import {updatedSavedFile} from "../../../../redux/tableBarItem_reducer"; import {useDispatch, useSelector} from "react-redux"; import md5 from "md5" import {message} from "antd"; + const {ipcRenderer} = window.require('electron') import "./ToobarPlugin.less" import {newFileAdd, updateFileMd5} from "../../../../redux/dirMessage_reducer"; -const SaveFilePlugin=(props)=> { - let activeKey = useSelector(state => state.tableBarItem.activeKey); - const dispatch = useDispatch(); - // const [messageApi,contextHolder] = message.useMessage(); - const [editor] = useLexicalComposerContext(); - const [editorState,setEditorState]=useState(); - function onChange(editorState) { +const SaveFilePlugin = (props) => { + let activeKey = useSelector(state => state.tableBarItem.activeKey); + const dispatch = useDispatch(); + // const [messageApi,contextHolder] = message.useMessage(); + const [editor] = useLexicalComposerContext(); + const [editorState, setEditorState] = useState(); - if (!isEmpty(props.filePath)&&props.filePath.endsWith(".md")){ - let read = editorState.read(() => $convertToMarkdownString(TRANSFORMERS)); - setEditorState(read) - }else { - // Call toJSON on the EditorState object, which produces a serialization safe string - const editorStateJSON = editorState.toJSON(); - console.log('onChange-editorStateJSON') - // However, we still have a JavaScript object, so we need to convert it to an actual string with JSON.stringify - setEditorState(JSON.stringify(editorStateJSON)); + function onChange(editorState) { + + if (!isEmpty(props.filePath) && props.filePath.endsWith(".md")) { + let read = editorState.read(() => $convertToMarkdownString(TRANSFORMERS)); + setEditorState(read) + } else { + // Call toJSON on the EditorState object, which produces a serialization safe string + const editorStateJSON = editorState.toJSON(); + console.log('onChange-editorStateJSON') + // However, we still have a JavaScript object, so we need to convert it to an actual string with JSON.stringify + setEditorState(JSON.stringify(editorStateJSON)); + } } - } - const saveFile = (event, args) => { - console.log("event,args:", event, args) - if (args !== "CTRL+S") { - return - } - let filePath = props.filePath; - if (!isEmpty(filePath)&&filePath !== activeKey) { - console.log("文件不同", filePath, activeKey) - return; - } - console.log("触发保存filePath:", filePath) - if (isEmpty(editorState)) { - return - } - let resultSave; + const saveFile = (event, args) => { + console.log("event,args:", event, args) + if (args !== "CTRL+S") { + return + } + let filePath = props.filePath; + if (!isEmpty(filePath) && filePath !== activeKey) { + console.log("文件不同", filePath, activeKey) + return; + } + console.log("触发保存filePath:", editorState,filePath) + if (isEmpty(editorState)) { + return + } + let resultSave; - // 如果文件地址为空需要用户选择目录并设置文件。 - if (!filePath) { - let saveDialogReturnValuePromise = saveFileWithName(); - console.log("saveDialogReturnValuePromise", saveDialogReturnValuePromise) - saveDialogReturnValuePromise.then(result => { - if (!result.canceled) { - let filePath =result.filePath - let fileExt = getFileExtByPath(result.filePath) - if (isEmpty(fileExt)){ - filePath = filePath+".lexical" - } - if (filePath.endsWith(".md")){ - resultSave=editorState - }else { + // 如果文件地址为空需要用户选择目录并设置文件。 + if (!filePath) { + let saveDialogReturnValuePromise = saveFileWithName(); + console.log("saveDialogReturnValuePromise", saveDialogReturnValuePromise) + saveDialogReturnValuePromise.then(result => { + if (!result.canceled) { + let filePath = result.filePath + let fileExt = getFileExtByPath(result.filePath) + if (isEmpty(fileExt)) { + filePath = filePath + ".lexical" + } + if (filePath.endsWith(".md")) { + resultSave = editorState + } else { + const editorStateSave = {"editorState": JSON.parse(editorState)}; + resultSave = JSON.stringify(editorStateSave); + } + overWriteFile(filePath, resultSave) + // 修改当前文件名 + dispatch(updatedSavedFile({filePath: filePath})) + // 文件目录更新 + dispatch(newFileAdd({ + fileName: getFileFullNameByPath(filePath), dirFlag: false, children: [], filePath: filePath, + fileId: filePath, fileMd5: md5(resultSave) + })) + } + }) + return + } + if (props.filePath.endsWith(".md")) { + resultSave = editorState + } else { const editorStateSave = {"editorState": JSON.parse(editorState)}; resultSave = JSON.stringify(editorStateSave); - } - overWriteFile(filePath, resultSave) - // 修改当前文件名 - dispatch(updatedSavedFile({filePath: filePath})) - // 文件目录更新 - dispatch(newFileAdd({fileName:getFileFullNameByPath(filePath),dirFlag:false,children:[],filePath: filePath, - fileId:filePath,fileMd5:md5(resultSave)})) } - }) - return - } - if (props.filePath.endsWith(".md")){ - resultSave=editorState - }else { - const editorStateSave = {"editorState": JSON.parse(editorState)}; - resultSave = JSON.stringify(editorStateSave); + + // 后期不再读取文件,直接读取文件MD5 + importFile(filePath).then(value => { + let save = true; + let oldFileMd5 + let newFileMd5 = md5(resultSave) + if (!isEmpty(value)) { + if (props.filePath.endsWith(".md")) { + // editorState + oldFileMd5 = md5(value.toString()); + save = (isEmpty(value)) || newFileMd5 !== oldFileMd5; + } else { + oldFileMd5 = md5(JSON.stringify(JSON.parse(value.toString()))); + save = (isEmpty(value)) || newFileMd5 !== oldFileMd5; + } + } + if (save) { + overWriteFile(filePath, resultSave).then(() => { + console.log("保存成功" + filePath) + // 修改文件Md5 + dispatch(updateFileMd5({filePath, "fileMd5": newFileMd5})) + // messageApi.open({type:"success",content:"保存成功:" + filePath,duration:1}) + message.success("保存成功:" + filePath) + }) + } + }).catch(error => + console.error(error) + ) } - // 后期不再读取文件,直接读取文件MD5 - importFile(filePath).then(value => { - let save =true; - let oldFileMd5 - let newFileMd5 =md5(resultSave) - if (!isEmpty(value)){ - if (props.filePath.endsWith(".md")){ - // editorState - oldFileMd5 = md5(value.toString()); - save = (isEmpty(value)) || newFileMd5 !== oldFileMd5; - }else { - oldFileMd5 = md5(JSON.stringify(JSON.parse(value.toString()))); - save = (isEmpty(value)) || newFileMd5 !== oldFileMd5; - } - } - if (save) { - overWriteFile(filePath, resultSave).then(()=>{ - console.log("保存成功"+ filePath) - // 修改文件Md5 - dispatch(updateFileMd5({filePath,"fileMd5":newFileMd5})) - // messageApi.open({type:"success",content:"保存成功:" + filePath,duration:1}) - message.success("保存成功:" + filePath) - }) - } - }).catch(error => - console.error(error) + useEffect(() => { + ipcRenderer.on("pushHotkeys", saveFile); + let updateListener = editor.registerUpdateListener(({editorState}) => { + console.log("SaveFilePlugin:editorState", editorState) + onChange(editorState); + }) + return () => { + console.log("销毁取消监听"); + updateListener() + ipcRenderer.removeListener("pushHotkeys", saveFile) + }; + }, [editor, onChange] ) - } - - useEffect(() => { - ipcRenderer.on("pushHotkeys", saveFile); - let updateListener = editor.registerUpdateListener(({editorState}) => { - console.log("SaveFilePlugin:editorState",editorState) - onChange(editorState); - }) - return () => { - console.log("销毁取消监听"); - updateListener() - ipcRenderer.removeListener("pushHotkeys", saveFile) - }; - },[editor,onChange] - ) } export default SaveFilePlugin diff --git a/src/pages/Note/index.jsx b/src/pages/Note/index.jsx index ac663b4..769fbb5 100644 --- a/src/pages/Note/index.jsx +++ b/src/pages/Note/index.jsx @@ -20,9 +20,9 @@ const Note = () => { const newTabIndex = useRef(0); const activeKey=useSelector(state => state.tableBarItem.activeKey); - const items = useSelector(state => state.tableBarItem.data) + const itemList = useSelector(state => state.tableBarItem.data) let filePath = useSelector(state => state.dirMessage.dirTree); - + console.log("itemList",itemList) const itemTreeTab=[ { key: '1', @@ -84,33 +84,42 @@ const Note = () => { return ( - -
- }/> -
-
-

上善若水

-
-
+ {/**/} + {/*
*/} + {/* }/>*/} + {/*
*/} + {/*
*/} + {/*

上善若水

*/} + {/*
*/} + {/*
*/} - state.tableBarItem.leftTableOfContents)} items={itemTreeTab} + {/* 文件 标题 */} + state.tableBarItem.leftTableOfContents)} + items={itemTreeTab} onChange={onChangeLeftTableOfContents} - style ={{background:"#fff"}} + style ={{background:"#fff",width:'100%'}} /> - - { - return {label:item.label,children:
,key:item.key} - })} - /> -
+ + + { + return { + label:item.label, + children:
, + key:item.key + } + })} + /> +
); }; diff --git a/src/pages/Note/index.less b/src/pages/Note/index.less index 8c1c0b0..9702aa7 100644 --- a/src/pages/Note/index.less +++ b/src/pages/Note/index.less @@ -1,3 +1,6 @@ +.ant-layout .ant-layout-has-sider .css-dev-only-do-not-override-1okl62o{ + overflow: hidden; +} .HlexicalName { // 顶上有标题设置100h后下面会多处一部分 height: 100%; @@ -10,11 +13,15 @@ margin: 0; height: 100%; } -#itemTreeTabs .ant-tabs-nav{ - height: 6%; +#layout-note .ant-tabs-nav{ + //width: calc(100% - 300px); + margin: 0px 20px; +} +#itemTreeTabs .ant-tabs-nav { + height: 60px; } #itemTreeTabs .ant-tabs-content-holder{ - height: 94%; + height: calc (100%-60px); } #itemTreeTabs .ant-tabs-tab{ margin: 0; @@ -28,12 +35,12 @@ #itemTreeTabs .ant-tabs-tab-btn{ width: 100%; } -.ant-tabs-nav .ant-tabs-nav-add, -/* 显示新增标签按钮 */ -.ant-tabs-nav-operations { - display: inline-block; -} +//.ant-tabs-nav .ant-tabs-nav-add, +///* 显示新增标签按钮 */ +//.ant-tabs-nav-operations { +// display: inline-block; +//} /* 隐藏触发隐藏操作按钮的样式 */ -.ant-tabs-nav-operations-hidden { - display: none !important; -} +//.ant-tabs-nav-operations-hidden { +// display: none !important; +//}