@ng-supabase/core
Version:
ng-supabase is a component library and helper utilities for integrating Supabase in your angular application.
117 lines • 16.7 kB
JavaScript
// Angular.
import { CommonModule } from '@angular/common';
import { Input, inject, signal, Output, Component, EventEmitter, ChangeDetectorRef, ChangeDetectionStrategy, } from '@angular/core';
import { FormGroup, Validators, FormControl, ReactiveFormsModule, } from '@angular/forms';
// 3rd party.
import { debounceTime } from 'rxjs';
// Local.
import { RouteService } from '../route.service';
import { LogService } from '../logging/log.service';
import { SupabaseConfig } from '../supabase-config';
import { SupabaseService } from '../supabase.service';
import { NotifyService } from '../notify/notify.service';
import * as i0 from "@angular/core";
export class SetPasswordComponent {
constructor() {
this.title = '';
this.saveLabel = 'Save Password';
this.savingLabel = 'Saving password...';
this.saved = new EventEmitter();
this.saving = signal(false);
this.errorMessage = signal('');
this.confirmMisMatch = signal(false);
this.form = new FormGroup({
password: new FormControl('', [Validators.required]),
});
this.log = inject(LogService);
this.notify = inject(NotifyService);
this.config = inject(SupabaseConfig);
this.supabase = inject(SupabaseService);
this.routeService = inject(RouteService);
this.changeDetector = inject(ChangeDetectorRef);
this.subscriptions = [];
}
ngOnInit() {
this.title = this.title ?? this.config.setPassword.title;
this.confirmPassword =
this.confirmPassword ?? this.config.setPassword.requireConfirm;
if (this.confirmPassword) {
const confirm = new FormControl('', [
Validators.required,
validatePasswordsMatch,
]);
this.form.addControl('confirm', confirm);
this.subscriptions.push(this.form.valueChanges.pipe(debounceTime(250)).subscribe(() => {
const isMisMatch = !this.form.disabled &&
confirm.dirty &&
confirm.value !== this.form.value.password;
this.confirmMisMatch.set(isMisMatch);
}));
}
}
ngOnDestroy() {
this.subscriptions.forEach((s) => s.unsubscribe());
}
async submit() {
if (this.form.invalid) {
return;
}
this.form.disable();
this.saving.set(true);
try {
const { data, error } = await this.supabase.client.auth.updateUser({
password: this.form.value.password,
});
if (error) {
this.errorMessage.set(error.message);
this.log.error(`Failed to save password. ${error.message}`);
this.onError(error);
return;
}
this.log.info(`Set password for '${data?.user?.email || ''}'`);
this.saved.emit(data.user);
if (this.config.setPassword.showMessageOnSave) {
this.notify.showSuccess({
title: 'Password Changed',
message: 'Your password was successfully reset',
});
}
if (this.redirectTo) {
await this.routeService.goTo(this.redirectTo);
}
this.form.reset();
}
finally {
this.form.enable();
this.saving.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.
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: SetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: SetPasswordComponent, isStandalone: true, selector: "supabase-set-password", inputs: { title: "title", saveLabel: "saveLabel", savingLabel: "savingLabel", confirmPassword: "confirmPassword", redirectTo: "redirectTo" }, outputs: { saved: "saved" }, 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: SetPasswordComponent, decorators: [{
type: Component,
args: [{ selector: 'supabase-set-password', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "" }]
}], propDecorators: { title: [{
type: Input
}], saveLabel: [{
type: Input
}], savingLabel: [{
type: Input
}], confirmPassword: [{
type: Input
}], redirectTo: [{
type: Input
}], saved: [{
type: Output
}] } });
function validatePasswordsMatch(c) {
const root = c.root;
return root.value['password'] === c.value ? null : { passwordsMatch: false };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LXBhc3N3b3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3NldC1wYXNzd29yZC9zZXQtcGFzc3dvcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvc2V0LXBhc3N3b3JkL3NldC1wYXNzd29yZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxXQUFXO0FBQ1gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUVULFlBQVksRUFDWixpQkFBaUIsRUFDakIsdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFFWCxtQkFBbUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixhQUFhO0FBQ2IsT0FBTyxFQUFnQixZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbEQsU0FBUztBQUNULE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBVXpELE1BQU0sT0FBTyxvQkFBb0I7SUFSakM7UUFTVyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsY0FBUyxHQUFHLGVBQWUsQ0FBQztRQUM1QixnQkFBVyxHQUFHLG9CQUFvQixDQUFDO1FBR2xDLFVBQUssR0FB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LEVBQUEseUREcUNZLFlBQVksOEJBQUUsbUJBQW1COzsyRkFLaEMsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsbUJBRzNCLHVCQUF1QixDQUFDLE1BQU07OEJBR3RDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLEtBQUs7c0JBQWQsTUFBTTs7QUE4RlQsU0FBUyxzQkFBc0IsQ0FDN0IsQ0FBa0I7SUFFbEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQWlCLENBQUM7SUFDakMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDL0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIE91dHB1dCxcbiAgQ29tcG9uZW50LFxuICBPbkRlc3Ryb3ksXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVybFRyZWUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxuICBGb3JtQ29udHJvbCxcbiAgQWJzdHJhY3RDb250cm9sLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8vIDNyZCBwYXJ0eS5cbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3IsIFVzZXIgfSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnO1xuXG4vLyBMb2NhbC5cbmltcG9ydCB7IFJvdXRlU2VydmljZSB9IGZyb20gJy4uL3JvdXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2xvZ2dpbmcvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VwYWJhc2VDb25maWcgfSBmcm9tICcuLi9zdXBhYmFzZS1jb25maWcnO1xuaW1wb3J0IHsgU3VwYWJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vc3VwYWJhc2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZnlTZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZ5L25vdGlmeS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VwYWJhc2Utc2V0LXBhc3N3b3JkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zZXQtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vc2V0LXBhc3N3b3JkLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNldFBhc3N3b3JkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0aXRsZSA9ICcnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSBQYXNzd29yZCc7XG4gIEBJbnB1dCgpIHNhdmluZ0xhYmVsID0gJ1NhdmluZyBwYXNzd29yZC4uLic7XG4gIEBJbnB1dCgpIGNvbmZpcm1QYXNzd29yZCE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHJlZGlyZWN0VG86IHN0cmluZyB8IHN0cmluZ1tdIHwgVXJsVHJlZSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIEBPdXRwdXQoKSBzYXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlciB8IG51bGw+KCk7XG5cbiAgcmVhZG9ubHkgc2F2aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgY29uZmlybU1pc01hdGNoID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgcGFzc3dvcmQ6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvZyA9IGluamVjdChMb2dTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vdGlmeSA9IGluamVjdChOb3RpZnlTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChTdXBhYmFzZUNvbmZpZyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdXBhYmFzZSA9IGluamVjdChTdXBhYmFzZVNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlU2VydmljZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjaGFuZ2VEZXRlY3RvciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlID8/IHRoaXMuY29uZmlnLnNldFBhc3N3b3JkLnRpdGxlO1xuICAgIHRoaXMuY29uZmlybVBhc3N3b3JkID1cbiAgICAgIHRoaXMuY29uZmlybVBhc3N3b3JkID8/IHRoaXMuY29uZmlnLnNldFBhc3N3b3JkLnJlcXVpcmVDb25maXJtO1xuXG4gICAgaWYgKHRoaXMuY29uZmlybVBhc3N3b3JkKSB7XG4gICAgICBjb25zdCBjb25maXJtID0gbmV3IEZvcm1Db250cm9sKCcnLCBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIHZhbGlkYXRlUGFzc3dvcmRzTWF0Y2gsXG4gICAgICBdKTtcblxuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2NvbmZpcm0nLCBjb25maXJtKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDI1MCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNNaXNNYXRjaCA9XG4gICAgICAgICAgICAhdGhpcy5mb3JtLmRpc2FibGVkICYmXG4gICAgICAgICAgICBjb25maXJtLmRpcnR5ICYmXG4gICAgICAgICAgICBjb25maXJtLnZhbHVlICE9PSB0aGlzLmZvcm0udmFsdWUucGFzc3dvcmQ7XG5cbiAgICAgICAgICB0aGlzLmNvbmZpcm1NaXNNYXRjaC5zZXQoaXNNaXNNYXRjaCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG4gICAgdGhpcy5zYXZpbmcuc2V0KHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuc3VwYWJhc2UuY2xpZW50LmF1dGgudXBkYXRlVXNlcih7XG4gICAgICAgIHBhc3N3b3JkOiB0aGlzLmZvcm0udmFsdWUucGFzc3dvcmQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEZhaWxlZCB0byBzYXZlIHBhc3N3b3JkLiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0IHBhc3N3b3JkIGZvciAnJHtkYXRhPy51c2VyPy5lbWFpbCB8fCAnJ30nYCk7XG4gICAgICB0aGlzLnNhdmVkLmVtaXQoZGF0YS51c2VyKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNldFBhc3N3b3JkLnNob3dNZXNzYWdlT25TYXZlKSB7XG4gICAgICAgIHRoaXMubm90aWZ5LnNob3dTdWNjZXNzKHtcbiAgICAgICAgICB0aXRsZTogJ1Bhc3N3b3JkIENoYW5nZWQnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdZb3VyIHBhc3N3b3JkIHdhcyBzdWNjZXNzZnVsbHkgcmVzZXQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmVkaXJlY3RUbykge1xuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlU2VydmljZS5nb1RvKHRoaXMucmVkaXJlY3RUbyBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICAgICAgdGhpcy5zYXZpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG9uRXJyb3IoZXJyb3I6IEF1dGhFcnJvcik6IHZvaWQge1xuICAgIC8vIERvIG5vdGhpbmcgaW4gaGVyZSBiZWNhdXNlIHRoaXMgaXMganVzdCBhIGhvb2sgZm9yIGNoaWxkXG4gICAgLy8gY29tcG9uZW50cyB0byBlYXNpbHkgc3Vic2NyaWJlIHRvIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGFzc3dvcmRzTWF0Y2goXG4gIGM6IEFic3RyYWN0Q29udHJvbFxuKTogbnVsbCB8IHsgcGFzc3dvcmRzTWF0Y2g6IGZhbHNlIH0ge1xuICBjb25zdCByb290ID0gYy5yb290IGFzIEZvcm1Hcm91cDtcbiAgcmV0dXJuIHJvb3QudmFsdWVbJ3Bhc3N3b3JkJ10gPT09IGMudmFsdWUgPyBudWxsIDogeyBwYXNzd29yZHNNYXRjaDogZmFsc2UgfTtcbn1cbiIsIiJdfQ==