feat(ui): move socket event handling out of redux

Download events and invocation status events (including progress images) are very frequent. There's no real need for these to pass through redux. Handling them outside redux is a significant performance win - far fewer store subscription calls, far fewer trips through middleware.

All event handling is moved outside middleware. Cleanup of unused actions and listeners to follow.
This commit is contained in:
psychedelicious
2024-08-17 15:30:55 +10:00
parent c38fe8025d
commit cea7890a67
32 changed files with 857 additions and 301 deletions

View File

@ -1,4 +1,5 @@
import { useStore } from '@nanostores/react';
import { $isConnected } from 'app/hooks/useSocketIO';
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
import { useAppSelector } from 'app/store/storeHooks';
import { selectCanvasV2Slice } from 'features/controlLayers/store/canvasV2Slice';
@ -25,7 +26,7 @@ const LAYER_TYPE_TO_TKEY = {
control_layer: 'controlLayers.globalControlAdapter',
} as const;
const createSelector = (templates: Templates) =>
const createSelector = (templates: Templates, isConnected: boolean) =>
createMemoizedSelector(
[
selectSystemSlice,
@ -41,8 +42,6 @@ const createSelector = (templates: Templates) =>
const { bbox } = canvasV2;
const { model, positivePrompt } = canvasV2.params;
const { isConnected } = system;
const reasons: { prefix?: string; content: string }[] = [];
// Cannot generate if not connected
@ -240,7 +239,8 @@ const createSelector = (templates: Templates) =>
export const useIsReadyToEnqueue = () => {
const templates = useStore($templates);
const selector = useMemo(() => createSelector(templates), [templates]);
const isConnected = useStore($isConnected)
const selector = useMemo(() => createSelector(templates, isConnected), [templates, isConnected]);
const value = useAppSelector(selector);
return value;
};