8726 workflow add a test button in workflow code step (#9016)
- add test button to workflow code step - add test tab to workflow code step https://github.com/user-attachments/assets/e180a827-7321-49a2-8026-88490c557da2  
This commit is contained in:
@ -1,27 +0,0 @@
|
||||
import { settingsServerlessFunctionCodeEditorOutputParamsState } from '@/settings/serverless-functions/states/settingsServerlessFunctionCodeEditorOutputParamsState';
|
||||
import { settingsServerlessFunctionInputState } from '@/settings/serverless-functions/states/settingsServerlessFunctionInputState';
|
||||
import { settingsServerlessFunctionOutputState } from '@/settings/serverless-functions/states/settingsServerlessFunctionOutputState';
|
||||
import { useResetRecoilState } from 'recoil';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
export const ResetServerlessFunctionStatesEffect = () => {
|
||||
const resetSettingsServerlessFunctionInput = useResetRecoilState(
|
||||
settingsServerlessFunctionInputState,
|
||||
);
|
||||
const resetSettingsServerlessFunctionOutput = useResetRecoilState(
|
||||
settingsServerlessFunctionOutputState,
|
||||
);
|
||||
const resetSettingsServerlessFunctionCodeEditorOutputParamsState =
|
||||
useResetRecoilState(settingsServerlessFunctionCodeEditorOutputParamsState);
|
||||
|
||||
useEffect(() => {
|
||||
resetSettingsServerlessFunctionInput();
|
||||
resetSettingsServerlessFunctionOutput();
|
||||
resetSettingsServerlessFunctionCodeEditorOutputParamsState();
|
||||
}, [
|
||||
resetSettingsServerlessFunctionInput,
|
||||
resetSettingsServerlessFunctionOutput,
|
||||
resetSettingsServerlessFunctionCodeEditorOutputParamsState,
|
||||
]);
|
||||
return <></>;
|
||||
};
|
||||
@ -4,14 +4,10 @@ import { SettingsServerlessFunctionCodeEditorTab } from '@/settings/serverless-f
|
||||
import { SettingsServerlessFunctionMonitoringTab } from '@/settings/serverless-functions/components/tabs/SettingsServerlessFunctionMonitoringTab';
|
||||
import { SettingsServerlessFunctionSettingsTab } from '@/settings/serverless-functions/components/tabs/SettingsServerlessFunctionSettingsTab';
|
||||
import { SettingsServerlessFunctionTestTab } from '@/settings/serverless-functions/components/tabs/SettingsServerlessFunctionTestTab';
|
||||
import { SettingsServerlessFunctionTestTabEffect } from '@/settings/serverless-functions/components/tabs/SettingsServerlessFunctionTestTabEffect';
|
||||
import { useExecuteOneServerlessFunction } from '@/settings/serverless-functions/hooks/useExecuteOneServerlessFunction';
|
||||
import { useGetOneServerlessFunctionSourceCode } from '@/settings/serverless-functions/hooks/useGetOneServerlessFunctionSourceCode';
|
||||
import { usePublishOneServerlessFunction } from '@/settings/serverless-functions/hooks/usePublishOneServerlessFunction';
|
||||
import { useServerlessFunctionUpdateFormState } from '@/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState';
|
||||
import { useUpdateOneServerlessFunction } from '@/settings/serverless-functions/hooks/useUpdateOneServerlessFunction';
|
||||
import { settingsServerlessFunctionInputState } from '@/settings/serverless-functions/states/settingsServerlessFunctionInputState';
|
||||
import { settingsServerlessFunctionOutputState } from '@/settings/serverless-functions/states/settingsServerlessFunctionOutputState';
|
||||
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
||||
import { SettingsPath } from '@/types/SettingsPath';
|
||||
import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar';
|
||||
@ -22,63 +18,39 @@ import { useTabList } from '@/ui/layout/tab/hooks/useTabList';
|
||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
||||
import { useState } from 'react';
|
||||
import { useParams } from 'react-router-dom';
|
||||
import { useRecoilValue, useSetRecoilState } from 'recoil';
|
||||
import {
|
||||
IconCode,
|
||||
IconGauge,
|
||||
IconSettings,
|
||||
IconTestPipe,
|
||||
Section,
|
||||
} from 'twenty-ui';
|
||||
import { usePreventOverlapCallback } from '~/hooks/usePreventOverlapCallback';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { IconCode, IconGauge, IconSettings, IconTestPipe } from 'twenty-ui';
|
||||
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
import { useTestServerlessFunction } from '@/serverless-functions/hooks/useTestServerlessFunction';
|
||||
import { useDebouncedCallback } from 'use-debounce';
|
||||
|
||||
const TAB_LIST_COMPONENT_ID = 'serverless-function-detail';
|
||||
|
||||
export const SettingsServerlessFunctionDetail = () => {
|
||||
const { serverlessFunctionId = '' } = useParams();
|
||||
const { enqueueSnackBar } = useSnackBar();
|
||||
const { activeTabIdState, setActiveTabId } = useTabList(
|
||||
TAB_LIST_COMPONENT_ID,
|
||||
);
|
||||
const activeTabId = useRecoilValue(activeTabIdState);
|
||||
const { activeTabId, setActiveTabId } = useTabList(TAB_LIST_COMPONENT_ID);
|
||||
const [isCodeValid, setIsCodeValid] = useState(true);
|
||||
const { executeOneServerlessFunction } = useExecuteOneServerlessFunction();
|
||||
const { updateOneServerlessFunction } = useUpdateOneServerlessFunction();
|
||||
const { publishOneServerlessFunction } = usePublishOneServerlessFunction();
|
||||
const { formValues, setFormValues, loading } =
|
||||
useServerlessFunctionUpdateFormState(serverlessFunctionId);
|
||||
const { testServerlessFunction } =
|
||||
useTestServerlessFunction(serverlessFunctionId);
|
||||
const { code: latestVersionCode } = useGetOneServerlessFunctionSourceCode({
|
||||
id: serverlessFunctionId,
|
||||
version: 'latest',
|
||||
});
|
||||
const setSettingsServerlessFunctionOutput = useSetRecoilState(
|
||||
settingsServerlessFunctionOutputState,
|
||||
);
|
||||
const settingsServerlessFunctionInput = useRecoilValue(
|
||||
settingsServerlessFunctionInputState,
|
||||
);
|
||||
|
||||
const save = async () => {
|
||||
try {
|
||||
await updateOneServerlessFunction({
|
||||
id: serverlessFunctionId,
|
||||
name: formValues.name,
|
||||
description: formValues.description,
|
||||
code: formValues.code,
|
||||
});
|
||||
} catch (err) {
|
||||
enqueueSnackBar(
|
||||
(err as Error)?.message || 'An error occurred while updating function',
|
||||
{
|
||||
variant: SnackBarVariant.Error,
|
||||
},
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSave = usePreventOverlapCallback(save, 1000);
|
||||
const handleSave = useDebouncedCallback(async () => {
|
||||
await updateOneServerlessFunction({
|
||||
id: serverlessFunctionId,
|
||||
name: formValues.name,
|
||||
description: formValues.description,
|
||||
code: formValues.code,
|
||||
});
|
||||
}, 1_000);
|
||||
|
||||
const onChange = (key: string) => {
|
||||
return async (value: string) => {
|
||||
@ -143,41 +115,11 @@ export const SettingsServerlessFunctionDetail = () => {
|
||||
}
|
||||
};
|
||||
|
||||
const handleExecute = async () => {
|
||||
try {
|
||||
const result = await executeOneServerlessFunction({
|
||||
id: serverlessFunctionId,
|
||||
payload: JSON.parse(settingsServerlessFunctionInput),
|
||||
version: 'draft',
|
||||
});
|
||||
setSettingsServerlessFunctionOutput({
|
||||
data: result?.data?.executeOneServerlessFunction?.data
|
||||
? JSON.stringify(
|
||||
result?.data?.executeOneServerlessFunction?.data,
|
||||
null,
|
||||
4,
|
||||
)
|
||||
: undefined,
|
||||
duration: result?.data?.executeOneServerlessFunction?.duration,
|
||||
status: result?.data?.executeOneServerlessFunction?.status,
|
||||
error: result?.data?.executeOneServerlessFunction?.error
|
||||
? JSON.stringify(
|
||||
result?.data?.executeOneServerlessFunction?.error,
|
||||
null,
|
||||
4,
|
||||
)
|
||||
: undefined,
|
||||
});
|
||||
} catch (err) {
|
||||
enqueueSnackBar(
|
||||
(err as Error)?.message || 'An error occurred while executing function',
|
||||
{
|
||||
variant: SnackBarVariant.Error,
|
||||
},
|
||||
);
|
||||
}
|
||||
const handleTestFunction = async () => {
|
||||
await testServerlessFunction();
|
||||
setActiveTabId('test');
|
||||
};
|
||||
|
||||
const isAnalyticsEnabled = useRecoilValue(isAnalyticsEnabledState);
|
||||
|
||||
const isAnalyticsV2Enabled = useIsFeatureEnabled('IS_ANALYTICS_V2_ENABLED');
|
||||
@ -209,7 +151,7 @@ export const SettingsServerlessFunctionDetail = () => {
|
||||
return (
|
||||
<SettingsServerlessFunctionCodeEditorTab
|
||||
files={files}
|
||||
handleExecute={handleExecute}
|
||||
handleExecute={handleTestFunction}
|
||||
handlePublish={handlePublish}
|
||||
handleReset={handleReset}
|
||||
resetDisabled={resetDisabled}
|
||||
@ -220,10 +162,10 @@ export const SettingsServerlessFunctionDetail = () => {
|
||||
);
|
||||
case 'test':
|
||||
return (
|
||||
<>
|
||||
<SettingsServerlessFunctionTestTabEffect />
|
||||
<SettingsServerlessFunctionTestTab handleExecute={handleExecute} />
|
||||
</>
|
||||
<SettingsServerlessFunctionTestTab
|
||||
serverlessFunctionId={serverlessFunctionId}
|
||||
handleExecute={handleTestFunction}
|
||||
/>
|
||||
);
|
||||
case 'settings':
|
||||
return (
|
||||
@ -262,9 +204,11 @@ export const SettingsServerlessFunctionDetail = () => {
|
||||
]}
|
||||
>
|
||||
<SettingsPageContainer>
|
||||
<Section>
|
||||
<TabList tabListInstanceId={TAB_LIST_COMPONENT_ID} tabs={tabs} />
|
||||
</Section>
|
||||
<TabList
|
||||
tabListInstanceId={TAB_LIST_COMPONENT_ID}
|
||||
tabs={tabs}
|
||||
behaveAsLinks={false}
|
||||
/>
|
||||
{renderActiveTabContent()}
|
||||
</SettingsPageContainer>
|
||||
</SubMenuTopBarContainer>
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
import { ResetServerlessFunctionStatesEffect } from '~/pages/settings/serverless-functions/ResetServerlessFunctionStatesEffect';
|
||||
import { SettingsServerlessFunctionDetail } from '~/pages/settings/serverless-functions/SettingsServerlessFunctionDetail';
|
||||
|
||||
export const SettingsServerlessFunctionDetailWrapper = () => {
|
||||
return (
|
||||
<>
|
||||
<ResetServerlessFunctionStatesEffect />
|
||||
<SettingsServerlessFunctionDetail />
|
||||
</>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user