diff --git a/packages/twenty-front/codegen-metadata.cjs b/packages/twenty-front/codegen-metadata.cjs index 55334b93820..f8319ee92d5 100644 --- a/packages/twenty-front/codegen-metadata.cjs +++ b/packages/twenty-front/codegen-metadata.cjs @@ -18,6 +18,7 @@ module.exports = { './src/modules/billing/graphql/**/*.{ts,tsx}', './src/modules/settings/**/graphql/**/*.{ts,tsx}', + './src/modules/logic-functions/graphql/**/*.{ts,tsx}', './src/modules/databases/graphql/**/*.{ts,tsx}', './src/modules/workflow/**/graphql/**/*.{ts,tsx}', diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 1519733ead8..89c5ecacda4 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -1447,7 +1447,9 @@ export type EventWithQueryIds = { queryIds: Array; }; -export type ExecuteLogicFunctionInput = { +export type ExecuteOneLogicFunctionInput = { + /** Force rebuild from source before executing */ + forceRebuild?: InputMaybe; /** Id of the logic function to execute */ id: Scalars['UUID']; /** Payload in JSON format */ @@ -2221,11 +2223,11 @@ export type Mutation = { updateDatabaseConfigVariable: Scalars['Boolean']; updateFrontComponent: FrontComponent; updateLabPublicFeatureFlag: FeatureFlagDto; + updateLogicFunctionSource: Scalars['Boolean']; updateNavigationMenuItem: NavigationMenuItem; updateOneAgent: Agent; updateOneApplicationVariable: Scalars['Boolean']; updateOneField: Field; - updateOneLogicFunction: LogicFunction; updateOneObject: Object; updateOneRole: Role; updatePageLayout: PageLayout; @@ -2732,7 +2734,7 @@ export type MutationEvaluateAgentTurnArgs = { export type MutationExecuteOneLogicFunctionArgs = { - input: ExecuteLogicFunctionInput; + input: ExecuteOneLogicFunctionInput; }; @@ -2981,6 +2983,11 @@ export type MutationUpdateLabPublicFeatureFlagArgs = { }; +export type MutationUpdateLogicFunctionSourceArgs = { + input: UpdateLogicFunctionSourceInput; +}; + + export type MutationUpdateNavigationMenuItemArgs = { input: UpdateOneNavigationMenuItemInput; }; @@ -3003,11 +3010,6 @@ export type MutationUpdateOneFieldArgs = { }; -export type MutationUpdateOneLogicFunctionArgs = { - input: UpdateLogicFunctionInput; -}; - - export type MutationUpdateOneObjectArgs = { input: UpdateOneObjectInput; }; @@ -4699,23 +4701,11 @@ export type UpdateLabPublicFeatureFlagInput = { value: Scalars['Boolean']; }; -export type UpdateLogicFunctionInput = { - /** Id of the logic function to update */ - id: Scalars['UUID']; - /** The logic function updates */ - update: UpdateLogicFunctionInputUpdates; -}; - -export type UpdateLogicFunctionInputUpdates = { - builtHandlerPath?: InputMaybe; +export type UpdateLogicFunctionSourceInput = { + /** The source code (Sources) to write. Only updates source files. */ code: Scalars['JSON']; - description?: InputMaybe; - handlerName?: InputMaybe; - isTool?: InputMaybe; - name: Scalars['String']; - sourceHandlerPath?: InputMaybe; - timeoutSeconds?: InputMaybe; - toolInputSchema?: InputMaybe; + /** The id of the logic function. */ + id: Scalars['UUID']; }; export type UpdateNavigationMenuItemInput = { @@ -5994,6 +5984,27 @@ export type UploadFilesFieldFileMutationVariables = Exact<{ export type UploadFilesFieldFileMutation = { __typename?: 'Mutation', uploadFilesFieldFile: { __typename?: 'File', id: string, path: string, size: number, createdAt: string } }; +export type ExecuteOneLogicFunctionMutationVariables = Exact<{ + input: ExecuteOneLogicFunctionInput; +}>; + + +export type ExecuteOneLogicFunctionMutation = { __typename?: 'Mutation', executeOneLogicFunction: { __typename?: 'LogicFunctionExecutionResult', data?: any | null, logs: string, duration: number, status: LogicFunctionExecutionStatus, error?: any | null } }; + +export type UpdateLogicFunctionSourceMutationVariables = Exact<{ + input: UpdateLogicFunctionSourceInput; +}>; + + +export type UpdateLogicFunctionSourceMutation = { __typename?: 'Mutation', updateLogicFunctionSource: boolean }; + +export type GetLogicFunctionSourceCodeQueryVariables = Exact<{ + input: GetLogicFunctionSourceCodeInput; +}>; + + +export type GetLogicFunctionSourceCodeQuery = { __typename?: 'Query', getLogicFunctionSourceCode?: any | null }; + export type NavigationMenuItemFieldsFragment = { __typename?: 'NavigationMenuItem', id: string, userWorkspaceId?: string | null, targetRecordId?: string | null, targetObjectMetadataId?: string | null, viewId?: string | null, folderId?: string | null, name?: string | null, position: number, applicationId?: string | null, createdAt: string, updatedAt: string }; export type NavigationMenuItemQueryFieldsFragment = { __typename?: 'NavigationMenuItem', id: string, userWorkspaceId?: string | null, targetRecordId?: string | null, targetObjectMetadataId?: string | null, viewId?: string | null, folderId?: string | null, name?: string | null, position: number, applicationId?: string | null, createdAt: string, updatedAt: string, targetRecordIdentifier?: { __typename?: 'RecordIdentifier', id: string, labelIdentifier: string, imageIdentifier?: string | null } | null }; @@ -6400,20 +6411,6 @@ export type DeleteOneLogicFunctionMutationVariables = Exact<{ export type DeleteOneLogicFunctionMutation = { __typename?: 'Mutation', deleteOneLogicFunction: { __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, sourceHandlerPath: string, builtHandlerPath: string, handlerName: string, toolInputSchema?: any | null, isTool: boolean, applicationId?: string | null, createdAt: string, updatedAt: string } }; -export type ExecuteOneLogicFunctionMutationVariables = Exact<{ - input: ExecuteLogicFunctionInput; -}>; - - -export type ExecuteOneLogicFunctionMutation = { __typename?: 'Mutation', executeOneLogicFunction: { __typename?: 'LogicFunctionExecutionResult', data?: any | null, logs: string, duration: number, status: LogicFunctionExecutionStatus, error?: any | null } }; - -export type UpdateOneLogicFunctionMutationVariables = Exact<{ - input: UpdateLogicFunctionInput; -}>; - - -export type UpdateOneLogicFunctionMutation = { __typename?: 'Mutation', updateOneLogicFunction: { __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, sourceHandlerPath: string, builtHandlerPath: string, handlerName: string, toolInputSchema?: any | null, isTool: boolean, applicationId?: string | null, createdAt: string, updatedAt: string } }; - export type FindManyAvailablePackagesQueryVariables = Exact<{ input: LogicFunctionIdInput; }>; @@ -6433,13 +6430,6 @@ export type GetOneLogicFunctionQueryVariables = Exact<{ export type GetOneLogicFunctionQuery = { __typename?: 'Query', findOneLogicFunction: { __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, sourceHandlerPath: string, builtHandlerPath: string, handlerName: string, toolInputSchema?: any | null, isTool: boolean, applicationId?: string | null, createdAt: string, updatedAt: string } }; -export type FindOneLogicFunctionSourceCodeQueryVariables = Exact<{ - input: GetLogicFunctionSourceCodeInput; -}>; - - -export type FindOneLogicFunctionSourceCodeQuery = { __typename?: 'Query', getLogicFunctionSourceCode?: any | null }; - export type UploadWorkspaceMemberProfilePictureMutationVariables = Exact<{ file: Scalars['Upload']; }>; @@ -10371,6 +10361,107 @@ export function useUploadFilesFieldFileMutation(baseOptions?: Apollo.MutationHoo export type UploadFilesFieldFileMutationHookResult = ReturnType; export type UploadFilesFieldFileMutationResult = Apollo.MutationResult; export type UploadFilesFieldFileMutationOptions = Apollo.BaseMutationOptions; +export const ExecuteOneLogicFunctionDocument = gql` + mutation ExecuteOneLogicFunction($input: ExecuteOneLogicFunctionInput!) { + executeOneLogicFunction(input: $input) { + data + logs + duration + status + error + } +} + `; +export type ExecuteOneLogicFunctionMutationFn = Apollo.MutationFunction; + +/** + * __useExecuteOneLogicFunctionMutation__ + * + * To run a mutation, you first call `useExecuteOneLogicFunctionMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useExecuteOneLogicFunctionMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [executeOneLogicFunctionMutation, { data, loading, error }] = useExecuteOneLogicFunctionMutation({ + * variables: { + * input: // value for 'input' + * }, + * }); + */ +export function useExecuteOneLogicFunctionMutation(baseOptions?: Apollo.MutationHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useMutation(ExecuteOneLogicFunctionDocument, options); + } +export type ExecuteOneLogicFunctionMutationHookResult = ReturnType; +export type ExecuteOneLogicFunctionMutationResult = Apollo.MutationResult; +export type ExecuteOneLogicFunctionMutationOptions = Apollo.BaseMutationOptions; +export const UpdateLogicFunctionSourceDocument = gql` + mutation UpdateLogicFunctionSource($input: UpdateLogicFunctionSourceInput!) { + updateLogicFunctionSource(input: $input) +} + `; +export type UpdateLogicFunctionSourceMutationFn = Apollo.MutationFunction; + +/** + * __useUpdateLogicFunctionSourceMutation__ + * + * To run a mutation, you first call `useUpdateLogicFunctionSourceMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useUpdateLogicFunctionSourceMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [updateLogicFunctionSourceMutation, { data, loading, error }] = useUpdateLogicFunctionSourceMutation({ + * variables: { + * input: // value for 'input' + * }, + * }); + */ +export function useUpdateLogicFunctionSourceMutation(baseOptions?: Apollo.MutationHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useMutation(UpdateLogicFunctionSourceDocument, options); + } +export type UpdateLogicFunctionSourceMutationHookResult = ReturnType; +export type UpdateLogicFunctionSourceMutationResult = Apollo.MutationResult; +export type UpdateLogicFunctionSourceMutationOptions = Apollo.BaseMutationOptions; +export const GetLogicFunctionSourceCodeDocument = gql` + query GetLogicFunctionSourceCode($input: GetLogicFunctionSourceCodeInput!) { + getLogicFunctionSourceCode(input: $input) +} + `; + +/** + * __useGetLogicFunctionSourceCodeQuery__ + * + * To run a query within a React component, call `useGetLogicFunctionSourceCodeQuery` and pass it any options that fit your needs. + * When your component renders, `useGetLogicFunctionSourceCodeQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useGetLogicFunctionSourceCodeQuery({ + * variables: { + * input: // value for 'input' + * }, + * }); + */ +export function useGetLogicFunctionSourceCodeQuery(baseOptions: Apollo.QueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(GetLogicFunctionSourceCodeDocument, options); + } +export function useGetLogicFunctionSourceCodeLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(GetLogicFunctionSourceCodeDocument, options); + } +export type GetLogicFunctionSourceCodeQueryHookResult = ReturnType; +export type GetLogicFunctionSourceCodeLazyQueryHookResult = ReturnType; +export type GetLogicFunctionSourceCodeQueryResult = Apollo.QueryResult; export const CreateNavigationMenuItemDocument = gql` mutation CreateNavigationMenuItem($input: CreateNavigationMenuItemInput!) { createNavigationMenuItem(input: $input) { @@ -12617,76 +12708,6 @@ export function useDeleteOneLogicFunctionMutation(baseOptions?: Apollo.MutationH export type DeleteOneLogicFunctionMutationHookResult = ReturnType; export type DeleteOneLogicFunctionMutationResult = Apollo.MutationResult; export type DeleteOneLogicFunctionMutationOptions = Apollo.BaseMutationOptions; -export const ExecuteOneLogicFunctionDocument = gql` - mutation ExecuteOneLogicFunction($input: ExecuteLogicFunctionInput!) { - executeOneLogicFunction(input: $input) { - data - logs - duration - status - error - } -} - `; -export type ExecuteOneLogicFunctionMutationFn = Apollo.MutationFunction; - -/** - * __useExecuteOneLogicFunctionMutation__ - * - * To run a mutation, you first call `useExecuteOneLogicFunctionMutation` within a React component and pass it any options that fit your needs. - * When your component renders, `useExecuteOneLogicFunctionMutation` returns a tuple that includes: - * - A mutate function that you can call at any time to execute the mutation - * - An object with fields that represent the current status of the mutation's execution - * - * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; - * - * @example - * const [executeOneLogicFunctionMutation, { data, loading, error }] = useExecuteOneLogicFunctionMutation({ - * variables: { - * input: // value for 'input' - * }, - * }); - */ -export function useExecuteOneLogicFunctionMutation(baseOptions?: Apollo.MutationHookOptions) { - const options = {...defaultOptions, ...baseOptions} - return Apollo.useMutation(ExecuteOneLogicFunctionDocument, options); - } -export type ExecuteOneLogicFunctionMutationHookResult = ReturnType; -export type ExecuteOneLogicFunctionMutationResult = Apollo.MutationResult; -export type ExecuteOneLogicFunctionMutationOptions = Apollo.BaseMutationOptions; -export const UpdateOneLogicFunctionDocument = gql` - mutation UpdateOneLogicFunction($input: UpdateLogicFunctionInput!) { - updateOneLogicFunction(input: $input) { - ...LogicFunctionFields - } -} - ${LogicFunctionFieldsFragmentDoc}`; -export type UpdateOneLogicFunctionMutationFn = Apollo.MutationFunction; - -/** - * __useUpdateOneLogicFunctionMutation__ - * - * To run a mutation, you first call `useUpdateOneLogicFunctionMutation` within a React component and pass it any options that fit your needs. - * When your component renders, `useUpdateOneLogicFunctionMutation` returns a tuple that includes: - * - A mutate function that you can call at any time to execute the mutation - * - An object with fields that represent the current status of the mutation's execution - * - * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; - * - * @example - * const [updateOneLogicFunctionMutation, { data, loading, error }] = useUpdateOneLogicFunctionMutation({ - * variables: { - * input: // value for 'input' - * }, - * }); - */ -export function useUpdateOneLogicFunctionMutation(baseOptions?: Apollo.MutationHookOptions) { - const options = {...defaultOptions, ...baseOptions} - return Apollo.useMutation(UpdateOneLogicFunctionDocument, options); - } -export type UpdateOneLogicFunctionMutationHookResult = ReturnType; -export type UpdateOneLogicFunctionMutationResult = Apollo.MutationResult; -export type UpdateOneLogicFunctionMutationOptions = Apollo.BaseMutationOptions; export const FindManyAvailablePackagesDocument = gql` query FindManyAvailablePackages($input: LogicFunctionIdInput!) { getAvailablePackages(input: $input) @@ -12789,39 +12810,6 @@ export function useGetOneLogicFunctionLazyQuery(baseOptions?: Apollo.LazyQueryHo export type GetOneLogicFunctionQueryHookResult = ReturnType; export type GetOneLogicFunctionLazyQueryHookResult = ReturnType; export type GetOneLogicFunctionQueryResult = Apollo.QueryResult; -export const FindOneLogicFunctionSourceCodeDocument = gql` - query FindOneLogicFunctionSourceCode($input: GetLogicFunctionSourceCodeInput!) { - getLogicFunctionSourceCode(input: $input) -} - `; - -/** - * __useFindOneLogicFunctionSourceCodeQuery__ - * - * To run a query within a React component, call `useFindOneLogicFunctionSourceCodeQuery` and pass it any options that fit your needs. - * When your component renders, `useFindOneLogicFunctionSourceCodeQuery` returns an object from Apollo Client that contains loading, error, and data properties - * you can use to render your UI. - * - * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; - * - * @example - * const { data, loading, error } = useFindOneLogicFunctionSourceCodeQuery({ - * variables: { - * input: // value for 'input' - * }, - * }); - */ -export function useFindOneLogicFunctionSourceCodeQuery(baseOptions: Apollo.QueryHookOptions) { - const options = {...defaultOptions, ...baseOptions} - return Apollo.useQuery(FindOneLogicFunctionSourceCodeDocument, options); - } -export function useFindOneLogicFunctionSourceCodeLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { - const options = {...defaultOptions, ...baseOptions} - return Apollo.useLazyQuery(FindOneLogicFunctionSourceCodeDocument, options); - } -export type FindOneLogicFunctionSourceCodeQueryHookResult = ReturnType; -export type FindOneLogicFunctionSourceCodeLazyQueryHookResult = ReturnType; -export type FindOneLogicFunctionSourceCodeQueryResult = Apollo.QueryResult; export const UploadWorkspaceMemberProfilePictureDocument = gql` mutation UploadWorkspaceMemberProfilePicture($file: Upload!) { uploadWorkspaceMemberProfilePicture(file: $file) { diff --git a/packages/twenty-front/src/generated/graphql.ts b/packages/twenty-front/src/generated/graphql.ts index c7f4761edf4..29c1051313e 100644 --- a/packages/twenty-front/src/generated/graphql.ts +++ b/packages/twenty-front/src/generated/graphql.ts @@ -1419,7 +1419,9 @@ export type EventWithQueryIds = { queryIds: Array; }; -export type ExecuteLogicFunctionInput = { +export type ExecuteOneLogicFunctionInput = { + /** Force rebuild from source before executing */ + forceRebuild?: InputMaybe; /** Id of the logic function to execute */ id: Scalars['UUID']; /** Payload in JSON format */ @@ -2184,10 +2186,10 @@ export type Mutation = { updateDatabaseConfigVariable: Scalars['Boolean']; updateFrontComponent: FrontComponent; updateLabPublicFeatureFlag: FeatureFlagDto; + updateLogicFunctionSource: Scalars['Boolean']; updateOneAgent: Agent; updateOneApplicationVariable: Scalars['Boolean']; updateOneField: Field; - updateOneLogicFunction: LogicFunction; updateOneObject: Object; updateOneRole: Role; updatePageLayout: PageLayout; @@ -2653,7 +2655,7 @@ export type MutationEmailPasswordResetLinkArgs = { export type MutationExecuteOneLogicFunctionArgs = { - input: ExecuteLogicFunctionInput; + input: ExecuteOneLogicFunctionInput; }; @@ -2896,6 +2898,11 @@ export type MutationUpdateLabPublicFeatureFlagArgs = { }; +export type MutationUpdateLogicFunctionSourceArgs = { + input: UpdateLogicFunctionSourceInput; +}; + + export type MutationUpdateOneAgentArgs = { input: UpdateAgentInput; }; @@ -2913,11 +2920,6 @@ export type MutationUpdateOneFieldArgs = { }; -export type MutationUpdateOneLogicFunctionArgs = { - input: UpdateLogicFunctionInput; -}; - - export type MutationUpdateOneObjectArgs = { input: UpdateOneObjectInput; }; @@ -4538,23 +4540,11 @@ export type UpdateLabPublicFeatureFlagInput = { value: Scalars['Boolean']; }; -export type UpdateLogicFunctionInput = { - /** Id of the logic function to update */ - id: Scalars['UUID']; - /** The logic function updates */ - update: UpdateLogicFunctionInputUpdates; -}; - -export type UpdateLogicFunctionInputUpdates = { - builtHandlerPath?: InputMaybe; +export type UpdateLogicFunctionSourceInput = { + /** The source code (Sources) to write. Only updates source files. */ code: Scalars['JSON']; - description?: InputMaybe; - handlerName?: InputMaybe; - isTool?: InputMaybe; - name: Scalars['String']; - sourceHandlerPath?: InputMaybe; - timeoutSeconds?: InputMaybe; - toolInputSchema?: InputMaybe; + /** The id of the logic function. */ + id: Scalars['UUID']; }; export type UpdateObjectPayload = { diff --git a/packages/twenty-front/src/modules/settings/logic-functions/graphql/mutations/executeOneLogicFunction.ts b/packages/twenty-front/src/modules/logic-functions/graphql/mutations/executeOneLogicFunction.ts similarity index 73% rename from packages/twenty-front/src/modules/settings/logic-functions/graphql/mutations/executeOneLogicFunction.ts rename to packages/twenty-front/src/modules/logic-functions/graphql/mutations/executeOneLogicFunction.ts index 47321b434dd..07bdf84f755 100644 --- a/packages/twenty-front/src/modules/settings/logic-functions/graphql/mutations/executeOneLogicFunction.ts +++ b/packages/twenty-front/src/modules/logic-functions/graphql/mutations/executeOneLogicFunction.ts @@ -1,7 +1,7 @@ import { gql } from '@apollo/client'; export const EXECUTE_ONE_LOGIC_FUNCTION = gql` - mutation ExecuteOneLogicFunction($input: ExecuteLogicFunctionInput!) { + mutation ExecuteOneLogicFunction($input: ExecuteOneLogicFunctionInput!) { executeOneLogicFunction(input: $input) { data logs diff --git a/packages/twenty-front/src/modules/logic-functions/graphql/mutations/updateLogicFunctionSource.ts b/packages/twenty-front/src/modules/logic-functions/graphql/mutations/updateLogicFunctionSource.ts new file mode 100644 index 00000000000..598cbe1807f --- /dev/null +++ b/packages/twenty-front/src/modules/logic-functions/graphql/mutations/updateLogicFunctionSource.ts @@ -0,0 +1,7 @@ +import { gql } from '@apollo/client'; + +export const UPDATE_LOGIC_FUNCTION_SOURCE = gql` + mutation UpdateLogicFunctionSource($input: UpdateLogicFunctionSourceInput!) { + updateLogicFunctionSource(input: $input) + } +`; diff --git a/packages/twenty-front/src/modules/logic-functions/graphql/queries/getLogicFunctionSourceCode.ts b/packages/twenty-front/src/modules/logic-functions/graphql/queries/getLogicFunctionSourceCode.ts new file mode 100644 index 00000000000..85a8a732d71 --- /dev/null +++ b/packages/twenty-front/src/modules/logic-functions/graphql/queries/getLogicFunctionSourceCode.ts @@ -0,0 +1,7 @@ +import { gql } from '@apollo/client'; + +export const GET_LOGIC_FUNCTION_SOURCE_CODE = gql` + query GetLogicFunctionSourceCode($input: GetLogicFunctionSourceCodeInput!) { + getLogicFunctionSourceCode(input: $input) + } +`; diff --git a/packages/twenty-front/src/modules/logic-functions/hooks/useExecuteLogicFunction.ts b/packages/twenty-front/src/modules/logic-functions/hooks/useExecuteLogicFunction.ts new file mode 100644 index 00000000000..7b81495e9cb --- /dev/null +++ b/packages/twenty-front/src/modules/logic-functions/hooks/useExecuteLogicFunction.ts @@ -0,0 +1,97 @@ +import { EXECUTE_ONE_LOGIC_FUNCTION } from '@/logic-functions/graphql/mutations/executeOneLogicFunction'; +import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient'; +import { logicFunctionTestDataFamilyState } from '@/workflow/workflow-steps/workflow-actions/code-action/states/logicFunctionTestDataFamilyState'; +import { useMutation } from '@apollo/client'; +import { useState } from 'react'; +import { useRecoilState } from 'recoil'; +import { isDefined } from 'twenty-shared/utils'; +import { LogicFunctionExecutionStatus } from '~/generated-metadata/graphql'; +import { sleep } from '~/utils/sleep'; + +type ExecuteOneLogicFunctionInput = { + id: string; + payload: object; + forceRebuild?: boolean; +}; + +type ExecuteOneLogicFunctionResult = { + data?: object | null; + logs: string; + duration: number; + status: LogicFunctionExecutionStatus; + error?: { + errorType: string; + errorMessage: string; + stackTrace: string; + } | null; +}; + +export const useExecuteLogicFunction = ({ + logicFunctionId, + callback, +}: { + logicFunctionId: string; + callback?: (result: object) => void; +}) => { + const [isExecuting, setIsExecuting] = useState(false); + const apolloMetadataClient = useApolloCoreClient(); + const [executeOneLogicFunctionMutation] = useMutation< + { executeOneLogicFunction: ExecuteOneLogicFunctionResult }, + { input: ExecuteOneLogicFunctionInput } + >(EXECUTE_ONE_LOGIC_FUNCTION, { + client: apolloMetadataClient, + }); + + const [logicFunctionTestData, setLogicFunctionTestData] = useRecoilState( + logicFunctionTestDataFamilyState(logicFunctionId), + ); + + const executeLogicFunction = async ({ + forceRebuild = false, + }: { forceRebuild?: boolean } = {}) => { + try { + setIsExecuting(true); + await sleep(200); // Delay artificially to avoid flashing the UI + const result = await executeOneLogicFunctionMutation({ + variables: { + input: { + id: logicFunctionId, + payload: logicFunctionTestData.input, + forceRebuild, + }, + }, + }); + + setIsExecuting(false); + + const executionResult = result?.data?.executeOneLogicFunction; + + if (isDefined(executionResult?.data)) { + callback?.(executionResult.data); + } + + setLogicFunctionTestData((prev) => ({ + ...prev, + language: 'json', + height: 300, + output: { + data: executionResult?.data + ? JSON.stringify(executionResult.data, null, 4) + : undefined, + logs: executionResult?.logs || '', + duration: executionResult?.duration, + status: (executionResult?.status ?? + LogicFunctionExecutionStatus.IDLE) as LogicFunctionExecutionStatus, + error: executionResult?.error + ? JSON.stringify(executionResult.error, null, 4) + : undefined, + }, + })); + } catch (error) { + setIsExecuting(false); + throw error; + } + }; + + return { executeLogicFunction, isExecuting }; +}; diff --git a/packages/twenty-front/src/modules/logic-functions/hooks/useGetLogicFunctionSourceCode.ts b/packages/twenty-front/src/modules/logic-functions/hooks/useGetLogicFunctionSourceCode.ts new file mode 100644 index 00000000000..4754c93867c --- /dev/null +++ b/packages/twenty-front/src/modules/logic-functions/hooks/useGetLogicFunctionSourceCode.ts @@ -0,0 +1,34 @@ +import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient'; +import { GET_LOGIC_FUNCTION_SOURCE_CODE } from '@/logic-functions/graphql/queries/getLogicFunctionSourceCode'; +import { useQuery } from '@apollo/client'; +import { type Sources } from 'twenty-shared/types'; +import { + type GetLogicFunctionSourceCodeQuery, + type GetLogicFunctionSourceCodeQueryVariables, +} from '~/generated-metadata/graphql'; + +export const useGetLogicFunctionSourceCode = ({ + logicFunctionId, +}: { + logicFunctionId: string; +}): { code: Sources | null; loading: boolean } => { + const apolloMetadataClient = useApolloCoreClient(); + const { data, loading } = useQuery< + GetLogicFunctionSourceCodeQuery, + GetLogicFunctionSourceCodeQueryVariables + >(GET_LOGIC_FUNCTION_SOURCE_CODE, { + client: apolloMetadataClient ?? undefined, + variables: { + input: { id: logicFunctionId }, + }, + skip: !logicFunctionId, + }); + + const raw = data?.getLogicFunctionSourceCode; + const code = + raw != null && typeof raw === 'object' && !Array.isArray(raw) + ? (raw as Sources) + : null; + + return { code, loading }; +}; diff --git a/packages/twenty-front/src/modules/settings/logic-functions/hooks/usePersistLogicFunction.ts b/packages/twenty-front/src/modules/logic-functions/hooks/usePersistLogicFunction.ts similarity index 80% rename from packages/twenty-front/src/modules/settings/logic-functions/hooks/usePersistLogicFunction.ts rename to packages/twenty-front/src/modules/logic-functions/hooks/usePersistLogicFunction.ts index fa1ffd6a30c..2b59e06d8ae 100644 --- a/packages/twenty-front/src/modules/settings/logic-functions/hooks/usePersistLogicFunction.ts +++ b/packages/twenty-front/src/modules/logic-functions/hooks/usePersistLogicFunction.ts @@ -1,27 +1,29 @@ import { useCallback } from 'react'; +import { UPDATE_LOGIC_FUNCTION_SOURCE } from '@/logic-functions/graphql/mutations/updateLogicFunctionSource'; +import { GET_LOGIC_FUNCTION_SOURCE_CODE } from '@/logic-functions/graphql/queries/getLogicFunctionSourceCode'; import { useMetadataErrorHandler } from '@/metadata-error-handler/hooks/useMetadataErrorHandler'; import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient'; import { type MetadataRequestResult } from '@/object-metadata/types/MetadataRequestResult.type'; import { CREATE_ONE_LOGIC_FUNCTION } from '@/settings/logic-functions/graphql/mutations/createOneLogicFunction'; import { DELETE_ONE_LOGIC_FUNCTION } from '@/settings/logic-functions/graphql/mutations/deleteOneLogicFunction'; -import { UPDATE_ONE_LOGIC_FUNCTION } from '@/settings/logic-functions/graphql/mutations/updateOneLogicFunction'; import { FIND_MANY_LOGIC_FUNCTIONS } from '@/settings/logic-functions/graphql/queries/findManyLogicFunctions'; -import { FIND_ONE_LOGIC_FUNCTION_SOURCE_CODE } from '@/settings/logic-functions/graphql/queries/findOneLogicFunctionSourceCode'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { ApolloError, useMutation } from '@apollo/client'; import { getOperationName } from '@apollo/client/utilities'; import { t } from '@lingui/core/macro'; -import { CrudOperationType } from 'twenty-shared/types'; +import { type Sources, CrudOperationType } from 'twenty-shared/types'; import { type CreateOneLogicFunctionItemMutation, type CreateOneLogicFunctionItemMutationVariables, type DeleteOneLogicFunctionMutation, type DeleteOneLogicFunctionMutationVariables, - type UpdateOneLogicFunctionMutation, - type UpdateOneLogicFunctionMutationVariables, } from '~/generated-metadata/graphql'; +type UpdateLogicFunctionSourceMutationVariables = { + input: { id: string; code: Sources }; +}; + export const usePersistLogicFunction = () => { const apolloMetadataClient = useApolloCoreClient(); const { handleMetadataError } = useMetadataErrorHandler(); @@ -34,13 +36,6 @@ export const usePersistLogicFunction = () => { client: apolloMetadataClient, }); - const [updateLogicFunctionMutation] = useMutation< - UpdateOneLogicFunctionMutation, - UpdateOneLogicFunctionMutationVariables - >(UPDATE_ONE_LOGIC_FUNCTION, { - client: apolloMetadataClient, - }); - const [deleteLogicFunctionMutation] = useMutation< DeleteOneLogicFunctionMutation, DeleteOneLogicFunctionMutationVariables @@ -48,6 +43,13 @@ export const usePersistLogicFunction = () => { client: apolloMetadataClient, }); + const [updateLogicFunctionSourceMutation] = useMutation< + { updateLogicFunctionSource: boolean }, + UpdateLogicFunctionSourceMutationVariables + >(UPDATE_LOGIC_FUNCTION_SOURCE, { + client: apolloMetadataClient, + }); + const createLogicFunction = useCallback( async ( variables: CreateOneLogicFunctionItemMutationVariables, @@ -86,19 +88,19 @@ export const usePersistLogicFunction = () => { [createLogicFunctionMutation, handleMetadataError, enqueueErrorSnackBar], ); - const updateLogicFunction = useCallback( + const updateLogicFunctionSource = useCallback( async ( - variables: UpdateOneLogicFunctionMutationVariables, + variables: UpdateLogicFunctionSourceMutationVariables, ): Promise< MetadataRequestResult< - Awaited> + Awaited> > > => { try { - const result = await updateLogicFunctionMutation({ + const result = await updateLogicFunctionSourceMutation({ variables, refetchQueries: [ - getOperationName(FIND_ONE_LOGIC_FUNCTION_SOURCE_CODE) ?? '', + getOperationName(GET_LOGIC_FUNCTION_SOURCE_CODE) ?? '', ], }); @@ -122,7 +124,11 @@ export const usePersistLogicFunction = () => { }; } }, - [updateLogicFunctionMutation, handleMetadataError, enqueueErrorSnackBar], + [ + updateLogicFunctionSourceMutation, + handleMetadataError, + enqueueErrorSnackBar, + ], ); const deleteLogicFunction = useCallback( @@ -138,7 +144,7 @@ export const usePersistLogicFunction = () => { variables, awaitRefetchQueries: true, refetchQueries: [ - getOperationName(FIND_ONE_LOGIC_FUNCTION_SOURCE_CODE) ?? '', + getOperationName(GET_LOGIC_FUNCTION_SOURCE_CODE) ?? '', ], }); @@ -167,7 +173,7 @@ export const usePersistLogicFunction = () => { return { createLogicFunction, - updateLogicFunction, + updateLogicFunctionSource, deleteLogicFunction, }; }; diff --git a/packages/twenty-front/src/modules/logic-functions/hooks/useTestLogicFunction.ts b/packages/twenty-front/src/modules/logic-functions/hooks/useTestLogicFunction.ts deleted file mode 100644 index bd74e7ba0da..00000000000 --- a/packages/twenty-front/src/modules/logic-functions/hooks/useTestLogicFunction.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useExecuteOneLogicFunction } from '@/settings/logic-functions/hooks/useExecuteOneLogicFunction'; -import { logicFunctionTestDataFamilyState } from '@/workflow/workflow-steps/workflow-actions/code-action/states/logicFunctionTestDataFamilyState'; -import { useState } from 'react'; -import { useRecoilState } from 'recoil'; -import { isDefined } from 'twenty-shared/utils'; -import { sleep } from '~/utils/sleep'; - -export const useTestLogicFunction = ({ - logicFunctionId, - callback, -}: { - logicFunctionId: string; - callback?: (testResult: object) => void; -}) => { - const [isTesting, setIsTesting] = useState(false); - const { executeOneLogicFunction } = useExecuteOneLogicFunction(); - const [logicFunctionTestData, setLogicFunctionTestData] = useRecoilState( - logicFunctionTestDataFamilyState(logicFunctionId), - ); - - const testLogicFunction = async () => { - try { - setIsTesting(true); - await sleep(200); // Delay artificially to avoid flashing the UI - const result = await executeOneLogicFunction({ - id: logicFunctionId, - payload: logicFunctionTestData.input, - }); - - setIsTesting(false); - - if (isDefined(result?.data?.executeOneLogicFunction?.data)) { - callback?.(result?.data?.executeOneLogicFunction?.data); - } - - setLogicFunctionTestData((prev) => ({ - ...prev, - language: 'json', - height: 300, - output: { - data: result?.data?.executeOneLogicFunction?.data - ? JSON.stringify( - result?.data?.executeOneLogicFunction?.data, - null, - 4, - ) - : undefined, - logs: result?.data?.executeOneLogicFunction?.logs || '', - duration: result?.data?.executeOneLogicFunction?.duration, - status: result?.data?.executeOneLogicFunction?.status, - error: result?.data?.executeOneLogicFunction?.error - ? JSON.stringify( - result?.data?.executeOneLogicFunction?.error, - null, - 4, - ) - : undefined, - }, - })); - } catch (error) { - setIsTesting(false); - throw error; - } - }; - - return { testLogicFunction, isTesting }; -}; diff --git a/packages/twenty-front/src/modules/settings/logic-functions/graphql/mutations/updateOneLogicFunction.ts b/packages/twenty-front/src/modules/settings/logic-functions/graphql/mutations/updateOneLogicFunction.ts deleted file mode 100644 index c50d9179f48..00000000000 --- a/packages/twenty-front/src/modules/settings/logic-functions/graphql/mutations/updateOneLogicFunction.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { gql } from '@apollo/client'; -import { LOGIC_FUNCTION_FRAGMENT } from '@/settings/logic-functions/graphql/fragments/logicFunctionFragment'; - -export const UPDATE_ONE_LOGIC_FUNCTION = gql` - ${LOGIC_FUNCTION_FRAGMENT} - mutation UpdateOneLogicFunction($input: UpdateLogicFunctionInput!) { - updateOneLogicFunction(input: $input) { - ...LogicFunctionFields - } - } -`; diff --git a/packages/twenty-front/src/modules/settings/logic-functions/graphql/queries/findOneLogicFunctionSourceCode.ts b/packages/twenty-front/src/modules/settings/logic-functions/graphql/queries/findOneLogicFunctionSourceCode.ts deleted file mode 100644 index 34a167653b4..00000000000 --- a/packages/twenty-front/src/modules/settings/logic-functions/graphql/queries/findOneLogicFunctionSourceCode.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { gql } from '@apollo/client'; - -export const FIND_ONE_LOGIC_FUNCTION_SOURCE_CODE = gql` - query FindOneLogicFunctionSourceCode( - $input: GetLogicFunctionSourceCodeInput! - ) { - getLogicFunctionSourceCode(input: $input) - } -`; diff --git a/packages/twenty-front/src/modules/settings/logic-functions/hooks/__tests__/useLogicFunctionUpdateFormState.test.ts b/packages/twenty-front/src/modules/settings/logic-functions/hooks/__tests__/useLogicFunctionUpdateFormState.test.ts index dbc08f2f49f..a1bfb330d34 100644 --- a/packages/twenty-front/src/modules/settings/logic-functions/hooks/__tests__/useLogicFunctionUpdateFormState.test.ts +++ b/packages/twenty-front/src/modules/settings/logic-functions/hooks/__tests__/useLogicFunctionUpdateFormState.test.ts @@ -6,13 +6,6 @@ jest.mock('@/settings/logic-functions/hooks/useGetOneLogicFunction', () => ({ useGetOneLogicFunction: jest.fn(), })); -jest.mock( - '@/settings/logic-functions/hooks/useGetOneLogicFunctionSourceCode', - () => ({ - useGetOneLogicFunctionSourceCode: jest.fn(), - }), -); - describe('useLogicFunctionUpdateFormState', () => { test('should return a form', () => { const logicFunctionId = 'logicFunctionId'; @@ -21,15 +14,8 @@ describe('useLogicFunctionUpdateFormState', () => { ); useGetOneLogicFunctionMock.useGetOneLogicFunction.mockReturnValue({ logicFunction: { name: 'name' }, + loading: false, }); - const useGetOneLogicFunctionSourceCodeMock = jest.requireMock( - '@/settings/logic-functions/hooks/useGetOneLogicFunctionSourceCode', - ); - useGetOneLogicFunctionSourceCodeMock.useGetOneLogicFunctionSourceCode.mockReturnValue( - { - code: { src: { 'index.ts': 'export const handler = () => {}' } }, - }, - ); const { result } = renderHook( () => useLogicFunctionUpdateFormState({ logicFunctionId }), { diff --git a/packages/twenty-front/src/modules/settings/logic-functions/hooks/useExecuteOneLogicFunction.ts b/packages/twenty-front/src/modules/settings/logic-functions/hooks/useExecuteOneLogicFunction.ts deleted file mode 100644 index 8d6883e5cfa..00000000000 --- a/packages/twenty-front/src/modules/settings/logic-functions/hooks/useExecuteOneLogicFunction.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient'; -import { EXECUTE_ONE_LOGIC_FUNCTION } from '@/settings/logic-functions/graphql/mutations/executeOneLogicFunction'; -import { useMutation } from '@apollo/client'; -import { - type ExecuteOneLogicFunctionMutation, - type ExecuteOneLogicFunctionMutationVariables, - type ExecuteLogicFunctionInput, -} from '~/generated-metadata/graphql'; - -export const useExecuteOneLogicFunction = () => { - const apolloMetadataClient = useApolloCoreClient(); - const [mutate] = useMutation< - ExecuteOneLogicFunctionMutation, - ExecuteOneLogicFunctionMutationVariables - >(EXECUTE_ONE_LOGIC_FUNCTION, { - client: apolloMetadataClient, - }); - - const executeOneLogicFunction = async (input: ExecuteLogicFunctionInput) => { - return await mutate({ - variables: { - input, - }, - }); - }; - return { executeOneLogicFunction }; -}; diff --git a/packages/twenty-front/src/modules/settings/logic-functions/hooks/useGetOneLogicFunctionSourceCode.ts b/packages/twenty-front/src/modules/settings/logic-functions/hooks/useGetOneLogicFunctionSourceCode.ts deleted file mode 100644 index 6a3729c0137..00000000000 --- a/packages/twenty-front/src/modules/settings/logic-functions/hooks/useGetOneLogicFunctionSourceCode.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useQuery } from '@apollo/client'; -import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient'; -import { FIND_ONE_LOGIC_FUNCTION_SOURCE_CODE } from '@/settings/logic-functions/graphql/queries/findOneLogicFunctionSourceCode'; -import { - type FindOneLogicFunctionSourceCodeQuery, - type FindOneLogicFunctionSourceCodeQueryVariables, -} from '~/generated-metadata/graphql'; - -export const useGetOneLogicFunctionSourceCode = ({ - id, - onCompleted, -}: { - id: string; - onCompleted?: (data: FindOneLogicFunctionSourceCodeQuery) => void; -}) => { - const apolloMetadataClient = useApolloCoreClient(); - const { data, loading } = useQuery< - FindOneLogicFunctionSourceCodeQuery, - FindOneLogicFunctionSourceCodeQueryVariables - >(FIND_ONE_LOGIC_FUNCTION_SOURCE_CODE, { - client: apolloMetadataClient ?? undefined, - variables: { - input: { id }, - }, - onCompleted, - fetchPolicy: 'network-only', - }); - return { code: data?.getLogicFunctionSourceCode, loading }; -}; diff --git a/packages/twenty-front/src/modules/settings/logic-functions/hooks/useLogicFunctionUpdateFormState.ts b/packages/twenty-front/src/modules/settings/logic-functions/hooks/useLogicFunctionUpdateFormState.ts index e2e532cd215..7420e98a454 100644 --- a/packages/twenty-front/src/modules/settings/logic-functions/hooks/useLogicFunctionUpdateFormState.ts +++ b/packages/twenty-front/src/modules/settings/logic-functions/hooks/useLogicFunctionUpdateFormState.ts @@ -1,16 +1,8 @@ -import { flattenSources } from '@/logic-functions/utils/flattenSources'; -import { getFunctionInputFromSourceCode } from '@/logic-functions/utils/getFunctionInputFromSourceCode'; import { useGetOneLogicFunction } from '@/settings/logic-functions/hooks/useGetOneLogicFunction'; -import { useGetOneLogicFunctionSourceCode } from '@/settings/logic-functions/hooks/useGetOneLogicFunctionSourceCode'; -import { logicFunctionTestDataFamilyState } from '@/workflow/workflow-steps/workflow-actions/code-action/states/logicFunctionTestDataFamilyState'; import { type Dispatch, type SetStateAction, useState } from 'react'; -import { useRecoilState } from 'recoil'; import { type Sources } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { - type FindOneLogicFunctionSourceCodeQuery, - type GetOneLogicFunctionQuery, -} from '~/generated-metadata/graphql'; +import { type GetOneLogicFunctionQuery } from '~/generated-metadata/graphql'; import { type LogicFunction } from '~/generated/graphql'; export type LogicFunctionNewFormValues = { @@ -42,10 +34,6 @@ export const useLogicFunctionUpdateFormState = ({ code: { src: { 'index.ts': '' } }, }); - const [logicFunctionTestData, setLogicFunctionTestData] = useRecoilState( - logicFunctionTestDataFamilyState(logicFunctionId), - ); - const { logicFunction, loading: logicFunctionLoading } = useGetOneLogicFunction({ id: logicFunctionId, @@ -62,43 +50,10 @@ export const useLogicFunctionUpdateFormState = ({ }, }); - const { loading: logicFunctionSourceCodeLoading } = - useGetOneLogicFunctionSourceCode({ - id: logicFunctionId, - onCompleted: async (data: FindOneLogicFunctionSourceCodeQuery) => { - const code = data?.getLogicFunctionSourceCode; - - setFormValues((prevState) => ({ - ...prevState, - code: code || prevState.code, - })); - - if (logicFunctionTestData.shouldInitInput) { - const flattenedCode = flattenSources(code); - - const sourceCode = flattenedCode.find( - (flatCode) => flatCode.path === logicFunction?.sourceHandlerPath, - ); - - if (isDefined(sourceCode)) { - const functionInput = await getFunctionInputFromSourceCode( - sourceCode.content, - ); - - setLogicFunctionTestData((prev) => ({ - ...prev, - input: functionInput, - shouldInitInput: false, - })); - } - } - }, - }); - return { formValues, setFormValues, logicFunction, - loading: logicFunctionSourceCodeLoading || logicFunctionLoading, + loading: logicFunctionLoading, }; }; diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/code-action/components/WorkflowEditActionCode.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/code-action/components/WorkflowEditActionCode.tsx index fb02bdc9140..0c6b05fa1b2 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/code-action/components/WorkflowEditActionCode.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/code-action/components/WorkflowEditActionCode.tsx @@ -1,8 +1,6 @@ +import { useGetLogicFunctionSourceCode } from '@/logic-functions/hooks/useGetLogicFunctionSourceCode'; import { useGetAvailablePackages } from '@/settings/logic-functions/hooks/useGetAvailablePackages'; -import { - type LogicFunctionFormValues, - useLogicFunctionUpdateFormState, -} from '@/settings/logic-functions/hooks/useLogicFunctionUpdateFormState'; +import { type LogicFunctionFormValues } from '@/settings/logic-functions/hooks/useLogicFunctionUpdateFormState'; import { useFullScreenModal } from '@/ui/layout/fullscreen/hooks/useFullScreenModal'; import { type BreadcrumbProps } from '@/ui/navigation/bread-crumb/components/Breadcrumb'; import { useGetUpdatableWorkflowVersionOrThrow } from '@/workflow/hooks/useGetUpdatableWorkflowVersionOrThrow'; @@ -14,7 +12,6 @@ import { setNestedValue } from '@/workflow/workflow-steps/workflow-actions/code- import { CmdEnterActionButton } from '@/action-menu/components/CmdEnterActionButton'; import { LogicFunctionExecutionResult } from '@/logic-functions/components/LogicFunctionExecutionResult'; import { INDEX_FILE_NAME } from '@/logic-functions/constants/IndexFileName'; -import { useTestLogicFunction } from '@/logic-functions/hooks/useTestLogicFunction'; import { getFunctionInputFromSourceCode } from '@/logic-functions/utils/getFunctionInputFromSourceCode'; import { mergeDefaultFunctionInputAndFunctionInput } from '@/logic-functions/utils/mergeDefaultFunctionInputAndFunctionInput'; import { InputLabel } from '@/ui/input/components/InputLabel'; @@ -39,8 +36,9 @@ import styled from '@emotion/styled'; import { useLingui } from '@lingui/react/macro'; import { SOURCE_FOLDER_NAME } from '@/logic-functions/constants/SourceFolderName'; +import { useExecuteLogicFunction } from '@/logic-functions/hooks/useExecuteLogicFunction'; +import { usePersistLogicFunction } from '@/logic-functions/hooks/usePersistLogicFunction'; import { computeNewSources } from '@/logic-functions/utils/computeNewSources'; -import { usePersistLogicFunction } from '@/settings/logic-functions/hooks/usePersistLogicFunction'; import { WorkflowStepFooter } from '@/workflow/workflow-steps/components/WorkflowStepFooter'; import { CODE_ACTION } from '@/workflow/workflow-steps/workflow-actions/constants/actions/CodeAction'; import { type Monaco } from '@monaco-editor/react'; @@ -106,7 +104,7 @@ export const WorkflowEditActionCode = ({ activeTabIdComponentState, WORKFLOW_LOGIC_FUNCTION_TAB_LIST_COMPONENT_ID, ); - const { updateLogicFunction } = usePersistLogicFunction(); + const { updateLogicFunctionSource } = usePersistLogicFunction(); const { getUpdatableWorkflowVersion } = useGetUpdatableWorkflowVersionOrThrow(); @@ -128,10 +126,21 @@ export const WorkflowEditActionCode = ({ action.settings.input.logicFunctionInput, ); - const { formValues, setFormValues, loading } = - useLogicFunctionUpdateFormState({ - logicFunctionId, - }); + const { code: codeFromApi, loading } = useGetLogicFunctionSourceCode({ + logicFunctionId, + }); + + const [formValues, setFormValues] = useState({ + name: '', + description: '', + code: { src: { 'index.ts': '' } }, + }); + + useEffect(() => { + if (isDefined(codeFromApi)) { + setFormValues((prev) => ({ ...prev, code: codeFromApi })); + } + }, [codeFromApi]); const updateOutputSchemaFromTestResult = async (testResult: object) => { if (actionOptions.readonly === true) { @@ -144,20 +153,16 @@ export const WorkflowEditActionCode = ({ }); }; - const { testLogicFunction, isTesting } = useTestLogicFunction({ + const { executeLogicFunction, isExecuting } = useExecuteLogicFunction({ logicFunctionId, callback: updateOutputSchemaFromTestResult, }); const handleSave = useDebouncedCallback(async () => { - await updateLogicFunction({ + await updateLogicFunctionSource({ input: { id: logicFunctionId, - update: { - name: formValues.name, - description: formValues.description, - code: formValues.code, - }, + code: formValues.code, }, }); }, 500); @@ -267,8 +272,8 @@ export const WorkflowEditActionCode = ({ return; } - if (!isTesting) { - await testLogicFunction(); + if (!isExecuting) { + await executeLogicFunction({ forceRebuild: true }); } }; @@ -461,7 +466,7 @@ export const WorkflowEditActionCode = ({ {t`Result`} {logicFunctionTestData.output.logs.length > 0 && ( @@ -469,7 +474,7 @@ export const WorkflowEditActionCode = ({ {t`Logs`}