Skip to content

Commit f030888

Browse files
authored
Merge pull request #207 from dgageot/improve-progress-bar
Improve progress bar
2 parents dfddf36 + 9979b2f commit f030888

File tree

6 files changed

+36
-51
lines changed

6 files changed

+36
-51
lines changed

src/extension/ui/src/App.tsx

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { createDockerDesktopClient } from '@docker/extension-api-client';
2-
import { useEffect, useCallback, memo } from 'react';
2+
import { memo, useCallback, useEffect } from 'react';
33

44
import { CatalogGrid } from './components/CatalogGrid';
55
import LoadingState from './components/LoadingState';
66
import { useCatalogAll } from './queries/useCatalog';
77
import { useConfig } from './queries/useConfig';
8-
import { useMCPClient } from './queries/useMCPClient';
98
import { useRequiredImages } from './queries/useRequiredImages';
109
import { useSecrets } from './queries/useSecrets';
1110
import { syncRegistryWithConfig } from './Registry';
@@ -20,7 +19,6 @@ export function App() {
2019
// Use hooks directly in the component
2120
const catalogAll = useCatalogAll(client);
2221
const requiredImages = useRequiredImages(client);
23-
const mcpClient = useMCPClient(client);
2422
const config = useConfig(client);
2523
const secrets = useSecrets(client);
2624

@@ -33,24 +31,22 @@ export function App() {
3331

3432
// Create a context-like combined props object to pass to children
3533
const appProps = {
36-
// Catalog related props
37-
...catalogAll,
34+
imagesLoading: requiredImages.imagesLoading,
35+
configLoading: config.configLoading,
36+
secretsLoading: secrets.isLoading,
37+
catalogLoading: catalogAll.catalogLoading,
38+
registryLoading: catalogAll.registryLoading,
3839

39-
// Required images props
40-
...requiredImages,
41-
42-
// MCP Client props
43-
...mcpClient,
44-
45-
// Config props
46-
...config,
40+
catalogItems: catalogAll.catalogItems,
41+
registryItems: catalogAll.registryItems,
4742
};
4843

4944
const isLoading =
45+
requiredImages.imagesLoading ||
46+
config.configLoading ||
47+
secrets.isLoading ||
5048
catalogAll.catalogLoading ||
51-
catalogAll.registryLoading ||
52-
requiredImages.isLoading ||
53-
secrets.isLoading;
49+
catalogAll.registryLoading;
5450

5551
useEffect(() => {
5652
syncRegistry();

src/extension/ui/src/components/LoadingState.tsx

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,23 @@ interface LoadingStateProps {
1010
}
1111

1212
const LoadingState: React.FC<LoadingStateProps> = ({ appProps }) => {
13-
// Extract the loading states from appProps
14-
const { secretsLoading, catalogLoading, registryLoading } = appProps;
15-
const { imageStates, isLoading: imagesLoading } = appProps;
16-
const { configLoading } = appProps;
17-
18-
// Determine if any loading is happening
19-
const isLoading = secretsLoading || catalogLoading || registryLoading || imagesLoading || configLoading;
20-
13+
const { imagesLoading, configLoading, secretsLoading, catalogLoading, registryLoading } = appProps;
2114
const [progress, setProgress] = useState(0);
15+
const isLoading = imagesLoading || configLoading || secretsLoading || catalogLoading || registryLoading;
2216

2317
useEffect(() => {
24-
const imageProgressTotal = imagesLoading ? 100 : 0;
25-
const configProgressTotal = configLoading ? 100 : 0;
26-
const secretsProgressTotal = secretsLoading ? 100 : 0;
27-
const catalogProgressTotal = catalogLoading ? 100 : 0;
28-
const registryProgressTotal = registryLoading ? 100 : 0;
18+
const progress = [
19+
imagesLoading ? 0 : 100,
20+
configLoading ? 0 : 100,
21+
secretsLoading ? 0 : 100,
22+
catalogLoading ? 0 : 100,
23+
registryLoading ? 0 : 100,
24+
]
25+
26+
const progressPercent = Math.round(progress.reduce((a, b) => a + b) / progress.length);
2927

30-
const totalLoadedProgress = imageProgressTotal + configProgressTotal + secretsProgressTotal + catalogProgressTotal + registryProgressTotal;
31-
const totalPossibleProgress = 500;
32-
setProgress(Math.round((totalLoadedProgress / totalPossibleProgress) * 100));
33-
}, [imageStates, configLoading, secretsLoading, catalogLoading, registryLoading]);
28+
setProgress(progressPercent);
29+
}, [imagesLoading, configLoading, secretsLoading, catalogLoading, registryLoading]);
3430

3531
if (!isLoading) return null;
3632

src/extension/ui/src/queries/useCatalog.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { useCallback, useEffect, useMemo, useState } from "react";
44
import { parse, stringify } from "yaml";
55
import {
66
CATALOG_URL,
7-
POLL_INTERVAL,
87
REGISTRY_YAML
98
} from "../Constants";
109
import { writeToPromptsVolume } from "../FileUtils";
@@ -72,7 +71,6 @@ function useCatalog(client: v1.DockerDesktopClient) {
7271
refetch: refetchCatalog,
7372
} = useQuery({
7473
queryKey: ["catalog"],
75-
enabled: !secretsLoading && !registryLoading && !configLoading,
7674
queryFn: async () => {
7775
const response = await fetch(
7876
localStorage.getItem("catalogUrl") || CATALOG_URL
@@ -173,10 +171,7 @@ function useRegistry(client: v1.DockerDesktopClient) {
173171
setCanRegister(true);
174172
throw error;
175173
}
176-
},
177-
refetchInterval: POLL_INTERVAL,
178-
staleTime: 30000,
179-
gcTime: 300000,
174+
}
180175
});
181176

182177
useQuery({

src/extension/ui/src/queries/useConfig.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ export function useConfig(client: v1.DockerDesktopClient) {
3737
client.desktopUI.toast.error("Failed to get stored config: " + error);
3838
throw error;
3939
}
40-
},
41-
refetchInterval: POLL_INTERVAL,
42-
staleTime: 30000,
43-
gcTime: 300000,
40+
}
4441
});
4542

4643
const saveConfigMutation = useMutation({
@@ -52,8 +49,10 @@ export function useConfig(client: v1.DockerDesktopClient) {
5249
newConfig: { [key: string]: any };
5350
}) => {
5451
try {
55-
const updatedConfig = { ...((queryClient.getQueryData(["config"]) as Record<string, any>) ||
56-
{}), [itemName]: newConfig };
52+
const updatedConfig = {
53+
...((queryClient.getQueryData(["config"]) as Record<string, any>) ||
54+
{}), [itemName]: newConfig
55+
};
5756

5857
await writeToPromptsVolume(client, 'config.yaml', stringify(updatedConfig));
5958

src/extension/ui/src/queries/useRequiredImages.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import { useEffect, useState } from "react";
33
import { BUSYBOX } from "../Constants";
44

55
export function useRequiredImages(client: v1.DockerDesktopClient) {
6-
const [isLoading, setIsLoading] = useState(false);
6+
const [imagesLoading, setImagesLoading] = useState(true);
77

88
const imageName = BUSYBOX;
99
const fetchRequiredImage = async () => {
1010
try {
1111
await client.docker.cli.exec('inspect', [imageName]);
12+
return;
1213
} catch (error) {
1314
// Ignore
1415
}
@@ -22,13 +23,12 @@ export function useRequiredImages(client: v1.DockerDesktopClient) {
2223
}
2324

2425
useEffect(() => {
25-
setIsLoading(true);
2626
fetchRequiredImage().then(() => {
27-
setIsLoading(false);
27+
setImagesLoading(false);
2828
});
2929
}, []);
3030

3131
return {
32-
isLoading,
32+
imagesLoading,
3333
};
3434
}

src/extension/ui/src/queries/useSecrets.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
import { v1 } from "@docker/extension-api-client-types";
12
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2-
import { client } from "../App";
33
import Secrets from "../Secrets";
4-
import { v1 } from "@docker/extension-api-client-types";
54
import { Secret } from "../types";
65

76
export function useSecrets(client: v1.DockerDesktopClient) {

0 commit comments

Comments
 (0)