-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Expand file tree
/
Copy pathuseSaveFieldsWidgetGroups.ts
More file actions
115 lines (99 loc) · 3.47 KB
/
useSaveFieldsWidgetGroups.ts
File metadata and controls
115 lines (99 loc) · 3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { fieldsWidgetGroupsDraftComponentState } from '@/page-layout/states/fieldsWidgetGroupsDraftComponentState';
import { fieldsWidgetGroupsPersistedComponentState } from '@/page-layout/states/fieldsWidgetGroupsPersistedComponentState';
import { UPSERT_FIELDS_WIDGET } from '@/page-layout/graphql/mutations/upsertFieldsWidget';
import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState';
import { useRefreshAllCoreViews } from '@/views/hooks/useRefreshAllCoreViews';
import { useMutation } from '@apollo/client';
import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared/utils';
import { type CoreViewFieldGroup } from '~/generated-metadata/graphql';
type UpsertFieldsWidgetInput = {
widgetId: string;
groups: {
id: string;
name: string;
position: number;
isVisible: boolean;
fields: {
viewFieldId: string;
isVisible: boolean;
position: number;
}[];
}[];
};
type UpsertFieldsWidgetResult = {
upsertFieldsWidget: CoreViewFieldGroup[];
};
type UseSaveFieldsWidgetGroupsParams = {
pageLayoutId: string;
};
export const useSaveFieldsWidgetGroups = ({
pageLayoutId,
}: UseSaveFieldsWidgetGroupsParams) => {
const fieldsWidgetGroupsDraftState = useRecoilComponentCallbackState(
fieldsWidgetGroupsDraftComponentState,
pageLayoutId,
);
const fieldsWidgetGroupsPersistedState = useRecoilComponentCallbackState(
fieldsWidgetGroupsPersistedComponentState,
pageLayoutId,
);
const [upsertFieldsWidgetMutation] = useMutation<
UpsertFieldsWidgetResult,
{ input: UpsertFieldsWidgetInput }
>(UPSERT_FIELDS_WIDGET);
const { refreshAllCoreViews } = useRefreshAllCoreViews();
const saveFieldsWidgetGroups = useRecoilCallback(
({ set, snapshot }) =>
async () => {
const allDraftGroups = snapshot
.getLoadable(fieldsWidgetGroupsDraftState)
.getValue();
const allPersistedGroups = snapshot
.getLoadable(fieldsWidgetGroupsPersistedState)
.getValue();
const widgetIds = new Set([
...Object.keys(allDraftGroups),
...Object.keys(allPersistedGroups),
]);
for (const widgetId of widgetIds) {
const draftGroups = allDraftGroups[widgetId] ?? [];
await upsertFieldsWidgetMutation({
variables: {
input: {
widgetId,
groups: draftGroups.map((group) => ({
id: group.id,
name: group.name,
position: group.position,
isVisible: group.isVisible,
fields: group.fields.flatMap((field) => {
if (!isDefined(field.viewFieldId)) {
return [];
}
return [
{
viewFieldId: field.viewFieldId,
isVisible: field.isVisible,
position: field.position,
},
];
}),
})),
},
},
});
}
set(fieldsWidgetGroupsPersistedState, allDraftGroups);
await refreshAllCoreViews();
return { status: 'successful' as const };
},
[
fieldsWidgetGroupsDraftState,
fieldsWidgetGroupsPersistedState,
upsertFieldsWidgetMutation,
refreshAllCoreViews,
],
);
return { saveFieldsWidgetGroups };
};