mirror of
				https://github.com/elyby/accounts-frontend.git
				synced 2025-05-31 14:11:58 +05:30 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import React from 'react';
 | 
						|
import clsx from 'clsx';
 | 
						|
import { CaptchaID } from 'app/services/captcha';
 | 
						|
import { Skin } from 'app/components/ui';
 | 
						|
import captcha from 'app/services/captcha';
 | 
						|
import logger from 'app/services/logger';
 | 
						|
import { ComponentLoader } from 'app/components/ui/loader';
 | 
						|
 | 
						|
import styles from './form.scss';
 | 
						|
import FormInputComponent from './FormInputComponent';
 | 
						|
 | 
						|
export default class Captcha extends FormInputComponent<
 | 
						|
    {
 | 
						|
        delay: number;
 | 
						|
        skin: Skin;
 | 
						|
    },
 | 
						|
    {
 | 
						|
        code: string;
 | 
						|
    }
 | 
						|
> {
 | 
						|
    elRef = React.createRef<HTMLDivElement>();
 | 
						|
    captchaId: CaptchaID;
 | 
						|
 | 
						|
    static defaultProps = {
 | 
						|
        skin: 'dark',
 | 
						|
        delay: 0,
 | 
						|
    };
 | 
						|
 | 
						|
    componentDidMount() {
 | 
						|
        setTimeout(() => {
 | 
						|
            const { current: el } = this.elRef;
 | 
						|
 | 
						|
            el &&
 | 
						|
                captcha
 | 
						|
                    .render(el, {
 | 
						|
                        skin: this.props.skin,
 | 
						|
                        onSetCode: this.setCode,
 | 
						|
                    })
 | 
						|
                    .then((captchaId) => {
 | 
						|
                        this.captchaId = captchaId;
 | 
						|
                    })
 | 
						|
                    .catch((error) => {
 | 
						|
                        logger.error('Failed rendering captcha', {
 | 
						|
                            error,
 | 
						|
                        });
 | 
						|
                    });
 | 
						|
        }, this.props.delay);
 | 
						|
    }
 | 
						|
 | 
						|
    render() {
 | 
						|
        const { skin } = this.props;
 | 
						|
 | 
						|
        return (
 | 
						|
            <div className={styles.captchaContainer}>
 | 
						|
                <div className={styles.captchaLoader}>
 | 
						|
                    <ComponentLoader />
 | 
						|
                </div>
 | 
						|
 | 
						|
                <div ref={this.elRef} className={clsx(styles.captcha, styles[`${skin}Captcha`])} />
 | 
						|
 | 
						|
                {this.renderError()}
 | 
						|
            </div>
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    reset() {
 | 
						|
        captcha.reset(this.captchaId);
 | 
						|
    }
 | 
						|
 | 
						|
    getValue() {
 | 
						|
        return this.state && this.state.code;
 | 
						|
    }
 | 
						|
 | 
						|
    onFormInvalid() {
 | 
						|
        this.reset();
 | 
						|
    }
 | 
						|
 | 
						|
    setCode = (code: string) => this.setState({ code });
 | 
						|
}
 |