92 lines
3.2 KiB
TypeScript
92 lines
3.2 KiB
TypeScript
import { PageLayoutComponentInstanceContext } from '@/page-layout/states/contexts/PageLayoutComponentInstanceContext';
|
|
import { getTabListInstanceIdFromPageLayoutId } from '@/page-layout/utils/getTabListInstanceIdFromPageLayoutId';
|
|
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
|
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
|
import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState';
|
|
import { type Layout, type Layouts } from 'react-grid-layout';
|
|
import { useRecoilCallback } from 'recoil';
|
|
import { isDefined } from 'twenty-shared/utils';
|
|
import { pageLayoutCurrentLayoutsComponentState } from '@/page-layout/states/pageLayoutCurrentLayoutsComponentState';
|
|
import { pageLayoutDraftComponentState } from '@/page-layout/states/pageLayoutDraftComponentState';
|
|
import { convertLayoutsToWidgets } from '@/page-layout/utils/convertLayoutsToWidgets';
|
|
|
|
export const usePageLayoutHandleLayoutChange = (
|
|
pageLayoutIdFromProps?: string,
|
|
) => {
|
|
const pageLayoutId = useAvailableComponentInstanceIdOrThrow(
|
|
PageLayoutComponentInstanceContext,
|
|
pageLayoutIdFromProps,
|
|
);
|
|
|
|
const tabListInstanceId = getTabListInstanceIdFromPageLayoutId(pageLayoutId);
|
|
|
|
const activeTabIdState = useRecoilComponentCallbackState(
|
|
activeTabIdComponentState,
|
|
tabListInstanceId,
|
|
);
|
|
|
|
const pageLayoutCurrentLayoutsState = useRecoilComponentCallbackState(
|
|
pageLayoutCurrentLayoutsComponentState,
|
|
pageLayoutId,
|
|
);
|
|
|
|
const pageLayoutDraftState = useRecoilComponentCallbackState(
|
|
pageLayoutDraftComponentState,
|
|
pageLayoutId,
|
|
);
|
|
|
|
const handleLayoutChange = useRecoilCallback(
|
|
({ snapshot, set }) =>
|
|
(_: Layout[], allLayouts: Layouts) => {
|
|
const activeTabId = snapshot.getLoadable(activeTabIdState).getValue();
|
|
|
|
if (!isDefined(activeTabId)) return;
|
|
|
|
const currentTabLayouts = snapshot
|
|
.getLoadable(pageLayoutCurrentLayoutsState)
|
|
.getValue();
|
|
|
|
set(pageLayoutCurrentLayoutsState, {
|
|
...currentTabLayouts,
|
|
[activeTabId]: structuredClone(allLayouts),
|
|
});
|
|
|
|
const pageLayoutDraft = snapshot
|
|
.getLoadable(pageLayoutDraftState)
|
|
.getValue();
|
|
|
|
const currentTab = pageLayoutDraft.tabs.find(
|
|
(tab) => tab.id === activeTabId,
|
|
);
|
|
|
|
if (!currentTab) return;
|
|
|
|
const updatedWidgets = convertLayoutsToWidgets(
|
|
currentTab.widgets,
|
|
allLayouts,
|
|
);
|
|
|
|
if (isDefined(activeTabId)) {
|
|
set(pageLayoutDraftState, (prev) => ({
|
|
...prev,
|
|
tabs: prev.tabs.map((tab) => {
|
|
if (tab.id === activeTabId) {
|
|
const tabWidgets = updatedWidgets.filter(
|
|
(w) => w.pageLayoutTabId === activeTabId,
|
|
);
|
|
return {
|
|
...tab,
|
|
widgets: tabWidgets,
|
|
};
|
|
}
|
|
return tab;
|
|
}),
|
|
}));
|
|
}
|
|
},
|
|
[activeTabIdState, pageLayoutCurrentLayoutsState, pageLayoutDraftState],
|
|
);
|
|
|
|
return { handleLayoutChange };
|
|
};
|