2022-03-07 11:31:40 +08:00
|
|
|
import { useField } from '@formily/react';
|
2022-02-16 15:11:24 +08:00
|
|
|
import { Result } from 'ahooks/lib/useRequest/src/types';
|
|
|
|
import React, { createContext, useContext, useEffect } from 'react';
|
2022-02-18 02:05:42 +08:00
|
|
|
import { useCollectionManager } from '.';
|
2022-02-17 23:56:39 +08:00
|
|
|
import { CollectionProvider, useRecord } from '..';
|
2022-02-16 22:48:24 +08:00
|
|
|
import { useAPIClient, useRequest } from '../api-client';
|
2022-02-16 15:11:24 +08:00
|
|
|
|
2022-03-06 12:06:50 +08:00
|
|
|
export const ResourceActionContext = createContext<
|
2022-03-07 11:31:40 +08:00
|
|
|
Result<any, any> & { state?: any; setState?: any; dragSort?: boolean; defaultRequest?: any }
|
2022-03-06 12:06:50 +08:00
|
|
|
>(null);
|
2022-02-16 15:11:24 +08:00
|
|
|
|
|
|
|
interface ResourceActionProviderProps {
|
2022-02-16 22:48:24 +08:00
|
|
|
type?: 'association' | 'collection';
|
2022-03-04 11:59:38 +08:00
|
|
|
collection?: any;
|
2022-02-16 15:11:24 +08:00
|
|
|
request?: any;
|
2022-03-07 11:31:40 +08:00
|
|
|
dragSort?: boolean;
|
2022-02-16 15:11:24 +08:00
|
|
|
uid?: string;
|
|
|
|
}
|
|
|
|
|
2022-02-16 22:48:24 +08:00
|
|
|
const ResourceContext = createContext<any>(null);
|
|
|
|
|
2022-03-04 11:59:38 +08:00
|
|
|
const CollectionResourceActionProvider = (props) => {
|
2022-03-07 11:31:40 +08:00
|
|
|
let { collection, request, uid, dragSort } = props;
|
2022-02-16 22:48:24 +08:00
|
|
|
const api = useAPIClient();
|
2022-03-04 20:45:21 +08:00
|
|
|
const record = useRecord();
|
|
|
|
const actionName = request?.action;
|
|
|
|
const others = {};
|
|
|
|
if (actionName === 'get') {
|
|
|
|
others['filterByTk'] = record[collection.targetKey || collection.filterTargetKey || 'id'];
|
|
|
|
}
|
2022-03-02 20:08:11 +08:00
|
|
|
const service = useRequest(
|
|
|
|
{
|
|
|
|
...request,
|
|
|
|
params: {
|
2022-03-04 20:45:21 +08:00
|
|
|
...others,
|
2022-03-02 20:08:11 +08:00
|
|
|
...request?.params,
|
2022-03-04 11:59:38 +08:00
|
|
|
appends: collection.fields.filter((field) => field.target).map((field) => field.name),
|
2022-03-07 11:31:40 +08:00
|
|
|
sort: dragSort ? [collection.sortable === true ? 'sort' : collection.sortable] : request?.params?.sort,
|
2022-03-02 20:08:11 +08:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{ uid },
|
|
|
|
);
|
2022-02-16 22:48:24 +08:00
|
|
|
const resource = api.resource(request.resource);
|
|
|
|
return (
|
|
|
|
<ResourceContext.Provider value={{ type: 'collection', resource, collection }}>
|
2022-03-07 11:31:40 +08:00
|
|
|
<ResourceActionContext.Provider value={{ ...service, defaultRequest: request, dragSort }}>
|
2022-02-17 23:56:39 +08:00
|
|
|
<CollectionProvider collection={collection}>{props.children}</CollectionProvider>
|
|
|
|
</ResourceActionContext.Provider>
|
2022-02-16 22:48:24 +08:00
|
|
|
</ResourceContext.Provider>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
const AssociationResourceActionProvider = (props) => {
|
2022-03-07 11:31:40 +08:00
|
|
|
let { collection, association, request, uid, dragSort } = props;
|
2022-02-16 22:48:24 +08:00
|
|
|
const api = useAPIClient();
|
|
|
|
const record = useRecord();
|
|
|
|
const resourceOf = record[association.sourceKey];
|
2022-03-04 11:59:38 +08:00
|
|
|
const service = useRequest(
|
|
|
|
{
|
|
|
|
resourceOf,
|
|
|
|
...request,
|
|
|
|
params: {
|
|
|
|
...request?.params,
|
|
|
|
appends: [
|
|
|
|
...collection?.fields?.filter?.((field) => field.target).map((field) => field.name),
|
|
|
|
...request?.params?.appends,
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{ uid },
|
|
|
|
);
|
2022-02-16 22:48:24 +08:00
|
|
|
const resource = api.resource(request.resource, resourceOf);
|
|
|
|
return (
|
|
|
|
<ResourceContext.Provider value={{ type: 'association', resource, association }}>
|
2022-03-07 11:31:40 +08:00
|
|
|
<ResourceActionContext.Provider value={{ ...service, defaultRequest: request, dragSort }}>
|
2022-02-17 23:56:39 +08:00
|
|
|
<CollectionProvider collection={collection}>{props.children}</CollectionProvider>
|
|
|
|
</ResourceActionContext.Provider>
|
2022-02-16 22:48:24 +08:00
|
|
|
</ResourceContext.Provider>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const ResourceActionProvider: React.FC<ResourceActionProviderProps> = (props) => {
|
2022-03-04 11:59:38 +08:00
|
|
|
let { collection, request } = props;
|
|
|
|
const { getCollection } = useCollectionManager();
|
|
|
|
if (typeof collection === 'string') {
|
|
|
|
collection = getCollection(collection);
|
|
|
|
}
|
|
|
|
if (!collection) {
|
|
|
|
return null;
|
|
|
|
}
|
2022-02-16 22:48:24 +08:00
|
|
|
if (request?.resource?.includes('.')) {
|
2022-03-04 11:59:38 +08:00
|
|
|
return <AssociationResourceActionProvider {...props} collection={collection} />;
|
2022-02-16 22:48:24 +08:00
|
|
|
}
|
2022-03-04 11:59:38 +08:00
|
|
|
return <CollectionResourceActionProvider {...props} collection={collection} />;
|
2022-02-16 15:11:24 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
export const useResourceActionContext = () => {
|
|
|
|
return useContext(ResourceActionContext);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const useDataSourceFromRAC = (options: any) => {
|
|
|
|
const service = useContext(ResourceActionContext);
|
2022-03-07 11:31:40 +08:00
|
|
|
const field = useField();
|
2022-02-16 15:11:24 +08:00
|
|
|
useEffect(() => {
|
|
|
|
if (!service.loading) {
|
|
|
|
options?.onSuccess(service.data);
|
2022-03-07 11:31:40 +08:00
|
|
|
field.componentProps.dragSort = !!service.dragSort;
|
2022-02-16 15:11:24 +08:00
|
|
|
}
|
|
|
|
}, [service.loading]);
|
|
|
|
return service;
|
|
|
|
};
|
2022-02-16 22:48:24 +08:00
|
|
|
|
|
|
|
export const useResourceContext = () => {
|
|
|
|
const { type, resource, collection, association } = useContext(ResourceContext);
|
2022-02-24 15:16:21 +08:00
|
|
|
return {
|
|
|
|
type,
|
|
|
|
resource,
|
|
|
|
collection,
|
|
|
|
association,
|
|
|
|
targetKey: association?.targetKey || collection?.targetKey || 'id',
|
|
|
|
};
|
2022-02-16 22:48:24 +08:00
|
|
|
};
|