Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | import { useMemo, useRef, useState } from "react" import { CODE_BLOCK_BG_COLOR } from "@/components/common/CodeBlock" import { useExtensionState } from "@/context/ExtensionStateContext" import { useAutoApproveActions } from "@/hooks/useAutoApproveActions" import { getAsVar, VSC_TITLEBAR_INACTIVE_FOREGROUND } from "@/utils/vscStyles" import AutoApproveMenuItem from "./AutoApproveMenuItem" import AutoApproveModal from "./AutoApproveModal" import { ACTION_METADATA, NOTIFICATIONS_SETTING } from "./constants" interface AutoApproveBarProps { style?: React.CSSProperties } const AutoApproveBar = ({ style }: AutoApproveBarProps) => { const { autoApprovalSettings } = useExtensionState() const { isChecked, isFavorited, updateAction } = useAutoApproveActions() const [isModalVisible, setIsModalVisible] = useState(false) const buttonRef = useRef<HTMLDivElement>(null) const favorites = useMemo(() => autoApprovalSettings.favorites || [], [autoApprovalSettings.favorites]) // Render a favorited item with a checkbox const renderFavoritedItem = (favId: string) => { const actions = [...ACTION_METADATA.flatMap((a) => [a, a.subAction]), NOTIFICATIONS_SETTING] const action = actions.find((a) => a?.id === favId) if (!action) { return null } return ( <AutoApproveMenuItem action={action} condensed={true} isChecked={isChecked} isFavorited={isFavorited} onToggle={updateAction} showIcon={false} /> ) } const getQuickAccessItems = () => { const notificationsEnabled = autoApprovalSettings.enableNotifications const enabledActionsNames = Object.keys(autoApprovalSettings.actions).filter( (key) => autoApprovalSettings.actions[key as keyof typeof autoApprovalSettings.actions], ) const enabledActions = enabledActionsNames.map((action) => { return ACTION_METADATA.flatMap((a) => [a, a.subAction]).find((a) => a?.id === action) }) const minusFavorites = enabledActions.filter((action) => !favorites.includes(action?.id ?? "") && action?.shortName) if (notificationsEnabled) { minusFavorites.push(NOTIFICATIONS_SETTING) } return [ ...favorites.map((favId) => renderFavoritedItem(favId)), minusFavorites.length > 0 ? ( <span className="text-[color:var(--vscode-foreground-muted)] pl-[10px] opacity-60" key="separator"> ✓ </span> ) : null, ...minusFavorites.map((action, index) => ( <span className="text-[color:var(--vscode-foreground-muted)] opacity-60" key={action?.id}> {action?.shortName} {index < minusFavorites.length - 1 && ","} </span> )), ] } return ( <div className="px-[10px] mx-[15px] select-none rounded-[10px_10px_0_0]" style={{ borderTop: `0.5px solid color-mix(in srgb, ${getAsVar(VSC_TITLEBAR_INACTIVE_FOREGROUND)} 20%, transparent)`, overflowY: "auto", backgroundColor: isModalVisible ? CODE_BLOCK_BG_COLOR : "transparent", ...style, }}> <div className="cursor-pointer py-[8px] pr-[2px] flex items-center justify-between gap-[8px]" onClick={() => { setIsModalVisible((prev) => !prev) }} ref={buttonRef}> <div className="flex flex-nowrap items-center overflow-x-auto gap-[4px] whitespace-nowrap" style={{ msOverflowStyle: "none", scrollbarWidth: "none", WebkitOverflowScrolling: "touch", }}> <span>Auto-approve:</span> {getQuickAccessItems()} </div> {isModalVisible ? ( <span className="codicon codicon-chevron-down" /> ) : ( <span className="codicon codicon-chevron-up" /> )} </div> <AutoApproveModal ACTION_METADATA={ACTION_METADATA} buttonRef={buttonRef} isVisible={isModalVisible} NOTIFICATIONS_SETTING={NOTIFICATIONS_SETTING} setIsVisible={setIsModalVisible} /> </div> ) } export default AutoApproveBar |