import { usePageLayoutHeaderInfo } from '@/command-menu/components/hooks/usePageLayoutHeaderInfo'; import { useUpdateCommandMenuPageInfo } from '@/command-menu/hooks/useUpdateCommandMenuPageInfo'; import { usePageLayoutIdFromContextStoreTargetedRecord } from '@/command-menu/pages/page-layout/hooks/usePageLayoutFromContextStoreTargetedRecord'; import { commandMenuPageInfoState } from '@/command-menu/states/commandMenuPageInfoState'; import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState'; import { commandMenuShouldFocusTitleInputComponentState } from '@/command-menu/states/commandMenuShouldFocusTitleInputComponentState'; import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages'; import { useUpdatePageLayoutTab } from '@/page-layout/hooks/useUpdatePageLayoutTab'; import { useUpdatePageLayoutWidget } from '@/page-layout/hooks/useUpdatePageLayoutWidget'; import { pageLayoutDraftComponentState } from '@/page-layout/states/pageLayoutDraftComponentState'; import { pageLayoutEditingWidgetIdComponentState } from '@/page-layout/states/pageLayoutEditingWidgetIdComponentState'; import { pageLayoutTabSettingsOpenTabIdComponentState } from '@/page-layout/states/pageLayoutTabSettingsOpenTabIdComponentState'; import { TitleInput } from '@/ui/input/components/TitleInput'; import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useTheme } from '@emotion/react'; import { isNonEmptyString } from '@sniptt/guards'; import { useState } from 'react'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; import { useIcons } from 'twenty-ui/display'; import { CommandMenuPageInfoLayout } from './CommandMenuPageInfoLayout'; export const CommandMenuPageLayoutInfo = () => { const theme = useTheme(); const { getIcon } = useIcons(); const commandMenuPage = useRecoilValue(commandMenuPageState); const commandMenuPageInfo = useRecoilValue(commandMenuPageInfoState); const { pageLayoutId } = usePageLayoutIdFromContextStoreTargetedRecord(); const [shouldFocusTitleInput, setShouldFocusTitleInput] = useRecoilComponentState( commandMenuShouldFocusTitleInputComponentState, commandMenuPageInfo.instanceId, ); const handleTitleInputOpen = () => { setShouldFocusTitleInput(false); }; const draftPageLayout = useRecoilComponentValue( pageLayoutDraftComponentState, pageLayoutId, ); const pageLayoutEditingWidgetId = useRecoilComponentValue( pageLayoutEditingWidgetIdComponentState, pageLayoutId, ); const [openTabId] = useRecoilComponentState( pageLayoutTabSettingsOpenTabIdComponentState, pageLayoutId, ); const { updateCommandMenuPageInfo } = useUpdateCommandMenuPageInfo(); const { updatePageLayoutWidget } = useUpdatePageLayoutWidget(pageLayoutId); const { updatePageLayoutTab } = useUpdatePageLayoutTab(pageLayoutId); const [editedTitle, setEditedTitle] = useState(null); const headerInfo = usePageLayoutHeaderInfo({ commandMenuPage, draftPageLayout, pageLayoutEditingWidgetId, openTabId, editedTitle, }); if (!headerInfo) { return null; } const { headerIcon, headerIconColor, headerType, title, isReadonly, tab, widgetInEditMode, } = headerInfo; const Icon = headerIcon ?? getIcon('IconDefault'); const handleTitleChange = (newTitle: string) => { setEditedTitle(newTitle); }; const saveTitle = async () => { const finalTitle = editedTitle ?? title; if (!isNonEmptyString(finalTitle)) { return; } updateCommandMenuPageInfo({ pageTitle: finalTitle, pageIcon: Icon, }); if ( commandMenuPage === CommandMenuPages.PageLayoutTabSettings && isDefined(tab) ) { updatePageLayoutTab(tab.id, { title: finalTitle }); } else if (isDefined(widgetInEditMode)) { updatePageLayoutWidget(widgetInEditMode.id, { title: finalTitle, }); } setEditedTitle(null); }; return ( ) : undefined } iconColor={headerIconColor} title={ setEditedTitle(null)} onClickOutside={saveTitle} onTab={saveTitle} onShiftTab={saveTitle} shouldFocus={shouldFocusTitleInput} onFocus={handleTitleInputOpen} /> } label={headerType} /> ); };