mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-04-01 03:01:13 -04:00
fix(ui): return wrapped history in redux-remember unserialize
We intermittently get an error like this: ``` TypeError: Cannot read properties of undefined (reading 'length') ``` This error is caused by a `redux-undo`-enhanced slice being rehydrated without the extra stuff it adds to the slice to make it undoable (e.g. an array of `past` states, the `present` state, array of `future` states, and some other metadata). `redux-undo` may need to check the length of the past/future arrays as part of its internal functionality. These keys don't exist so we get the error. I'm not sure _why_ they don't exist - my understanding of `redux-undo` is that it should be checking and wrapping the state w/ the history stuff automatically. Seems to be related to `redux-remember` - may be a race condition. The solution is to ensure we wrap rehydrated state for undoable slices as we rehydrate them. I discovered the solution while troubleshooting #8314 when the changes therein somehow triggered the issue to start occuring every time instead of rarely.
This commit is contained in:
@@ -31,7 +31,7 @@ import { diff } from 'jsondiffpatch';
|
||||
import dynamicMiddlewares from 'redux-dynamic-middlewares';
|
||||
import type { SerializeFunction, UnserializeFunction } from 'redux-remember';
|
||||
import { rememberEnhancer, rememberReducer } from 'redux-remember';
|
||||
import undoable from 'redux-undo';
|
||||
import undoable, { newHistory } from 'redux-undo';
|
||||
import { serializeError } from 'serialize-error';
|
||||
import { api } from 'services/api';
|
||||
import { authToastMiddleware } from 'services/api/authToastMiddleware';
|
||||
@@ -118,6 +118,7 @@ const unserialize: UnserializeFunction = (data, key) => {
|
||||
if (!persistConfig) {
|
||||
throw new Error(`No persist config for slice "${key}"`);
|
||||
}
|
||||
let state;
|
||||
try {
|
||||
const { initialState, migrate } = persistConfig;
|
||||
const parsed = JSON.parse(data);
|
||||
@@ -141,13 +142,21 @@ const unserialize: UnserializeFunction = (data, key) => {
|
||||
},
|
||||
`Rehydrated slice "${key}"`
|
||||
);
|
||||
return transformed;
|
||||
state = transformed;
|
||||
} catch (err) {
|
||||
log.warn(
|
||||
{ error: serializeError(err as Error) },
|
||||
`Error rehydrating slice "${key}", falling back to default initial state`
|
||||
);
|
||||
return persistConfig.initialState;
|
||||
state = persistConfig.initialState;
|
||||
}
|
||||
|
||||
// If the slice is undoable, we need to wrap it in a new history - only nodes and canvas are undoable at the moment.
|
||||
// TODO(psyche): make this automatic & remove the hard-coding for specific slices.
|
||||
if (key === nodesSlice.name || key === canvasSlice.name) {
|
||||
return newHistory([], state, []);
|
||||
} else {
|
||||
return state;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user