import { useField } from '@formily/react'; import { Result } from 'ahooks/lib/useRequest/src/types'; import React, { createContext, useContext, useEffect } from 'react'; import { useCollectionManager } from '.'; import { CollectionProvider, useRecord } from '..'; import { useAPIClient, useRequest } from '../api-client'; export const ResourceActionContext = createContext< Result & { state?: any; setState?: any; dragSort?: boolean; defaultRequest?: any } >(null); interface ResourceActionProviderProps { type?: 'association' | 'collection'; collection?: any; request?: any; dragSort?: boolean; uid?: string; } const ResourceContext = createContext(null); const CollectionResourceActionProvider = (props) => { let { collection, request, uid, dragSort } = props; const api = useAPIClient(); const record = useRecord(); const actionName = request?.action; const others = {}; if (actionName === 'get') { others['filterByTk'] = record[collection.targetKey || collection.filterTargetKey || 'id']; } const service = useRequest( { ...request, params: { ...others, ...request?.params, appends: collection.fields.filter((field) => field.target).map((field) => field.name), sort: dragSort ? [collection.sortable === true ? 'sort' : collection.sortable] : request?.params?.sort, }, }, { uid }, ); const resource = api.resource(request.resource); return ( {props.children} ); }; const AssociationResourceActionProvider = (props) => { let { collection, association, request, uid, dragSort } = props; const api = useAPIClient(); const record = useRecord(); const resourceOf = record[association.sourceKey]; const service = useRequest( { resourceOf, ...request, params: { ...request?.params, appends: [ ...collection?.fields?.filter?.((field) => field.target).map((field) => field.name), ...request?.params?.appends, ], }, }, { uid }, ); const resource = api.resource(request.resource, resourceOf); return ( {props.children} ); }; export const ResourceActionProvider: React.FC = (props) => { let { collection, request } = props; const { getCollection } = useCollectionManager(); if (typeof collection === 'string') { collection = getCollection(collection); } if (!collection) { return null; } if (request?.resource?.includes('.')) { return ; } return ; }; export const useResourceActionContext = () => { return useContext(ResourceActionContext); }; export const useDataSourceFromRAC = (options: any) => { const service = useContext(ResourceActionContext); const field = useField(); useEffect(() => { if (!service.loading) { options?.onSuccess(service.data); field.componentProps.dragSort = !!service.dragSort; } }, [service.loading]); return service; }; export const useResourceContext = () => { const { type, resource, collection, association } = useContext(ResourceContext); return { type, resource, collection, association, targetKey: association?.targetKey || collection?.targetKey || 'id', }; };