ng-recaptchav3
Version:
Angular8 library to provide easy extraction for google recaptcha v3, invisible recaptcha and recaptcha v2
232 lines • 15.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, HostBinding, Inject, Input, NgZone, Optional, Output } from '@angular/core';
import { RecaptchaLoaderService } from './recaptcha-loader.service';
import { RECAPTCHA_SETTINGS } from './recaptcha-settings';
/** @type {?} */
let nextId = 0;
export class RecaptchaComponent {
/**
* @param {?} elementRef
* @param {?} loader
* @param {?} zone
* @param {?=} settings
*/
constructor(elementRef, loader, zone, settings) {
this.elementRef = elementRef;
this.loader = loader;
this.zone = zone;
this.id = `ngrecaptcha-${nextId++}`;
this.resolved = new EventEmitter();
if (!settings) {
return;
}
this.siteKey = settings.siteKey;
this.theme = settings.theme;
this.type = settings.type;
this.size = settings.size;
this.badge = settings.badge;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.subscription = this.loader.ready.subscribe((/**
* @param {?} grecaptcha
* @return {?}
*/
(grecaptcha) => {
if (grecaptcha != null) {
this.grecaptcha = grecaptcha;
this.renderRecaptcha();
}
}));
}
/**
* @return {?}
*/
ngOnDestroy() {
// reset the captcha to ensure it does not leave anything behind
// after the component is no longer needed
this.grecaptchaReset();
if (this.subscription) {
this.subscription.unsubscribe();
}
}
/**
* Executes the invisible recaptcha.
* Does nothing if component's size is not set to "invisible".
* @return {?}
*/
execute() {
if (this.size !== 'invisible' || this.widget === null) {
return;
}
if (this.actionName) {
this.grecaptcha.execute(this.widget, { action: this.actionName });
}
else {
this.grecaptcha.execute(this.widget);
}
}
/**
* @return {?}
*/
reset() {
if (this.widget === null) {
return;
}
if (this.grecaptcha.getResponse(this.widget)) {
// Only emit an event in case if something would actually change.
// That way we do not trigger "touching" of the control if someone does a "reset"
// on a non-resolved captcha.
this.resolved.emit(null);
}
this.grecaptchaReset();
}
/**
* \@internal
* @private
* @return {?}
*/
expired() {
this.resolved.emit(null);
}
/**
* \@internal
* @private
* @param {?} response
* @return {?}
*/
captchaReponseCallback(response) {
this.resolved.emit(response);
}
/**
* \@internal
* @private
* @return {?}
*/
grecaptchaReset() {
if (this.widget != null) {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => this.grecaptcha.reset(this.widget)));
}
}
/**
* \@internal
* @private
* @return {?}
*/
renderRecaptcha() {
this.widget = this.grecaptcha.render(this.elementRef.nativeElement, {
badge: this.badge,
callback: (/**
* @param {?} response
* @return {?}
*/
(response) => {
this.zone.run((/**
* @return {?}
*/
() => this.captchaReponseCallback(response)));
}),
'expired-callback': (/**
* @return {?}
*/
() => {
this.zone.run((/**
* @return {?}
*/
() => this.expired()));
}),
sitekey: this.siteKey,
size: this.size,
tabindex: this.tabIndex,
theme: this.theme,
type: this.type
});
}
}
RecaptchaComponent.decorators = [
{ type: Component, args: [{
exportAs: 'reCaptcha',
selector: 're-captcha',
template: ''
}] }
];
/** @nocollapse */
RecaptchaComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: RecaptchaLoaderService },
{ type: NgZone },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [RECAPTCHA_SETTINGS,] }] }
];
RecaptchaComponent.propDecorators = {
id: [{ type: Input }, { type: HostBinding, args: ['attr.id',] }],
siteKey: [{ type: Input }],
theme: [{ type: Input }],
type: [{ type: Input }],
size: [{ type: Input }],
tabIndex: [{ type: Input }],
badge: [{ type: Input }],
actionName: [{ type: Input }],
resolved: [{ type: Output }]
};
if (false) {
/** @type {?} */
RecaptchaComponent.prototype.id;
/** @type {?} */
RecaptchaComponent.prototype.siteKey;
/** @type {?} */
RecaptchaComponent.prototype.theme;
/** @type {?} */
RecaptchaComponent.prototype.type;
/** @type {?} */
RecaptchaComponent.prototype.size;
/** @type {?} */
RecaptchaComponent.prototype.tabIndex;
/** @type {?} */
RecaptchaComponent.prototype.badge;
/** @type {?} */
RecaptchaComponent.prototype.actionName;
/** @type {?} */
RecaptchaComponent.prototype.resolved;
/**
* \@internal
* @type {?}
* @private
*/
RecaptchaComponent.prototype.subscription;
/**
* \@internal
* @type {?}
* @private
*/
RecaptchaComponent.prototype.widget;
/**
* \@internal
* @type {?}
* @private
*/
RecaptchaComponent.prototype.grecaptcha;
/**
* @type {?}
* @private
*/
RecaptchaComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
RecaptchaComponent.prototype.loader;
/**
* @type {?}
* @private
*/
RecaptchaComponent.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXJlY2FwdGNoYXYzLyIsInNvdXJjZXMiOlsibGliL3JlY2FwdGNoYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7O0lBR3pFLE1BQU0sR0FBRyxDQUFDO0FBT2QsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7OztJQXNCN0IsWUFDVSxVQUFzQixFQUN0QixNQUE4QixFQUM5QixJQUFZLEVBQ29CLFFBQTRCO1FBSDVELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBd0I7UUFDOUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQXRCdEIsT0FBRSxHQUFHLGVBQWUsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQVVyQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQWU5QyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUM5QixDQUFD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LElBQUksQ0FBQyxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O1lBM0hGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsV0FBVztnQkFDckIsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFFBQVEsRUFBRSxFQUFFO2FBQ2I7Ozs7WUF0QkMsVUFBVTtZQVlILHNCQUFzQjtZQVA3QixNQUFNOzRDQTRDSCxRQUFRLFlBQUksTUFBTSxTQUFDLGtCQUFrQjs7O2lCQXpCdkMsS0FBSyxZQUNMLFdBQVcsU0FBQyxTQUFTO3NCQUdyQixLQUFLO29CQUNMLEtBQUs7bUJBQ0wsS0FBSzttQkFDTCxLQUFLO3VCQUNMLEtBQUs7b0JBQ0wsS0FBSzt5QkFDTCxLQUFLO3VCQUVMLE1BQU07Ozs7SUFaUCxnQ0FFK0I7O0lBRS9CLHFDQUF5Qjs7SUFDekIsbUNBQStCOztJQUMvQixrQ0FBNkI7O0lBQzdCLGtDQUE2Qjs7SUFDN0Isc0NBQTBCOztJQUMxQixtQ0FBK0I7O0lBQy9CLHdDQUE2Qjs7SUFFN0Isc0NBQWdEOzs7Ozs7SUFHaEQsMENBQW1DOzs7Ozs7SUFFbkMsb0NBQXVCOzs7Ozs7SUFFdkIsd0NBQThCOzs7OztJQUc1Qix3Q0FBOEI7Ozs7O0lBQzlCLG9DQUFzQzs7Ozs7SUFDdEMsa0NBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVDYXB0Y2hhLCBSZUNhcHRjaGFCYWRnZSwgUmVDYXB0Y2hhU2l6ZSwgUmVDYXB0Y2hhVGhlbWUsIFJlQ2FwdGNoYVR5cGUgfSBmcm9tICcuL2dyZWNhcHRjaGEnO1xuaW1wb3J0IHsgUmVjYXB0Y2hhTG9hZGVyU2VydmljZSB9IGZyb20gJy4vcmVjYXB0Y2hhLWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJFQ0FQVENIQV9TRVRUSU5HUywgUmVjYXB0Y2hhU2V0dGluZ3MgfSBmcm9tICcuL3JlY2FwdGNoYS1zZXR0aW5ncyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxubGV0IG5leHRJZCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBleHBvcnRBczogJ3JlQ2FwdGNoYScsXG4gIHNlbGVjdG9yOiAncmUtY2FwdGNoYScsXG4gIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICBpZCA9IGBuZ3JlY2FwdGNoYS0ke25leHRJZCsrfWA7XG5cbiAgQElucHV0KCkgc2l0ZUtleTogc3RyaW5nO1xuICBASW5wdXQoKSB0aGVtZTogUmVDYXB0Y2hhVGhlbWU7XG4gIEBJbnB1dCgpIHR5cGU6IFJlQ2FwdGNoYVR5cGU7XG4gIEBJbnB1dCgpIHNpemU6IFJlQ2FwdGNoYVNpemU7XG4gIEBJbnB1dCgpIHRhYkluZGV4OiBudW1iZXI7XG4gIEBJbnB1dCgpIGJhZGdlOiBSZUNhcHRjaGFCYWRnZTtcbiAgQElucHV0KCkgYWN0aW9uTmFtZT86IHN0cmluZztcblxuICBAT3V0cHV0KCkgcmVzb2x2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSB3aWRnZXQ6IG51bWJlcjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGdyZWNhcHRjaGE6IFJlQ2FwdGNoYTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBsb2FkZXI6IFJlY2FwdGNoYUxvYWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSRUNBUFRDSEFfU0VUVElOR1MpIHNldHRpbmdzPzogUmVjYXB0Y2hhU2V0dGluZ3NcbiAgKSB7XG4gICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNpdGVLZXkgPSBzZXR0aW5ncy5zaXRlS2V5O1xuICAgIHRoaXMudGhlbWUgPSBzZXR0aW5ncy50aGVtZTtcbiAgICB0aGlzLnR5cGUgPSBzZXR0aW5ncy50eXBlO1xuICAgIHRoaXMuc2l6ZSA9IHNldHRpbmdzLnNpemU7XG4gICAgdGhpcy5iYWRnZSA9IHNldHRpbmdzLmJhZGdlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5sb2FkZXIucmVhZHkuc3Vic2NyaWJlKChncmVjYXB0Y2hhOiBSZUNhcHRjaGEpID0+IHtcbiAgICAgIGlmIChncmVjYXB0Y2hhICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5ncmVjYXB0Y2hhID0gZ3JlY2FwdGNoYTtcbiAgICAgICAgdGhpcy5yZW5kZXJSZWNhcHRjaGEoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIHJlc2V0IHRoZSBjYXB0Y2hhIHRvIGVuc3VyZSBpdCBkb2VzIG5vdCBsZWF2ZSBhbnl0aGluZyBiZWhpbmRcbiAgICAvLyBhZnRlciB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlciBuZWVkZWRcbiAgICB0aGlzLmdyZWNhcHRjaGFSZXNldCgpO1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGludmlzaWJsZSByZWNhcHRjaGEuXG4gICAqIERvZXMgbm90aGluZyBpZiBjb21wb25lbnQncyBzaXplIGlzIG5vdCBzZXQgdG8gXCJpbnZpc2libGVcIi5cbiAgICovXG4gIGV4ZWN1dGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2l6ZSAhPT0gJ2ludmlzaWJsZScgfHwgdGhpcy53aWRnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3Rpb25OYW1lKSB7XG4gICAgICB0aGlzLmdyZWNhcHRjaGEuZXhlY3V0ZSh0aGlzLndpZGdldCwgeyBhY3Rpb246IHRoaXMuYWN0aW9uTmFtZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmVjYXB0Y2hhLmV4ZWN1dGUodGhpcy53aWRnZXQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLndpZGdldCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmVjYXB0Y2hhLmdldFJlc3BvbnNlKHRoaXMud2lkZ2V0KSkge1xuICAgICAgLy8gT25seSBlbWl0IGFuIGV2ZW50IGluIGNhc2UgaWYgc29tZXRoaW5nIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cbiAgICAgIC8vIFRoYXQgd2F5IHdlIGRvIG5vdCB0cmlnZ2VyIFwidG91Y2hpbmdcIiBvZiB0aGUgY29udHJvbCBpZiBzb21lb25lIGRvZXMgYSBcInJlc2V0XCJcbiAgICAgIC8vIG9uIGEgbm9uLXJlc29sdmVkIGNhcHRjaGEuXG4gICAgICB0aGlzLnJlc29sdmVkLmVtaXQobnVsbCk7XG4gICAgfVxuICAgIHRoaXMuZ3JlY2FwdGNoYVJlc2V0KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgZXhwaXJlZCgpIHtcbiAgICB0aGlzLnJlc29sdmVkLmVtaXQobnVsbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgY2FwdGNoYVJlcG9uc2VDYWxsYmFjayhyZXNwb25zZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZXNvbHZlZC5lbWl0KHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBncmVjYXB0Y2hhUmVzZXQoKSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmdyZWNhcHRjaGEucmVzZXQodGhpcy53aWRnZXQpKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVuZGVyUmVjYXB0Y2hhKCkge1xuICAgIHRoaXMud2lkZ2V0ID0gdGhpcy5ncmVjYXB0Y2hhLnJlbmRlcih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgYmFkZ2U6IHRoaXMuYmFkZ2UsXG4gICAgICBjYWxsYmFjazogKHJlc3BvbnNlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmNhcHRjaGFSZXBvbnNlQ2FsbGJhY2socmVzcG9uc2UpKTtcbiAgICAgIH0sXG4gICAgICAnZXhwaXJlZC1jYWxsYmFjayc6ICgpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmV4cGlyZWQoKSk7XG4gICAgICB9LFxuICAgICAgc2l0ZWtleTogdGhpcy5zaXRlS2V5LFxuICAgICAgc2l6ZTogdGhpcy5zaXplLFxuICAgICAgdGFiaW5kZXg6IHRoaXMudGFiSW5kZXgsXG4gICAgICB0aGVtZTogdGhpcy50aGVtZSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZVxuICAgIH0pO1xuICB9XG59XG4iXX0=