* Wip refactoring view * Post merge conflicts * Fix review * Add create view capability * Fix create object missing view * Fix tests
88 lines
2.5 KiB
TypeScript
88 lines
2.5 KiB
TypeScript
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { usePersistViewFieldRecords } from '@/views/hooks/internal/usePersistViewFieldRecords';
|
|
import { useViewStates } from '@/views/hooks/internal/useViewStates';
|
|
import { useGetViewFromCache } from '@/views/hooks/useGetViewFromCache';
|
|
import { ViewField } from '@/views/types/ViewField';
|
|
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
|
import { isDefined } from '~/utils/isDefined';
|
|
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
|
|
|
export const useSaveCurrentViewFields = (viewBarComponentId?: string) => {
|
|
const { createViewFieldRecords, updateViewFieldRecords } =
|
|
usePersistViewFieldRecords();
|
|
|
|
const { getViewFromCache } = useGetViewFromCache();
|
|
|
|
const { isPersistingViewFieldsState, currentViewIdState } =
|
|
useViewStates(viewBarComponentId);
|
|
|
|
const saveViewFields = useRecoilCallback(
|
|
({ set, snapshot }) =>
|
|
async (fields: ViewField[]) => {
|
|
const currentViewId = snapshot
|
|
.getLoadable(currentViewIdState)
|
|
.getValue();
|
|
|
|
if (!currentViewId) {
|
|
return;
|
|
}
|
|
|
|
set(isPersistingViewFieldsState, true);
|
|
const view = await getViewFromCache(currentViewId);
|
|
|
|
if (isUndefinedOrNull(view)) {
|
|
return;
|
|
}
|
|
|
|
const viewFieldsToUpdate = fields
|
|
.map((field) => {
|
|
const existingField = view.viewFields.find(
|
|
(viewField) => viewField.id === field.id,
|
|
);
|
|
|
|
if (isUndefinedOrNull(existingField)) {
|
|
return undefined;
|
|
}
|
|
if (
|
|
isDeeplyEqual(
|
|
{
|
|
position: existingField.position,
|
|
size: existingField.size,
|
|
isVisible: existingField.isVisible,
|
|
},
|
|
{
|
|
position: field.position,
|
|
size: field.size,
|
|
isVisible: field.isVisible,
|
|
},
|
|
)
|
|
) {
|
|
return undefined;
|
|
}
|
|
return field;
|
|
})
|
|
.filter(isDefined);
|
|
|
|
const viewFieldsToCreate = fields.filter((field) => !field.id);
|
|
|
|
await Promise.all([
|
|
createViewFieldRecords(viewFieldsToCreate, view),
|
|
updateViewFieldRecords(viewFieldsToUpdate),
|
|
]);
|
|
set(isPersistingViewFieldsState, false);
|
|
},
|
|
[
|
|
createViewFieldRecords,
|
|
currentViewIdState,
|
|
getViewFromCache,
|
|
isPersistingViewFieldsState,
|
|
updateViewFieldRecords,
|
|
],
|
|
);
|
|
|
|
return {
|
|
saveViewFields,
|
|
};
|
|
};
|