Skip to content

Commit 1ece8e9

Browse files
committed
refactor: improve auto-approve checkbox implementation
- Simplify conditional rendering in AutoApproveMenu by using single checkbox with conditional tooltip - Extract duplicated toggles logic into reusable useAutoApprovalToggles hook - Fix ESLint no-unused-vars errors after refactoring
1 parent 07322bd commit 1ece8e9

File tree

3 files changed

+69
-72
lines changed

3 files changed

+69
-72
lines changed

webview-ui/src/components/chat/AutoApproveMenu.tsx

Lines changed: 20 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useAppTranslation } from "@src/i18n/TranslationContext"
88
import { AutoApproveToggle, AutoApproveSetting, autoApproveSettingsConfig } from "../settings/AutoApproveToggle"
99
import { StandardTooltip } from "@src/components/ui"
1010
import { useAutoApprovalState } from "@src/hooks/useAutoApprovalState"
11+
import { useAutoApprovalToggles } from "@src/hooks/useAutoApprovalToggles"
1112

1213
interface AutoApproveMenuProps {
1314
style?: React.CSSProperties
@@ -19,16 +20,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
1920
const {
2021
autoApprovalEnabled,
2122
setAutoApprovalEnabled,
22-
alwaysAllowReadOnly,
23-
alwaysAllowWrite,
24-
alwaysAllowExecute,
25-
alwaysAllowBrowser,
26-
alwaysAllowMcp,
27-
alwaysAllowModeSwitch,
28-
alwaysAllowSubtasks,
2923
alwaysApproveResubmit,
30-
alwaysAllowFollowupQuestions,
31-
alwaysAllowUpdateTodoList,
3224
allowedMaxRequests,
3325
setAlwaysAllowReadOnly,
3426
setAlwaysAllowWrite,
@@ -45,31 +37,15 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
4537

4638
const { t } = useAppTranslation()
4739

40+
const baseToggles = useAutoApprovalToggles()
41+
42+
// AutoApproveMenu needs alwaysApproveResubmit in addition to the base toggles
4843
const toggles = useMemo(
4944
() => ({
50-
alwaysAllowReadOnly: alwaysAllowReadOnly,
51-
alwaysAllowWrite: alwaysAllowWrite,
52-
alwaysAllowExecute: alwaysAllowExecute,
53-
alwaysAllowBrowser: alwaysAllowBrowser,
54-
alwaysAllowMcp: alwaysAllowMcp,
55-
alwaysAllowModeSwitch: alwaysAllowModeSwitch,
56-
alwaysAllowSubtasks: alwaysAllowSubtasks,
45+
...baseToggles,
5746
alwaysApproveResubmit: alwaysApproveResubmit,
58-
alwaysAllowFollowupQuestions: alwaysAllowFollowupQuestions,
59-
alwaysAllowUpdateTodoList: alwaysAllowUpdateTodoList,
6047
}),
61-
[
62-
alwaysAllowReadOnly,
63-
alwaysAllowWrite,
64-
alwaysAllowExecute,
65-
alwaysAllowBrowser,
66-
alwaysAllowMcp,
67-
alwaysAllowModeSwitch,
68-
alwaysAllowSubtasks,
69-
alwaysApproveResubmit,
70-
alwaysAllowFollowupQuestions,
71-
alwaysAllowUpdateTodoList,
72-
],
48+
[baseToggles, alwaysApproveResubmit],
7349
)
7450

7551
const { hasEnabledOptions, effectiveAutoApprovalEnabled } = useAutoApprovalState(toggles, autoApprovalEnabled)
@@ -198,30 +174,26 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
198174
}}
199175
onClick={toggleExpanded}>
200176
<div onClick={(e) => e.stopPropagation()}>
201-
{!hasEnabledOptions ? (
202-
<StandardTooltip content={t("chat:autoApprove.selectOptionsFirst")}>
203-
<VSCodeCheckbox
204-
checked={effectiveAutoApprovalEnabled}
205-
disabled={isCheckboxDisabled}
206-
aria-label={t("chat:autoApprove.disabledAriaLabel")}
207-
onChange={() => {
208-
// Show a message or do nothing
209-
return
210-
}}
211-
/>
212-
</StandardTooltip>
213-
) : (
177+
<StandardTooltip
178+
content={!hasEnabledOptions ? t("chat:autoApprove.selectOptionsFirst") : undefined}>
214179
<VSCodeCheckbox
215180
checked={effectiveAutoApprovalEnabled}
216181
disabled={isCheckboxDisabled}
217-
aria-label={t("chat:autoApprove.toggleAriaLabel")}
182+
aria-label={
183+
hasEnabledOptions
184+
? t("chat:autoApprove.toggleAriaLabel")
185+
: t("chat:autoApprove.disabledAriaLabel")
186+
}
218187
onChange={() => {
219-
const newValue = !(autoApprovalEnabled ?? false)
220-
setAutoApprovalEnabled(newValue)
221-
vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue })
188+
if (hasEnabledOptions) {
189+
const newValue = !(autoApprovalEnabled ?? false)
190+
setAutoApprovalEnabled(newValue)
191+
vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue })
192+
}
193+
// If no options enabled, do nothing
222194
}}
223195
/>
224-
)}
196+
</StandardTooltip>
225197
</div>
226198
<div
227199
style={{

webview-ui/src/components/chat/ChatView.tsx

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import RooHero from "@src/components/welcome/RooHero"
3939
import RooTips from "@src/components/welcome/RooTips"
4040
import { StandardTooltip } from "@src/components/ui"
4141
import { useAutoApprovalState } from "@src/hooks/useAutoApprovalState"
42+
import { useAutoApprovalToggles } from "@src/hooks/useAutoApprovalToggles"
4243

4344
import TelemetryBanner from "../common/TelemetryBanner"
4445
import VersionIndicator from "../common/VersionIndicator"
@@ -961,30 +962,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
961962
)
962963

963964
// Create toggles object for useAutoApprovalState hook
964-
const autoApprovalToggles = useMemo(
965-
() => ({
966-
alwaysAllowReadOnly,
967-
alwaysAllowWrite,
968-
alwaysAllowExecute,
969-
alwaysAllowBrowser,
970-
alwaysAllowMcp,
971-
alwaysAllowModeSwitch,
972-
alwaysAllowSubtasks,
973-
alwaysAllowFollowupQuestions,
974-
alwaysAllowUpdateTodoList,
975-
}),
976-
[
977-
alwaysAllowReadOnly,
978-
alwaysAllowWrite,
979-
alwaysAllowExecute,
980-
alwaysAllowBrowser,
981-
alwaysAllowMcp,
982-
alwaysAllowModeSwitch,
983-
alwaysAllowSubtasks,
984-
alwaysAllowFollowupQuestions,
985-
alwaysAllowUpdateTodoList,
986-
],
987-
)
965+
const autoApprovalToggles = useAutoApprovalToggles()
988966

989967
const { hasEnabledOptions } = useAutoApprovalState(autoApprovalToggles, autoApprovalEnabled)
990968

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { useMemo } from "react"
2+
import { useExtensionState } from "@src/context/ExtensionStateContext"
3+
4+
/**
5+
* Custom hook that creates and returns the auto-approval toggles object
6+
* This encapsulates the logic for creating the toggles object from extension state
7+
*/
8+
export function useAutoApprovalToggles() {
9+
const {
10+
alwaysAllowReadOnly,
11+
alwaysAllowWrite,
12+
alwaysAllowExecute,
13+
alwaysAllowBrowser,
14+
alwaysAllowMcp,
15+
alwaysAllowModeSwitch,
16+
alwaysAllowSubtasks,
17+
alwaysAllowFollowupQuestions,
18+
alwaysAllowUpdateTodoList,
19+
} = useExtensionState()
20+
21+
const toggles = useMemo(
22+
() => ({
23+
alwaysAllowReadOnly,
24+
alwaysAllowWrite,
25+
alwaysAllowExecute,
26+
alwaysAllowBrowser,
27+
alwaysAllowMcp,
28+
alwaysAllowModeSwitch,
29+
alwaysAllowSubtasks,
30+
alwaysAllowFollowupQuestions,
31+
alwaysAllowUpdateTodoList,
32+
}),
33+
[
34+
alwaysAllowReadOnly,
35+
alwaysAllowWrite,
36+
alwaysAllowExecute,
37+
alwaysAllowBrowser,
38+
alwaysAllowMcp,
39+
alwaysAllowModeSwitch,
40+
alwaysAllowSubtasks,
41+
alwaysAllowFollowupQuestions,
42+
alwaysAllowUpdateTodoList,
43+
],
44+
)
45+
46+
return toggles
47+
}

0 commit comments

Comments
 (0)