/**
* @license
* Copyright Stbui All Rights Reserved.
* https://github.com/stbui/prophet
*/
import { useCallback } from 'react';
import { useLocation } from 'react-router-dom';
import { parse } from 'query-string';
import { useCreate } from '../dataProvider';
import { useNotify, useRedirect, useRefresh } from '../sideEffect';
import useVersion from './useVersion';
export interface CreateControllerProps {
resource: string;
basePath: string;
loading: boolean;
loaded: boolean;
save: (data: any, option: any) => void;
saving: any;
record?: object;
redirect: any;
version: number;
}
export interface CreateProps {
resource: string;
basePath: string;
hasCreate?: boolean;
hasEdit?: boolean;
hasShow?: boolean;
record?: object;
successMessage?: string;
}
/**
* import { useCreateController } from '@stbui/prophet-core';
*
* const CreateView = () =>
...
*
* const pageComponent = props => {
* const controllerProps = useCreateController(props);
*
* return ;
* }
*/
export const getDefaultRedirectRoute = (
hasEdit?: boolean,
hasShow?: boolean
) => {
if (hasEdit) {
return 'edit';
}
if (hasShow) {
return 'show';
}
return 'list';
};
// todo: 如果路由参数存在fitelr={},可以会报错
export const getRecord = ({ state, search }, record: any = {}) =>
state && state.record
? state.record
: search
? JSON.parse(parse(search).source)
: record;
const useCreateController = (props: CreateProps): CreateControllerProps => {
const {
resource,
basePath,
hasEdit,
hasShow,
record = {},
successMessage,
} = props;
const location = useLocation();
const notify = useNotify();
const redirect = useRedirect();
const version = useVersion();
const refresh = useRefresh();
const recordToUse = getRecord(location, record);
const [create, { loading: saving }] = useCreate(resource);
const save = useCallback(
(data: any, { onSuccess, onFailure, redirectTo = 'list' } = {}) => {
create(
{ data },
{
onSuccess: onSuccess
? onSuccess
: () => {
notify(successMessage || '创建成功', 'success');
redirect(redirectTo, basePath, data.id);
refresh();
},
onFailure: onFailure
? onFailure
: error =>
notify(
typeof error === 'string'
? error
: error.message ||
'prophet.notification.http_error',
'error'
),
}
);
},
[resource, basePath, create, notify, redirect, successMessage]
);
return {
resource,
basePath,
loading: false,
loaded: true,
save,
saving,
version,
record: recordToUse,
redirect: getDefaultRedirectRoute(hasEdit, hasShow),
};
};
export default useCreateController;