summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/hooks/useEditorSettings.ts
diff options
context:
space:
mode:
authorLeo <[email protected]>2025-06-12 02:21:54 +0100
committerGitHub <[email protected]>2025-06-11 18:21:54 -0700
commit1ef68e061213b6b170bd979d31d4805da2357272 (patch)
treeddd91ec2a7841e763676e09765adf6f21880c2c3 /packages/cli/src/ui/hooks/useEditorSettings.ts
parentdd53e5c96aa01708a3bdb675c8a8e0d71be35651 (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.ts75
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,
+ };
+};