import { useStore } from '@nanostores/react'; import useViewport from '~/lib/hooks'; import { chatStore } from '~/lib/stores/chat'; import { workbenchStore } from '~/lib/stores/workbench'; import { classNames } from '~/utils/classNames'; interface HeaderActionButtonsProps {} export function HeaderActionButtons({}: HeaderActionButtonsProps) { const showWorkbench = useStore(workbenchStore.showWorkbench); const { showChat } = useStore(chatStore); const isSmallViewport = useViewport(1024); const canHideChat = showWorkbench || !showChat; return ( <div className="flex"> <div className="flex border border-bolt-elements-borderColor rounded-md overflow-hidden"> <Button active={showChat} disabled={!canHideChat || isSmallViewport} // expand button is disabled on mobile as it's needed onClick={() => { if (canHideChat) { chatStore.setKey('showChat', !showChat); } }} > <div className="i-bolt:chat text-sm" /> </Button> <div className="w-[1px] bg-bolt-elements-borderColor" /> <Button active={showWorkbench} onClick={() => { if (showWorkbench && !showChat) { chatStore.setKey('showChat', true); } workbenchStore.showWorkbench.set(!showWorkbench); }} > <div className="i-ph:code-bold" /> </Button> </div> </div> ); } interface ButtonProps { active?: boolean; disabled?: boolean; children?: any; onClick?: VoidFunction; } function Button({ active = false, disabled = false, children, onClick }: ButtonProps) { return ( <button className={classNames('flex items-center p-1.5', { 'bg-bolt-elements-item-backgroundDefault hover:bg-bolt-elements-item-backgroundActive text-bolt-elements-textTertiary hover:text-bolt-elements-textPrimary': !active, 'bg-bolt-elements-item-backgroundAccent text-bolt-elements-item-contentAccent': active && !disabled, 'bg-bolt-elements-item-backgroundDefault text-alpha-gray-20 dark:text-alpha-white-20 cursor-not-allowed': disabled, })} onClick={onClick} > {children} </button> ); }