diff --git a/packages/twenty-front/src/generated-metadata/gql.ts b/packages/twenty-front/src/generated-metadata/gql.ts index 2a0c2ef85e..244977c0a4 100644 --- a/packages/twenty-front/src/generated-metadata/gql.ts +++ b/packages/twenty-front/src/generated-metadata/gql.ts @@ -18,6 +18,7 @@ const documents = { "\n \n mutation createServer($input: CreateRemoteServerInput!) {\n createOneRemoteServer(input: $input) {\n ...RemoteServerFields\n }\n }\n": types.CreateServerDocument, "\n mutation deleteServer($input: RemoteServerIdInput!) {\n deleteOneRemoteServer(input: $input) {\n id\n }\n }\n": types.DeleteServerDocument, "\n \n mutation syncRemoteTable($input: RemoteTableInput!) {\n syncRemoteTable(input: $input) {\n ...RemoteTableFields\n }\n }\n": types.SyncRemoteTableDocument, + "\n \n mutation syncRemoteTableSchemaChanges($input: RemoteTableInput!) {\n syncRemoteTableSchemaChanges(input: $input) {\n ...RemoteTableFields\n }\n }\n": types.SyncRemoteTableSchemaChangesDocument, "\n \n mutation unsyncRemoteTable($input: RemoteTableInput!) {\n unsyncRemoteTable(input: $input) {\n ...RemoteTableFields\n }\n }\n": types.UnsyncRemoteTableDocument, "\n \n mutation updateServer($input: UpdateRemoteServerInput!) {\n updateOneRemoteServer(input: $input) {\n ...RemoteServerFields\n }\n }\n": types.UpdateServerDocument, "\n \n query GetManyDatabaseConnections($input: RemoteServerTypeInput!) {\n findManyRemoteServersByType(input: $input) {\n ...RemoteServerFields\n }\n }\n": types.GetManyDatabaseConnectionsDocument, @@ -68,6 +69,10 @@ export function graphql(source: "\n mutation deleteServer($input: RemoteServerI * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql(source: "\n \n mutation syncRemoteTable($input: RemoteTableInput!) {\n syncRemoteTable(input: $input) {\n ...RemoteTableFields\n }\n }\n"): (typeof documents)["\n \n mutation syncRemoteTable($input: RemoteTableInput!) {\n syncRemoteTable(input: $input) {\n ...RemoteTableFields\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n \n mutation syncRemoteTableSchemaChanges($input: RemoteTableInput!) {\n syncRemoteTableSchemaChanges(input: $input) {\n ...RemoteTableFields\n }\n }\n"): (typeof documents)["\n \n mutation syncRemoteTableSchemaChanges($input: RemoteTableInput!) {\n syncRemoteTableSchemaChanges(input: $input) {\n ...RemoteTableFields\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 3af8d5b9c5..c01c188a45 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -368,6 +368,7 @@ export type LoginToken = { export type Mutation = { __typename?: 'Mutation'; activateWorkspace: Workspace; + addUserToWorkspace: User; authorizeApp: AuthorizeApp; challenge: LoginToken; checkoutSession: SessionEntity; @@ -391,6 +392,7 @@ export type Mutation = { renewToken: AuthTokens; signUp: LoginToken; syncRemoteTable: RemoteTable; + syncRemoteTableSchemaChanges: RemoteTable; track: Analytics; unsyncRemoteTable: RemoteTable; updateBillingSubscription: UpdateBillingEntity; @@ -412,6 +414,11 @@ export type MutationActivateWorkspaceArgs = { }; +export type MutationAddUserToWorkspaceArgs = { + inviteHash: Scalars['String']['input']; +}; + + export type MutationAuthorizeAppArgs = { clientId: Scalars['String']['input']; codeChallenge?: InputMaybe; @@ -523,6 +530,11 @@ export type MutationSyncRemoteTableArgs = { }; +export type MutationSyncRemoteTableSchemaChangesArgs = { + input: RemoteTableInput; +}; + + export type MutationTrackArgs = { data: Scalars['JSON']['input']; type: Scalars['String']['input']; @@ -1284,6 +1296,13 @@ export type SyncRemoteTableMutationVariables = Exact<{ export type SyncRemoteTableMutation = { __typename?: 'Mutation', syncRemoteTable: { __typename?: 'RemoteTable', id?: any | null, name: string, schema?: string | null, status: RemoteTableStatus, schemaPendingUpdates?: Array | null } }; +export type SyncRemoteTableSchemaChangesMutationVariables = Exact<{ + input: RemoteTableInput; +}>; + + +export type SyncRemoteTableSchemaChangesMutation = { __typename?: 'Mutation', syncRemoteTableSchemaChanges: { __typename?: 'RemoteTable', id?: any | null, name: string, schema?: string | null, status: RemoteTableStatus, schemaPendingUpdates?: Array | null } }; + export type UnsyncRemoteTableMutationVariables = Exact<{ input: RemoteTableInput; }>; @@ -1390,6 +1409,7 @@ export const RemoteTableFieldsFragmentDoc = {"kind":"Document","definitions":[{" export const CreateServerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"createServer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateRemoteServerInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createOneRemoteServer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteServerFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteServerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperId"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperOptions"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperType"}},{"kind":"Field","name":{"kind":"Name","value":"userMappingOptions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"}}]}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}}]}}]} as unknown as DocumentNode; export const DeleteServerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"deleteServer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServerIdInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneRemoteServer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; export const SyncRemoteTableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"syncRemoteTable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTableInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"syncRemoteTable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteTableFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteTableFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTable"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"schemaPendingUpdates"}}]}}]} as unknown as DocumentNode; +export const SyncRemoteTableSchemaChangesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"syncRemoteTableSchemaChanges"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTableInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"syncRemoteTableSchemaChanges"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteTableFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteTableFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTable"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"schemaPendingUpdates"}}]}}]} as unknown as DocumentNode; export const UnsyncRemoteTableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"unsyncRemoteTable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTableInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unsyncRemoteTable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteTableFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteTableFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTable"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"schemaPendingUpdates"}}]}}]} as unknown as DocumentNode; export const UpdateServerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"updateServer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateRemoteServerInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateOneRemoteServer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteServerFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteServerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperId"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperOptions"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperType"}},{"kind":"Field","name":{"kind":"Name","value":"userMappingOptions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"}}]}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}}]}}]} as unknown as DocumentNode; export const GetManyDatabaseConnectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetManyDatabaseConnections"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServerTypeInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyRemoteServersByType"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteServerFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteServerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperId"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperOptions"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperType"}},{"kind":"Field","name":{"kind":"Name","value":"userMappingOptions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"}}]}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}}]}}]} as unknown as DocumentNode; diff --git a/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts b/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts index 768142302a..d0c3c6eda9 100644 --- a/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts +++ b/packages/twenty-front/src/modules/apollo/hooks/useApolloFactory.ts @@ -30,7 +30,13 @@ export const useApolloFactory = (options: Partial> = {}) => { const apolloClient = useMemo(() => { apolloRef.current = new ApolloFactory({ uri: `${REACT_APP_SERVER_BASE_URL}/graphql`, - cache: new InMemoryCache(), + cache: new InMemoryCache({ + typePolicies: { + RemoteTable: { + keyFields: ['name'], + }, + }, + }), headers: { ...(currentWorkspace?.currentCacheVersion && { 'X-Schema-Version': currentWorkspace.currentCacheVersion, diff --git a/packages/twenty-front/src/modules/databases/graphql/mutations/syncRemoteTableSchemaChanges.ts b/packages/twenty-front/src/modules/databases/graphql/mutations/syncRemoteTableSchemaChanges.ts new file mode 100644 index 0000000000..c56fc6d8e6 --- /dev/null +++ b/packages/twenty-front/src/modules/databases/graphql/mutations/syncRemoteTableSchemaChanges.ts @@ -0,0 +1,12 @@ +import { gql } from '@apollo/client'; + +import { REMOTE_TABLE_FRAGMENT } from '@/databases/graphql/fragments/remoteTableFragment'; + +export const SYNC_REMOTE_TABLE_SCHEMA_CHANGES = gql` + ${REMOTE_TABLE_FRAGMENT} + mutation syncRemoteTableSchemaChanges($input: RemoteTableInput!) { + syncRemoteTableSchemaChanges(input: $input) { + ...RemoteTableFields + } + } +`; diff --git a/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTable.ts b/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTable.ts index 72b9e5c2a4..24da83024d 100644 --- a/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTable.ts +++ b/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTable.ts @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { ApolloClient, useApolloClient, useMutation } from '@apollo/client'; import { SYNC_REMOTE_TABLE } from '@/databases/graphql/mutations/syncRemoteTable'; -import { GET_MANY_REMOTE_TABLES } from '@/databases/graphql/queries/findManyRemoteTables'; +import { modifyRemoteTableFromCache } from '@/databases/utils/modifyRemoteTableFromCache'; import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient'; import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; @@ -12,6 +12,7 @@ import { SyncRemoteTableMutation, SyncRemoteTableMutationVariables, } from '~/generated-metadata/graphql'; +import { isDefined } from '~/utils/isDefined'; export const useSyncRemoteTable = () => { const apolloMetadataClient = useApolloMetadataClient(); @@ -23,7 +24,6 @@ export const useSyncRemoteTable = () => { const { findManyRecordsQuery: findManyViewsQuery } = useFindManyRecordsQuery({ objectNameSingular: CoreObjectNameSingular.View, }); - const [mutate] = useMutation< SyncRemoteTableMutation, SyncRemoteTableMutationVariables @@ -37,20 +37,19 @@ export const useSyncRemoteTable = () => { variables: { input, }, - awaitRefetchQueries: true, - refetchQueries: [ - { - query: GET_MANY_REMOTE_TABLES, - variables: { - input: { - id: input.remoteServerId, + update: (cache, { data }) => { + if (isDefined(data)) { + modifyRemoteTableFromCache({ + cache: cache, + remoteTableName: input.name, + fieldModifiers: { + status: () => data.syncRemoteTable.status, }, - }, - }, - ], + }); + } + }, }); - // TODO: we should return the tables with the columns and store in cache instead of refetching await refetchObjectMetadataItems(); await apolloClient.query({ query: findManyViewsQuery, diff --git a/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTableSchemaChanges.ts b/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTableSchemaChanges.ts new file mode 100644 index 0000000000..fe4e8357b5 --- /dev/null +++ b/packages/twenty-front/src/modules/databases/hooks/useSyncRemoteTableSchemaChanges.ts @@ -0,0 +1,53 @@ +import { useCallback } from 'react'; +import { ApolloClient, useMutation } from '@apollo/client'; + +import { SYNC_REMOTE_TABLE_SCHEMA_CHANGES } from '@/databases/graphql/mutations/syncRemoteTableSchemaChanges'; +import { modifyRemoteTableFromCache } from '@/databases/utils/modifyRemoteTableFromCache'; +import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient'; +import { + RemoteTableInput, + SyncRemoteTableSchemaChangesMutation, + SyncRemoteTableSchemaChangesMutationVariables, +} from '~/generated-metadata/graphql'; +import { isDefined } from '~/utils/isDefined'; + +export const useSyncRemoteTableSchemaChanges = () => { + const apolloMetadataClient = useApolloMetadataClient(); + + const [mutate, mutationInformation] = useMutation< + SyncRemoteTableSchemaChangesMutation, + SyncRemoteTableSchemaChangesMutationVariables + >(SYNC_REMOTE_TABLE_SCHEMA_CHANGES, { + client: apolloMetadataClient ?? ({} as ApolloClient), + }); + + const syncRemoteTableSchemaChanges = useCallback( + async (input: RemoteTableInput) => { + const remoteTable = await mutate({ + variables: { + input, + }, + update: (cache, { data }) => { + if (isDefined(data)) { + modifyRemoteTableFromCache({ + cache: cache, + remoteTableName: input.name, + fieldModifiers: { + schemaPendingUpdates: () => + data.syncRemoteTableSchemaChanges.schemaPendingUpdates || [], + }, + }); + } + }, + }); + + return remoteTable; + }, + [mutate], + ); + + return { + syncRemoteTableSchemaChanges, + isLoading: mutationInformation.loading, + }; +}; diff --git a/packages/twenty-front/src/modules/databases/hooks/useUnsyncRemoteTable.ts b/packages/twenty-front/src/modules/databases/hooks/useUnsyncRemoteTable.ts index 89d2bc04e1..7e08b5fded 100644 --- a/packages/twenty-front/src/modules/databases/hooks/useUnsyncRemoteTable.ts +++ b/packages/twenty-front/src/modules/databases/hooks/useUnsyncRemoteTable.ts @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { ApolloClient, useMutation } from '@apollo/client'; import { UNSYNC_REMOTE_TABLE } from '@/databases/graphql/mutations/unsyncRemoteTable'; -import { GET_MANY_REMOTE_TABLES } from '@/databases/graphql/queries/findManyRemoteTables'; +import { modifyRemoteTableFromCache } from '@/databases/utils/modifyRemoteTableFromCache'; import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient'; import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems'; import { @@ -10,6 +10,7 @@ import { UnsyncRemoteTableMutation, UnsyncRemoteTableMutationVariables, } from '~/generated-metadata/graphql'; +import { isDefined } from '~/utils/isDefined'; export const useUnsyncRemoteTable = () => { const apolloMetadataClient = useApolloMetadataClient(); @@ -29,17 +30,17 @@ export const useUnsyncRemoteTable = () => { variables: { input, }, - awaitRefetchQueries: true, - refetchQueries: [ - { - query: GET_MANY_REMOTE_TABLES, - variables: { - input: { - id: input.remoteServerId, + update: (cache, { data }) => { + if (isDefined(data)) { + modifyRemoteTableFromCache({ + cache: cache, + remoteTableName: input.name, + fieldModifiers: { + status: () => data.unsyncRemoteTable.status, }, - }, - }, - ], + }); + } + }, }); await refetchObjectMetadataItems(); diff --git a/packages/twenty-front/src/modules/databases/utils/modifyRemoteTableFromCache.ts b/packages/twenty-front/src/modules/databases/utils/modifyRemoteTableFromCache.ts new file mode 100644 index 0000000000..166c7b208f --- /dev/null +++ b/packages/twenty-front/src/modules/databases/utils/modifyRemoteTableFromCache.ts @@ -0,0 +1,22 @@ +import { ApolloCache } from '@apollo/client'; +import { Modifiers } from '@apollo/client/cache'; + +import { RemoteTable } from '~/generated-metadata/graphql'; + +export const modifyRemoteTableFromCache = ({ + cache, + fieldModifiers, + remoteTableName, +}: { + cache: ApolloCache; + fieldModifiers: Modifiers; + remoteTableName: string; +}) => { + const remoteTableCacheId = `RemoteTable:{"name":"${remoteTableName}"}`; + + cache.modify({ + id: remoteTableCacheId, + fields: fieldModifiers, + optimistic: true, + }); +}; diff --git a/packages/twenty-front/src/modules/settings/integrations/components/SettingsIntegrationRemoteTableSchemaUpdate.tsx b/packages/twenty-front/src/modules/settings/integrations/components/SettingsIntegrationRemoteTableSchemaUpdate.tsx new file mode 100644 index 0000000000..6fc4d875fd --- /dev/null +++ b/packages/twenty-front/src/modules/settings/integrations/components/SettingsIntegrationRemoteTableSchemaUpdate.tsx @@ -0,0 +1,37 @@ +import { FetchResult } from '@apollo/client'; +import styled from '@emotion/styled'; +import { IconReload } from 'twenty-ui'; + +import { Button } from '@/ui/input/button/components/Button'; +import { SyncRemoteTableSchemaChangesMutation } from '~/generated-metadata/graphql'; + +const StyledText = styled.h3` + color: ${({ theme }) => theme.font.color.tertiary}; + font-size: ${({ theme }) => theme.font.size.md}; + font-weight: ${({ theme }) => theme.font.weight.regular}; + margin: 0; +`; + +type SettingsIntegrationRemoteTableSchemaUpdateProps = { + updatesText: string; + onUpdate: () => Promise>; +}; + +export const SettingsIntegrationRemoteTableSchemaUpdate = ({ + updatesText, + onUpdate, +}: SettingsIntegrationRemoteTableSchemaUpdateProps) => { + return ( + <> + {updatesText && {updatesText}} + {updatesText && ( +