|  | @@ -1,17 +1,56 @@
 | 
	
		
			
				|  |  | +import { EyeInvisibleOutlined, EyeTwoTone } from '@ant-design/icons'
 | 
	
		
			
				|  |  |  import { Input } from 'antd'
 | 
	
		
			
				|  |  | -import { PasswordProps } from 'antd/lib/input'
 | 
	
		
			
				|  |  |  import React, { ChangeEvent, useState } from 'react'
 | 
	
		
			
				|  |  |  import zxcvbn from 'zxcvbn'
 | 
	
		
			
				|  |  | +import { generatePsw } from '@/utils/util'
 | 
	
		
			
				|  |  |  import './index.scss'
 | 
	
		
			
				|  |  | +interface StrengthMeterProps {
 | 
	
		
			
				|  |  | +  value?: string
 | 
	
		
			
				|  |  | +  onChange?: (value: string) => void
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const StrengthMeter: React.FC<StrengthMeterProps> = (props) => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const Index: React.FC<PasswordProps> = (props) => {
 | 
	
		
			
				|  |  | +  const { value, onChange } = props
 | 
	
		
			
				|  |  | +  const [ psw, setPsw ] = useState<string>('')
 | 
	
		
			
				|  |  |    const [ score, setScore ] = useState<number | null>(null)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const triggerChange = (newVal: string) => {
 | 
	
		
			
				|  |  | +    if (onChange) {
 | 
	
		
			
				|  |  | +      onChange(newVal)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    const handleChangeEvent = (event: ChangeEvent<HTMLInputElement>) => {
 | 
	
		
			
				|  |  | -    setScore(event.target.value ? zxcvbn(event.target.value, []).score : null)
 | 
	
		
			
				|  |  | +    const newVal = event.target.value || ''
 | 
	
		
			
				|  |  | +    setScore(newVal ? zxcvbn(newVal, []).score : null)
 | 
	
		
			
				|  |  | +    if (!value) {
 | 
	
		
			
				|  |  | +      setPsw(newVal)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    // 当使用随机密码时,如果在value为underfined时不将psw置空,则会读取使用随机密码设置的psw,而不是传进来的value
 | 
	
		
			
				|  |  | +    if (!newVal) {
 | 
	
		
			
				|  |  | +      setPsw('')
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    triggerChange(newVal)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const handlePsw = () => {
 | 
	
		
			
				|  |  | +    const newVal = generatePsw(12)
 | 
	
		
			
				|  |  | +    setScore(newVal ? zxcvbn(newVal, []).score : null)
 | 
	
		
			
				|  |  | +    if (!value) {
 | 
	
		
			
				|  |  | +      setPsw(newVal)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    triggerChange(newVal)
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    return (
 | 
	
		
			
				|  |  |      <div className="zh-strength-meter">
 | 
	
		
			
				|  |  | -      <Input.Password {...props} onChange={handleChangeEvent}/>
 | 
	
		
			
				|  |  | +      <Input.Password
 | 
	
		
			
				|  |  | +        placeholder="密码支持英文数字及符号"
 | 
	
		
			
				|  |  | +        value={value || psw}
 | 
	
		
			
				|  |  | +        addonAfter={<span className="pi-pd-lr-11" onClick={() => handlePsw()}>随机密码</span>}
 | 
	
		
			
				|  |  | +        iconRender={visible => (visible ? <EyeTwoTone /> : <EyeInvisibleOutlined />)}
 | 
	
		
			
				|  |  | +        onChange={handleChangeEvent}
 | 
	
		
			
				|  |  | +      />
 | 
	
		
			
				|  |  |        <div className="zh-strength-meter-bar">
 | 
	
		
			
				|  |  |        <div className="zh-strength-meter-bar--fill" data-score={score} />
 | 
	
		
			
				|  |  |      </div>
 | 
	
	
		
			
				|  | @@ -19,4 +58,4 @@ const Index: React.FC<PasswordProps> = (props) => {
 | 
	
		
			
				|  |  |    )
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -export default Index
 | 
	
		
			
				|  |  | +export default StrengthMeter
 |