diff --git a/main.js b/main.js index 9d59803..11e56af 100644 --- a/main.js +++ b/main.js @@ -1,6 +1,12 @@ const {app, Menu, BrowserWindow,ipcMain,dialog} = require('electron') const path = require('path') const {menuRebuild} = require('./src/comment/TopMenu.js') +const Store = require('electron-store'); +const yaml = require('js-yaml'); + +const store = new Store(); + + const createWindow = () => { // Create the browser window. const win = new BrowserWindow({ @@ -30,19 +36,13 @@ const createWindow = () => { event.preventDefault() } // console.log('Pressed ',input.key) - if (input.key.toUpperCase() === 'F5') { + if (input.key.toUpperCase() === 'F5' && input.type.toLowerCase() === "keydown" && input.isAutoRepeat === false) { win.reload() } - if (input.key.toUpperCase() === 'F12') { - if (input.type.toLowerCase() === "keydown") { - devToolPush = true; - } else { - devToolPush = false; - } - if (win.webContents.isDevToolsOpened() && !devToolPush) { + if (input.key.toUpperCase() === 'F12' && input.type.toLowerCase() === "keydown" && input.isAutoRepeat === false) { + if (win.webContents.isDevToolsOpened()) { win.webContents.closeDevTools() - } - if (!win.webContents.isDevToolsOpened() && !devToolPush) { + }else { win.webContents.openDevTools() } } @@ -64,6 +64,19 @@ app.whenReady().then(() => { console.log("saveFileWithName") return dialog.showSaveDialog({"title":"保存文件",}) }) + ipcMain.handle("electronStoreSave",(listen,key,value)=>{ + console.log("electronStoreSave") + return store.set(key,value) + }) + ipcMain.handle("electronStoreGet",(listen,args)=>{ + console.log("electronStoreGet") + return store.get(args) + }) + ipcMain.handle("electronStoreDelete",(listen,args)=>{ + console.log("electronStoreDelete") + return store.delete(args) + }) + console.log("app.getPath('userData')",app.getPath('userData')) }) // 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此, 通常 // 对应用程序和它们的菜单栏来说应该时刻保持激活状态, diff --git a/package-lock.json b/package-lock.json index 40e890f..4bd4400 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,9 @@ "electron-store": "^8.1.0", "md5": "^2.3.0", "mousetrap": "^1.6.5", - "node-sass": "^7.0.3" + "node-sass": "^7.0.3", + "redux-persist": "^6.0.0", + "redux-persist-electron-storage": "^2.1.0" }, "devDependencies": { "@ant-design/pro-components": "^2.3.57", @@ -2613,7 +2615,6 @@ "version": "7.23.8", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.8.tgz", "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -22651,11 +22652,26 @@ "version": "4.2.1", "resolved": "https://registry.npmmirror.com/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dev": true, "dependencies": { "@babel/runtime": "^7.9.2" } }, + "node_modules/redux-persist": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/redux-persist/-/redux-persist-6.0.0.tgz", + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", + "peerDependencies": { + "redux": ">4.0.0" + } + }, + "node_modules/redux-persist-electron-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/redux-persist-electron-storage/-/redux-persist-electron-storage-2.1.0.tgz", + "integrity": "sha512-8VhAttDPqrwZlGIiHB3/PzZZChCliom8qcex8Q+eW3lHpSMkbqAaYpoedRm29e3FoVnan3VT+UV22NGFXKPmCg==", + "peerDependencies": { + "electron-store": "*" + } + }, "node_modules/redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmmirror.com/redux-thunk/-/redux-thunk-2.4.2.tgz", @@ -22703,8 +22719,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", diff --git a/package.json b/package.json index 12b2077..64320e2 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,9 @@ "electron-store": "^8.1.0", "md5": "^2.3.0", "mousetrap": "^1.6.5", - "node-sass": "^7.0.3" + "node-sass": "^7.0.3", + "redux-persist": "^6.0.0", + "redux-persist-electron-storage": "^2.1.0" }, "browser": { "fs": false diff --git a/src/components/ItemTree/index.jsx b/src/components/ItemTree/index.jsx index 6cef545..0c5b042 100644 --- a/src/components/ItemTree/index.jsx +++ b/src/components/ItemTree/index.jsx @@ -3,7 +3,7 @@ import {Input, Tree} from 'antd'; import {FolderOutlined, FileMarkdownOutlined,FileOutlined} from '@ant-design/icons'; import "./index.less" const {Search} = Input; -import store from "../../redux/store"; +import {store} from "../../redux/store"; import {clickFile} from "../../redux/clickFile_reducer"; const defaultData = []; diff --git a/src/index.js b/src/index.js index bbb3b79..a0ffe7a 100644 --- a/src/index.js +++ b/src/index.js @@ -2,16 +2,19 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; -import store from './redux/store'; +import {store,persistor} from './redux/store'; import { Provider } from 'react-redux'; import { BrowserRouter } from 'react-router-dom'; +import {PersistGate} from "redux-persist/integration/react"; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( // - - - + + + + + // ); diff --git a/src/pages/Note/Hlexical/index.jsx b/src/pages/Note/Hlexical/index.jsx index 5768b94..51e4f05 100644 --- a/src/pages/Note/Hlexical/index.jsx +++ b/src/pages/Note/Hlexical/index.jsx @@ -19,7 +19,7 @@ import {useEffect, useId, useState} from 'react'; import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext'; import {importFile, overWriteFile, saveFileWithName} from "../../../utils/File" import {CLEAR_HISTORY_COMMAND} from "lexical"; -import store from "../../../redux/store"; +import {store} from "../../../redux/store"; import {SAVE} from "../../../utils/HotkeyConst"; import md5 from "md5" import {isEmpty} from "../../../utils/ObjectUtils"; diff --git a/src/pages/Note/index.jsx b/src/pages/Note/index.jsx index 0314c22..00d4c71 100644 --- a/src/pages/Note/index.jsx +++ b/src/pages/Note/index.jsx @@ -10,7 +10,7 @@ import {Layout, Menu, Button, theme, Avatar, Tabs} from 'antd'; import Hlexical from './Hlexical'; import ItemTree from "../../components/ItemTree"; import './index.less' -import store from "../../redux/store"; +import {store} from "../../redux/store"; import {isEmpty} from "../../utils/ObjectUtils"; const {Header, Sider, Content} = Layout; diff --git a/src/redux/store.js b/src/redux/store.js index f426531..75e921d 100644 --- a/src/redux/store.js +++ b/src/redux/store.js @@ -1,17 +1,55 @@ -import { configureStore } from '@reduxjs/toolkit' +import {combineReducers, configureStore} from '@reduxjs/toolkit' import historyReducer from './historyRecord_reducer' import redirectReducer from './redirectUrl_reducer' import dirMessageReducer from './dirMessage_reducer' import clickFileReducer from './clickFile_reducer' import pushHotkeysReducer from "./pushHotkeys_reducer"; -// 用于支持异步函数 +import tableBarItemReducer from "./tableBarItem_reducer"; +import {electronStorage} from "../utils/LocalStorage"; +import { persistStore, persistReducer } from 'redux-persist' +// 持久化配置 + +const historyRecordPersistConfig = { + key: 'historyRecord', + storage: electronStorage() +} +const redirectUrlPersistConfig = { + key: 'redirectUrl', + storage: electronStorage() +} +const dirMessagePersistConfig = { + key: 'dirMessage', + storage: electronStorage() +} +const pushHotkeysPersistConfig = { + key: 'pushHotkeys', + storage: electronStorage() +} +const clickFileMessagePersistConfig = { + key: 'clickFileMessage', + storage: electronStorage() +} +const tableBarItemPersistConfig = { + key: 'tableBarItem', + storage: electronStorage() +} + + +const historyRecordPersistedReducer = persistReducer(historyRecordPersistConfig, historyReducer) +const redirectUrlPersistedReducer = persistReducer(redirectUrlPersistConfig, redirectReducer) +const dirMessagePersistedReducer = persistReducer(dirMessagePersistConfig, dirMessageReducer) +const pushHotkeysPersistedReducer = persistReducer(pushHotkeysPersistConfig, pushHotkeysReducer) +const clickFileMessagePersistedReducer = persistReducer(clickFileMessagePersistConfig, clickFileReducer) +const tableBarItemPersistedReducer = persistReducer(tableBarItemPersistConfig, tableBarItemReducer) + export const store = configureStore({ reducer: { - historyRecord:historyReducer, - redirectUrl:redirectReducer, - dirMessage:dirMessageReducer, - pushHotkeys:pushHotkeysReducer, - clickFileMessage:clickFileReducer + historyRecord:historyRecordPersistedReducer, + redirectUrl:redirectUrlPersistedReducer, + dirMessage:dirMessagePersistedReducer, + pushHotkeys:pushHotkeysPersistedReducer, + clickFileMessage:clickFileMessagePersistedReducer, + tableBarItem:tableBarItemPersistedReducer } }) -export default store \ No newline at end of file +export const persistor = persistStore(store); diff --git a/src/redux/tableBarItem_reducer.js b/src/redux/tableBarItem_reducer.js new file mode 100644 index 0000000..0c40c02 --- /dev/null +++ b/src/redux/tableBarItem_reducer.js @@ -0,0 +1,17 @@ +import { createSlice } from '@reduxjs/toolkit' + +export const tableBarItemSlice = createSlice({ + name: 'tableBarItem', + initialState: { + type:"tableBarItem", + data: [] + }, + reducers: { + tableBarItem: (state, action) => { + console.log("tableBarItemSlice:tableBarItem", state, action) + state.data=action.payload + } + } +}) +export const { tableBarItem } = tableBarItemSlice.actions +export default tableBarItemSlice.reducer diff --git a/src/utils/File/index.jsx b/src/utils/File/index.jsx index 654722e..c512aae 100644 --- a/src/utils/File/index.jsx +++ b/src/utils/File/index.jsx @@ -1,5 +1,5 @@ const fs = window.require("fs").promises -const {ipcRenderer,dialog} = window.require('electron') +const {ipcRenderer} = window.require('electron') export async function importFile(pathName) { return await fs.readFile(pathName) } diff --git a/src/utils/LocalStorage/index.jsx b/src/utils/LocalStorage/index.jsx index e69de29..d754d62 100644 --- a/src/utils/LocalStorage/index.jsx +++ b/src/utils/LocalStorage/index.jsx @@ -0,0 +1,18 @@ +const {ipcRenderer} = window.require('electron') + +export function electronStorage() { + return { + getItem: + (key) => { + return ipcRenderer.invoke("electronStoreGet", key) + }, + setItem: + (key, item) => { + return ipcRenderer.invoke("electronStoreSave", key, item) + }, + removeItem: + (key) => { + return ipcRenderer.invoke("electronStoreDelete", key) + } + } +} \ No newline at end of file