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 {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 外,当所有窗口都被关闭的时候退出程序。 因此, 通常
|
||||||
// 对应用程序和它们的菜单栏来说应该时刻保持激活状态,
|
// 对应用程序和它们的菜单栏来说应该时刻保持激活状态,
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = [];
|
||||||
|
|
11
src/index.js
11
src/index.js
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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