Use optimistic rendering when executing a workflow with manual trigger (#12695)

This PR adds optimistic rendering at two places:

- In the `runWorkflowVersion`, to create a workflow run entry as fast as
possible in the cache and render it immediately in the side panel.
- In the `ListenUpdatesEffect`, to be sure the cache is properly set; we
also need to set the record in the record store that's used in the
fields card.


## Before


https://github.com/user-attachments/assets/8b360ea9-c292-4e05-82a0-d2f12176bb6f

## After


https://github.com/user-attachments/assets/2d11023c-2ceb-4fa3-a951-187b9a0b5743

### With a slowed-down network


https://github.com/user-attachments/assets/7d2a592a-1ea7-455b-856f-bf3d9d905061

## Follow up

I will create next a PR to ensure the viewport is always set when we
know the dimensions of the nodes.
This commit is contained in:
Baptiste Devessier
2025-06-19 14:09:47 +02:00
committed by GitHub
parent a6b8830b91
commit dae282ca0f
13 changed files with 261 additions and 46 deletions

View File

@ -0,0 +1,45 @@
import { useApolloClient } from '@apollo/client';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useFindOneRecordQuery } from '@/object-record/hooks/useFindOneRecordQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
export const useUpsertFindOneRecordQueryInCache = ({
objectMetadataItem,
recordGqlFields,
withSoftDeleted = false,
}: {
objectMetadataItem: ObjectMetadataItem;
recordGqlFields: Record<string, any>;
withSoftDeleted?: boolean;
}) => {
const apolloClient = useApolloClient();
const { findOneRecordQuery } = useFindOneRecordQuery({
objectNameSingular: objectMetadataItem.nameSingular,
recordGqlFields,
withSoftDeleted,
});
const upsertFindOneRecordQueryInCache = <
T extends ObjectRecord = ObjectRecord,
>({
objectRecordId,
objectRecordToOverwrite,
}: {
objectRecordId: string;
objectRecordToOverwrite: T;
}) => {
apolloClient.writeQuery({
query: findOneRecordQuery,
variables: { objectRecordId },
data: {
[objectMetadataItem.nameSingular]: objectRecordToOverwrite,
},
});
};
return {
upsertFindOneRecordQueryInCache,
};
};