44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import { ToolkitStore } from "@reduxjs/toolkit/dist/configureStore"
|
|
|
|
const storageKey = '_aura'
|
|
|
|
export const backupStore = (store: ToolkitStore) => {
|
|
const saveState = () => {
|
|
const state = store.getState()
|
|
try {
|
|
const serializedState = serialize(state)
|
|
localStorage.setItem(storageKey, serializedState)
|
|
} catch (err) {
|
|
console.error('Error while saving state', err)
|
|
}
|
|
}
|
|
|
|
window.addEventListener('beforeunload', saveState)
|
|
document.addEventListener('visibilitychange', () => {
|
|
if (document.visibilityState === 'hidden') {
|
|
saveState()
|
|
}
|
|
})
|
|
|
|
return () => {
|
|
window.removeEventListener('beforeunload', saveState)
|
|
document.removeEventListener('visibilitychange', saveState)
|
|
}
|
|
}
|
|
export const loadStore = () => {
|
|
try {
|
|
const serializedState = localStorage.getItem(storageKey)
|
|
return serializedState === null ? undefined : deserialize(serializedState)
|
|
} catch (err) {
|
|
return undefined
|
|
}
|
|
}
|
|
|
|
function serialize(data: object): string {
|
|
return btoa(encodeURIComponent(JSON.stringify(data)))
|
|
}
|
|
|
|
function deserialize(b64: string): object {
|
|
return JSON.parse(decodeURIComponent(atob(b64)))
|
|
}
|