1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
   | import {   memo,   useContext,   useCallback,   useRef,   useState,   useEffect,   createElement,   MouseEvent, } from 'react'; import { LayerActionContext, LayerProps } from './layer-context'; import { ProFormInstance } from '@ant-design/pro-components';
  export type LayerInstance = {   close: () => void; };
  const Layer = memo<{   item: LayerProps & { id: string; onOk: (e: any, close: any) => void };   index: number; }>(({ item, index }) => {   const setLayerStack = useContext(LayerActionContext);
    const close = useCallback(() => {     setTimeout(() => {       setLayerStack((p) => {         return p?.filter((layer) => layer?.id !== item.id);       });     }, 500);   }, [item.id]);
    const { content, title, centered = true, Component, onOk, modalProps, footer, _layerName, ...rest } = item;
 
    const [open, setOpen] = useState(false);   const formRef = useRef<ProFormInstance>();   const dataRef = useRef<any>();   const instanceRef = useRef<LayerInstance>({     close: () => {       setOpen(false);     },   });   useEffect(() => {     setOpen(true);
      setLayerStack((p) => {       const newStack = [...p];       newStack[index].ins = instanceRef.current;       return newStack;     });   }, []);   const handleClose = useCallback(() => {     setOpen(false);   }, []);   const afterClose = useCallback(() => {     item?.afterClose?.();     close();   }, []);   const onCancel = useCallback((e: MouseEvent<HTMLButtonElement, globalThis.MouseEvent>) => {     item?.onCancel?.(e);     handleClose();   }, []);   const afterOpenChange = useCallback((open: boolean) => {     if (!open) {       item?.afterClose?.();       handleClose();       close();     }   }, []);   const handleOnOk = useCallback(() => {     const data = dataRef.current;     onOk?.(data, handleClose);   }, []);
    let handleFooter = footer;   if (typeof handleFooter === 'function') {          handleFooter = handleFooter.bind(null, handleClose);   }
    let layerSelfProps = {}   if(_layerName === 'modal' || _layerName === 'drawer') {     layerSelfProps ={       centered,       afterClose,       afterOpenChange,       onOk: handleOnOk,       onCancel,     }   }
    return (     <Component       open={open}       {...layerSelfProps}       formRef={formRef}       onClose={onCancel}       onOpenChange={afterOpenChange}       title={title}       modalProps={{ centered, ...modalProps }}       footer={handleFooter}       {...rest}     >       {createElement(content, {         close: handleClose,         formRef: formRef,         dataRef: dataRef,       })}     </Component>   ); });
  export default Layer;
  |