feat:redux-persist
This commit is contained in:
parent
b58e3f62a2
commit
c9bc49e2e8
33
main.js
33
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 外,当所有窗口都被关闭的时候退出程序。 因此, 通常
|
||||
// 对应用程序和它们的菜单栏来说应该时刻保持激活状态,
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = [];
|
||||
|
|
|
@ -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(
|
||||
// <React.StrictMode>
|
||||
<Provider store={store}>
|
||||
<PersistGate loading={null} persistor={persistor}>
|
||||
<BrowserRouter>
|
||||
<App />
|
||||
</BrowserRouter>
|
||||
</PersistGate>
|
||||
</Provider>
|
||||
// </React.StrictMode>
|
||||
);
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
export const persistor = persistStore(store);
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue