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;
|