diff options
| author | Leo <[email protected]> | 2025-06-12 02:21:54 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-11 18:21:54 -0700 |
| commit | 1ef68e061213b6b170bd979d31d4805da2357272 (patch) | |
| tree | ddd91ec2a7841e763676e09765adf6f21880c2c3 /packages/cli/src/ui/hooks/useEditorSettings.ts | |
| parent | dd53e5c96aa01708a3bdb675c8a8e0d71be35651 (diff) | |
feat: External editor settings (#882)
Diffstat (limited to 'packages/cli/src/ui/hooks/useEditorSettings.ts')
| -rw-r--r-- | packages/cli/src/ui/hooks/useEditorSettings.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/packages/cli/src/ui/hooks/useEditorSettings.ts b/packages/cli/src/ui/hooks/useEditorSettings.ts new file mode 100644 index 00000000..1fe3983e --- /dev/null +++ b/packages/cli/src/ui/hooks/useEditorSettings.ts @@ -0,0 +1,75 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useState, useCallback } from 'react'; +import { LoadedSettings, SettingScope } from '../../config/settings.js'; +import { type HistoryItem, MessageType } from '../types.js'; +import { + allowEditorTypeInSandbox, + checkHasEditorType, + EditorType, +} from '@gemini-cli/core'; + +interface UseEditorSettingsReturn { + isEditorDialogOpen: boolean; + openEditorDialog: () => void; + handleEditorSelect: ( + editorType: EditorType | undefined, + scope: SettingScope, + ) => void; + exitEditorDialog: () => void; +} + +export const useEditorSettings = ( + loadedSettings: LoadedSettings, + setEditorError: (error: string | null) => void, + addItem: (item: Omit<HistoryItem, 'id'>, timestamp: number) => void, +): UseEditorSettingsReturn => { + const [isEditorDialogOpen, setIsEditorDialogOpen] = useState(false); + + const openEditorDialog = useCallback(() => { + setIsEditorDialogOpen(true); + }, []); + + const handleEditorSelect = useCallback( + (editorType: EditorType | undefined, scope: SettingScope) => { + if ( + editorType && + (!checkHasEditorType(editorType) || + !allowEditorTypeInSandbox(editorType)) + ) { + return; + } + + try { + loadedSettings.setValue(scope, 'preferredEditor', editorType); + addItem( + { + type: MessageType.INFO, + text: `Editor preference ${editorType ? `set to "${editorType}"` : 'cleared'} in ${scope} settings.`, + }, + Date.now(), + ); + setEditorError(null); + setIsEditorDialogOpen(false); + } catch (error) { + setEditorError(`Failed to set editor preference: ${error}`); + } + }, + [loadedSettings, setEditorError, addItem], + ); + + const exitEditorDialog = useCallback(() => { + setIsEditorDialogOpen(false); + }, []); + + return { + isEditorDialogOpen, + openEditorDialog, + handleEditorSelect, + exitEditorDialog, + }; +}; |
