6 changed files with 131 additions and 57 deletions
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
.spinner { |
||||
position: absolute; |
||||
top: 50%; |
||||
left: 50%; |
||||
} |
||||
|
||||
.content { |
||||
display: block; |
||||
height: 100%; |
||||
padding: 2vw; |
||||
} |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
import { Spin, Skeleton, Modal as AntModal } from 'antd'; |
||||
import React, { ReactNode, useState } from 'react'; |
||||
import s from './Modal.module.scss'; |
||||
|
||||
interface Props { |
||||
title: string; |
||||
url?: string; |
||||
visible: boolean; |
||||
handleOk?: () => void; |
||||
handleCancel?: () => void; |
||||
afterClose?: () => void; |
||||
children?: ReactNode; |
||||
} |
||||
|
||||
export default function Modal(props: Props) { |
||||
const { title, url, visible, handleOk, handleCancel, afterClose, children } = props; |
||||
const [loading, setLoading] = useState(!!url); |
||||
|
||||
const modalStyle = { |
||||
padding: '0px', |
||||
height: '80vh', |
||||
}; |
||||
|
||||
console.log(url); |
||||
const iframe = url && ( |
||||
<iframe |
||||
title={title} |
||||
src={url} |
||||
width="100%" |
||||
height="100%" |
||||
sandbox="allow-same-origin allow-scripts allow-popups allow-forms" |
||||
allowpaymentrequest="true" |
||||
frameBorder="0" |
||||
allowFullScreen |
||||
onLoad={() => setLoading(false)} |
||||
/> |
||||
); |
||||
|
||||
const iframeDisplayStyle = loading ? 'none' : 'inline'; |
||||
|
||||
return ( |
||||
<AntModal |
||||
title={title} |
||||
visible={visible} |
||||
onOk={handleOk} |
||||
onCancel={handleCancel} |
||||
afterClose={afterClose} |
||||
bodyStyle={modalStyle} |
||||
width="70%" |
||||
zIndex={9999} |
||||
footer={null} |
||||
centered |
||||
destroyOnClose |
||||
> |
||||
<> |
||||
{loading && ( |
||||
<Skeleton active={loading} style={{ padding: '10px' }} paragraph={{ rows: 10 }} /> |
||||
)} |
||||
|
||||
{iframe && <div style={{ display: iframeDisplayStyle }}>{iframe}</div>} |
||||
{children && <div className={s.content}>{children}</div>} |
||||
{loading && <Spin className={s.spinner} spinning={loading} size="large" />} |
||||
</> |
||||
</AntModal> |
||||
); |
||||
} |
||||
|
||||
Modal.defaultProps = { |
||||
url: undefined, |
||||
children: undefined, |
||||
handleOk: undefined, |
||||
handleCancel: undefined, |
||||
afterClose: undefined, |
||||
}; |
Loading…
Reference in new issue