ngx-recaptcha
Version:
Angular 2 component implementing Google's reCAPTCHA
109 lines (86 loc) • 3.33 kB
text/typescript
import { Directive, EventEmitter, Output, Input, OnInit } from '@angular/core';
//
// Main recpatcha object
//
declare var grecaptcha: any;
//
// Directive used to render and respond to the recaptcha
//
export class RenderRecaptchaDirective implements OnInit {
onCaptchaComplete: EventEmitter<any> = new EventEmitter();
siteKey: string = null;
captchaStyle: any = null;
renderDelay: number = 0;
recaptchaId: string = null;
private recaptchaRenderElement: any = null;
//
// Element has been initialised
//
ngOnInit() {
// We can't render the recaptcha straight away
setTimeout(() => {
// Build up the style of the recaptcha and render
let recaptchaStyle = this.buildRecaptchaProperties();
let recaptchaElement = document.getElementById(this.recaptchaId);
let script = document.createElement('script');
script.src = 'https://www.google.com/recaptcha/api.js';
script.async = true;
script.defer = true;
let self = this;
script.onload = function(){
setTimeout(function(){
self.recaptchaRenderElement = grecaptcha.render(recaptchaElement, recaptchaStyle);
}, 1000);
};
document.getElementsByTagName('head')[0].appendChild(script);
}, this.renderDelay);
};
//
// Resets the reCAPTCHA instance and requires the user to revalidate
//
resetRecaptcha() {
// Expire the current instance
this.onRecaptchaExpired();
}
//
// Builds up the style of the recaptcha
//
private buildRecaptchaProperties() {
let recaptchaProperties: any = {};
// Know properties
recaptchaProperties['sitekey'] = this.siteKey;
recaptchaProperties['callback'] = (data: string) => this.onCaptchaComplete.emit(data);
recaptchaProperties['expired-callback'] = () => this.onRecaptchaExpired();
// Build up the optional properties
if (this.captchaStyle !== null) {
if (this.captchaStyle.theme != null) {
recaptchaProperties['theme'] = this.captchaStyle.theme;
}
if (this.captchaStyle.type != null) {
recaptchaProperties['type'] = this.captchaStyle.type;
}
if (this.captchaStyle.size != null) {
recaptchaProperties['size'] = this.captchaStyle.size;
}
if (this.captchaStyle.tabindex != null) {
recaptchaProperties['tabindex'] = this.captchaStyle.tabindex;
}
}
return recaptchaProperties;
}
//
// Called when a recaptcha has expired
//
private onRecaptchaExpired() {
// Check we have an element
if (this.recaptchaRenderElement === null) {
return;
}
// Reset the recaptcha
grecaptcha.reset(this.recaptchaRenderElement);
this.onCaptchaComplete.emit(null);
}
}