import { useRecoilValue } from 'recoil'; import { IconApps, IconAt, IconCalendarEvent, IconCode, IconColorSwatch, IconComponent, IconCurrencyDollar, IconDoorEnter, IconFlask, IconFunction, IconHierarchy2, IconKey, IconMail, IconRocket, IconServer, IconSettings, IconUserCircle, IconUsers, } from 'twenty-ui'; import { useAuth } from '@/auth/hooks/useAuth'; import { currentUserState } from '@/auth/states/currentUserState'; import { billingState } from '@/client-config/states/billingState'; import { labPublicFeatureFlagsState } from '@/client-config/states/labPublicFeatureFlagsState'; import { AdvancedSettingsWrapper } from '@/settings/components/AdvancedSettingsWrapper'; import { SettingsNavigationDrawerItem } from '@/settings/components/SettingsNavigationDrawerItem'; import { SettingsPath } from '@/types/SettingsPath'; import { NavigationDrawerItem, NavigationDrawerItemIndentationLevel, } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem'; import { NavigationDrawerItemGroup } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItemGroup'; import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSection'; import { NavigationDrawerSectionTitle } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSectionTitle'; import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { useLingui } from '@lingui/react/macro'; import { matchPath, resolvePath, useLocation } from 'react-router-dom'; import { FeatureFlagKey } from '~/generated/graphql'; import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; type SettingsNavigationItem = { label: string; path: SettingsPath; Icon: IconComponent; indentationLevel?: NavigationDrawerItemIndentationLevel; matchSubPages?: boolean; }; export const SettingsNavigationDrawerItems = () => { const { signOut } = useAuth(); const { t } = useLingui(); const billing = useRecoilValue(billingState); // We want to disable this serverless function setting menu but keep the code // for now const isFunctionSettingsEnabled = false; const isFreeAccessEnabled = useIsFeatureEnabled( FeatureFlagKey.IsFreeAccessEnabled, ); const isBillingPageEnabled = billing?.isBillingEnabled && !isFreeAccessEnabled; const currentUser = useRecoilValue(currentUserState); const isAdminPageEnabled = currentUser?.canImpersonate; const labPublicFeatureFlags = useRecoilValue(labPublicFeatureFlagsState); // TODO: Refactor this part to only have arrays of navigation items const currentPathName = useLocation().pathname; const accountSubSettings: SettingsNavigationItem[] = [ { label: t`Emails`, path: SettingsPath.AccountsEmails, Icon: IconMail, indentationLevel: 2, }, { label: t`Calendars`, path: SettingsPath.AccountsCalendars, Icon: IconCalendarEvent, indentationLevel: 2, }, ]; const selectedIndex = accountSubSettings.findIndex((accountSubSetting) => { const href = getSettingsPath(accountSubSetting.path); const pathName = resolvePath(href).pathname; return matchPath( { path: pathName, end: accountSubSetting.matchSubPages === false, }, currentPathName, ); }); return ( <> {accountSubSettings.map((navigationItem, index) => ( ))} {isBillingPageEnabled && ( )} {isFunctionSettingsEnabled && ( )} {isAdminPageEnabled && ( )} {labPublicFeatureFlags?.length > 0 && ( )} ); };