diff --git a/src/main/ipc/handlers.ts b/src/main/ipc/handlers.ts index 126bbae..d4d34f8 100644 --- a/src/main/ipc/handlers.ts +++ b/src/main/ipc/handlers.ts @@ -842,7 +842,7 @@ export function registerIpcHandlers(): void { return engine.getAllForProject(); }); - safeHandle('importDefinitions:update', async (_, id: string, updates: any) => { + safeHandle('importDefinitions:update', async (event, id: string, updates: any) => { const { ImportDefinitionEngine } = await import('../engine/ImportDefinitionEngine'); const engine = new ImportDefinitionEngine(); const projectEngine = getProjectEngine(); @@ -850,7 +850,12 @@ export function registerIpcHandlers(): void { if (activeProject) { engine.setProjectContext(activeProject.id); } - return engine.updateDefinition(id, updates); + const result = await engine.updateDefinition(id, updates); + // Notify renderer of name changes for sidebar/tab updates + if (result && updates.name !== undefined) { + event.sender.send('importDefinition-name-updated', { definitionId: id, name: result.name }); + } + return result; }); safeHandle('importDefinitions:delete', async (_, id: string) => { diff --git a/src/main/preload.ts b/src/main/preload.ts index f8c52b5..046427c 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -164,6 +164,11 @@ contextBridge.exposeInMainWorld('electronAPI', { getAll: () => ipcRenderer.invoke('importDefinitions:getAll'), update: (id: string, updates: unknown) => ipcRenderer.invoke('importDefinitions:update', id, updates), delete: (id: string) => ipcRenderer.invoke('importDefinitions:delete', id), + onNameUpdated: (callback: (data: { definitionId: string; name: string }) => void) => { + const subscription = (_event: Electron.IpcRendererEvent, data: { definitionId: string; name: string }) => callback(data); + ipcRenderer.on('importDefinition-name-updated', subscription); + return () => ipcRenderer.removeListener('importDefinition-name-updated', subscription); + }, }, // AI Chat (OpenCode Zen API integration) diff --git a/src/renderer/components/Sidebar/Sidebar.tsx b/src/renderer/components/Sidebar/Sidebar.tsx index ee44bb3..ddb36b3 100644 --- a/src/renderer/components/Sidebar/Sidebar.tsx +++ b/src/renderer/components/Sidebar/Sidebar.tsx @@ -1293,6 +1293,23 @@ const ImportList: React.FC = () => { init(); }, [loadDefinitions]); + // Listen for import definition name updates + useEffect(() => { + const unsub = window.electronAPI?.importDefinitions.onNameUpdated((data) => { + setDefinitions(prev => + prev.map(def => + def.id === data.definitionId + ? { ...def, name: data.name } + : def + ) + ); + }); + + return () => { + unsub?.(); + }; + }, []); + const handleNewDefinition = async () => { try { const def = await window.electronAPI?.importDefinitions.create(); diff --git a/src/renderer/components/TabBar/TabBar.tsx b/src/renderer/components/TabBar/TabBar.tsx index 5e7d145..efa5fc8 100644 --- a/src/renderer/components/TabBar/TabBar.tsx +++ b/src/renderer/components/TabBar/TabBar.tsx @@ -204,6 +204,21 @@ export const TabBar: React.FC = () => { fetchTitles(); }, [tabs]); // Note: intentionally not including importDefTitles to avoid infinite loops + // Listen for import definition name updates + useEffect(() => { + const unsub = window.electronAPI?.importDefinitions.onNameUpdated((data) => { + setImportDefTitles(prev => { + const newTitles = new Map(prev); + newTitles.set(data.definitionId, data.name); + return newTitles; + }); + }); + + return () => { + unsub?.(); + }; + }, []); + // Check if arrows are needed based on scroll position const updateArrowVisibility = useCallback(() => { const container = tabsContainerRef.current; diff --git a/src/renderer/types/electron.d.ts b/src/renderer/types/electron.d.ts index f1f5aa5..9180e8f 100644 --- a/src/renderer/types/electron.d.ts +++ b/src/renderer/types/electron.d.ts @@ -403,6 +403,7 @@ export interface ElectronAPI { getAll: () => Promise; update: (id: string, updates: Partial>) => Promise; delete: (id: string) => Promise; + onNameUpdated: (callback: (data: { definitionId: string; name: string }) => void) => () => void; }; chat: { // API Key Management