@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
JavaScript
// 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==