UNPKG

@ng-supabase/core

Version:

ng-supabase is a component library and helper utilities for integrating Supabase in your angular application.

135 lines 18.1 kB
// Angular. import { CommonModule } from '@angular/common'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Input, signal, Component, ChangeDetectionStrategy, } from '@angular/core'; import { RouteService } from '../route.service'; import { LogService } from '../logging/log.service'; import { SupabaseConfig } from '../supabase-config'; import { SupabaseService } from '../supabase.service'; import * as i0 from "@angular/core"; import * as i1 from "../supabase-config"; import * as i2 from "../logging/log.service"; import * as i3 from "../supabase.service"; import * as i4 from "../route.service"; export class RegisterComponent { constructor(config, log, supabase, routeService) { this.config = config; this.log = log; this.supabase = supabase; this.routeService = routeService; this.title = ''; this.email = ''; /** * The absolute route to redirect to from the email link. This should not * be used in conjunction with "redirectToPath" (use one or the other). */ this.redirectToUrl = ''; /** * A route path to redirect to from the email link (as apposed to an absolute path). * This path will be appended to the app's root URL and will be the URL that is * targeted from the email link. This should not be used in conjunction with * "redirectTo" (use one or the other). */ this.redirectToPath = ''; this.errorMessage = signal(''); this.working = signal(false); this.verifyingOtp = signal(false); this.wait = signal(null); this.form = new FormGroup({ email: new FormControl('', [Validators.required]), }); } ngOnInit() { this.title = this.title ?? this.config.register.title; if (this.config.register.metadata.length) { this.setupForMetadata(); } } async register() { if (this.form.invalid) { return; } try { const email = this.form.value.email; const data = this.form.value.metadata; const emailRedirectTo = this.getRedirectTo(); this.form.disable(); this.working.set(true); const { error } = await this.supabase.client.auth.signInWithOtp({ email, options: { shouldCreateUser: true, emailRedirectTo, data, }, }); if (error) { this.errorMessage.set(error.message); this.log.error(`Failed to save password. ${error.message}`); this.onError(error); } this.log.info(`Sent OTP email to '${email}'`); this.wait.set({ icon: 'pi pi-envelope', title: 'Check your email', enableOtp: this.config.signIn.otpEnabled, message: `An email has been sent to <strong>${email}</strong> with a link to verify your email address. Simply click the link from your email and follow the instructions to continue.`, }); } finally { this.form.enable(); this.working.set(false); } } async verifyOtp(token) { this.verifyingOtp.set(true); const email = this.form.value.email; const { error } = await this.supabase.client.auth.verifyOtp({ email, token, type: 'email', }); if (error) { this.onError(error); return; } const redirectUrl = this.getRedirectTo(); this.routeService.goTo(redirectUrl); } // eslint-disable-next-line @typescript-eslint/no-unused-vars onError(error) { // Do nothing in here because this is just a hook for child // components to easily subscribe to when an error occurs. } setupForMetadata() { const group = new FormGroup({}); for (const meta of this.config.register.metadata) { const validators = meta.required ? [Validators.required] : []; const value = meta.defaultValue || ''; const control = new FormControl(value, validators); group.addControl(meta.field, control); } this.form.addControl('metadata', group); } getRedirectTo() { const fallback = this.config.routes.userProfile || this.config.routes.main; return this.redirectToPath ? this.routeService.appendRoute(this.redirectToPath) : this.redirectToUrl || this.routeService.appendRoute(fallback); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RegisterComponent, deps: [{ token: i1.SupabaseConfig }, { token: i2.LogService }, { token: i3.SupabaseService }, { token: i4.RouteService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: RegisterComponent, isStandalone: true, selector: "supabase-register", inputs: { title: "title", email: "email", redirectToUrl: "redirectToUrl", redirectToPath: "redirectToPath" }, ngImport: i0, template: "", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RegisterComponent, decorators: [{ type: Component, args: [{ selector: 'supabase-register', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "" }] }], ctorParameters: () => [{ type: i1.SupabaseConfig }, { type: i2.LogService }, { type: i3.SupabaseService }, { type: i4.RouteService }], propDecorators: { title: [{ type: Input }], email: [{ type: Input }], redirectToUrl: [{ type: Input }], redirectToPath: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVnaXN0ZXIvcmVnaXN0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVnaXN0ZXIvcmVnaXN0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVztBQUNYLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBT3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBVXRELE1BQU0sT0FBTyxpQkFBaUI7SUEwQjVCLFlBQ1csTUFBc0IsRUFDZCxHQUFlLEVBQ2YsUUFBeUIsRUFDekIsWUFBMEI7UUFIbEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDZCxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsaUJBQVksR0FBWixZQUFZLENBQWM7UUE3QnBDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRXBCOzs7V0FHRztRQUNNLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRTVCOzs7OztXQUtHO1FBQ00sbUJBQWMsR0FB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LGFBQWE7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMzRSxPQUFPLElBQUksQ0FBQyxjQUFjO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7OEdBNUhVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDJMQzdCOUIsRUFBQSx5RER3QlksWUFBWTs7MkZBS1gsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBR04sdUJBQXVCLENBQUMsTUFBTTtxS0FHdEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQVFHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyLlxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBJbnB1dCxcbiAgc2lnbmFsLFxuICBPbkluaXQsXG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyAzcmQgcGFydHkuXG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnO1xuXG4vLyBMb2NhbC5cbmltcG9ydCB7IFdhaXRNZXNzYWdlIH0gZnJvbSAnLi4vd2FpdC1tZXNzYWdlJztcbmltcG9ydCB7IFJvdXRlU2VydmljZSB9IGZyb20gJy4uL3JvdXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2xvZ2dpbmcvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VwYWJhc2VDb25maWcgfSBmcm9tICcuLi9zdXBhYmFzZS1jb25maWcnO1xuaW1wb3J0IHsgU3VwYWJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vc3VwYWJhc2Uuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1cGFiYXNlLXJlZ2lzdGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpc3Rlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9yZWdpc3Rlci5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZWdpc3RlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHRpdGxlID0gJyc7XG4gIEBJbnB1dCgpIGVtYWlsID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSByb3V0ZSB0byByZWRpcmVjdCB0byBmcm9tIHRoZSBlbWFpbCBsaW5rLiBUaGlzIHNob3VsZCBub3RcbiAgICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFwicmVkaXJlY3RUb1BhdGhcIiAodXNlIG9uZSBvciB0aGUgb3RoZXIpLlxuICAgKi9cbiAgQElucHV0KCkgcmVkaXJlY3RUb1VybCA9ICcnO1xuXG4gIC8qKlxuICAgKiBBIHJvdXRlIHBhdGggdG8gcmVkaXJlY3QgdG8gZnJvbSB0aGUgZW1haWwgbGluayAoYXMgYXBwb3NlZCB0byBhbiBhYnNvbHV0ZSBwYXRoKS5cbiAgICogVGhpcyBwYXRoIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGFwcCdzIHJvb3QgVVJMIGFuZCB3aWxsIGJlIHRoZSBVUkwgdGhhdCBpc1xuICAgKiB0YXJnZXRlZCBmcm9tIHRoZSBlbWFpbCBsaW5rLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAqIFwicmVkaXJlY3RUb1wiICh1c2Ugb25lIG9yIHRoZSBvdGhlcikuXG4gICAqL1xuICBASW5wdXQoKSByZWRpcmVjdFRvUGF0aCA9ICcnO1xuXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IHdvcmtpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB2ZXJpZnlpbmdPdHAgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB3YWl0ID0gc2lnbmFsPFdhaXRNZXNzYWdlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGZvcm06IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIGVtYWlsOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGNvbmZpZzogU3VwYWJhc2VDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdXBhYmFzZTogU3VwYWJhc2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVTZXJ2aWNlOiBSb3V0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlID8/IHRoaXMuY29uZmlnLnJlZ2lzdGVyLnRpdGxlO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnJlZ2lzdGVyLm1ldGFkYXRhLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZXR1cEZvck1ldGFkYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVtYWlsID0gdGhpcy5mb3JtLnZhbHVlLmVtYWlsIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm0udmFsdWUubWV0YWRhdGE7XG4gICAgICBjb25zdCBlbWFpbFJlZGlyZWN0VG8gPSB0aGlzLmdldFJlZGlyZWN0VG8oKTtcblxuICAgICAgdGhpcy5mb3JtLmRpc2FibGUoKTtcbiAgICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IHRoaXMuc3VwYWJhc2UuY2xpZW50LmF1dGguc2lnbkluV2l0aE90cCh7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2hvdWxkQ3JlYXRlVXNlcjogdHJ1ZSxcbiAgICAgICAgICBlbWFpbFJlZGlyZWN0VG8sXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihgRmFpbGVkIHRvIHNhdmUgcGFzc3dvcmQuICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2VudCBPVFAgZW1haWwgdG8gJyR7ZW1haWx9J2ApO1xuICAgICAgdGhpcy53YWl0LnNldCh7XG4gICAgICAgIGljb246ICdwaSBwaS1lbnZlbG9wZScsXG4gICAgICAgIHRpdGxlOiAnQ2hlY2sgeW91ciBlbWFpbCcsXG4gICAgICAgIGVuYWJsZU90cDogdGhpcy5jb25maWcuc2lnbkluLm90cEVuYWJsZWQsXG4gICAgICAgIG1lc3NhZ2U6IGBBbiBlbWFpbCBoYXMgYmVlbiBzZW50IHRvIDxzdHJvbmc+JHtlbWFpbH08L3N0cm9uZz4gd2l0aCBhIGxpbmsgdG8gdmVyaWZ5IHlvdXIgZW1haWwgYWRkcmVzcy4gU2ltcGx5IGNsaWNrIHRoZSBsaW5rIGZyb20geW91ciBlbWFpbCBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29udGludWUuYCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZvcm0uZW5hYmxlKCk7XG4gICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2ZXJpZnlPdHAodG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5aW5nT3RwLnNldCh0cnVlKTtcbiAgICBjb25zdCBlbWFpbCA9IHRoaXMuZm9ybS52YWx1ZS5lbWFpbCBhcyBzdHJpbmc7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgdGhpcy5zdXBhYmFzZS5jbGllbnQuYXV0aC52ZXJpZnlPdHAoe1xuICAgICAgZW1haWwsXG4gICAgICB0b2tlbixcbiAgICAgIHR5cGU6ICdlbWFpbCcsXG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3RVcmwgPSB0aGlzLmdldFJlZGlyZWN0VG8oKTtcbiAgICB0aGlzLnJvdXRlU2VydmljZS5nb1RvKHJlZGlyZWN0VXJsKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb25FcnJvcihlcnJvcjogQXV0aEVycm9yIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRG8gbm90aGluZyBpbiBoZXJlIGJlY2F1c2UgdGhpcyBpcyBqdXN0IGEgaG9vayBmb3IgY2hpbGRcbiAgICAvLyBjb21wb25lbnRzIHRvIGVhc2lseSBzdWJzY3JpYmUgdG8gd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBGb3JNZXRhZGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gICAgZm9yIChjb25zdCBtZXRhIG9mIHRoaXMuY29uZmlnLnJlZ2lzdGVyLm1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gbWV0YS5yZXF1aXJlZCA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdO1xuICAgICAgY29uc3QgdmFsdWUgPSBtZXRhLmRlZmF1bHRWYWx1ZSB8fCAnJztcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodmFsdWUsIHZhbGlkYXRvcnMpO1xuICAgICAgZ3JvdXAuYWRkQ29udHJvbChtZXRhLmZpZWxkLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCgnbWV0YWRhdGEnLCBncm91cCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVkaXJlY3RUbygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZhbGxiYWNrID0gdGhpcy5jb25maWcucm91dGVzLnVzZXJQcm9maWxlIHx8IHRoaXMuY29uZmlnLnJvdXRlcy5tYWluO1xuICAgIHJldHVybiB0aGlzLnJlZGlyZWN0VG9QYXRoXG4gICAgICA/IHRoaXMucm91dGVTZXJ2aWNlLmFwcGVuZFJvdXRlKHRoaXMucmVkaXJlY3RUb1BhdGgpXG4gICAgICA6IHRoaXMucmVkaXJlY3RUb1VybCB8fCB0aGlzLnJvdXRlU2VydmljZS5hcHBlbmRSb3V0ZShmYWxsYmFjayk7XG4gIH1cbn1cbiIsIiJdfQ==