Skip to content

Commit 4546b5f

Browse files
feat(ui): show progress bar animation while models are loading (#9058)
Model load events are already emitted by the backend but were only logged in the frontend. Track a loading counter via model_load_started / model_load_complete and flip the existing ProgressBar into indeterminate mode while any model is loading, so users get visual feedback that something is happening.
1 parent c83f293 commit 4546b5f

3 files changed

Lines changed: 14 additions & 3 deletions

File tree

invokeai/frontend/web/src/features/system/components/ProgressBar.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import { useStore } from '@nanostores/react';
44
import { memo, useMemo } from 'react';
55
import { useTranslation } from 'react-i18next';
66
import { useGetQueueStatusQuery } from 'services/api/endpoints/queue';
7-
import { $isConnected, $lastProgressEvent } from 'services/events/stores';
7+
import { $isConnected, $lastProgressEvent, $loadingModelsCount } from 'services/events/stores';
88

99
const ProgressBar = (props: ProgressProps) => {
1010
const { t } = useTranslation();
1111
const { data: queueStatus } = useGetQueueStatusQuery();
1212
const isConnected = useStore($isConnected);
1313
const lastProgressEvent = useStore($lastProgressEvent);
14+
const loadingModelsCount = useStore($loadingModelsCount);
1415
const value = useMemo(() => {
1516
if (!lastProgressEvent) {
1617
return 0;
@@ -23,6 +24,10 @@ const ProgressBar = (props: ProgressProps) => {
2324
return false;
2425
}
2526

27+
if (loadingModelsCount > 0) {
28+
return true;
29+
}
30+
2631
if (!queueStatus?.queue.in_progress) {
2732
return false;
2833
}
@@ -40,7 +45,7 @@ const ProgressBar = (props: ProgressProps) => {
4045
}
4146

4247
return false;
43-
}, [isConnected, lastProgressEvent, queueStatus?.queue.in_progress]);
48+
}, [isConnected, lastProgressEvent, queueStatus?.queue.in_progress, loadingModelsCount]);
4449

4550
return (
4651
<Progress

invokeai/frontend/web/src/services/events/setEventListeners.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import type { ClientToServerEvents, ServerToClientEvents } from 'services/events
4343
import type { Socket } from 'socket.io-client';
4444
import type { JsonObject } from 'type-fest';
4545

46-
import { $lastProgressEvent } from './stores';
46+
import { $lastProgressEvent, $loadingModelsCount } from './stores';
4747

4848
const log = logger('events');
4949

@@ -73,12 +73,14 @@ export const setEventListeners = ({ socket, store, setIsConnected }: SetEventLis
7373
socket.emit('subscribe_queue', { queue_id: 'default' });
7474
socket.emit('subscribe_bulk_download', { bulk_download_id: 'default' });
7575
$lastProgressEvent.set(null);
76+
$loadingModelsCount.set(0);
7677
});
7778

7879
socket.on('connect_error', (error) => {
7980
log.debug('Connect error');
8081
setIsConnected(false);
8182
$lastProgressEvent.set(null);
83+
$loadingModelsCount.set(0);
8284
if (error && error.message) {
8385
const data: string | undefined = (error as unknown as { data: string | undefined }).data;
8486
if (data === 'ERR_UNAUTHENTICATED') {
@@ -95,6 +97,7 @@ export const setEventListeners = ({ socket, store, setIsConnected }: SetEventLis
9597
socket.on('disconnect', () => {
9698
log.debug('Disconnected');
9799
$lastProgressEvent.set(null);
100+
$loadingModelsCount.set(0);
98101
setIsConnected(false);
99102
});
100103

@@ -183,6 +186,7 @@ export const setEventListeners = ({ socket, store, setIsConnected }: SetEventLis
183186
const message = `Model load started: ${name} (${extras.join(', ')})`;
184187

185188
log.debug({ data }, message);
189+
$loadingModelsCount.set($loadingModelsCount.get() + 1);
186190
});
187191

188192
socket.on('model_load_complete', (data) => {
@@ -197,6 +201,7 @@ export const setEventListeners = ({ socket, store, setIsConnected }: SetEventLis
197201
const message = `Model load complete: ${name} (${extras.join(', ')})`;
198202

199203
log.debug({ data }, message);
204+
$loadingModelsCount.set(Math.max(0, $loadingModelsCount.get() - 1));
200205
});
201206

202207
socket.on('download_started', (data) => {

invokeai/frontend/web/src/services/events/stores.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { AppSocket } from 'services/events/types';
66
export const $socket = atom<AppSocket | null>(null);
77
export const $isConnected = atom<boolean>(false);
88
export const $lastProgressEvent = atom<S['InvocationProgressEvent'] | null>(null);
9+
export const $loadingModelsCount = atom<number>(0);
910

1011
export const $lastProgressMessage = computed($lastProgressEvent, (val) => {
1112
if (!val) {

0 commit comments

Comments
 (0)