feat:redux-persist

This commit is contained in:
shixiaohua 2024-02-02 14:40:28 +08:00
parent b58e3f62a2
commit c9bc49e2e8
11 changed files with 138 additions and 32 deletions

33
main.js
View File

@ -1,6 +1,12 @@
const {app, Menu, BrowserWindow,ipcMain,dialog} = require('electron') const {app, Menu, BrowserWindow,ipcMain,dialog} = require('electron')
const path = require('path') const path = require('path')
const {menuRebuild} = require('./src/comment/TopMenu.js') const {menuRebuild} = require('./src/comment/TopMenu.js')
const Store = require('electron-store');
const yaml = require('js-yaml');
const store = new Store();
const createWindow = () => { const createWindow = () => {
// Create the browser window. // Create the browser window.
const win = new BrowserWindow({ const win = new BrowserWindow({
@ -30,19 +36,13 @@ const createWindow = () => {
event.preventDefault() event.preventDefault()
} }
// console.log('Pressed ',input.key) // console.log('Pressed ',input.key)
if (input.key.toUpperCase() === 'F5') { if (input.key.toUpperCase() === 'F5' && input.type.toLowerCase() === "keydown" && input.isAutoRepeat === false) {
win.reload() win.reload()
} }
if (input.key.toUpperCase() === 'F12') { if (input.key.toUpperCase() === 'F12' && input.type.toLowerCase() === "keydown" && input.isAutoRepeat === false) {
if (input.type.toLowerCase() === "keydown") { if (win.webContents.isDevToolsOpened()) {
devToolPush = true;
} else {
devToolPush = false;
}
if (win.webContents.isDevToolsOpened() && !devToolPush) {
win.webContents.closeDevTools() win.webContents.closeDevTools()
} }else {
if (!win.webContents.isDevToolsOpened() && !devToolPush) {
win.webContents.openDevTools() win.webContents.openDevTools()
} }
} }
@ -64,6 +64,19 @@ app.whenReady().then(() => {
console.log("saveFileWithName") console.log("saveFileWithName")
return dialog.showSaveDialog({"title":"保存文件",}) 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 外,当所有窗口都被关闭的时候退出程序。 因此, 通常 // 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此, 通常
// 对应用程序和它们的菜单栏来说应该时刻保持激活状态, // 对应用程序和它们的菜单栏来说应该时刻保持激活状态,

25
package-lock.json generated
View File

@ -13,7 +13,9 @@
"electron-store": "^8.1.0", "electron-store": "^8.1.0",
"md5": "^2.3.0", "md5": "^2.3.0",
"mousetrap": "^1.6.5", "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": { "devDependencies": {
"@ant-design/pro-components": "^2.3.57", "@ant-design/pro-components": "^2.3.57",
@ -2613,7 +2615,6 @@
"version": "7.23.8", "version": "7.23.8",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.8.tgz", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.8.tgz",
"integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
"dev": true,
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
}, },
@ -22651,11 +22652,26 @@
"version": "4.2.1", "version": "4.2.1",
"resolved": "https://registry.npmmirror.com/redux/-/redux-4.2.1.tgz", "resolved": "https://registry.npmmirror.com/redux/-/redux-4.2.1.tgz",
"integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
"dev": true,
"dependencies": { "dependencies": {
"@babel/runtime": "^7.9.2" "@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": { "node_modules/redux-thunk": {
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmmirror.com/redux-thunk/-/redux-thunk-2.4.2.tgz", "resolved": "https://registry.npmmirror.com/redux-thunk/-/redux-thunk-2.4.2.tgz",
@ -22703,8 +22719,7 @@
"node_modules/regenerator-runtime": { "node_modules/regenerator-runtime": {
"version": "0.14.1", "version": "0.14.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
"dev": true
}, },
"node_modules/regenerator-transform": { "node_modules/regenerator-transform": {
"version": "0.15.2", "version": "0.15.2",

View File

@ -53,7 +53,9 @@
"electron-store": "^8.1.0", "electron-store": "^8.1.0",
"md5": "^2.3.0", "md5": "^2.3.0",
"mousetrap": "^1.6.5", "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": { "browser": {
"fs": false "fs": false

View File

@ -3,7 +3,7 @@ import {Input, Tree} from 'antd';
import {FolderOutlined, FileMarkdownOutlined,FileOutlined} from '@ant-design/icons'; import {FolderOutlined, FileMarkdownOutlined,FileOutlined} from '@ant-design/icons';
import "./index.less" import "./index.less"
const {Search} = Input; const {Search} = Input;
import store from "../../redux/store"; import {store} from "../../redux/store";
import {clickFile} from "../../redux/clickFile_reducer"; import {clickFile} from "../../redux/clickFile_reducer";
const defaultData = []; const defaultData = [];

View File

@ -2,16 +2,19 @@ import React from 'react';
import ReactDOM from 'react-dom/client'; import ReactDOM from 'react-dom/client';
import './index.css'; import './index.css';
import App from './App'; import App from './App';
import store from './redux/store'; import {store,persistor} from './redux/store';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom'; import { BrowserRouter } from 'react-router-dom';
import {PersistGate} from "redux-persist/integration/react";
const root = ReactDOM.createRoot(document.getElementById('root')); const root = ReactDOM.createRoot(document.getElementById('root'));
root.render( root.render(
// <React.StrictMode> // <React.StrictMode>
<Provider store={store}> <Provider store={store}>
<BrowserRouter> <PersistGate loading={null} persistor={persistor}>
<App /> <BrowserRouter>
</BrowserRouter> <App />
</BrowserRouter>
</PersistGate>
</Provider> </Provider>
// </React.StrictMode> // </React.StrictMode>
); );

View File

@ -19,7 +19,7 @@ import {useEffect, useId, useState} from 'react';
import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext'; import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
import {importFile, overWriteFile, saveFileWithName} from "../../../utils/File" import {importFile, overWriteFile, saveFileWithName} from "../../../utils/File"
import {CLEAR_HISTORY_COMMAND} from "lexical"; import {CLEAR_HISTORY_COMMAND} from "lexical";
import store from "../../../redux/store"; import {store} from "../../../redux/store";
import {SAVE} from "../../../utils/HotkeyConst"; import {SAVE} from "../../../utils/HotkeyConst";
import md5 from "md5" import md5 from "md5"
import {isEmpty} from "../../../utils/ObjectUtils"; import {isEmpty} from "../../../utils/ObjectUtils";

View File

@ -10,7 +10,7 @@ import {Layout, Menu, Button, theme, Avatar, Tabs} from 'antd';
import Hlexical from './Hlexical'; import Hlexical from './Hlexical';
import ItemTree from "../../components/ItemTree"; import ItemTree from "../../components/ItemTree";
import './index.less' import './index.less'
import store from "../../redux/store"; import {store} from "../../redux/store";
import {isEmpty} from "../../utils/ObjectUtils"; import {isEmpty} from "../../utils/ObjectUtils";
const {Header, Sider, Content} = Layout; const {Header, Sider, Content} = Layout;

View File

@ -1,17 +1,55 @@
import { configureStore } from '@reduxjs/toolkit' import {combineReducers, configureStore} from '@reduxjs/toolkit'
import historyReducer from './historyRecord_reducer' import historyReducer from './historyRecord_reducer'
import redirectReducer from './redirectUrl_reducer' import redirectReducer from './redirectUrl_reducer'
import dirMessageReducer from './dirMessage_reducer' import dirMessageReducer from './dirMessage_reducer'
import clickFileReducer from './clickFile_reducer' import clickFileReducer from './clickFile_reducer'
import pushHotkeysReducer from "./pushHotkeys_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({ export const store = configureStore({
reducer: { reducer: {
historyRecord:historyReducer, historyRecord:historyRecordPersistedReducer,
redirectUrl:redirectReducer, redirectUrl:redirectUrlPersistedReducer,
dirMessage:dirMessageReducer, dirMessage:dirMessagePersistedReducer,
pushHotkeys:pushHotkeysReducer, pushHotkeys:pushHotkeysPersistedReducer,
clickFileMessage:clickFileReducer clickFileMessage:clickFileMessagePersistedReducer,
tableBarItem:tableBarItemPersistedReducer
} }
}) })
export default store export const persistor = persistStore(store);

View File

@ -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

View File

@ -1,5 +1,5 @@
const fs = window.require("fs").promises const fs = window.require("fs").promises
const {ipcRenderer,dialog} = window.require('electron') const {ipcRenderer} = window.require('electron')
export async function importFile(pathName) { export async function importFile(pathName) {
return await fs.readFile(pathName) return await fs.readFile(pathName)
} }

View File

@ -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)
}
}
}