tachybase_todo/packages/client/src/block-provider/hooks/index.ts
2022-04-14 16:01:29 +08:00

150 lines
4.2 KiB
TypeScript

import { useFieldSchema, useForm } from '@formily/react';
import { Modal } from 'antd';
import { useTranslation } from 'react-i18next';
import { useHistory } from 'react-router-dom';
import { useActionContext } from '../../schema-component';
import { useBlockRequestContext, useFilterByTk } from '../BlockProvider';
import { useFormBlockContext } from '../FormBlockProvider';
import { TableFieldResource } from '../TableFieldProvider';
export const usePickActionProps = () => {
const form = useForm();
return {
onClick() {
console.log('usePickActionProps', form.values);
},
};
};
function isURL(string) {
let url;
try {
url = new URL(string);
} catch (e) {
return false;
}
return url.protocol === 'http:' || url.protocol === 'https:';
}
export const useCreateActionProps = () => {
const form = useForm();
const { resource, __parent } = useBlockRequestContext();
const { visible, setVisible } = useActionContext();
const { field } = useFormBlockContext();
const history = useHistory();
const { t } = useTranslation();
const actionSchema = useFieldSchema();
return {
async onClick() {
const skipValidator = actionSchema?.['x-action-settings']?.skipValidator;
const overwriteValues = actionSchema?.['x-action-settings']?.overwriteValues;
if (!skipValidator) {
await form.submit();
}
await resource.create({
values: {
...form.values,
...overwriteValues,
},
});
__parent?.service?.refresh?.();
setVisible?.(false);
const onSuccess = actionSchema?.['x-action-settings']?.onSuccess;
if (!onSuccess?.successMessage) {
return;
}
Modal.success({
title: onSuccess?.successMessage,
onOk: async () => {
await form.reset();
if (onSuccess?.redirecting && onSuccess?.redirectTo) {
if (isURL(onSuccess.redirectTo)) {
window.location.href = onSuccess.redirectTo;
} else {
history.push(onSuccess.redirectTo);
}
}
},
});
},
};
};
export const useUpdateActionProps = () => {
const form = useForm();
const filterByTk = useFilterByTk();
const { resource, __parent } = useBlockRequestContext();
const { setVisible } = useActionContext();
const actionSchema = useFieldSchema();
const history = useHistory();
return {
async onClick() {
const skipValidator = actionSchema?.['x-action-settings']?.skipValidator;
const overwriteValues = actionSchema?.['x-action-settings']?.overwriteValues;
if (!skipValidator) {
await form.submit();
}
await resource.update({
filterByTk,
values: {
...form.values,
...overwriteValues,
},
});
__parent?.service?.refresh?.();
if (!(resource instanceof TableFieldResource)) {
__parent?.__parent?.service?.refresh?.();
}
setVisible?.(false);
const onSuccess = actionSchema?.['x-action-settings']?.onSuccess;
if (onSuccess?.successMessage) {
Modal.success({
title: onSuccess?.successMessage,
onOk: async () => {
await form.reset();
if (onSuccess?.redirecting && onSuccess?.redirectTo) {
if (isURL(onSuccess.redirectTo)) {
window.location.href = onSuccess.redirectTo;
} else {
history.push(onSuccess.redirectTo);
}
}
},
});
}
},
};
};
export const useDestroyActionProps = () => {
const filterByTk = useFilterByTk();
const { resource, service } = useBlockRequestContext();
return {
async onClick() {
await resource.destroy({
filterByTk,
});
service?.refresh?.();
},
};
};
export const useBulkDestroyActionProps = () => {
const { field } = useBlockRequestContext();
const { resource, service } = useBlockRequestContext();
return {
async onClick() {
if (!field?.data?.selectedRowKeys?.length) {
return;
}
await resource.destroy({
filterByTk: field.data?.selectedRowKeys,
});
field.data.selectedRowKeys = [];
service?.refresh?.();
},
};
};