mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
3b9426eb72
Implement `dnd-kit` for image drag and drop - vastly simplifies logic bc we can drag and drop non-serializable data (like an `ImageDTO`) - also much prettier - also will fix conflicts with file upload via OS drag and drop, bc `dnd-kit` does not use native HTML drag and drop API - Implemented for Init image, controlnet, and node editor so far More progress on the ControlNet UI
88 lines
2.3 KiB
TypeScript
88 lines
2.3 KiB
TypeScript
import React, {
|
|
lazy,
|
|
memo,
|
|
PropsWithChildren,
|
|
ReactNode,
|
|
useEffect,
|
|
} from 'react';
|
|
import { Provider } from 'react-redux';
|
|
import { store } from 'app/store/store';
|
|
import { OpenAPI } from 'services/api';
|
|
|
|
import Loading from '../../common/components/Loading/Loading';
|
|
import { addMiddleware, resetMiddlewares } from 'redux-dynamic-middlewares';
|
|
import { PartialAppConfig } from 'app/types/invokeai';
|
|
|
|
import '../../i18n';
|
|
import { socketMiddleware } from 'services/events/middleware';
|
|
import { Middleware } from '@reduxjs/toolkit';
|
|
import ImageDndContext from './ImageDnd/ImageDndContext';
|
|
|
|
const App = lazy(() => import('./App'));
|
|
const ThemeLocaleProvider = lazy(() => import('./ThemeLocaleProvider'));
|
|
|
|
interface Props extends PropsWithChildren {
|
|
apiUrl?: string;
|
|
token?: string;
|
|
config?: PartialAppConfig;
|
|
headerComponent?: ReactNode;
|
|
setIsReady?: (isReady: boolean) => void;
|
|
middleware?: Middleware[];
|
|
}
|
|
|
|
const InvokeAIUI = ({
|
|
apiUrl,
|
|
token,
|
|
config,
|
|
headerComponent,
|
|
setIsReady,
|
|
middleware,
|
|
}: Props) => {
|
|
useEffect(() => {
|
|
// configure API client token
|
|
if (token) {
|
|
OpenAPI.TOKEN = token;
|
|
}
|
|
|
|
// configure API client base url
|
|
if (apiUrl) {
|
|
OpenAPI.BASE = apiUrl;
|
|
}
|
|
|
|
// reset dynamically added middlewares
|
|
resetMiddlewares();
|
|
|
|
// TODO: at this point, after resetting the middleware, we really ought to clean up the socket
|
|
// stuff by calling `dispatch(socketReset())`. but we cannot dispatch from here as we are
|
|
// outside the provider. it's not needed until there is the possibility that we will change
|
|
// the `apiUrl`/`token` dynamically.
|
|
|
|
// rebuild socket middleware with token and apiUrl
|
|
if (middleware && middleware.length > 0) {
|
|
addMiddleware(socketMiddleware(), ...middleware);
|
|
} else {
|
|
addMiddleware(socketMiddleware());
|
|
}
|
|
}, [apiUrl, token, middleware]);
|
|
|
|
return (
|
|
<React.StrictMode>
|
|
<Provider store={store}>
|
|
<React.Suspense fallback={<Loading />}>
|
|
<ThemeLocaleProvider>
|
|
<ImageDndContext>
|
|
<App
|
|
config={config}
|
|
headerComponent={headerComponent}
|
|
setIsReady={setIsReady}
|
|
/>
|
|
</ImageDndContext>
|
|
</ThemeLocaleProvider>
|
|
</React.Suspense>
|
|
</Provider>
|
|
</React.StrictMode>
|
|
);
|
|
};
|
|
|
|
export default memo(InvokeAIUI);
|