import { CommandMenuContextChip } from '@/command-menu/components/CommandMenuContextChip'; import { CommandMenuContextChipGroups } from '@/command-menu/components/CommandMenuContextChipGroups'; import { CommandMenuContextChipGroupsWithRecordSelection } from '@/command-menu/components/CommandMenuContextChipGroupsWithRecordSelection'; import { CommandMenuTopBarInputFocusEffect } from '@/command-menu/components/CommandMenuTopBarInputFocusEffect'; import { COMMAND_MENU_SEARCH_BAR_HEIGHT } from '@/command-menu/constants/CommandMenuSearchBarHeight'; import { COMMAND_MENU_SEARCH_BAR_PADDING } from '@/command-menu/constants/CommandMenuSearchBarPadding'; import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu'; import { useCommandMenuContextChips } from '@/command-menu/hooks/useCommandMenuContextChips'; import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState'; import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState'; import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages'; import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { useLingui } from '@lingui/react/macro'; import { AnimatePresence, motion } from 'framer-motion'; import { useRef } from 'react'; import { useLocation } from 'react-router-dom'; import { useRecoilState, useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared'; import { Button, IconChevronLeft, IconX, LightIconButton, getOsControlSymbol, useIsMobile, } from 'twenty-ui'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; const StyledInputContainer = styled.div` align-items: center; background-color: ${({ theme }) => theme.background.transparent.lighter}; border: none; border-bottom: 1px solid ${({ theme }) => theme.border.color.medium}; border-radius: 0; display: flex; justify-content: space-between; font-size: ${({ theme }) => theme.font.size.lg}; height: ${COMMAND_MENU_SEARCH_BAR_HEIGHT}px; margin: 0; outline: none; position: relative; padding: 0 ${({ theme }) => theme.spacing(COMMAND_MENU_SEARCH_BAR_PADDING)}; gap: ${({ theme }) => theme.spacing(1)}; flex-shrink: 0; `; const StyledInput = styled.input` border: none; border-radius: 0; background-color: transparent; color: ${({ theme }) => theme.font.color.primary}; font-size: ${({ theme }) => theme.font.size.md}; margin: 0; outline: none; height: 24px; padding: 0; flex: 1; &::placeholder { color: ${({ theme }) => theme.font.color.light}; font-weight: ${({ theme }) => theme.font.weight.medium}; } `; const StyledContentContainer = styled.div` align-items: center; display: flex; flex: 1; gap: ${({ theme }) => theme.spacing(1)}; `; const StyledCloseButtonContainer = styled.div` align-items: center; display: flex; height: 32px; justify-content: center; `; const StyledCloseButtonWrapper = styled.div<{ isVisible: boolean }>` visibility: ${({ isVisible }) => (isVisible ? 'visible' : 'hidden')}; `; export const CommandMenuTopBar = () => { const [commandMenuSearch, setCommandMenuSearch] = useRecoilState( commandMenuSearchState, ); const inputRef = useRef(null); const { t } = useLingui(); const handleSearchChange = (event: React.ChangeEvent) => { setCommandMenuSearch(event.target.value); }; const isMobile = useIsMobile(); const { closeCommandMenu, goBackFromCommandMenu } = useCommandMenu(); const contextStoreCurrentObjectMetadataItem = useRecoilComponentValueV2( contextStoreCurrentObjectMetadataItemComponentState, ); const commandMenuPage = useRecoilValue(commandMenuPageState); const theme = useTheme(); const isCommandMenuV2Enabled = useIsFeatureEnabled( FeatureFlagKey.IsCommandMenuV2Enabled, ); const { contextChips } = useCommandMenuContextChips(); const location = useLocation(); const isButtonVisible = !location.pathname.startsWith('/objects/') && !location.pathname.startsWith('/object/'); const backButtonAnimationDuration = contextChips.length > 0 ? theme.animation.duration.instant : 0; return ( {isCommandMenuV2Enabled && ( <> {commandMenuPage !== CommandMenuPages.Root && ( ]} onClick={goBackFromCommandMenu} testId="command-menu-go-back-button" /> )} {isDefined(contextStoreCurrentObjectMetadataItem) && commandMenuPage !== CommandMenuPages.SearchRecords ? ( ) : ( )} )} {(commandMenuPage === CommandMenuPages.Root || commandMenuPage === CommandMenuPages.SearchRecords) && ( <> )} {!isMobile && ( {isCommandMenuV2Enabled ? (