From cd354aebedebe5380ccc5a4917268b4d756fe80c Mon Sep 17 00:00:00 2001 From: Tommaso Sciortino Date: Thu, 9 Oct 2025 11:07:25 -0700 Subject: [PATCH] Fix hooks to avoid unnecessary re-renders (#10820) --- packages/cli/src/ui/AppContainer.tsx | 8 ++++- .../cli/src/ui/hooks/useHistoryManager.ts | 19 +++++++----- .../cli/src/ui/hooks/useWorkspaceMigration.ts | 30 ++++++++++++------- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/ui/AppContainer.tsx b/packages/cli/src/ui/AppContainer.tsx index b11ef38863..eb03394611 100644 --- a/packages/cli/src/ui/AppContainer.tsx +++ b/packages/cli/src/ui/AppContainer.tsx @@ -1239,6 +1239,11 @@ Logging in with Google... Please restart Gemini CLI to continue. ], ); + const exitPrivacyNotice = useCallback( + () => setShowPrivacyNotice(false), + [setShowPrivacyNotice], + ); + const uiActions: UIActions = useMemo( () => ({ handleThemeSelect, @@ -1248,7 +1253,7 @@ Logging in with Google... Please restart Gemini CLI to continue. onAuthError, handleEditorSelect, exitEditorDialog, - exitPrivacyNotice: () => setShowPrivacyNotice(false), + exitPrivacyNotice, closeSettingsDialog, closeModelDialog, closePermissionsDialog, @@ -1273,6 +1278,7 @@ Logging in with Google... Please restart Gemini CLI to continue. onAuthError, handleEditorSelect, exitEditorDialog, + exitPrivacyNotice, closeSettingsDialog, closeModelDialog, closePermissionsDialog, diff --git a/packages/cli/src/ui/hooks/useHistoryManager.ts b/packages/cli/src/ui/hooks/useHistoryManager.ts index cc7ed5575e..c25fc84a29 100644 --- a/packages/cli/src/ui/hooks/useHistoryManager.ts +++ b/packages/cli/src/ui/hooks/useHistoryManager.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { useState, useRef, useCallback } from 'react'; +import { useState, useRef, useCallback, useMemo } from 'react'; import type { HistoryItem } from '../types.js'; // Type for the updater function passed to updateHistoryItem @@ -101,11 +101,14 @@ export function useHistory(): UseHistoryManagerReturn { messageIdCounterRef.current = 0; }, []); - return { - history, - addItem, - updateItem, - clearItems, - loadHistory, - }; + return useMemo( + () => ({ + history, + addItem, + updateItem, + clearItems, + loadHistory, + }), + [history, addItem, updateItem, clearItems, loadHistory], + ); } diff --git a/packages/cli/src/ui/hooks/useWorkspaceMigration.ts b/packages/cli/src/ui/hooks/useWorkspaceMigration.ts index e4312d9ea2..2183f41ab3 100644 --- a/packages/cli/src/ui/hooks/useWorkspaceMigration.ts +++ b/packages/cli/src/ui/hooks/useWorkspaceMigration.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useCallback, useMemo } from 'react'; import type { GeminiCLIExtension } from '@google/gemini-cli-core'; import { getWorkspaceExtensions } from '../../config/extension.js'; import { type LoadedSettings, SettingScope } from '../../config/settings.js'; @@ -37,7 +37,7 @@ export function useWorkspaceMigration(settings: LoadedSettings) { settings.merged.experimental?.extensionManagement, ]); - const onWorkspaceMigrationDialogOpen = () => { + const onWorkspaceMigrationDialogOpen = useCallback(() => { const userSettings = settings.forScope(SettingScope.User); const extensionSettings = userSettings.settings.extensions || { disabled: [], @@ -53,16 +53,24 @@ export function useWorkspaceMigration(settings: LoadedSettings) { extensionSettings.workspacesWithMigrationNudge = workspacesWithMigrationNudge; settings.setValue(SettingScope.User, 'extensions', extensionSettings); - }; + }, [settings]); - const onWorkspaceMigrationDialogClose = () => { + const onWorkspaceMigrationDialogClose = useCallback(() => { setShowWorkspaceMigrationDialog(false); - }; + }, [setShowWorkspaceMigrationDialog]); - return { - showWorkspaceMigrationDialog, - workspaceExtensions, - onWorkspaceMigrationDialogOpen, - onWorkspaceMigrationDialogClose, - }; + return useMemo( + () => ({ + showWorkspaceMigrationDialog, + workspaceExtensions, + onWorkspaceMigrationDialogOpen, + onWorkspaceMigrationDialogClose, + }), + [ + showWorkspaceMigrationDialog, + workspaceExtensions, + onWorkspaceMigrationDialogOpen, + onWorkspaceMigrationDialogClose, + ], + ); }