84d140025a
Fixes #16388 Now we have used the metadata fetching from network using resetVirtualizationBecauseDataChanged(), as we navigate back to the table after updating the field content. As the virtualised table uses the "cache-first" strategy, it fails to give fresh data from the data base Please let me know i we need to add the loading state (and it's UI requirements) while it fetches the cell content, as currently the cell is empty until it's populated by fresh data https://github.com/user-attachments/assets/901085ba-4337-4a5d-86c8-15ac84250e8f --------- Co-authored-by: Arun kumar <arunkumar@Aruns-MacBook-Air.local> Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
101 lines
3.0 KiB
TypeScript
101 lines
3.0 KiB
TypeScript
import {
|
|
type UpdateOneFieldMetadataItemMutationVariables,
|
|
useUpdateOneFieldMetadataItemMutation,
|
|
} from '~/generated-metadata/graphql';
|
|
|
|
import { useMetadataErrorHandler } from '@/metadata-error-handler/hooks/useMetadataErrorHandler';
|
|
import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItems';
|
|
import { lastFieldMetadataItemUpdateState } from '@/object-metadata/states/lastFieldMetadataItemUpdateState';
|
|
import { type MetadataRequestResult } from '@/object-metadata/types/MetadataRequestResult.type';
|
|
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
|
import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshCoreViewsByObjectMetadataId';
|
|
import { ApolloError } from '@apollo/client';
|
|
import { t } from '@lingui/core/macro';
|
|
import { useSetRecoilState } from 'recoil';
|
|
import { CrudOperationType } from 'twenty-shared/types';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
export const useUpdateOneFieldMetadataItem = () => {
|
|
const { refreshObjectMetadataItems } =
|
|
useRefreshObjectMetadataItems('network-only');
|
|
|
|
const { refreshCoreViewsByObjectMetadataId } =
|
|
useRefreshCoreViewsByObjectMetadataId();
|
|
|
|
const [updateOneFieldMetadataItemMutation] =
|
|
useUpdateOneFieldMetadataItemMutation();
|
|
|
|
const { handleMetadataError } = useMetadataErrorHandler();
|
|
|
|
const { enqueueErrorSnackBar } = useSnackBar();
|
|
|
|
const setLastFieldMetadataItemUpdate = useSetRecoilState(
|
|
lastFieldMetadataItemUpdateState,
|
|
);
|
|
|
|
const updateOneFieldMetadataItem = async ({
|
|
objectMetadataId,
|
|
fieldMetadataIdToUpdate,
|
|
updatePayload,
|
|
}: {
|
|
objectMetadataId: string;
|
|
fieldMetadataIdToUpdate: UpdateOneFieldMetadataItemMutationVariables['idToUpdate'];
|
|
updatePayload: Pick<
|
|
UpdateOneFieldMetadataItemMutationVariables['updatePayload'],
|
|
| 'description'
|
|
| 'icon'
|
|
| 'isActive'
|
|
| 'label'
|
|
| 'name'
|
|
| 'defaultValue'
|
|
| 'options'
|
|
| 'isLabelSyncedWithName'
|
|
>;
|
|
}): Promise<
|
|
MetadataRequestResult<
|
|
Awaited<ReturnType<typeof updateOneFieldMetadataItemMutation>>
|
|
>
|
|
> => {
|
|
try {
|
|
const response = await updateOneFieldMetadataItemMutation({
|
|
variables: {
|
|
idToUpdate: fieldMetadataIdToUpdate,
|
|
updatePayload: updatePayload,
|
|
},
|
|
});
|
|
|
|
await refreshObjectMetadataItems();
|
|
await refreshCoreViewsByObjectMetadataId(objectMetadataId);
|
|
|
|
setLastFieldMetadataItemUpdate({
|
|
fieldMetadataItemId: fieldMetadataIdToUpdate,
|
|
objectMetadataId,
|
|
id: uuidv4(),
|
|
});
|
|
|
|
return {
|
|
status: 'successful',
|
|
response,
|
|
};
|
|
} catch (error) {
|
|
if (error instanceof ApolloError) {
|
|
handleMetadataError(error, {
|
|
primaryMetadataName: 'fieldMetadata',
|
|
operationType: CrudOperationType.UPDATE,
|
|
});
|
|
} else {
|
|
enqueueErrorSnackBar({ message: t`An error occurred.` });
|
|
}
|
|
|
|
return {
|
|
status: 'failed',
|
|
error,
|
|
};
|
|
}
|
|
};
|
|
|
|
return {
|
|
updateOneFieldMetadataItem,
|
|
};
|
|
};
|