import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { IconChevronDown, IconList, MOBILE_VIEWPORT, useIcons, } from 'twenty-ui'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { StyledDropdownButtonContainer } from '@/ui/layout/dropdown/components/StyledDropdownButtonContainer'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { entityCountInCurrentViewComponentState } from '@/views/states/entityCountInCurrentViewComponentState'; import { ViewsHotkeyScope } from '@/views/types/ViewsHotkeyScope'; import { ViewPickerContentCreateMode } from '@/views/view-picker/components/ViewPickerContentCreateMode'; import { ViewPickerContentEditMode } from '@/views/view-picker/components/ViewPickerContentEditMode'; import { ViewPickerContentEffect } from '@/views/view-picker/components/ViewPickerContentEffect'; import { ViewPickerFavoriteFoldersDropdown } from '@/views/view-picker/components/ViewPickerFavoriteFoldersDropdown'; import { ViewPickerListContent } from '@/views/view-picker/components/ViewPickerListContent'; import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId'; import { useUpdateViewFromCurrentState } from '@/views/view-picker/hooks/useUpdateViewFromCurrentState'; import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { isDefined } from '~/utils/isDefined'; const StyledDropdownLabelAdornments = styled.span` align-items: center; color: ${({ theme }) => theme.grayScale.gray35}; display: inline-flex; gap: ${({ theme }) => theme.spacing(1)}; margin-left: ${({ theme }) => theme.spacing(1)}; `; const StyledViewName = styled.span` margin-left: ${({ theme }) => theme.spacing(1)}; display: inline-block; max-width: 130px; @media (max-width: 375px) { max-width: 90px; } @media (min-width: 376px) and (max-width: ${MOBILE_VIEWPORT}px) { max-width: 110px; } overflow: hidden; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; `; export const ViewPickerDropdown = () => { const theme = useTheme(); const isFavoriteFolderEnabled = useIsFeatureEnabled( 'IS_FAVORITE_FOLDER_ENABLED', ); const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); const { updateViewFromCurrentState } = useUpdateViewFromCurrentState(); const entityCountInCurrentView = useRecoilComponentValueV2( entityCountInCurrentViewComponentState, ); const { isDropdownOpen: isViewsListDropdownOpen } = useDropdown( VIEW_PICKER_DROPDOWN_ID, ); const { viewPickerMode, setViewPickerMode } = useViewPickerMode(); const { getIcon } = useIcons(); const CurrentViewIcon = getIcon(currentViewWithCombinedFiltersAndSorts?.icon); const handleClickOutside = async () => { if (isViewsListDropdownOpen && viewPickerMode === 'edit') { await updateViewFromCurrentState(); } setViewPickerMode('list'); }; return ( {currentViewWithCombinedFiltersAndSorts && CurrentViewIcon ? ( ) : ( )} {currentViewWithCombinedFiltersAndSorts?.name ?? 'All'} {isDefined(entityCountInCurrentView) && ( <>ยท {entityCountInCurrentView} )} } dropdownComponents={(() => { switch (viewPickerMode) { case 'list': return ; case 'favorite-folders-picker': return ( isFavoriteFolderEnabled && ); case 'create-empty': case 'create-from-current': return ( <> ); case 'edit': return ( <> ); default: return null; } })()} /> ); };