UNPKG

ng-recaptchav3

Version:

Angular8 library to provide easy extraction for google recaptcha v3, invisible recaptcha and recaptcha v2

232 lines 15.8 kB
/** * @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=