import { bindFeatures, updateFeature } from '../server'; import { useGetAppId } from '../utils/hooks'; import { difference, intersectionWith } from 'lodash'; import { useCallback, useEffect, useState } from 'react'; import { useIntl, useRequest, useSelector } from 'umi'; interface IBindFeature { name?: string; type?: 'feature' | 'option' | 'policy' | 'user' | 'role'; // 选择类型 id?: number; form: any; isHaveDate?: boolean; appIdCustomer?: number; } export const useBindFeature = ({ name = 'data', id, type, isHaveDate, form, appIdCustomer, }: IBindFeature) => { const { formatMessage } = useIntl(); const [dataMap, setDataMap] = useState({}); const { featureTreeData } = useSelector<{ public: API.StoreState }, API.StoreState>( (state: any) => state.public, ); const appId = useGetAppId(); const { data, run, loading } = useRequest( bindFeatures({ appId: appIdCustomer ? appIdCustomer : appId }), { manual: true, }, ); const { list } = data || {}; const initFetch = useCallback(() => { if (!id) return; run({ [`${type}Id`]: id }); }, [type, id, run]); const updateFn = useCallback( async (newData, oldList, formatFn) => { const map = {}; const params: number[] = newData?.map((val) => { map[val?.id] = val; return parseInt(val?.id, 10); }); const oldParams: number[] = oldList?.map((item) => item.id); // 这是增加的 const addParams = difference(params, oldParams)?.map((item) => formatFn(item, map)); // 这是减少的 const deleteParams = difference(oldParams, params)?.map((item) => formatFn(item, dataMap)); // 这是需要更新的 const updateParams = intersectionWith(newData, oldList, (oldItem: any, newItem: any) => { if (!isHaveDate) { return false; } if (`${oldItem?.id}` === `${newItem?.id}`) { if (oldItem?.expiredAt !== newItem?.expiredAt) { return true; } } return false; }); await updateFeature( `${type}_feature`, [ ...addParams, ...updateParams?.map((p: API.FuncListItem) => formatFn(parseInt(`${p.id}`, 10), map)), ], deleteParams, ); }, [type, dataMap, isHaveDate], ); useEffect(() => { const ref = form?.setFieldsValue ? form : form?.current; if (!list?.length) { ref?.resetFields(); return; } ref?.setFieldsValue?.({ [name]: { data: list?.map((d) => ({ id: `${d.id}`, expiredAt: isHaveDate ? d.expiredAt * 1000 : undefined, })), }, }); }, [list, form, name, isHaveDate]); useEffect(() => { const obj = {}; list?.forEach((item) => { obj[item.id] = { ...item, expiredAt: isHaveDate ? item.expiredAt * 1000 : undefined, }; }); setDataMap(obj); }, [list, setDataMap, isHaveDate]); return { featureTreeData, initFetch, loading, list: list?.map?.((item) => ({ ...item, expiredAt: isHaveDate ? item.expiredAt * 1000 : undefined, })), appId: appIdCustomer ? appIdCustomer : appId, form, updateFn, title: formatMessage({ id: `component.bind.feature.title`, defaultMessage: '绑定功能' }), }; };