@ng-supabase/core
Version:
ng-supabase is a component library and helper utilities for integrating Supabase in your angular application.
98 lines • 13.9 kB
JavaScript
// Angular.
import { CommonModule } from '@angular/common';
import { Input, signal, Component, ChangeDetectionStrategy, } from '@angular/core';
import { FormGroup, Validators, FormControl, ReactiveFormsModule, } from '@angular/forms';
import { LogService } from '../logging/log.service';
import { SupabaseService } from '../supabase.service';
import { RouteService } from '../route.service';
import { SupabaseConfig } from '../supabase-config';
import * as i0 from "@angular/core";
import * as i1 from "../logging/log.service";
import * as i2 from "../supabase-config";
import * as i3 from "../supabase.service";
import * as i4 from "../route.service";
export class ResetPasswordComponent {
constructor(log, config, supabase, routeService) {
this.log = log;
this.config = config;
this.supabase = supabase;
this.routeService = routeService;
this.title = 'Reset Password';
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.sendingReset = signal(false);
this.wait = signal(null);
this.form = new FormGroup({
email: new FormControl('', [Validators.required]),
});
}
ngOnInit() {
this.title = this.title ?? this.config.signIn.title;
this.form.controls.email.setValue(this.email);
}
async resetPassword() {
if (this.form.invalid) {
return;
}
this.form.disable();
this.sendingReset.set(true);
try {
const email = this.form.value.email;
const redirectTo = this.getRedirectTo();
const { error } = await this.supabase.client.auth.resetPasswordForEmail(email, { redirectTo });
if (error) {
this.errorMessage.set(error.message);
this.log.error(`Failed to save password. ${error.message}`);
this.onError(error);
}
this.log.info(`Sent reset password email to '${email}'`);
this.wait.set({
icon: 'pi pi-envelope',
title: 'Check your email',
message: `An email has been sent to <strong>${email}</strong> with a link to reset your password. Simply click the link from your email and follow the instructions.`,
});
}
finally {
this.form.enable();
this.sendingReset.set(false);
}
}
// 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.
}
getRedirectTo() {
return this.redirectToPath
? this.routeService.appendRoute(this.redirectToPath)
: this.redirectToUrl ||
this.routeService.appendRoute(this.config.routes.setPassword);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ResetPasswordComponent, deps: [{ token: i1.LogService }, { token: i2.SupabaseConfig }, { token: i3.SupabaseService }, { token: i4.RouteService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: ResetPasswordComponent, isStandalone: true, selector: "supabase-reset-password", inputs: { title: "title", email: "email", redirectToUrl: "redirectToUrl", redirectToPath: "redirectToPath" }, ngImport: i0, template: "", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ResetPasswordComponent, decorators: [{
type: Component,
args: [{ selector: 'supabase-reset-password', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "" }]
}], ctorParameters: () => [{ type: i1.LogService }, { type: i2.SupabaseConfig }, { type: i3.SupabaseService }, { type: i4.RouteService }], propDecorators: { title: [{
type: Input
}], email: [{
type: Input
}], redirectToUrl: [{
type: Input
}], redirectToPath: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVzZXQtcGFzc3dvcmQvcmVzZXQtcGFzc3dvcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVzZXQtcGFzc3dvcmQvcmVzZXQtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVztBQUNYLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxtQkFBbUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUt4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQVVwRCxNQUFNLE9BQU8sc0JBQXNCO0lBd0JqQyxZQUNtQixHQUFlLEVBQ2YsTUFBc0IsRUFDdEIsUUFBeUIsRUFDekIsWUFBMEI7UUFIMUIsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUNmLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBM0JwQyxVQUFLLEdBQUcsZ0JBQWdCLENBQUM7UUFDekIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNwQjs7O1dBR0c7UUFDTSxr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QyxFQUFBLHlERDJCWSxZQUFZLDhCQUFFLG1CQUFtQjs7MkZBS2hDLHNCQUFzQjtrQkFSbEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLG1CQUczQix1QkFBdUIsQ0FBQyxNQUFNO3FLQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBUUcsY0FBYztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgSW5wdXQsXG4gIHNpZ25hbCxcbiAgQ29tcG9uZW50LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9ycyxcbiAgRm9ybUNvbnRyb2wsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLy8gTG9jYWwuXG5pbXBvcnQgeyBXYWl0TWVzc2FnZSB9IGZyb20gJy4uL3dhaXQtbWVzc2FnZSc7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2xvZ2dpbmcvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VwYWJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vc3VwYWJhc2Uuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZVNlcnZpY2UgfSBmcm9tICcuLi9yb3V0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN1cGFiYXNlQ29uZmlnIH0gZnJvbSAnLi4vc3VwYWJhc2UtY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VwYWJhc2UtcmVzZXQtcGFzc3dvcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc2V0LXBhc3N3b3JkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Jlc2V0LXBhc3N3b3JkLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlc2V0UGFzc3dvcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0aXRsZSA9ICdSZXNldCBQYXNzd29yZCc7XG4gIEBJbnB1dCgpIGVtYWlsID0gJyc7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcm91dGUgdG8gcmVkaXJlY3QgdG8gZnJvbSB0aGUgZW1haWwgbGluay4gVGhpcyBzaG91bGQgbm90XG4gICAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBcInJlZGlyZWN0VG9QYXRoXCIgKHVzZSBvbmUgb3IgdGhlIG90aGVyKS5cbiAgICovXG4gIEBJbnB1dCgpIHJlZGlyZWN0VG9VcmwgPSAnJztcblxuICAvKipcbiAgICogQSByb3V0ZSBwYXRoIHRvIHJlZGlyZWN0IHRvIGZyb20gdGhlIGVtYWlsIGxpbmsgKGFzIGFwcG9zZWQgdG8gYW4gYWJzb2x1dGUgcGF0aCkuXG4gICAqIFRoaXMgcGF0aCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBhcHAncyByb290IFVSTCBhbmQgd2lsbCBiZSB0aGUgVVJMIHRoYXQgaXNcbiAgICogdGFyZ2V0ZWQgZnJvbSB0aGUgZW1haWwgbGluay4gVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiBcInJlZGlyZWN0VG9cIiAodXNlIG9uZSBvciB0aGUgb3RoZXIpLlxuICAgKi9cbiAgQElucHV0KCkgcmVkaXJlY3RUb1BhdGggPSAnJztcblxuICByZWFkb25seSBlcnJvck1lc3NhZ2UgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBzZW5kaW5nUmVzZXQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB3YWl0ID0gc2lnbmFsPFdhaXRNZXNzYWdlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogU3VwYWJhc2VDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdXBhYmFzZTogU3VwYWJhc2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVTZXJ2aWNlOiBSb3V0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlID8/IHRoaXMuY29uZmlnLnNpZ25Jbi50aXRsZTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMuZW1haWwuc2V0VmFsdWUodGhpcy5lbWFpbCk7XG4gIH1cblxuICBhc3luYyByZXNldFBhc3N3b3JkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG4gICAgdGhpcy5zZW5kaW5nUmVzZXQuc2V0KHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVtYWlsID0gdGhpcy5mb3JtLnZhbHVlLmVtYWlsIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlZGlyZWN0VG8gPSB0aGlzLmdldFJlZGlyZWN0VG8oKTtcblxuICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgdGhpcy5zdXBhYmFzZS5jbGllbnQuYXV0aC5yZXNldFBhc3N3b3JkRm9yRW1haWwoXG4gICAgICAgIGVtYWlsLFxuICAgICAgICB7IHJlZGlyZWN0VG8gfVxuICAgICAgKTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEZhaWxlZCB0byBzYXZlIHBhc3N3b3JkLiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFNlbnQgcmVzZXQgcGFzc3dvcmQgZW1haWwgdG8gJyR7ZW1haWx9J2ApO1xuICAgICAgdGhpcy53YWl0LnNldCh7XG4gICAgICAgIGljb246ICdwaSBwaS1lbnZlbG9wZScsXG4gICAgICAgIHRpdGxlOiAnQ2hlY2sgeW91ciBlbWFpbCcsXG4gICAgICAgIG1lc3NhZ2U6IGBBbiBlbWFpbCBoYXMgYmVlbiBzZW50IHRvIDxzdHJvbmc+JHtlbWFpbH08L3N0cm9uZz4gd2l0aCBhIGxpbmsgdG8gcmVzZXQgeW91ciBwYXNzd29yZC4gU2ltcGx5IGNsaWNrIHRoZSBsaW5rIGZyb20geW91ciBlbWFpbCBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMuYCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZvcm0uZW5hYmxlKCk7XG4gICAgICB0aGlzLnNlbmRpbmdSZXNldC5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb25FcnJvcihlcnJvcjogQXV0aEVycm9yKTogdm9pZCB7XG4gICAgLy8gRG8gbm90aGluZyBpbiBoZXJlIGJlY2F1c2UgdGhpcyBpcyBqdXN0IGEgaG9vayBmb3IgY2hpbGRcbiAgICAvLyBjb21wb25lbnRzIHRvIGVhc2lseSBzdWJzY3JpYmUgdG8gd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVkaXJlY3RUbygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZGlyZWN0VG9QYXRoXG4gICAgICA/IHRoaXMucm91dGVTZXJ2aWNlLmFwcGVuZFJvdXRlKHRoaXMucmVkaXJlY3RUb1BhdGgpXG4gICAgICA6IHRoaXMucmVkaXJlY3RUb1VybCB8fFxuICAgICAgICAgIHRoaXMucm91dGVTZXJ2aWNlLmFwcGVuZFJvdXRlKHRoaXMuY29uZmlnLnJvdXRlcy5zZXRQYXNzd29yZCk7XG4gIH1cbn1cbiIsIiJdfQ==