import { Box, useGlobalModifiersInit } from '@invoke-ai/ui-library'; import { GlobalImageHotkeys } from 'app/components/GlobalImageHotkeys'; import type { StudioInitAction } from 'app/hooks/useStudioInitAction'; import { useStudioInitAction } from 'app/hooks/useStudioInitAction'; import { useSyncQueueStatus } from 'app/hooks/useSyncQueueStatus'; import { useLogger } from 'app/logging/useLogger'; import { useSyncLoggingConfig } from 'app/logging/useSyncLoggingConfig'; import { appStarted } from 'app/store/middleware/listenerMiddleware/listeners/appStarted'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import type { PartialAppConfig } from 'app/types/invokeai'; import { useFocusRegionWatcher } from 'common/hooks/focus'; import { useClearStorage } from 'common/hooks/useClearStorage'; import { useGlobalHotkeys } from 'common/hooks/useGlobalHotkeys'; import ChangeBoardModal from 'features/changeBoardModal/components/ChangeBoardModal'; import { NewCanvasSessionDialog, NewGallerySessionDialog, } from 'features/controlLayers/components/NewSessionConfirmationAlertDialog'; import DeleteImageModal from 'features/deleteImageModal/components/DeleteImageModal'; import { FullscreenDropzone } from 'features/dnd/FullscreenDropzone'; import { DynamicPromptsModal } from 'features/dynamicPrompts/components/DynamicPromptsPreviewModal'; import DeleteBoardModal from 'features/gallery/components/Boards/DeleteBoardModal'; import { ImageContextMenu } from 'features/gallery/components/ImageContextMenu/ImageContextMenu'; import { useStarterModelsToast } from 'features/modelManagerV2/hooks/useStarterModelsToast'; import { ShareWorkflowModal } from 'features/nodes/components/sidePanel/WorkflowListMenu/ShareWorkflowModal'; import { ClearQueueConfirmationsAlertDialog } from 'features/queue/components/ClearQueueConfirmationAlertDialog'; import { DeleteStylePresetDialog } from 'features/stylePresets/components/DeleteStylePresetDialog'; import { StylePresetModal } from 'features/stylePresets/components/StylePresetForm/StylePresetModal'; import RefreshAfterResetModal from 'features/system/components/SettingsModal/RefreshAfterResetModal'; import { configChanged } from 'features/system/store/configSlice'; import { selectLanguage } from 'features/system/store/systemSelectors'; import { AppContent } from 'features/ui/components/AppContent'; import { DeleteWorkflowDialog } from 'features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog'; import { NewWorkflowConfirmationAlertDialog } from 'features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog'; import i18n from 'i18n'; import { size } from 'lodash-es'; import { memo, useCallback, useEffect } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; import { useGetOpenAPISchemaQuery } from 'services/api/endpoints/appInfo'; import { useSocketIO } from 'services/events/useSocketIO'; import AppErrorBoundaryFallback from './AppErrorBoundaryFallback'; const DEFAULT_CONFIG = {}; interface Props { config?: PartialAppConfig; studioInitAction?: StudioInitAction; } const App = ({ config = DEFAULT_CONFIG, studioInitAction }: Props) => { const language = useAppSelector(selectLanguage); const logger = useLogger('system'); const dispatch = useAppDispatch(); const clearStorage = useClearStorage(); // singleton! useSocketIO(); useGlobalModifiersInit(); useGlobalHotkeys(); useGetOpenAPISchemaQuery(); useSyncLoggingConfig(); const handleReset = useCallback(() => { clearStorage(); location.reload(); return false; }, [clearStorage]); useEffect(() => { i18n.changeLanguage(language); }, [language]); useEffect(() => { if (size(config)) { logger.info({ config }, 'Received config'); dispatch(configChanged(config)); } }, [dispatch, config, logger]); useEffect(() => { dispatch(appStarted()); }, [dispatch]); useStudioInitAction(studioInitAction); useStarterModelsToast(); useSyncQueueStatus(); useFocusRegionWatcher(); return ( ); }; export default memo(App);