import React, { useMemo, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { ActionButton } from '@src/components/ActionButton' import { CustomIcon } from '@src/components/CustomIcon' import Tooltip from '@src/components/Tooltip' import type { KclCommandValue, KclExpressionWithVariable, } from '@src/lib/commandTypes' import type { Selections } from '@src/lib/selections' import { getSelectionTypeDisplayText } from '@src/lib/selections' import { roundOff } from '@src/lib/utils' import { commandBarActor, useCommandBarState } from '@src/lib/singletons' function CommandBarHeader({ children }: React.PropsWithChildren) { const commandBarState = useCommandBarState() const { context: { selectedCommand, currentArgument, argumentsToSubmit }, } = commandBarState const nonHiddenArgs = useMemo(() => { if (!selectedCommand?.args) return undefined const s = { ...selectedCommand.args } for (const [name, arg] of Object.entries(s)) { if ( typeof arg.hidden === 'function' ? arg.hidden(commandBarState.context) : arg.hidden ) delete s[name] } return s }, [selectedCommand]) const isReviewing = commandBarState.matches('Review') const [showShortcuts, setShowShortcuts] = useState(false) useHotkeys( 'alt', () => setShowShortcuts(true), { enableOnFormTags: true, enableOnContentEditable: true }, [showShortcuts] ) useHotkeys( 'alt', () => setShowShortcuts(false), { keyup: true, enableOnFormTags: true, enableOnContentEditable: true }, [showShortcuts] ) useHotkeys( [ 'alt+1', 'alt+2', 'alt+3', 'alt+4', 'alt+5', 'alt+6', 'alt+7', 'alt+8', 'alt+9', 'alt+0', ], (_, b) => { if (b.keys && !Number.isNaN(parseInt(b.keys[0], 10))) { if (!nonHiddenArgs) return const argName = Object.keys(nonHiddenArgs)[parseInt(b.keys[0], 10) - 1] const arg = nonHiddenArgs[argName] if (!argName || !arg) return commandBarActor.send({ type: 'Change current argument', data: { arg: { ...arg, name: argName } }, }) } }, { keyup: true, enableOnFormTags: true, enableOnContentEditable: true }, [argumentsToSubmit, selectedCommand] ) return ( selectedCommand && argumentsToSubmit && ( <>

{selectedCommand && 'icon' in selectedCommand && selectedCommand.icon && ( )} {selectedCommand.displayName || selectedCommand.name} {selectedCommand.status === 'experimental' ? ( experimental ) : ( )}

{Object.entries(nonHiddenArgs || {}) .filter(([_, argConfig]) => typeof argConfig.required === 'function' ? argConfig.required(commandBarState.context) : argConfig.required ) .map(([argName, arg], i) => { const argValue = (typeof argumentsToSubmit[argName] === 'function' ? argumentsToSubmit[argName](commandBarState.context) : argumentsToSubmit[argName]) || '' return ( ) })}
{isReviewing ? ( ) : ( )}
{children} ) ) } type ButtonProps = { bgClassName?: string; iconClassName?: string } function ReviewingButton({ bgClassName, iconClassName }: ButtonProps) { return ( Submit command ) } function GatheringArgsButton({ bgClassName, iconClassName }: ButtonProps) { return ( Continue ) } export default CommandBarHeader