tachybase_todo/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts
Dunqing d2bf691b69
fix(plugin-custom-request): improve x button style and afterSuccess not work when manualClose is enable (#2882)
* feat: improve x button style

* fix: manualClose does not enable logic
2023-10-20 16:06:37 +08:00

120 lines
3.8 KiB
TypeScript

import { useField, useFieldSchema, useForm } from '@formily/react';
import {
TableFieldResource,
getFormValues,
useAPIClient,
useActionContext,
useBlockRequestContext,
useCollection,
useCompile,
useFilterByTk,
useFormActiveFields,
useRecord,
} from '@nocobase/client';
import { App } from 'antd';
import { isURL } from '@nocobase/utils/client';
import { useNavigate } from 'react-router-dom';
import { useGetCustomRequest } from './useGetCustomRequest';
import { useTranslation } from '../locale';
export const useCustomizeRequestActionProps = () => {
const apiClient = useAPIClient();
const navigate = useNavigate();
const filterByTk = useFilterByTk();
const actionSchema = useFieldSchema();
const compile = useCompile();
const form = useForm();
const { fields, getField, getPrimaryKey } = useCollection();
const { field, resource, __parent, service } = useBlockRequestContext();
const { getActiveFieldsName } = useFormActiveFields() || {};
const record = useRecord();
const fieldSchema = useFieldSchema();
const { data, runAsync } = useGetCustomRequest();
const actionField = useField();
const { setVisible } = useActionContext();
const { modal, message } = App.useApp();
const { t } = useTranslation();
return {
async onClick() {
const { skipValidator, onSuccess } = actionSchema?.['x-action-settings'] ?? {};
const options = data ? data?.data?.options : (await runAsync())?.data?.options;
if (!options?.['url']) {
return message.error(t('Please configure the request settings first'));
}
const xAction = actionSchema?.['x-action'];
if (skipValidator !== true && xAction === 'customize:form:request') {
await form.submit();
}
let formValues = {};
const methods = ['POST', 'PUT', 'PATCH'];
if (xAction === 'customize:form:request' && methods.includes(options['method'])) {
const fieldNames = fields.map((field) => field.name);
const values = getFormValues({
filterByTk,
field,
form,
fieldNames,
getField,
resource,
actionFields: getActiveFieldsName?.('form') || [],
});
formValues = values;
}
actionField.data ??= {};
actionField.data.loading = true;
try {
await apiClient.request({
url: `/customRequests:send/${fieldSchema['x-uid']}`,
method: 'POST',
data: {
currentRecord: {
id: record[getPrimaryKey()],
appends: service.params[0].appends,
data: formValues,
},
},
});
actionField.data.loading = false;
if (!(resource instanceof TableFieldResource)) {
__parent?.service?.refresh?.();
}
service?.refresh?.();
if (xAction === 'customize:form:request') {
setVisible?.(false);
}
if (!onSuccess?.successMessage) {
return;
}
if (onSuccess?.manualClose) {
modal.success({
title: compile(onSuccess?.successMessage),
onOk: async () => {
if (onSuccess?.redirecting && onSuccess?.redirectTo) {
if (isURL(onSuccess.redirectTo)) {
window.location.href = onSuccess.redirectTo;
} else {
navigate(onSuccess.redirectTo);
}
}
},
});
} else {
message.success(compile(onSuccess?.successMessage));
if (onSuccess?.redirecting && onSuccess?.redirectTo) {
if (isURL(onSuccess.redirectTo)) {
window.location.href = onSuccess.redirectTo;
} else {
navigate(onSuccess.redirectTo);
}
}
}
} finally {
actionField.data.loading = false;
}
},
};
};