Skip to content

Commit 686ab81

Browse files
authored
Optimize config cache (#82)
* Bring contrast fix to `expectedConfig` field * Move config to context provider and reat query * Move client updates to query store * Use new catalog state * Remove placeholder types
1 parent ea80da7 commit 686ab81

File tree

7 files changed

+430
-241
lines changed

7 files changed

+430
-241
lines changed

src/extension/ui/src/App.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Close } from '@mui/icons-material';
66
import { CatalogGrid } from './components/CatalogGrid';
77
import { POLL_INTERVAL } from './Constants';
88
import { CatalogProvider, useCatalogContext } from './context/CatalogContext';
9+
import { ConfigProvider } from './context/ConfigContext';
910
import { MCPClientProvider, useMCPClientContext } from './context/MCPClientContext';
1011
import ConfigurationModal from './components/ConfigurationModal';
1112
import { Settings as SettingsIcon } from '@mui/icons-material';
@@ -42,16 +43,18 @@ export function App() {
4243
const [configuringItem, setConfiguringItem] = useState<CatalogItemWithName | null>(null);
4344
// Wrap the entire application with our providers
4445
return (
45-
<CatalogProvider client={client}>
46-
<MCPClientProvider client={client}>
47-
<AppContent
48-
settings={settings}
49-
setSettings={setSettings}
50-
configuringItem={configuringItem}
51-
setConfiguringItem={setConfiguringItem}
52-
/>
53-
</MCPClientProvider>
54-
</CatalogProvider>
46+
<ConfigProvider client={client}>
47+
<CatalogProvider client={client}>
48+
<MCPClientProvider client={client}>
49+
<AppContent
50+
settings={settings}
51+
setSettings={setSettings}
52+
configuringItem={configuringItem}
53+
setConfiguringItem={setConfiguringItem}
54+
/>
55+
</MCPClientProvider>
56+
</CatalogProvider>
57+
</ConfigProvider>
5558
);
5659
}
5760

src/extension/ui/src/components/CatalogGrid.tsx

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { CatalogItemWithName } from './tile/Tile';
44
import { Archive, ArrowDropDown, Edit, FileCopy, FolderOpenRounded, MoreHoriz, Search, Settings, Sort, SortByAlpha, SwapVert } from '@mui/icons-material';
55
import { useCatalogContext } from '../context/CatalogContext';
66
import { useMCPClientContext } from '../context/MCPClientContext';
7+
import { useConfigContext } from '../context/ConfigContext';
78
import { createDockerDesktopClient } from '@docker/extension-api-client';
89
import { ExecResult } from '@docker/extension-api-client-types/dist/v0';
910
import YourClients from './tabs/YourClients';
@@ -38,7 +39,6 @@ export const CatalogGrid: React.FC<CatalogGridProps> = ({
3839
catalogItems,
3940
registryItems,
4041
canRegister,
41-
config,
4242
registerCatalogItem,
4343
unregisterCatalogItem,
4444
tryLoadSecrets,
@@ -53,6 +53,9 @@ export const CatalogGrid: React.FC<CatalogGridProps> = ({
5353
isLoading: mcpLoading
5454
} = useMCPClientContext();
5555

56+
const {
57+
config
58+
} = useConfigContext();
5659

5760
const [showReloadModal, setShowReloadModal] = useState<boolean>(false);
5861
const [search, setSearch] = useState<string>('');
@@ -104,11 +107,6 @@ export const CatalogGrid: React.FC<CatalogGridProps> = ({
104107
return <CircularProgress />
105108
}
106109

107-
108-
if (!config) {
109-
return <CircularProgress />
110-
}
111-
112110
const noConfiguredClients = !mcpLoading && !Object.values(mcpClientStates || {}).some(state => state.exists && state.configured);
113111

114112
return (
@@ -215,7 +213,6 @@ export const CatalogGrid: React.FC<CatalogGridProps> = ({
215213
{tab === 0 && (
216214
<ToolCatalog
217215
registryItems={registryItems}
218-
config={config}
219216
search={search}
220217
catalogItems={sortedCatalogItems}
221218
client={client}
@@ -226,12 +223,12 @@ export const CatalogGrid: React.FC<CatalogGridProps> = ({
226223
onSecretChange={tryLoadSecrets}
227224
secrets={secrets}
228225
setConfiguringItem={setConfiguringItem}
226+
config={config || {}}
229227
/>
230228
)}
231229
{tab === 1 && (
232230
<YourTools
233231
registryItems={registryItems}
234-
config={config}
235232
search={search}
236233
catalogItems={sortedCatalogItems}
237234
unregister={unregisterCatalogItem}
@@ -240,21 +237,18 @@ export const CatalogGrid: React.FC<CatalogGridProps> = ({
240237
setConfiguringItem={setConfiguringItem}
241238
canRegister={canRegister}
242239
ddVersion={ddVersion}
240+
config={config || {}}
243241
/>
244242
)}
245243
{tab === 2 && ddVersion && (
246244
<YourEnvironment
247245
secrets={secrets}
248246
ddVersion={ddVersion}
249-
config={config}
247+
config={config || {}}
250248
/>
251249
)}
252250
{tab === 3 && (
253251
<YourClients
254-
mcpClientStates={mcpClientStates || {}}
255-
onUpdate={updateMCPClientStates}
256-
setButtonsLoading={setButtonsLoading}
257-
buttonsLoading={buttonsLoading}
258252
client={client}
259253
/>
260254
)}

src/extension/ui/src/components/ConfigurationModal.tsx

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ import { useEffect, useState } from "react";
44
import { CatalogItemWithName } from "./tile/Tile";
55
import Secrets from "../Secrets";
66
import { v1 } from "@docker/extension-api-client-types";
7-
import { getStoredConfig, syncRegistryWithConfig } from "../Registry";
8-
import { stringify } from "yaml";
9-
import { escapeJSONForPlatformShell, tryRunImageSync } from "../FileWatcher";
7+
import { githubLightTheme, NodeData, githubDarkTheme, JsonEditor } from "json-edit-react";
108
import { useCatalogContext } from "../context/CatalogContext";
9+
import { useConfigContext } from "../context/ConfigContext";
1110
import { DeepObject, mergeDeep } from "../MergeDeep";
12-
import { githubLightTheme, NodeData, githubDarkTheme, JsonEditor } from "json-edit-react";
1311

1412
// Styles for the tab panel
1513
interface TabPanelProps {
@@ -142,7 +140,8 @@ const ConfigurationModal = ({
142140
catalogItem,
143141
client,
144142
}: ConfigurationModalProps) => {
145-
const { config, startPull, registryItems, tryUpdateSecrets, secrets } = useCatalogContext();
143+
const { startPull, registryItems, tryUpdateSecrets, secrets } = useCatalogContext();
144+
const { config, configLoading, saveConfig } = useConfigContext();
146145
const theme = useTheme();
147146

148147
// State for tabs
@@ -154,7 +153,6 @@ const ConfigurationModal = ({
154153
const [secretLoading, setSecretLoading] = useState(false);
155154

156155
// State for config
157-
const [configLoading, setConfigLoading] = useState(true);
158156
const [loadedConfig, setLoadedConfig] = useState<{ [key: string]: any }>({});
159157

160158
// Load assigned secrets
@@ -171,7 +169,6 @@ const ConfigurationModal = ({
171169
} catch (error) {
172170
console.error(error);
173171
}
174-
setConfigLoading(false);
175172
}, [catalogItem, config]);
176173

177174
// Handle tab change
@@ -181,33 +178,14 @@ const ConfigurationModal = ({
181178

182179
// Save config to YAML
183180
const saveConfigToYaml = async (newConfig: { [key: string]: any }) => {
184-
if (!registryItems || !config) {
181+
if (!registryItems) {
185182
return;
186183
}
187184
try {
188-
setConfigLoading(true);
189-
const currentStoredConfig = config;
190-
console.log('currentStoredConfig', currentStoredConfig);
191-
currentStoredConfig[catalogItem.name] = newConfig;
192-
console.log('newConfig', newConfig);
193-
const payload = escapeJSONForPlatformShell({
194-
files: [{
195-
path: 'config.yaml',
196-
content: stringify(currentStoredConfig)
197-
}]
198-
}, client.host.platform);
199-
await tryRunImageSync(client, ['--rm', '-v', 'docker-prompts:/docker-prompts', '--workdir', '/docker-prompts', 'vonwig/function_write_files:latest', payload]);
200-
console.log('Config saved successfully, syncing');
201-
await syncRegistryWithConfig(client, registryItems, currentStoredConfig);
185+
await saveConfig(catalogItem.name, newConfig);
202186
await startPull();
203-
console.log('Syncing complete');
204-
client.desktopUI.toast.success('Config saved successfully.');
205-
setTimeout(() => {
206-
setConfigLoading(false);
207-
}, 500);
208187
} catch (error) {
209188
client.desktopUI.toast.error('Failed to update config: ' + error);
210-
setConfigLoading(false);
211189
}
212190
};
213191

0 commit comments

Comments
 (0)