5 changed files with 88 additions and 11 deletions
			
			
		- 
					58src/components/download/Download.tsx
 - 
					0src/components/download/index.ts
 - 
					13src/pages/websites/ssl/index.tsx
 - 
					20src/request.ts
 - 
					6src/service/websites.ts
 
@ -0,0 +1,58 @@ | 
			
		|||||
 | 
				import React, { useEffect, useRef, useState } from 'react' | 
			
		||||
 | 
				import { LoadingOutlined } from '@ant-design/icons' | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				export interface DownloadProps { | 
			
		||||
 | 
				    children?: React.ReactNode; | 
			
		||||
 | 
				    className?: string; | 
			
		||||
 | 
				    style?: React.CSSProperties; | 
			
		||||
 | 
				    server?: () => Promise<any> | 
			
		||||
 | 
				    fileName?: string | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				    [key: string]: any | 
			
		||||
 | 
				} | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				const Download = ({ server, style, className, fileName, children, ...props }: DownloadProps) => { | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				    const [ isLoading, setLoading ] = useState(false) | 
			
		||||
 | 
				    const serverRef = useRef(server) | 
			
		||||
 | 
				    serverRef.current = server | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				    useEffect(() => { | 
			
		||||
 | 
				        serverRef.current = server | 
			
		||||
 | 
				    }, [ server ]) | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				    return ( | 
			
		||||
 | 
				            <div className={className} | 
			
		||||
 | 
				                 style={style} {...props} | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                 onClick={() => { | 
			
		||||
 | 
				                     if (isLoading) return | 
			
		||||
 | 
				                     serverRef.current && serverRef.current()?.then(res => { | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                         if (!res) { | 
			
		||||
 | 
				                             return res | 
			
		||||
 | 
				                         } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                         const downloadUrl = window.URL.createObjectURL(new Blob([ res ])) | 
			
		||||
 | 
				                         const a = document.createElement('a') | 
			
		||||
 | 
				                         a.style.display = 'none' | 
			
		||||
 | 
				                         a.href = downloadUrl | 
			
		||||
 | 
				                         a.download = fileName || '' | 
			
		||||
 | 
				                         const event = new MouseEvent('click') | 
			
		||||
 | 
				                         a.dispatchEvent(event) | 
			
		||||
 | 
				                         window.URL.revokeObjectURL(downloadUrl) | 
			
		||||
 | 
				                         setTimeout(() => a.remove()) | 
			
		||||
 | 
				                         return res | 
			
		||||
 | 
				                     })?.finally(() => { | 
			
		||||
 | 
				                         setLoading(false) | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				                     }) | 
			
		||||
 | 
				                 }} | 
			
		||||
 | 
				            > | 
			
		||||
 | 
				                {isLoading && <LoadingOutlined/>} | 
			
		||||
 | 
				                {children} | 
			
		||||
 | 
				            </div> | 
			
		||||
 | 
				    ) | 
			
		||||
 | 
				} | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				export default Download | 
			
		||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue