barsa-auth 3.0.8 → 3.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injectable, signal, EventEmitter, Input, Output, ChangeDetectionStrategy, Component, NgZone, ViewChild, ViewChildren, input, TemplateRef, NgModule } from '@angular/core';
2
+ import { inject, Injectable, signal, EventEmitter, Input, Output, ChangeDetectionStrategy, Component, NgZone, ViewChild, ViewChildren, input, computed, TemplateRef, NgModule } from '@angular/core';
3
3
  import * as i3 from 'barsa-novin-ray-core';
4
4
  import { getUniqueId, BaseController, BarsaApi, ViewBase, forbiddenValidator, mobile_regex, BaseComponent, validateAllFormFields, PortalService, ApplicationCtrlrService, BaseModule, DynamicComponentService, BarsaNovinRayCoreModule } from 'barsa-novin-ray-core';
5
5
  import { HttpClient, HttpErrorResponse } from '@angular/common/http';
@@ -203,6 +203,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
203
203
  args: [{ providedIn: 'root' }]
204
204
  }] });
205
205
 
206
+ const SOCIAL_SIGNIN_PATH = '/api/openId/signin';
207
+ function buildSocialSignInHref(providerName, origin) {
208
+ return `${SOCIAL_SIGNIN_PATH}?provider=${encodeURIComponent(providerName)}&returnUrl=${encodeURIComponent(origin)}`;
209
+ }
210
+ function toSocialConnectionButtons(report, origin) {
211
+ const list = report?.MoDataList;
212
+ if (!Array.isArray(list)) {
213
+ return [];
214
+ }
215
+ const result = [];
216
+ for (const item of list) {
217
+ const providerName = item?.SocialConnectionProvider?.$Caption?.trim();
218
+ if (!providerName) {
219
+ continue;
220
+ }
221
+ const logo = item.A_SocialConnectionProvider_Logo;
222
+ result.push({
223
+ id: item.Id,
224
+ title: item.Title?.trim() || providerName,
225
+ providerName,
226
+ href: buildSocialSignInHref(providerName, origin),
227
+ logo: logo?.FileId && !logo.IsDeleted ? logo : null
228
+ });
229
+ }
230
+ return result;
231
+ }
232
+
206
233
  class LoginMobileController extends BaseController {
207
234
  /**
208
235
  *
@@ -759,6 +786,8 @@ class BarsaAuthComponent {
759
786
  ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
760
787
  this.passkeyAvailable = signal(false, /* @ts-ignore */
761
788
  ...(ngDevMode ? [{ debugName: "passkeyAvailable" }] : /* istanbul ignore next */ []));
789
+ this.socialConnections = computed(() => toSocialConnectionButtons(this.appSettings()?.SocialConnections, window.location.origin), /* @ts-ignore */
790
+ ...(ngDevMode ? [{ debugName: "socialConnections" }] : /* istanbul ignore next */ []));
762
791
  this._portalService = inject(PortalService);
763
792
  this._applicationCtrlrService = inject(ApplicationCtrlrService);
764
793
  this.passkeyService = inject(PasskeyService);
@@ -816,11 +845,11 @@ class BarsaAuthComponent {
816
845
  this.verified.emit(token2);
817
846
  }
818
847
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
819
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: BarsaAuthComponent, isStandalone: false, selector: "ba-auth", inputs: { appSettings: { classPropertyName: "appSettings", publicName: "appSettings", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { verified: "verified" }, ngImport: i0, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.MobileDirective, selector: "[mobile]" }, { kind: "component", type: EnterMobileComponent, selector: "ba-enter-mobile", inputs: ["errorTemplate", "otpProvider", "mobileDescription", "usernameDescription", "usernameLabel"], outputs: ["otpSent"] }, { kind: "component", type: VerificationComponent, selector: "ba-verification", inputs: ["mobile", "otpProvider", "errorTemplate"], outputs: ["otpVerified", "changeMobile"] }, { kind: "component", type: UserPassComponent, selector: "ba-user-pass", inputs: ["errorTemplate", "otpProvider"], outputs: ["loggedIn"] }, { kind: "component", type: PasskeyComponent, selector: "ba-passkey", inputs: ["mode", "autoStart"], outputs: ["loggedIn", "registered", "skipped", "cancelled"] }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
848
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: BarsaAuthComponent, isStandalone: false, selector: "ba-auth", inputs: { appSettings: { classPropertyName: "appSettings", publicName: "appSettings", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { verified: "verified" }, ngImport: i0, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #socialConnectionsTpl>\r\n @if(socialConnections().length > 0){\r\n <div class=\"social-connections tw-flex tw-flex-wrap tw-gap-2 tw-mt-3\">\r\n @for(btn of socialConnections(); track btn.id){\r\n <a class=\"social-connection-button tw-px-4 tw-py-3 tw-text-sm tw-font-medium\" [href]=\"btn.href\">\r\n @if(btn.logo){\r\n <img class=\"social-connection-logo\" [src]=\"btn.logo | picFieldSrc: 'ID':null:'':48:48\" alt=\"\" loading=\"lazy\" />\r\n }\r\n <span>{{ btn.title }}</span>\r\n </a>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('user-pass')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\r\n </a>\r\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\r\n <div class=\"passkey-entry tw-mt-5\">\r\n <button\r\n type=\"button\"\r\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('passkey')\"\r\n >\r\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\r\n </button>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"socialConnectionsTpl\"></ng-container>\r\n </div>\r\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('enter-mobile')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n </a>\r\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\r\n <div class=\"passkey-entry tw-mt-5\">\r\n <button\r\n type=\"button\"\r\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('passkey')\"\r\n >\r\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\r\n </button>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"socialConnectionsTpl\"></ng-container>\r\n </div>\r\n </ba-user-pass>\r\n } @case ('passkey') {\r\n <ba-passkey\r\n mode=\"login\"\r\n [autoStart]=\"true\"\r\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\r\n (cancelled)=\"onChangeState('enter-mobile')\"\r\n >\r\n </ba-passkey>\r\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button,.social-connection-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover,.social-connection-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active,.social-connection-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible,.social-connection-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.social-connection-button{display:flex;flex:1 1 10rem;align-items:center;justify-content:center;gap:.5rem;text-decoration:none}.social-connection-logo{width:1.5rem;height:1.5rem;object-fit:contain}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.MobileDirective, selector: "[mobile]" }, { kind: "component", type: EnterMobileComponent, selector: "ba-enter-mobile", inputs: ["errorTemplate", "otpProvider", "mobileDescription", "usernameDescription", "usernameLabel"], outputs: ["otpSent"] }, { kind: "component", type: VerificationComponent, selector: "ba-verification", inputs: ["mobile", "otpProvider", "errorTemplate"], outputs: ["otpVerified", "changeMobile"] }, { kind: "component", type: UserPassComponent, selector: "ba-user-pass", inputs: ["errorTemplate", "otpProvider"], outputs: ["loggedIn"] }, { kind: "component", type: PasskeyComponent, selector: "ba-passkey", inputs: ["mode", "autoStart"], outputs: ["loggedIn", "registered", "skipped", "cancelled"] }, { kind: "pipe", type: i3.PictureFieldSourcePipe, name: "picFieldSrc" }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
820
849
  }
821
850
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, decorators: [{
822
851
  type: Component,
823
- args: [{ selector: 'ba-auth', changeDetection: ChangeDetectionStrategy.Eager, standalone: false, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"] }]
852
+ args: [{ selector: 'ba-auth', changeDetection: ChangeDetectionStrategy.Eager, standalone: false, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #socialConnectionsTpl>\r\n @if(socialConnections().length > 0){\r\n <div class=\"social-connections tw-flex tw-flex-wrap tw-gap-2 tw-mt-3\">\r\n @for(btn of socialConnections(); track btn.id){\r\n <a class=\"social-connection-button tw-px-4 tw-py-3 tw-text-sm tw-font-medium\" [href]=\"btn.href\">\r\n @if(btn.logo){\r\n <img class=\"social-connection-logo\" [src]=\"btn.logo | picFieldSrc: 'ID':null:'':48:48\" alt=\"\" loading=\"lazy\" />\r\n }\r\n <span>{{ btn.title }}</span>\r\n </a>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('user-pass')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\r\n </a>\r\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\r\n <div class=\"passkey-entry tw-mt-5\">\r\n <button\r\n type=\"button\"\r\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('passkey')\"\r\n >\r\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\r\n </button>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"socialConnectionsTpl\"></ng-container>\r\n </div>\r\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('enter-mobile')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n </a>\r\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\r\n <div class=\"passkey-entry tw-mt-5\">\r\n <button\r\n type=\"button\"\r\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('passkey')\"\r\n >\r\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\r\n </button>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"socialConnectionsTpl\"></ng-container>\r\n </div>\r\n </ba-user-pass>\r\n } @case ('passkey') {\r\n <ba-passkey\r\n mode=\"login\"\r\n [autoStart]=\"true\"\r\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\r\n (cancelled)=\"onChangeState('enter-mobile')\"\r\n >\r\n </ba-passkey>\r\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button,.social-connection-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover,.social-connection-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active,.social-connection-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible,.social-connection-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.social-connection-button{display:flex;flex:1 1 10rem;align-items:center;justify-content:center;gap:.5rem;text-decoration:none}.social-connection-logo{width:1.5rem;height:1.5rem;object-fit:contain}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"] }]
824
853
  }], propDecorators: { verified: [{
825
854
  type: Output
826
855
  }], appSettings: [{ type: i0.Input, args: [{ isSignal: true, alias: "appSettings", required: true }] }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"barsa-auth.mjs","sources":["../../../projects/barsa-auth/src/lib/services/passkey-codec.ts","../../../projects/barsa-auth/src/lib/services/passkey.service.ts","../../../projects/barsa-auth/src/lib/controllers/login-mobile-controller.ts","../../../projects/barsa-auth/src/lib/controllers/login-userpass-controller.ts","../../../projects/barsa-auth/src/lib/controllers/login-verification-controller.ts","../../../projects/barsa-auth/src/lib/enter-mobile/enter-mobile.component.ts","../../../projects/barsa-auth/src/lib/enter-mobile/enter-mobile.component.html","../../../projects/barsa-auth/src/lib/timer-countdown/timer-countdown.component.ts","../../../projects/barsa-auth/src/lib/timer-countdown/timer-countdown.component.html","../../../projects/barsa-auth/src/lib/verification/verification.component.ts","../../../projects/barsa-auth/src/lib/verification/verification.component.html","../../../projects/barsa-auth/src/lib/user-pass/user-pass.component.ts","../../../projects/barsa-auth/src/lib/user-pass/user-pass.component.html","../../../projects/barsa-auth/src/lib/passkey/passkey.component.ts","../../../projects/barsa-auth/src/lib/passkey/passkey.component.html","../../../projects/barsa-auth/src/lib/barsa-auth/barsa-auth.component.ts","../../../projects/barsa-auth/src/lib/barsa-auth/barsa-auth.component.html","../../../projects/barsa-auth/src/lib/login/login.component.ts","../../../projects/barsa-auth/src/lib/login/login.component.html","../../../projects/barsa-auth/src/lib/barsa-auth.module.ts","../../../projects/barsa-auth/src/public-api.ts","../../../projects/barsa-auth/src/barsa-auth.ts"],"sourcesContent":["export function decodeBase64Url(value: string): ArrayBuffer {\r\n const padding = '='.repeat((4 - (value.length % 4)) % 4);\r\n const binary = globalThis.atob(value.replace(/-/g, '+').replace(/_/g, '/') + padding);\r\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\r\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\r\n}\r\n\r\nexport function encodeBase64Url(value: ArrayBuffer): string {\r\n const bytes = new Uint8Array(value);\r\n let binary = '';\r\n for (const byte of bytes) {\r\n binary += String.fromCharCode(byte);\r\n }\r\n return globalThis.btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport {\r\n PasskeyAuthenticationCredentialJson,\r\n PasskeyAuthenticationOptionsJson,\r\n PasskeyAuthenticationVerifyResponse,\r\n PasskeyCeremonyOptions,\r\n PasskeyCredentialDescriptorJson,\r\n PasskeyEnrollmentStatus,\r\n PasskeyRegistrationCredentialJson,\r\n PasskeyRegistrationOptionsJson,\r\n PasskeyRegistrationVerifyResponse\r\n} from '../controllers/models';\r\nimport { decodeBase64Url, encodeBase64Url } from './passkey-codec';\r\nimport { getUniqueId } from 'barsa-novin-ray-core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PasskeyService {\r\n private readonly httpClient = inject(HttpClient);\r\n private platformAvailability?: Promise<boolean>;\r\n\r\n isPlatformAuthenticatorAvailable(): Promise<boolean> {\r\n if (!this.platformAvailability) {\r\n this.platformAvailability = this.detectPlatformAuthenticator();\r\n }\r\n return this.platformAvailability;\r\n }\r\n\r\n getEnrollmentStatus(): Promise<PasskeyEnrollmentStatus> {\n return firstValueFrom(\n this.httpClient.get<PasskeyEnrollmentStatus | string>('/api2/PassKey/0.1/status?v=' + getUniqueId(4))\n ).then((response) => this.parseJsonResponse<PasskeyEnrollmentStatus>(response));\n }\n\n canOfferEnrollment(status: PasskeyEnrollmentStatus): boolean {\n return status.canCreatePasskey ?? status.shouldOfferEnrollment;\n }\n\n isCredentialAlreadyRegistered(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'InvalidStateError'\n );\n }\n\r\n async register(): Promise<PasskeyRegistrationVerifyResponse> {\r\n const ceremonyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyCeremonyOptions<PasskeyRegistrationOptionsJson> | string>(\r\n '/api2/PassKey/0.1/registrationoptions',\r\n {}\r\n )\r\n );\r\n const ceremony =\r\n this.parseJsonResponse<PasskeyCeremonyOptions<PasskeyRegistrationOptionsJson>>(ceremonyResponse);\r\n const publicKey = this.toCreationOptions(ceremony.publicKey);\r\n const credential = (await navigator.credentials.create({ publicKey })) as PublicKeyCredential | null;\r\n\r\n if (!credential || !('attestationObject' in credential.response)) {\r\n throw new Error('PASSKEY_REGISTRATION_EMPTY');\r\n }\r\n\r\n const verifyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyRegistrationVerifyResponse | string>('/api2/PassKey/0.1/registrationverify', {\r\n ceremonyId: ceremony.ceremonyId,\r\n credential: this.serializeRegistrationCredential(credential)\r\n })\r\n );\r\n const response = this.parseJsonResponse<PasskeyRegistrationVerifyResponse>(verifyResponse);\r\n\r\n if (!response.verified) {\r\n throw new Error('PASSKEY_REGISTRATION_REJECTED');\r\n }\r\n return response;\r\n }\r\n\r\n async authenticate(): Promise<string> {\r\n const ceremonyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyCeremonyOptions<PasskeyAuthenticationOptionsJson> | string>(\r\n '/api2/PassKey/0.1/authenticationoptions',\r\n {}\r\n )\r\n );\r\n const ceremony =\r\n this.parseJsonResponse<PasskeyCeremonyOptions<PasskeyAuthenticationOptionsJson>>(ceremonyResponse);\r\n const publicKey = this.toRequestOptions(ceremony.publicKey);\r\n const credential = (await navigator.credentials.get({ publicKey })) as PublicKeyCredential | null;\r\n\r\n if (!credential || !('signature' in credential.response)) {\r\n throw new Error('PASSKEY_AUTHENTICATION_EMPTY');\r\n }\r\n\r\n const verifyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyAuthenticationVerifyResponse | string>(\r\n '/api2/PassKey/0.1/authenticationverify',\r\n {\r\n ceremonyId: ceremony.ceremonyId,\r\n credential: this.serializeAuthenticationCredential(credential)\r\n }\r\n )\r\n );\r\n const response = this.parseJsonResponse<PasskeyAuthenticationVerifyResponse>(verifyResponse);\r\n\r\n if (!response.verified || !response.token2?.trim()) {\r\n throw new Error('PASSKEY_AUTHENTICATION_REJECTED');\r\n }\r\n return response.token2;\r\n }\r\n\r\n getErrorMessage(error: unknown): string {\n if (error instanceof DOMException) {\r\n if (error.name === 'NotAllowedError') {\r\n return 'عملیات لغو شد یا Passkey معتبری روی این دستگاه پیدا نشد.';\r\n }\r\n if (error.name === 'InvalidStateError') {\r\n return 'Passkey این دستگاه قبلاً برای حساب شما ثبت شده است.';\r\n }\r\n if (error.name === 'SecurityError') {\r\n return 'تنظیمات دامنه یا ارتباط امن برای ورود با دستگاه معتبر نیست.';\r\n }\r\n }\r\n if (error instanceof HttpErrorResponse) {\r\n const serverMessage = error.error?.Message || error.error?.message || error.error?.error?.userMessage;\r\n if (typeof serverMessage === 'string' && serverMessage) {\r\n return serverMessage;\r\n }\r\n }\r\n return 'انجام احراز هویت دستگاه ممکن نشد. می‌توانید از روش دیگری وارد شوید.';\r\n }\r\n\r\n private async detectPlatformAuthenticator(): Promise<boolean> {\r\n if (\r\n typeof window === 'undefined' ||\r\n !window.isSecureContext ||\r\n typeof PublicKeyCredential === 'undefined' ||\r\n typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function'\r\n ) {\r\n return false;\r\n }\r\n try {\r\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private parseJsonResponse<T>(response: T | string): T {\r\n let value: unknown = response;\r\n\r\n for (let depth = 0; depth < 2 && typeof value === 'string'; depth++) {\r\n value = JSON.parse(value);\r\n }\r\n\r\n return value as T;\r\n }\r\n\r\n private toCreationOptions(options: PasskeyRegistrationOptionsJson): PublicKeyCredentialCreationOptions {\r\n return {\r\n ...options,\r\n challenge: decodeBase64Url(options.challenge),\r\n user: {\r\n ...options.user,\r\n id: decodeBase64Url(options.user.id)\r\n },\r\n excludeCredentials: this.toCredentialDescriptors(options.excludeCredentials),\r\n authenticatorSelection: {\r\n ...options.authenticatorSelection,\r\n authenticatorAttachment: 'platform',\r\n residentKey: 'required',\r\n requireResidentKey: true,\r\n userVerification: 'required'\r\n },\r\n attestation: 'none',\r\n hints: ['client-device']\r\n } as PublicKeyCredentialCreationOptions;\r\n }\r\n\r\n private toRequestOptions(options: PasskeyAuthenticationOptionsJson): PublicKeyCredentialRequestOptions {\r\n return {\r\n ...options,\r\n challenge: decodeBase64Url(options.challenge),\r\n allowCredentials: this.toCredentialDescriptors(options.allowCredentials),\r\n userVerification: 'required',\r\n hints: ['client-device']\r\n } as PublicKeyCredentialRequestOptions;\r\n }\r\n\r\n private toCredentialDescriptors(\r\n descriptors: PasskeyCredentialDescriptorJson[] | undefined\r\n ): PublicKeyCredentialDescriptor[] | undefined {\r\n return descriptors?.map((descriptor) => ({\r\n ...descriptor,\r\n id: decodeBase64Url(descriptor.id),\r\n transports: descriptor.transports as AuthenticatorTransport[] | undefined\r\n }));\r\n }\r\n\r\n private serializeRegistrationCredential(credential: PublicKeyCredential): PasskeyRegistrationCredentialJson {\r\n const response = credential.response as AuthenticatorAttestationResponse & {\r\n getTransports?: () => string[];\r\n };\r\n return {\r\n id: credential.id,\r\n rawId: encodeBase64Url(credential.rawId),\r\n type: 'public-key',\r\n authenticatorAttachment: this.getAuthenticatorAttachment(credential),\r\n clientExtensionResults: credential.getClientExtensionResults(),\r\n response: {\r\n clientDataJSON: encodeBase64Url(response.clientDataJSON),\r\n attestationObject: encodeBase64Url(response.attestationObject),\r\n transports: response.getTransports?.() || []\r\n }\r\n };\r\n }\r\n\r\n private serializeAuthenticationCredential(credential: PublicKeyCredential): PasskeyAuthenticationCredentialJson {\r\n const response = credential.response as AuthenticatorAssertionResponse;\r\n return {\r\n id: credential.id,\r\n rawId: encodeBase64Url(credential.rawId),\r\n type: 'public-key',\r\n authenticatorAttachment: this.getAuthenticatorAttachment(credential),\r\n clientExtensionResults: credential.getClientExtensionResults(),\r\n response: {\r\n clientDataJSON: encodeBase64Url(response.clientDataJSON),\r\n authenticatorData: encodeBase64Url(response.authenticatorData),\r\n signature: encodeBase64Url(response.signature),\r\n userHandle: response.userHandle ? encodeBase64Url(response.userHandle) : null\r\n }\r\n };\r\n }\r\n\r\n private getAuthenticatorAttachment(credential: PublicKeyCredential): string | null {\r\n return (\r\n (credential as PublicKeyCredential & { authenticatorAttachment?: string | null }).authenticatorAttachment ??\r\n null\r\n );\r\n }\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, finalize, throwError } from 'rxjs';\r\n\r\nimport { BaseController, IViewBase } from 'barsa-novin-ray-core';\r\n\r\nexport class LoginMobileController extends BaseController<ILoginMobileView> {\r\n private _httpClient: HttpClient;\r\n /**\r\n *\r\n */\r\n\r\n constructor(view: ILoginMobileView) {\r\n super(view);\r\n this._httpClient = view.injector.get(HttpClient);\r\n }\r\n get form(): FormGroup {\r\n return this.view.form;\r\n }\r\n sendCode(otpProvider: string, e): void {\r\n const { mobile, username } = e;\r\n this.form.valid && this.view.setLoading(true);\r\n this.view.showError('', -1);\r\n // const x = (): void => {\r\n // this.loading.set(false);\r\n // };\r\n const usernamequery = username ? `&username=${username}` : '';\r\n this._httpClient\r\n .get<{ otpId: string }>(`/api/openid/signin?provider=${otpProvider}&mobile=${mobile}${usernamequery}`)\r\n .pipe(\r\n finalize(() => {\r\n this.view.setLoading(false);\r\n }),\r\n catchError((err) => {\r\n if (typeof err === 'object' && err.status === 403) {\r\n this.view.showError(err.error.Message, err.error.Code);\r\n }\r\n return throwError(() => new Error(err));\r\n })\r\n )\r\n .subscribe((c) => {\r\n if (c?.otpId) {\r\n localStorage.setItem('otpId', c.otpId);\r\n this.view.codeSent();\r\n } else {\r\n const res = c as any;\r\n if (!res.succeed) {\r\n this.view.showError(res.error.userMessage, res.type);\r\n }\r\n // debugger;\r\n }\r\n });\r\n }\r\n init(): void {\r\n this.form.valueChanges.subscribe((_c) =>\r\n this.form.valid ? this.view.canSend(true) : this.view.canSend(false)\r\n );\r\n }\r\n}\r\n\r\nexport interface ILoginMobileView extends IViewBase {\r\n showError(message: any, code: any): void;\r\n form: FormGroup;\r\n codeSent: () => void;\r\n setLoading: (loading: boolean) => void;\r\n canSend: (loading: boolean) => void;\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { BarsaApi, BaseController, IViewBase } from 'barsa-novin-ray-core';\r\n\r\nexport class LoginUserPassController extends BaseController<ILoginUserPassView> {\r\n get form(): FormGroup {\r\n return this.view.form;\r\n }\r\n login(e: any): void {\r\n const { username, password, cap, capId } = e;\r\n this.view.setLoading(true);\r\n this.view.showError('', -1);\r\n const data = {\r\n un: username,\r\n pwd: password,\r\n cap,\r\n capId\r\n };\r\n BarsaApi.Bw.Login(data, {\r\n onSuccess: () => {\r\n this.view.userLoggedIn();\r\n },\r\n onError: (response2) => {\r\n this.view.setLoading(false);\r\n const response = response2.Data.ResponseData;\r\n let error = response.error;\r\n if (!error) {\r\n error = response;\r\n }\r\n const data = response.data;\r\n this.view.showError(error.userMessage, -1);\r\n if (data.showCaptcha) {\r\n this.view.visibleCaptcha(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n init(): void {\r\n this.form.valueChanges.subscribe((_c) => this.view.setValid(this.form.valid));\r\n if (BarsaApi.LoginFormData.ShowCaptcha === 'Show') {\r\n this.view.visibleCaptcha(true);\r\n }\r\n }\r\n}\r\n\r\nexport interface ILoginUserPassView extends IViewBase {\r\n form: FormGroup;\r\n showError(message: any, code: any): void;\r\n visibleCaptcha: (visible: boolean) => void;\r\n setLoading: (loading: boolean) => void;\r\n setValid: (isValid: boolean) => void;\r\n userLoggedIn: () => void;\r\n}\r\n","import { signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, finalize, throwError } from 'rxjs';\r\n\r\nimport { BaseController, IViewBase, BarsaApi } from 'barsa-novin-ray-core';\r\n\r\nexport class LoginVerificationController extends BaseController<ILoginVerificationView> {\r\n canVerify = signal(false);\r\n _httpClient: HttpClient;\r\n\r\n constructor(view: ILoginVerificationView) {\r\n super(view);\r\n this._httpClient = view.injector.get(HttpClient);\r\n }\r\n\r\n get form(): FormGroup {\r\n return this.view.form;\r\n }\r\n resendCode(otpProvider: string): void {\r\n this.view.setResetLoading(true);\r\n this._httpClient\r\n .get<{ otpId: string }>(`/api/openid/signin?provider=${otpProvider}&otpId=${localStorage.getItem('otpId')}`)\r\n .pipe(\r\n finalize(() => {}),\r\n catchError((err) => {\r\n this.view.setResetLoading(false);\r\n if (typeof err === 'object' && err.status === 403) {\r\n this.view.showError(err.error.Message, err.error.Code);\r\n }\r\n return throwError(() => new Error(err));\r\n })\r\n )\r\n .subscribe((_c) => {\r\n this.view.setResetLoading(false);\r\n this.view.startCountDown();\r\n });\r\n }\r\n verifyCode(otpProvider: string, e): void {\r\n this.view.setLoading(true);\r\n const { code, cap, capId } = e;\r\n\r\n this._httpClient\r\n .post<{ Sth: string }>(`/api/openid/callback?provider=${otpProvider}`, {\r\n otpId: localStorage.getItem('otpId'),\r\n otpCode: code,\r\n captchaCode: cap,\r\n capId\r\n })\r\n .pipe(\r\n finalize(() => {\r\n this.view.setLoading(false);\r\n }),\r\n catchError((err) => {\r\n if (typeof err === 'object' && err.status === 403) {\r\n this.view.showError(err.error.Message, err.error.Code);\r\n }\r\n return throwError(() => new Error(err));\r\n })\r\n )\r\n .subscribe((c) => {\r\n if (c?.Sth) {\r\n localStorage.removeItem('otpId');\r\n window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, c.Sth);\r\n this.view.codeVerified();\r\n } else {\r\n const res = c as any;\r\n if (!res.succeed) {\r\n this.view.showError(res.error.userMessage, res.type);\r\n }\r\n }\r\n });\r\n }\r\n init(): void {\r\n this.form.valueChanges.subscribe((_c) =>\r\n this.form.valid ? this.canVerify.set(true) : this.canVerify.set(false)\r\n );\r\n }\r\n}\r\nexport interface ILoginVerificationView extends IViewBase {\r\n form: FormGroup;\r\n codeVerified: () => void;\r\n startCountDown: () => void;\r\n setResetLoading: (loading: boolean) => void;\r\n setLoading: (loading: boolean) => void;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n signal,\r\n inject\r\n} from '@angular/core';\r\nimport { ILoginMobileView, LoginMobileController } from '../controllers';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { forbiddenValidator, mobile_regex, ViewBase } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-enter-mobile',\r\n templateUrl: './enter-mobile.component.html',\r\n styleUrl: './enter-mobile.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class EnterMobileComponent extends ViewBase<LoginMobileController> implements ILoginMobileView {\r\n @Output() otpSent = new EventEmitter<string>();\r\n @Input() errorTemplate: TemplateRef<any>;\r\n @Input() otpProvider: string;\r\n @Input() mobileDescription: string;\r\n @Input() usernameDescription: string;\r\n @Input() usernameLabel: string;\r\n controller = new LoginMobileController(this);\r\n form: FormGroup;\r\n loading = signal(false);\r\n isValid = signal(false);\r\n\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n private fb = inject(FormBuilder);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.form = this.fb.group({\r\n mobile: [\r\n '',\r\n Validators.compose([Validators.required, Validators.maxLength(11), forbiddenValidator(mobile_regex)])\r\n ],\r\n username: ['', Validators.compose([])],\r\n updateOn: 'blur'\r\n });\r\n }\r\n get mobile(): any {\r\n return this.form.get('mobile');\r\n }\r\n get username(): any {\r\n return this.form.get('username');\r\n }\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n if (this.usernameLabel) {\r\n this.form.get('username')?.addValidators([Validators.required, Validators.minLength(2)]);\r\n }\r\n }\r\n codeSent(): void {\r\n this.otpSent.emit(this.form.value.mobile);\r\n }\r\n setLoading(loading: boolean): void {\r\n this.loading.set(loading);\r\n }\r\n\r\n canSend(isValid: boolean): void {\r\n this.isValid.set(isValid);\r\n }\r\n onSendCode(): void {\r\n this.controller.sendCode(this.otpProvider, this.form.value);\r\n }\r\n}\r\n","<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{ usernameLabel }}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{ usernameLabel }} ضروری است</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> شماره همراه </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">شماره همراه ضروری است</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'ارسال کد تایید'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, Input, signal, EventEmitter, Output } from '@angular/core';\r\nimport { BaseComponent } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-timer-countdown',\r\n templateUrl: './timer-countdown.component.html',\r\n styleUrl: './timer-countdown.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class TimerCountDownComponent extends BaseComponent {\r\n @Output() resend = new EventEmitter();\r\n @Input() minutes: number;\r\n @Input() loading: boolean;\r\n showResend = signal(false);\r\n minutesText = signal('');\r\n secondText = signal('');\r\n _interval: any;\r\n private _countDownDate: number;\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n\r\n this.startCountDown();\r\n }\r\n ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n if (this._interval) {\r\n clearInterval(this._interval);\r\n }\r\n }\r\n startCountDown(): void {\r\n const tcountDownDate: Date = new Date();\r\n const nmin = tcountDownDate.getMinutes();\r\n tcountDownDate.setMinutes(nmin + this.minutes);\r\n this._countDownDate = tcountDownDate.getTime();\r\n this.showResend.set(false);\r\n this._calc();\r\n this._interval = setInterval(() => {\r\n this._calc();\r\n }, 1000);\r\n }\r\n _calc(): void {\r\n const now = new Date().getTime();\r\n const distance: any = this._countDownDate - now;\r\n\r\n // Time calculations for days, hours, minutes and seconds\r\n // const _days = Math.floor(distance / (1000 * 60 * 60 * 24));\r\n // const _hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n\r\n // Display the result in the respective elements\r\n this.minutesText.set(\r\n minutes.toLocaleString('en-US', {\r\n minimumIntegerDigits: 2,\r\n useGrouping: false\r\n })\r\n );\r\n this.secondText.set(\r\n seconds.toLocaleString('en-US', {\r\n minimumIntegerDigits: 2,\r\n useGrouping: false\r\n })\r\n );\r\n\r\n // If the count down is over, write some text\r\n if (distance < 0) {\r\n clearInterval(this._interval);\r\n this._interval = null;\r\n this.showResend.set(true);\r\n }\r\n }\r\n}\r\n","@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'ارسال مجدد'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"auth-timer tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n NgZone,\r\n Output,\r\n QueryList,\r\n signal,\r\n TemplateRef,\r\n ViewChild,\r\n ViewChildren\r\n} from '@angular/core';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { getUniqueId, BarsaApi, ViewBase } from 'barsa-novin-ray-core';\r\n\r\nimport { ILoginVerificationView, LoginVerificationController } from '../controllers';\r\nimport { TimerCountDownComponent } from '../timer-countdown/timer-countdown.component';\r\n\r\n@Component({\r\n selector: 'ba-verification',\r\n templateUrl: './verification.component.html',\r\n styleUrl: './verification.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class VerificationComponent extends ViewBase<LoginVerificationController> implements ILoginVerificationView {\r\n @ViewChild(TimerCountDownComponent) _timerCountDown: TimerCountDownComponent;\r\n @ViewChildren('inputv') _inputsEl: QueryList<ElementRef>;\r\n @ViewChild('loadingBtn') _loadingBtn: TemplateRef<any>;\r\n @Output() otpVerified = new EventEmitter();\r\n @Output() changeMobile = new EventEmitter();\r\n @Input() mobile: string;\r\n @Input() otpProvider: string;\r\n @Input() errorTemplate: TemplateRef<any>;\r\n\r\n controller = new LoginVerificationController(this);\r\n form: FormGroup;\r\n capId = signal('-');\r\n resendLoading = signal(false);\r\n loading = signal(false);\r\n showCaptcha = signal(false);\r\n _ngZone = inject(NgZone);\r\n now = signal(getUniqueId(3));\r\n private fb = inject(FormBuilder);\r\n\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n\r\n constructor() {\r\n super();\r\n this.form = this.fb.group({\r\n in1: ['', Validators.compose([Validators.required, Validators.maxLength(6)])],\r\n cap: [''],\r\n capId: [this.capId(), Validators.required]\r\n });\r\n }\r\n get in1(): any {\r\n return this.form.get('in1');\r\n }\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n this.showCaptcha.set(true);\r\n }\r\n showError(message: string, code: number): void {\r\n super.showError(message, code);\r\n this.capId.set(BarsaApi.LoginFormData.CaptchaId);\r\n }\r\n codeVerified(): void {\r\n this.otpVerified.emit();\r\n }\r\n onRefreshCaptcha(): void {\r\n this.now.set(getUniqueId(3));\r\n }\r\n onVerifyCode(): void {\r\n this._verifyCode();\r\n }\r\n onResendOtp(): void {\r\n this.controller.resendCode(this.otpProvider);\r\n }\r\n _verifyCode(): void {\r\n const { in1, capId, cap } = this.form.value;\r\n this.controller.verifyCode(this.otpProvider, { code: `${in1}`, capId, cap });\r\n }\r\n setResetLoading(loading: boolean): void {\r\n this.resendLoading.set(loading);\r\n }\r\n setLoading(loading: boolean): void {\r\n this.loading.set(loading);\r\n }\r\n startCountDown(): void {\r\n this._timerCountDown.startCountDown();\r\n }\r\n get invArr(): ElementRef[] {\r\n return this._inputsEl.toArray();\r\n }\r\n\r\n get canVerify(): boolean {\r\n return this.controller.canVerify();\r\n }\r\n}\r\n","<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"auth-label tw-block tw-w-full tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n کد ارسال شده به شماره <strong>{{ mobile }}</strong> را وارد نمایید.\r\n </label>\r\n <a\r\n class=\"auth-link tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >ویرایش شماره همراه\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"auth-field tw-w-full\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\" class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\">\r\n <div *ngIf=\"in1.errors?.['required']\">کد تایید ضروری است</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'تایید کد'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n signal,\r\n TemplateRef,\r\n inject\r\n} from '@angular/core';\r\nimport { ILoginUserPassView, LoginUserPassController } from '../controllers';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { getUniqueId, ViewBase, validateAllFormFields } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-user-pass',\r\n templateUrl: './user-pass.component.html',\r\n styleUrl: './user-pass.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class UserPassComponent extends ViewBase<LoginUserPassController> implements ILoginUserPassView {\r\n @Output() loggedIn = new EventEmitter<void>();\r\n @Input() errorTemplate: TemplateRef<any>;\r\n @Input() otpProvider: string;\r\n\r\n controller = new LoginUserPassController(this);\r\n form: FormGroup;\r\n canLogin = signal(false);\r\n loading = signal(false);\r\n capId = signal(getUniqueId(4));\r\n now = signal(getUniqueId(3));\r\n showCaptcha = signal(false);\r\n\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n private fb = inject(FormBuilder);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.form = this.fb.group({\r\n username: ['', Validators.compose([Validators.required, Validators.minLength(1)])],\r\n password: ['', Validators.compose([Validators.required, Validators.minLength(1)])],\r\n cap: [''],\r\n capId: [this.capId(), Validators.required]\r\n });\r\n }\r\n get username(): any {\r\n return this.form.get('username');\r\n }\r\n get password(): any {\r\n return this.form.get('password');\r\n }\r\n get cap(): any {\r\n return this.form.get('cap');\r\n }\r\n userLoggedIn(): void {\r\n this.loggedIn.emit();\r\n }\r\n setLoading(loading: boolean): void {\r\n this.loading.set(loading);\r\n }\r\n setValid(isValid: boolean): void {\r\n this.canLogin.set(isValid);\r\n }\r\n showError(message: string, code: number): void {\r\n super.showError(message, code);\r\n setTimeout(() => {\r\n this.errorMessage.set('');\r\n this.errorCode.set(-1);\r\n }, 3000);\r\n }\r\n visibleCaptcha(visible: boolean): void {\r\n this.now.set(getUniqueId(3));\r\n this.showCaptcha.set(visible);\r\n this.cap.reset();\r\n }\r\n onRefreshCaptcha(): void {\r\n this.now.set(getUniqueId(3));\r\n }\r\n onSendCode(): void {\r\n validateAllFormFields(this.form);\r\n this.canLogin() && !this.loading() && this.controller.login(this.form.value);\r\n }\r\n}\r\n","<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\" (ngSubmit)=\"onSendCode()\">\r\n <button type=\"submit\" hidden tabindex=\"-1\" aria-hidden=\"true\"></button>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> نام کاربری </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">نام کاربری ضروری است.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> رمز عبور </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">رمز عبور ضروری است.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-flex tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> عبارت امنیتی </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\" />\r\n <button\r\n class=\"auth-captcha-refresh tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, OnInit, Output, signal } from '@angular/core';\r\nimport { PasskeyMode } from '../controllers';\r\nimport { PasskeyService } from '../services/passkey.service';\r\n\r\n@Component({\r\n selector: 'ba-passkey',\r\n templateUrl: './passkey.component.html',\r\n styleUrl: './passkey.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class PasskeyComponent implements OnInit {\n @Input() mode: PasskeyMode = 'login';\n @Input() autoStart = false;\n @Output() loggedIn = new EventEmitter<string>();\n @Output() registered = new EventEmitter<void>();\r\n @Output() skipped = new EventEmitter<void>();\r\n @Output() cancelled = new EventEmitter<void>();\r\n\r\n checkingSupport = signal(true);\r\n supported = signal(false);\r\n loading = signal(false);\r\n errorMessage = signal('');\r\n private readonly passkeyService = inject(PasskeyService);\r\n\r\n ngOnInit(): void {\r\n void this.checkSupport();\r\n }\r\n\r\n async onPrimaryAction(): Promise<void> {\r\n if (!this.supported() || this.loading()) {\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.errorMessage.set('');\r\n try {\r\n if (this.mode === 'enrollment') {\n await this.passkeyService.register();\n this.registered.emit();\n } else {\n const token2 = await this.passkeyService.authenticate();\n this.loggedIn.emit(token2);\n }\n } catch (error) {\n if (this.mode === 'enrollment' && this.passkeyService.isCredentialAlreadyRegistered(error)) {\n // excludeCredentials نشان می‌دهد Passkey روی authenticator جاری از قبل موجود است.\n this.registered.emit();\n return;\n }\n\n console.error('Passkey error:', error);\n\r\n if (error instanceof DOMException) {\r\n console.error('name:', error.name);\r\n console.error('message:', error.message);\r\n }\r\n\r\n this.errorMessage.set(this.passkeyService.getErrorMessage(error));\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\r\n\r\n onSkip(): void {\n if (this.loading()) {\n return;\n }\n\n this.skipped.emit();\n }\n\r\n private async checkSupport(): Promise<void> {\n const supported = await this.passkeyService.isPlatformAuthenticatorAvailable();\n this.supported.set(supported);\n this.checkingSupport.set(false);\n\n if (supported && this.mode === 'login' && this.autoStart) {\n await this.onPrimaryAction();\n }\n }\n}\n","<section class=\"passkey-panel tw-mt-2\" [attr.aria-busy]=\"loading()\">\r\n @if (mode === 'enrollment') {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">ورود سریع با همین دستگاه</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n با ثبت Passkey، دفعه‌ی بعد می‌توانید با اثر انگشت، تشخیص چهره یا PIN دستگاه وارد شوید. اطلاعات بیومتریک و PIN از\r\n دستگاه خارج نمی‌شوند.\r\n </p>\r\n } @else {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">ورود با دستگاه</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n از اثر انگشت، تشخیص چهره یا PIN همین دستگاه برای ورود استفاده کنید.\r\n </p>\r\n } @if (checkingSupport()) {\r\n <p class=\"passkey-description tw-text-sm tw-mb-4\">در حال بررسی قابلیت دستگاه...</p>\r\n } @else if (supported()) {\r\n <div class=\"tw-flex tw-items-center tw-mb-4\">\r\n <bnrc-button-loading\r\n [text]=\"mode === 'enrollment' ? 'فعال‌سازی ورود با دستگاه' : 'ورود با دستگاه'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading()\"\r\n (click)=\"onPrimaryAction()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n } @else {\r\n <p class=\"auth-error tw-p-3 tw-mb-4 tw-text-xs\" role=\"status\">\r\n احراز هویت داخلی روی این مرورگر یا دستگاه در دسترس نیست.\r\n </p>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-4 tw-items-center\">\r\n @if (mode === 'enrollment') {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"onSkip()\">فعلاً نه</button>\r\n } @else {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"cancelled.emit()\">\r\n بازگشت به روش‌های دیگر\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"auth-error tw-p-3 tw-mb-4 tw-mt-4 tw-text-xs\" role=\"alert\">\r\n <span class=\"tw-font-medium\">خطا!</span> {{ errorMessage() }}\r\n </div>\r\n }\r\n</section>\r\n","import {\r\n Component,\r\n input,\r\n WritableSignal,\r\n signal,\r\n inject,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { AuthViewState, LoginSettings } from '../controllers';\r\nimport { ApplicationCtrlrService, PortalService } from 'barsa-novin-ray-core';\r\nimport { PasskeyService } from '../services/passkey.service';\r\n\r\n@Component({\r\n selector: 'ba-auth',\r\n templateUrl: './barsa-auth.component.html',\r\n styleUrl: './barsa-auth.component.scss',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: false\r\n})\r\nexport class BarsaAuthComponent {\n @Output() verified = new EventEmitter<string | undefined>();\n appSettings = input.required<LoginSettings>();\r\n state: WritableSignal<AuthViewState> = signal('enter-mobile');\r\n mobile = signal('');\r\n loading = signal(false);\r\n passkeyAvailable = signal(false);\r\n _portalService = inject(PortalService);\r\n _applicationCtrlrService = inject(ApplicationCtrlrService);\r\n private readonly passkeyService = inject(PasskeyService);\r\n\r\n ngOnInit(): void {\r\n this.state.set(this.appSettings().DefaultState || 'enter-mobile');\r\n if (this.appSettings().PasskeyEnable) {\r\n void this.updatePasskeyAvailability();\r\n }\r\n }\r\n\r\n onChangeState(state: AuthViewState): void {\r\n this.state.set(state);\r\n }\r\n onChangeMobile(): void {\r\n this.state.set('enter-mobile');\r\n }\r\n onOtpSent(mobile: string): void {\r\n this.mobile.set(mobile);\r\n this.state.set('verification');\r\n }\r\n onLoggedIn(): void {\r\n void this.completeExistingLogin();\r\n }\r\n\r\n onPasskeyLoggedIn(token2: string): void {\n this.finishLogin(token2);\n }\r\n\r\n onEnrollmentFinished(): void {\r\n this.finishLogin();\r\n }\r\n\r\n private async updatePasskeyAvailability(): Promise<void> {\r\n this.passkeyAvailable.set(await this.passkeyService.isPlatformAuthenticatorAvailable());\r\n }\r\n\r\n private async completeExistingLogin(): Promise<void> {\r\n this.loading.set(true);\r\n if (\r\n this.appSettings().PasskeyEnable &&\r\n this.appSettings().PasskeyPromptOnFirstLogin &&\r\n (await this.passkeyService.isPlatformAuthenticatorAvailable())\r\n ) {\r\n try {\r\n const status = await this.passkeyService.getEnrollmentStatus();\n if (this.passkeyService.canOfferEnrollment(status)) {\n this.loading.set(false);\n this.state.set('passkey-enrollment');\n return;\n }\r\n } catch (e) {\n console.error('Error checking passkey enrollment status:', e);\r\n // Passkey اختیاری است؛ خطای status نباید ورود موفق را متوقف کند.\r\n }\r\n }\r\n this.finishLogin();\r\n }\r\n\r\n private finishLogin(token2?: string): void {\n this.loading.set(false);\n this.verified.emit(token2);\n }\n}\n","<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >ورود با نام کاربری\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n ورود با اثر انگشت، چهره یا PIN دستگاه\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >ورود با شماره همراه\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n ورود با اثر انگشت، چهره یا PIN دستگاه\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">ورود از طریق درگاه</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >ورود از طریق درگاه دولت من\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n signal,\r\n WritableSignal,\r\n OnInit,\r\n TemplateRef,\r\n ViewChild,\r\n inject\r\n} from '@angular/core';\r\nimport { LoginSettings } from '../controllers';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { PortalService } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-login',\r\n templateUrl: './login.component.html',\r\n styleUrl: './login.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class LoginComponent implements OnInit {\r\n @ViewChild('template', { static: true, read: TemplateRef }) _errorTemplate: TemplateRef<any>;\r\n settings: Settings;\r\n appSettings: WritableSignal<LoginSettings> = signal({\r\n Logo: null,\r\n HideGovSso: true,\r\n Section1Title: '',\r\n Section1Description: '',\r\n Subtitle: '',\r\n Title: '',\r\n UserPassEnable: false,\r\n UsernameLabel: '',\r\n LogoOnTop: false,\r\n DefaultState: 'enter-mobile',\r\n GovSSOHref: '',\r\n OtpProvider: '',\r\n LoginType: 1,\r\n MobileDescription: '',\r\n UsernameDescription: '',\r\n LoginFooter: '' \r\n });\r\n logoUrl = '';\r\n backgroundUrl = '';\r\n title = '';\r\n hideGovSso = false;\r\n private _activatedRoute = inject(ActivatedRoute);\r\n private _portalService = inject(PortalService);\r\n ngOnInit(): void {\r\n const resolverData = this._activatedRoute.snapshot.data;\r\n if (this.settings?.LoginSettingsValue) {\r\n this.appSettings.set(this.settings?.LoginSettingsValue);\r\n } else if (resolverData) {\r\n this.appSettings.set(resolverData.loginSettings);\r\n }\r\n }\r\n onVerified(token2?: string): void {\r\n if (token2) {\r\n const currentUrl = new URL(window.location.origin);\r\n currentUrl.searchParams.set('token2', token2);\r\n window.location.href = currentUrl.toString();\r\n return;\r\n }\r\n window.location.href = window.location.origin;\r\n }\r\n}\r\ninterface Settings {\r\n LoginSettingsValue: LoginSettings;\r\n}\r\n","@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"login-page tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"login-panel tw-w-full md:tw-w-4/12 tw-relative tw-shadow-sm\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- فرم ورود -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n\r\n <hr class=\"login-divider tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"auth-link tw-pt-2\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n رمز عبور را فراموش کرده ام\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"login-page tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"login-hero-overlay tw-flex tw-items-center tw-h-full tw-px-20\">\r\n <div>\r\n <h2 class=\"login-hero-title tw-text-4xl tw-font-bold\">\r\n {{ appSettings().Section1Title }}\r\n </h2>\r\n <p class=\"login-hero-description tw-max-w-xl tw-mt-3\">\r\n {{ appSettings().Section1Description }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"login-title tw-text-2xl tw-font-bold tw-text-center\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"login-subtitle tw-text-xl tw-mt-1\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import { NgModule, inject } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { BarsaNovinRayCoreModule, BaseModule, DynamicComponentService } from 'barsa-novin-ray-core';\r\nimport {\r\n BarsaAuthComponent,\r\n EnterMobileComponent,\r\n LoginComponent,\r\n TimerCountDownComponent,\r\n UserPassComponent,\r\n VerificationComponent,\r\n PasskeyComponent\r\n} from '../public-api';\r\n\r\nconst components = [\r\n BarsaAuthComponent,\r\n EnterMobileComponent,\r\n VerificationComponent,\r\n TimerCountDownComponent,\r\n UserPassComponent,\r\n LoginComponent,\r\n PasskeyComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: [...components],\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule],\r\n exports: [...components]\r\n})\r\nexport class BarsaAuthModule extends BaseModule {\r\n protected dynamicComponents = [...components];\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n constructor() {\r\n const dcm = inject(DynamicComponentService);\r\n super(dcm, 'BarsaAuthModule');\r\n this.dcm = dcm;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of barsa-auth\r\n */\r\n\r\nexport * from './lib/barsa-auth/barsa-auth.component';\r\nexport * from './lib/enter-mobile/enter-mobile.component';\r\nexport * from './lib/user-pass/user-pass.component';\r\nexport * from './lib/verification/verification.component';\r\nexport * from './lib/timer-countdown/timer-countdown.component';\r\nexport * from './lib/login/login.component';\r\nexport * from './lib/passkey/passkey.component';\r\nexport * from './lib/services/passkey.service';\r\nexport * from './lib/controllers';\r\n\r\nexport * from './lib/barsa-auth.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i4.TimerCountDownComponent","i2","i3.EnterMobileComponent","i4.VerificationComponent","i5.UserPassComponent","i6.PasskeyComponent","i2.BarsaAuthComponent"],"mappings":"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"}
1
+ {"version":3,"file":"barsa-auth.mjs","sources":["../../../projects/barsa-auth/src/lib/services/passkey-codec.ts","../../../projects/barsa-auth/src/lib/services/passkey.service.ts","../../../projects/barsa-auth/src/lib/barsa-auth/social-connections.ts","../../../projects/barsa-auth/src/lib/controllers/login-mobile-controller.ts","../../../projects/barsa-auth/src/lib/controllers/login-userpass-controller.ts","../../../projects/barsa-auth/src/lib/controllers/login-verification-controller.ts","../../../projects/barsa-auth/src/lib/enter-mobile/enter-mobile.component.ts","../../../projects/barsa-auth/src/lib/enter-mobile/enter-mobile.component.html","../../../projects/barsa-auth/src/lib/timer-countdown/timer-countdown.component.ts","../../../projects/barsa-auth/src/lib/timer-countdown/timer-countdown.component.html","../../../projects/barsa-auth/src/lib/verification/verification.component.ts","../../../projects/barsa-auth/src/lib/verification/verification.component.html","../../../projects/barsa-auth/src/lib/user-pass/user-pass.component.ts","../../../projects/barsa-auth/src/lib/user-pass/user-pass.component.html","../../../projects/barsa-auth/src/lib/passkey/passkey.component.ts","../../../projects/barsa-auth/src/lib/passkey/passkey.component.html","../../../projects/barsa-auth/src/lib/barsa-auth/barsa-auth.component.ts","../../../projects/barsa-auth/src/lib/barsa-auth/barsa-auth.component.html","../../../projects/barsa-auth/src/lib/login/login.component.ts","../../../projects/barsa-auth/src/lib/login/login.component.html","../../../projects/barsa-auth/src/lib/barsa-auth.module.ts","../../../projects/barsa-auth/src/public-api.ts","../../../projects/barsa-auth/src/barsa-auth.ts"],"sourcesContent":["export function decodeBase64Url(value: string): ArrayBuffer {\r\n const padding = '='.repeat((4 - (value.length % 4)) % 4);\r\n const binary = globalThis.atob(value.replace(/-/g, '+').replace(/_/g, '/') + padding);\r\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\r\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\r\n}\r\n\r\nexport function encodeBase64Url(value: ArrayBuffer): string {\r\n const bytes = new Uint8Array(value);\r\n let binary = '';\r\n for (const byte of bytes) {\r\n binary += String.fromCharCode(byte);\r\n }\r\n return globalThis.btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport {\r\n PasskeyAuthenticationCredentialJson,\r\n PasskeyAuthenticationOptionsJson,\r\n PasskeyAuthenticationVerifyResponse,\r\n PasskeyCeremonyOptions,\r\n PasskeyCredentialDescriptorJson,\r\n PasskeyEnrollmentStatus,\r\n PasskeyRegistrationCredentialJson,\r\n PasskeyRegistrationOptionsJson,\r\n PasskeyRegistrationVerifyResponse\r\n} from '../controllers/models';\r\nimport { decodeBase64Url, encodeBase64Url } from './passkey-codec';\r\nimport { getUniqueId } from 'barsa-novin-ray-core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PasskeyService {\r\n private readonly httpClient = inject(HttpClient);\r\n private platformAvailability?: Promise<boolean>;\r\n\r\n isPlatformAuthenticatorAvailable(): Promise<boolean> {\r\n if (!this.platformAvailability) {\r\n this.platformAvailability = this.detectPlatformAuthenticator();\r\n }\r\n return this.platformAvailability;\r\n }\r\n\r\n getEnrollmentStatus(): Promise<PasskeyEnrollmentStatus> {\n return firstValueFrom(\n this.httpClient.get<PasskeyEnrollmentStatus | string>('/api2/PassKey/0.1/status?v=' + getUniqueId(4))\n ).then((response) => this.parseJsonResponse<PasskeyEnrollmentStatus>(response));\n }\n\n canOfferEnrollment(status: PasskeyEnrollmentStatus): boolean {\n return status.canCreatePasskey ?? status.shouldOfferEnrollment;\n }\n\n isCredentialAlreadyRegistered(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'InvalidStateError'\n );\n }\n\r\n async register(): Promise<PasskeyRegistrationVerifyResponse> {\r\n const ceremonyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyCeremonyOptions<PasskeyRegistrationOptionsJson> | string>(\r\n '/api2/PassKey/0.1/registrationoptions',\r\n {}\r\n )\r\n );\r\n const ceremony =\r\n this.parseJsonResponse<PasskeyCeremonyOptions<PasskeyRegistrationOptionsJson>>(ceremonyResponse);\r\n const publicKey = this.toCreationOptions(ceremony.publicKey);\r\n const credential = (await navigator.credentials.create({ publicKey })) as PublicKeyCredential | null;\r\n\r\n if (!credential || !('attestationObject' in credential.response)) {\r\n throw new Error('PASSKEY_REGISTRATION_EMPTY');\r\n }\r\n\r\n const verifyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyRegistrationVerifyResponse | string>('/api2/PassKey/0.1/registrationverify', {\r\n ceremonyId: ceremony.ceremonyId,\r\n credential: this.serializeRegistrationCredential(credential)\r\n })\r\n );\r\n const response = this.parseJsonResponse<PasskeyRegistrationVerifyResponse>(verifyResponse);\r\n\r\n if (!response.verified) {\r\n throw new Error('PASSKEY_REGISTRATION_REJECTED');\r\n }\r\n return response;\r\n }\r\n\r\n async authenticate(): Promise<string> {\r\n const ceremonyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyCeremonyOptions<PasskeyAuthenticationOptionsJson> | string>(\r\n '/api2/PassKey/0.1/authenticationoptions',\r\n {}\r\n )\r\n );\r\n const ceremony =\r\n this.parseJsonResponse<PasskeyCeremonyOptions<PasskeyAuthenticationOptionsJson>>(ceremonyResponse);\r\n const publicKey = this.toRequestOptions(ceremony.publicKey);\r\n const credential = (await navigator.credentials.get({ publicKey })) as PublicKeyCredential | null;\r\n\r\n if (!credential || !('signature' in credential.response)) {\r\n throw new Error('PASSKEY_AUTHENTICATION_EMPTY');\r\n }\r\n\r\n const verifyResponse = await firstValueFrom(\r\n this.httpClient.post<PasskeyAuthenticationVerifyResponse | string>(\r\n '/api2/PassKey/0.1/authenticationverify',\r\n {\r\n ceremonyId: ceremony.ceremonyId,\r\n credential: this.serializeAuthenticationCredential(credential)\r\n }\r\n )\r\n );\r\n const response = this.parseJsonResponse<PasskeyAuthenticationVerifyResponse>(verifyResponse);\r\n\r\n if (!response.verified || !response.token2?.trim()) {\r\n throw new Error('PASSKEY_AUTHENTICATION_REJECTED');\r\n }\r\n return response.token2;\r\n }\r\n\r\n getErrorMessage(error: unknown): string {\n if (error instanceof DOMException) {\r\n if (error.name === 'NotAllowedError') {\r\n return 'عملیات لغو شد یا Passkey معتبری روی این دستگاه پیدا نشد.';\r\n }\r\n if (error.name === 'InvalidStateError') {\r\n return 'Passkey این دستگاه قبلاً برای حساب شما ثبت شده است.';\r\n }\r\n if (error.name === 'SecurityError') {\r\n return 'تنظیمات دامنه یا ارتباط امن برای ورود با دستگاه معتبر نیست.';\r\n }\r\n }\r\n if (error instanceof HttpErrorResponse) {\r\n const serverMessage = error.error?.Message || error.error?.message || error.error?.error?.userMessage;\r\n if (typeof serverMessage === 'string' && serverMessage) {\r\n return serverMessage;\r\n }\r\n }\r\n return 'انجام احراز هویت دستگاه ممکن نشد. می‌توانید از روش دیگری وارد شوید.';\r\n }\r\n\r\n private async detectPlatformAuthenticator(): Promise<boolean> {\r\n if (\r\n typeof window === 'undefined' ||\r\n !window.isSecureContext ||\r\n typeof PublicKeyCredential === 'undefined' ||\r\n typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function'\r\n ) {\r\n return false;\r\n }\r\n try {\r\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private parseJsonResponse<T>(response: T | string): T {\r\n let value: unknown = response;\r\n\r\n for (let depth = 0; depth < 2 && typeof value === 'string'; depth++) {\r\n value = JSON.parse(value);\r\n }\r\n\r\n return value as T;\r\n }\r\n\r\n private toCreationOptions(options: PasskeyRegistrationOptionsJson): PublicKeyCredentialCreationOptions {\r\n return {\r\n ...options,\r\n challenge: decodeBase64Url(options.challenge),\r\n user: {\r\n ...options.user,\r\n id: decodeBase64Url(options.user.id)\r\n },\r\n excludeCredentials: this.toCredentialDescriptors(options.excludeCredentials),\r\n authenticatorSelection: {\r\n ...options.authenticatorSelection,\r\n authenticatorAttachment: 'platform',\r\n residentKey: 'required',\r\n requireResidentKey: true,\r\n userVerification: 'required'\r\n },\r\n attestation: 'none',\r\n hints: ['client-device']\r\n } as PublicKeyCredentialCreationOptions;\r\n }\r\n\r\n private toRequestOptions(options: PasskeyAuthenticationOptionsJson): PublicKeyCredentialRequestOptions {\r\n return {\r\n ...options,\r\n challenge: decodeBase64Url(options.challenge),\r\n allowCredentials: this.toCredentialDescriptors(options.allowCredentials),\r\n userVerification: 'required',\r\n hints: ['client-device']\r\n } as PublicKeyCredentialRequestOptions;\r\n }\r\n\r\n private toCredentialDescriptors(\r\n descriptors: PasskeyCredentialDescriptorJson[] | undefined\r\n ): PublicKeyCredentialDescriptor[] | undefined {\r\n return descriptors?.map((descriptor) => ({\r\n ...descriptor,\r\n id: decodeBase64Url(descriptor.id),\r\n transports: descriptor.transports as AuthenticatorTransport[] | undefined\r\n }));\r\n }\r\n\r\n private serializeRegistrationCredential(credential: PublicKeyCredential): PasskeyRegistrationCredentialJson {\r\n const response = credential.response as AuthenticatorAttestationResponse & {\r\n getTransports?: () => string[];\r\n };\r\n return {\r\n id: credential.id,\r\n rawId: encodeBase64Url(credential.rawId),\r\n type: 'public-key',\r\n authenticatorAttachment: this.getAuthenticatorAttachment(credential),\r\n clientExtensionResults: credential.getClientExtensionResults(),\r\n response: {\r\n clientDataJSON: encodeBase64Url(response.clientDataJSON),\r\n attestationObject: encodeBase64Url(response.attestationObject),\r\n transports: response.getTransports?.() || []\r\n }\r\n };\r\n }\r\n\r\n private serializeAuthenticationCredential(credential: PublicKeyCredential): PasskeyAuthenticationCredentialJson {\r\n const response = credential.response as AuthenticatorAssertionResponse;\r\n return {\r\n id: credential.id,\r\n rawId: encodeBase64Url(credential.rawId),\r\n type: 'public-key',\r\n authenticatorAttachment: this.getAuthenticatorAttachment(credential),\r\n clientExtensionResults: credential.getClientExtensionResults(),\r\n response: {\r\n clientDataJSON: encodeBase64Url(response.clientDataJSON),\r\n authenticatorData: encodeBase64Url(response.authenticatorData),\r\n signature: encodeBase64Url(response.signature),\r\n userHandle: response.userHandle ? encodeBase64Url(response.userHandle) : null\r\n }\r\n };\r\n }\r\n\r\n private getAuthenticatorAttachment(credential: PublicKeyCredential): string | null {\r\n return (\r\n (credential as PublicKeyCredential & { authenticatorAttachment?: string | null }).authenticatorAttachment ??\r\n null\r\n );\r\n }\r\n}\r\n","import { FilePictureInfoModel } from 'barsa-novin-ray-core';\r\nimport { SocialConnectionReport } from '../controllers';\r\n\r\nexport const SOCIAL_SIGNIN_PATH = '/api/openId/signin';\r\n\r\nexport interface SocialConnectionButton {\r\n /** شناسه‌ی آیتم، برای track */\r\n id: string;\r\n /** Title؛ اگر خالی بود providerName */\r\n title: string;\r\n /** SocialConnectionProvider.$Caption (فرض A1: همان Name ِ provider در سرور) */\r\n providerName: string;\r\n href: string;\r\n /** null اگر FileId نبود یا IsDeleted بود */\r\n logo: FilePictureInfoModel | null;\r\n}\r\n\r\nexport function buildSocialSignInHref(providerName: string, origin: string): string {\r\n return `${SOCIAL_SIGNIN_PATH}?provider=${encodeURIComponent(providerName)}&returnUrl=${encodeURIComponent(origin)}`;\r\n}\r\n\r\nexport function toSocialConnectionButtons(\r\n report: SocialConnectionReport | null | undefined,\r\n origin: string\r\n): SocialConnectionButton[] {\r\n const list = report?.MoDataList;\r\n if (!Array.isArray(list)) {\r\n return [];\r\n }\r\n const result: SocialConnectionButton[] = [];\r\n for (const item of list) {\r\n const providerName = item?.SocialConnectionProvider?.$Caption?.trim();\r\n if (!providerName) {\r\n continue;\r\n }\r\n const logo = item.A_SocialConnectionProvider_Logo;\r\n result.push({\r\n id: item.Id,\r\n title: item.Title?.trim() || providerName,\r\n providerName,\r\n href: buildSocialSignInHref(providerName, origin),\r\n logo: logo?.FileId && !logo.IsDeleted ? logo : null\r\n });\r\n }\r\n return result;\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, finalize, throwError } from 'rxjs';\r\n\r\nimport { BaseController, IViewBase } from 'barsa-novin-ray-core';\r\n\r\nexport class LoginMobileController extends BaseController<ILoginMobileView> {\r\n private _httpClient: HttpClient;\r\n /**\r\n *\r\n */\r\n\r\n constructor(view: ILoginMobileView) {\r\n super(view);\r\n this._httpClient = view.injector.get(HttpClient);\r\n }\r\n get form(): FormGroup {\r\n return this.view.form;\r\n }\r\n sendCode(otpProvider: string, e): void {\r\n const { mobile, username } = e;\r\n this.form.valid && this.view.setLoading(true);\r\n this.view.showError('', -1);\r\n // const x = (): void => {\r\n // this.loading.set(false);\r\n // };\r\n const usernamequery = username ? `&username=${username}` : '';\r\n this._httpClient\r\n .get<{ otpId: string }>(`/api/openid/signin?provider=${otpProvider}&mobile=${mobile}${usernamequery}`)\r\n .pipe(\r\n finalize(() => {\r\n this.view.setLoading(false);\r\n }),\r\n catchError((err) => {\r\n if (typeof err === 'object' && err.status === 403) {\r\n this.view.showError(err.error.Message, err.error.Code);\r\n }\r\n return throwError(() => new Error(err));\r\n })\r\n )\r\n .subscribe((c) => {\r\n if (c?.otpId) {\r\n localStorage.setItem('otpId', c.otpId);\r\n this.view.codeSent();\r\n } else {\r\n const res = c as any;\r\n if (!res.succeed) {\r\n this.view.showError(res.error.userMessage, res.type);\r\n }\r\n // debugger;\r\n }\r\n });\r\n }\r\n init(): void {\r\n this.form.valueChanges.subscribe((_c) =>\r\n this.form.valid ? this.view.canSend(true) : this.view.canSend(false)\r\n );\r\n }\r\n}\r\n\r\nexport interface ILoginMobileView extends IViewBase {\r\n showError(message: any, code: any): void;\r\n form: FormGroup;\r\n codeSent: () => void;\r\n setLoading: (loading: boolean) => void;\r\n canSend: (loading: boolean) => void;\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { BarsaApi, BaseController, IViewBase } from 'barsa-novin-ray-core';\r\n\r\nexport class LoginUserPassController extends BaseController<ILoginUserPassView> {\r\n get form(): FormGroup {\r\n return this.view.form;\r\n }\r\n login(e: any): void {\r\n const { username, password, cap, capId } = e;\r\n this.view.setLoading(true);\r\n this.view.showError('', -1);\r\n const data = {\r\n un: username,\r\n pwd: password,\r\n cap,\r\n capId\r\n };\r\n BarsaApi.Bw.Login(data, {\r\n onSuccess: () => {\r\n this.view.userLoggedIn();\r\n },\r\n onError: (response2) => {\r\n this.view.setLoading(false);\r\n const response = response2.Data.ResponseData;\r\n let error = response.error;\r\n if (!error) {\r\n error = response;\r\n }\r\n const data = response.data;\r\n this.view.showError(error.userMessage, -1);\r\n if (data.showCaptcha) {\r\n this.view.visibleCaptcha(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n init(): void {\r\n this.form.valueChanges.subscribe((_c) => this.view.setValid(this.form.valid));\r\n if (BarsaApi.LoginFormData.ShowCaptcha === 'Show') {\r\n this.view.visibleCaptcha(true);\r\n }\r\n }\r\n}\r\n\r\nexport interface ILoginUserPassView extends IViewBase {\r\n form: FormGroup;\r\n showError(message: any, code: any): void;\r\n visibleCaptcha: (visible: boolean) => void;\r\n setLoading: (loading: boolean) => void;\r\n setValid: (isValid: boolean) => void;\r\n userLoggedIn: () => void;\r\n}\r\n","import { signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, finalize, throwError } from 'rxjs';\r\n\r\nimport { BaseController, IViewBase, BarsaApi } from 'barsa-novin-ray-core';\r\n\r\nexport class LoginVerificationController extends BaseController<ILoginVerificationView> {\r\n canVerify = signal(false);\r\n _httpClient: HttpClient;\r\n\r\n constructor(view: ILoginVerificationView) {\r\n super(view);\r\n this._httpClient = view.injector.get(HttpClient);\r\n }\r\n\r\n get form(): FormGroup {\r\n return this.view.form;\r\n }\r\n resendCode(otpProvider: string): void {\r\n this.view.setResetLoading(true);\r\n this._httpClient\r\n .get<{ otpId: string }>(`/api/openid/signin?provider=${otpProvider}&otpId=${localStorage.getItem('otpId')}`)\r\n .pipe(\r\n finalize(() => {}),\r\n catchError((err) => {\r\n this.view.setResetLoading(false);\r\n if (typeof err === 'object' && err.status === 403) {\r\n this.view.showError(err.error.Message, err.error.Code);\r\n }\r\n return throwError(() => new Error(err));\r\n })\r\n )\r\n .subscribe((_c) => {\r\n this.view.setResetLoading(false);\r\n this.view.startCountDown();\r\n });\r\n }\r\n verifyCode(otpProvider: string, e): void {\r\n this.view.setLoading(true);\r\n const { code, cap, capId } = e;\r\n\r\n this._httpClient\r\n .post<{ Sth: string }>(`/api/openid/callback?provider=${otpProvider}`, {\r\n otpId: localStorage.getItem('otpId'),\r\n otpCode: code,\r\n captchaCode: cap,\r\n capId\r\n })\r\n .pipe(\r\n finalize(() => {\r\n this.view.setLoading(false);\r\n }),\r\n catchError((err) => {\r\n if (typeof err === 'object' && err.status === 403) {\r\n this.view.showError(err.error.Message, err.error.Code);\r\n }\r\n return throwError(() => new Error(err));\r\n })\r\n )\r\n .subscribe((c) => {\r\n if (c?.Sth) {\r\n localStorage.removeItem('otpId');\r\n window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, c.Sth);\r\n this.view.codeVerified();\r\n } else {\r\n const res = c as any;\r\n if (!res.succeed) {\r\n this.view.showError(res.error.userMessage, res.type);\r\n }\r\n }\r\n });\r\n }\r\n init(): void {\r\n this.form.valueChanges.subscribe((_c) =>\r\n this.form.valid ? this.canVerify.set(true) : this.canVerify.set(false)\r\n );\r\n }\r\n}\r\nexport interface ILoginVerificationView extends IViewBase {\r\n form: FormGroup;\r\n codeVerified: () => void;\r\n startCountDown: () => void;\r\n setResetLoading: (loading: boolean) => void;\r\n setLoading: (loading: boolean) => void;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n signal,\r\n inject\r\n} from '@angular/core';\r\nimport { ILoginMobileView, LoginMobileController } from '../controllers';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { forbiddenValidator, mobile_regex, ViewBase } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-enter-mobile',\r\n templateUrl: './enter-mobile.component.html',\r\n styleUrl: './enter-mobile.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class EnterMobileComponent extends ViewBase<LoginMobileController> implements ILoginMobileView {\r\n @Output() otpSent = new EventEmitter<string>();\r\n @Input() errorTemplate: TemplateRef<any>;\r\n @Input() otpProvider: string;\r\n @Input() mobileDescription: string;\r\n @Input() usernameDescription: string;\r\n @Input() usernameLabel: string;\r\n controller = new LoginMobileController(this);\r\n form: FormGroup;\r\n loading = signal(false);\r\n isValid = signal(false);\r\n\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n private fb = inject(FormBuilder);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.form = this.fb.group({\r\n mobile: [\r\n '',\r\n Validators.compose([Validators.required, Validators.maxLength(11), forbiddenValidator(mobile_regex)])\r\n ],\r\n username: ['', Validators.compose([])],\r\n updateOn: 'blur'\r\n });\r\n }\r\n get mobile(): any {\r\n return this.form.get('mobile');\r\n }\r\n get username(): any {\r\n return this.form.get('username');\r\n }\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n if (this.usernameLabel) {\r\n this.form.get('username')?.addValidators([Validators.required, Validators.minLength(2)]);\r\n }\r\n }\r\n codeSent(): void {\r\n this.otpSent.emit(this.form.value.mobile);\r\n }\r\n setLoading(loading: boolean): void {\r\n this.loading.set(loading);\r\n }\r\n\r\n canSend(isValid: boolean): void {\r\n this.isValid.set(isValid);\r\n }\r\n onSendCode(): void {\r\n this.controller.sendCode(this.otpProvider, this.form.value);\r\n }\r\n}\r\n","<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{ usernameLabel }}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{ usernameLabel }} ضروری است</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> شماره همراه </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">شماره همراه ضروری است</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'ارسال کد تایید'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, Input, signal, EventEmitter, Output } from '@angular/core';\r\nimport { BaseComponent } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-timer-countdown',\r\n templateUrl: './timer-countdown.component.html',\r\n styleUrl: './timer-countdown.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class TimerCountDownComponent extends BaseComponent {\r\n @Output() resend = new EventEmitter();\r\n @Input() minutes: number;\r\n @Input() loading: boolean;\r\n showResend = signal(false);\r\n minutesText = signal('');\r\n secondText = signal('');\r\n _interval: any;\r\n private _countDownDate: number;\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n\r\n this.startCountDown();\r\n }\r\n ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n if (this._interval) {\r\n clearInterval(this._interval);\r\n }\r\n }\r\n startCountDown(): void {\r\n const tcountDownDate: Date = new Date();\r\n const nmin = tcountDownDate.getMinutes();\r\n tcountDownDate.setMinutes(nmin + this.minutes);\r\n this._countDownDate = tcountDownDate.getTime();\r\n this.showResend.set(false);\r\n this._calc();\r\n this._interval = setInterval(() => {\r\n this._calc();\r\n }, 1000);\r\n }\r\n _calc(): void {\r\n const now = new Date().getTime();\r\n const distance: any = this._countDownDate - now;\r\n\r\n // Time calculations for days, hours, minutes and seconds\r\n // const _days = Math.floor(distance / (1000 * 60 * 60 * 24));\r\n // const _hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n\r\n // Display the result in the respective elements\r\n this.minutesText.set(\r\n minutes.toLocaleString('en-US', {\r\n minimumIntegerDigits: 2,\r\n useGrouping: false\r\n })\r\n );\r\n this.secondText.set(\r\n seconds.toLocaleString('en-US', {\r\n minimumIntegerDigits: 2,\r\n useGrouping: false\r\n })\r\n );\r\n\r\n // If the count down is over, write some text\r\n if (distance < 0) {\r\n clearInterval(this._interval);\r\n this._interval = null;\r\n this.showResend.set(true);\r\n }\r\n }\r\n}\r\n","@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'ارسال مجدد'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"auth-timer tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n NgZone,\r\n Output,\r\n QueryList,\r\n signal,\r\n TemplateRef,\r\n ViewChild,\r\n ViewChildren\r\n} from '@angular/core';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { getUniqueId, BarsaApi, ViewBase } from 'barsa-novin-ray-core';\r\n\r\nimport { ILoginVerificationView, LoginVerificationController } from '../controllers';\r\nimport { TimerCountDownComponent } from '../timer-countdown/timer-countdown.component';\r\n\r\n@Component({\r\n selector: 'ba-verification',\r\n templateUrl: './verification.component.html',\r\n styleUrl: './verification.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class VerificationComponent extends ViewBase<LoginVerificationController> implements ILoginVerificationView {\r\n @ViewChild(TimerCountDownComponent) _timerCountDown: TimerCountDownComponent;\r\n @ViewChildren('inputv') _inputsEl: QueryList<ElementRef>;\r\n @ViewChild('loadingBtn') _loadingBtn: TemplateRef<any>;\r\n @Output() otpVerified = new EventEmitter();\r\n @Output() changeMobile = new EventEmitter();\r\n @Input() mobile: string;\r\n @Input() otpProvider: string;\r\n @Input() errorTemplate: TemplateRef<any>;\r\n\r\n controller = new LoginVerificationController(this);\r\n form: FormGroup;\r\n capId = signal('-');\r\n resendLoading = signal(false);\r\n loading = signal(false);\r\n showCaptcha = signal(false);\r\n _ngZone = inject(NgZone);\r\n now = signal(getUniqueId(3));\r\n private fb = inject(FormBuilder);\r\n\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n\r\n constructor() {\r\n super();\r\n this.form = this.fb.group({\r\n in1: ['', Validators.compose([Validators.required, Validators.maxLength(6)])],\r\n cap: [''],\r\n capId: [this.capId(), Validators.required]\r\n });\r\n }\r\n get in1(): any {\r\n return this.form.get('in1');\r\n }\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n this.showCaptcha.set(true);\r\n }\r\n showError(message: string, code: number): void {\r\n super.showError(message, code);\r\n this.capId.set(BarsaApi.LoginFormData.CaptchaId);\r\n }\r\n codeVerified(): void {\r\n this.otpVerified.emit();\r\n }\r\n onRefreshCaptcha(): void {\r\n this.now.set(getUniqueId(3));\r\n }\r\n onVerifyCode(): void {\r\n this._verifyCode();\r\n }\r\n onResendOtp(): void {\r\n this.controller.resendCode(this.otpProvider);\r\n }\r\n _verifyCode(): void {\r\n const { in1, capId, cap } = this.form.value;\r\n this.controller.verifyCode(this.otpProvider, { code: `${in1}`, capId, cap });\r\n }\r\n setResetLoading(loading: boolean): void {\r\n this.resendLoading.set(loading);\r\n }\r\n setLoading(loading: boolean): void {\r\n this.loading.set(loading);\r\n }\r\n startCountDown(): void {\r\n this._timerCountDown.startCountDown();\r\n }\r\n get invArr(): ElementRef[] {\r\n return this._inputsEl.toArray();\r\n }\r\n\r\n get canVerify(): boolean {\r\n return this.controller.canVerify();\r\n }\r\n}\r\n","<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"auth-label tw-block tw-w-full tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n کد ارسال شده به شماره <strong>{{ mobile }}</strong> را وارد نمایید.\r\n </label>\r\n <a\r\n class=\"auth-link tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >ویرایش شماره همراه\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"auth-field tw-w-full\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\" class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\">\r\n <div *ngIf=\"in1.errors?.['required']\">کد تایید ضروری است</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'تایید کد'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n signal,\r\n TemplateRef,\r\n inject\r\n} from '@angular/core';\r\nimport { ILoginUserPassView, LoginUserPassController } from '../controllers';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { getUniqueId, ViewBase, validateAllFormFields } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-user-pass',\r\n templateUrl: './user-pass.component.html',\r\n styleUrl: './user-pass.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class UserPassComponent extends ViewBase<LoginUserPassController> implements ILoginUserPassView {\r\n @Output() loggedIn = new EventEmitter<void>();\r\n @Input() errorTemplate: TemplateRef<any>;\r\n @Input() otpProvider: string;\r\n\r\n controller = new LoginUserPassController(this);\r\n form: FormGroup;\r\n canLogin = signal(false);\r\n loading = signal(false);\r\n capId = signal(getUniqueId(4));\r\n now = signal(getUniqueId(3));\r\n showCaptcha = signal(false);\r\n\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n private fb = inject(FormBuilder);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.form = this.fb.group({\r\n username: ['', Validators.compose([Validators.required, Validators.minLength(1)])],\r\n password: ['', Validators.compose([Validators.required, Validators.minLength(1)])],\r\n cap: [''],\r\n capId: [this.capId(), Validators.required]\r\n });\r\n }\r\n get username(): any {\r\n return this.form.get('username');\r\n }\r\n get password(): any {\r\n return this.form.get('password');\r\n }\r\n get cap(): any {\r\n return this.form.get('cap');\r\n }\r\n userLoggedIn(): void {\r\n this.loggedIn.emit();\r\n }\r\n setLoading(loading: boolean): void {\r\n this.loading.set(loading);\r\n }\r\n setValid(isValid: boolean): void {\r\n this.canLogin.set(isValid);\r\n }\r\n showError(message: string, code: number): void {\r\n super.showError(message, code);\r\n setTimeout(() => {\r\n this.errorMessage.set('');\r\n this.errorCode.set(-1);\r\n }, 3000);\r\n }\r\n visibleCaptcha(visible: boolean): void {\r\n this.now.set(getUniqueId(3));\r\n this.showCaptcha.set(visible);\r\n this.cap.reset();\r\n }\r\n onRefreshCaptcha(): void {\r\n this.now.set(getUniqueId(3));\r\n }\r\n onSendCode(): void {\r\n validateAllFormFields(this.form);\r\n this.canLogin() && !this.loading() && this.controller.login(this.form.value);\r\n }\r\n}\r\n","<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\" (ngSubmit)=\"onSendCode()\">\r\n <button type=\"submit\" hidden tabindex=\"-1\" aria-hidden=\"true\"></button>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> نام کاربری </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">نام کاربری ضروری است.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> رمز عبور </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">رمز عبور ضروری است.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-flex tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> عبارت امنیتی </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\" />\r\n <button\r\n class=\"auth-captcha-refresh tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, OnInit, Output, signal } from '@angular/core';\r\nimport { PasskeyMode } from '../controllers';\r\nimport { PasskeyService } from '../services/passkey.service';\r\n\r\n@Component({\r\n selector: 'ba-passkey',\r\n templateUrl: './passkey.component.html',\r\n styleUrl: './passkey.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class PasskeyComponent implements OnInit {\n @Input() mode: PasskeyMode = 'login';\n @Input() autoStart = false;\n @Output() loggedIn = new EventEmitter<string>();\n @Output() registered = new EventEmitter<void>();\r\n @Output() skipped = new EventEmitter<void>();\r\n @Output() cancelled = new EventEmitter<void>();\r\n\r\n checkingSupport = signal(true);\r\n supported = signal(false);\r\n loading = signal(false);\r\n errorMessage = signal('');\r\n private readonly passkeyService = inject(PasskeyService);\r\n\r\n ngOnInit(): void {\r\n void this.checkSupport();\r\n }\r\n\r\n async onPrimaryAction(): Promise<void> {\r\n if (!this.supported() || this.loading()) {\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.errorMessage.set('');\r\n try {\r\n if (this.mode === 'enrollment') {\n await this.passkeyService.register();\n this.registered.emit();\n } else {\n const token2 = await this.passkeyService.authenticate();\n this.loggedIn.emit(token2);\n }\n } catch (error) {\n if (this.mode === 'enrollment' && this.passkeyService.isCredentialAlreadyRegistered(error)) {\n // excludeCredentials نشان می‌دهد Passkey روی authenticator جاری از قبل موجود است.\n this.registered.emit();\n return;\n }\n\n console.error('Passkey error:', error);\n\r\n if (error instanceof DOMException) {\r\n console.error('name:', error.name);\r\n console.error('message:', error.message);\r\n }\r\n\r\n this.errorMessage.set(this.passkeyService.getErrorMessage(error));\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\r\n\r\n onSkip(): void {\n if (this.loading()) {\n return;\n }\n\n this.skipped.emit();\n }\n\r\n private async checkSupport(): Promise<void> {\n const supported = await this.passkeyService.isPlatformAuthenticatorAvailable();\n this.supported.set(supported);\n this.checkingSupport.set(false);\n\n if (supported && this.mode === 'login' && this.autoStart) {\n await this.onPrimaryAction();\n }\n }\n}\n","<section class=\"passkey-panel tw-mt-2\" [attr.aria-busy]=\"loading()\">\r\n @if (mode === 'enrollment') {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">ورود سریع با همین دستگاه</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n با ثبت Passkey، دفعه‌ی بعد می‌توانید با اثر انگشت، تشخیص چهره یا PIN دستگاه وارد شوید. اطلاعات بیومتریک و PIN از\r\n دستگاه خارج نمی‌شوند.\r\n </p>\r\n } @else {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">ورود با دستگاه</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n از اثر انگشت، تشخیص چهره یا PIN همین دستگاه برای ورود استفاده کنید.\r\n </p>\r\n } @if (checkingSupport()) {\r\n <p class=\"passkey-description tw-text-sm tw-mb-4\">در حال بررسی قابلیت دستگاه...</p>\r\n } @else if (supported()) {\r\n <div class=\"tw-flex tw-items-center tw-mb-4\">\r\n <bnrc-button-loading\r\n [text]=\"mode === 'enrollment' ? 'فعال‌سازی ورود با دستگاه' : 'ورود با دستگاه'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading()\"\r\n (click)=\"onPrimaryAction()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n } @else {\r\n <p class=\"auth-error tw-p-3 tw-mb-4 tw-text-xs\" role=\"status\">\r\n احراز هویت داخلی روی این مرورگر یا دستگاه در دسترس نیست.\r\n </p>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-4 tw-items-center\">\r\n @if (mode === 'enrollment') {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"onSkip()\">فعلاً نه</button>\r\n } @else {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"cancelled.emit()\">\r\n بازگشت به روش‌های دیگر\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"auth-error tw-p-3 tw-mb-4 tw-mt-4 tw-text-xs\" role=\"alert\">\r\n <span class=\"tw-font-medium\">خطا!</span> {{ errorMessage() }}\r\n </div>\r\n }\r\n</section>\r\n","import {\r\n Component,\r\n input,\r\n WritableSignal,\r\n signal,\r\n inject,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n computed,\r\n Signal\r\n} from '@angular/core';\r\nimport { AuthViewState, LoginSettings } from '../controllers';\r\nimport { ApplicationCtrlrService, PortalService } from 'barsa-novin-ray-core';\r\nimport { PasskeyService } from '../services/passkey.service';\r\nimport { SocialConnectionButton, toSocialConnectionButtons } from './social-connections';\r\n\r\n@Component({\r\n selector: 'ba-auth',\r\n templateUrl: './barsa-auth.component.html',\r\n styleUrl: './barsa-auth.component.scss',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: false\r\n})\r\nexport class BarsaAuthComponent {\r\n @Output() verified = new EventEmitter<string | undefined>();\r\n appSettings = input.required<LoginSettings>();\r\n state: WritableSignal<AuthViewState> = signal('enter-mobile');\r\n mobile = signal('');\r\n loading = signal(false);\r\n passkeyAvailable = signal(false);\r\n socialConnections: Signal<SocialConnectionButton[]> = computed(() =>\r\n toSocialConnectionButtons(this.appSettings()?.SocialConnections, window.location.origin)\r\n );\r\n _portalService = inject(PortalService);\r\n _applicationCtrlrService = inject(ApplicationCtrlrService);\r\n private readonly passkeyService = inject(PasskeyService);\r\n\r\n ngOnInit(): void {\r\n this.state.set(this.appSettings().DefaultState || 'enter-mobile');\r\n if (this.appSettings().PasskeyEnable) {\r\n void this.updatePasskeyAvailability();\r\n }\r\n }\r\n\r\n onChangeState(state: AuthViewState): void {\r\n this.state.set(state);\r\n }\r\n onChangeMobile(): void {\r\n this.state.set('enter-mobile');\r\n }\r\n onOtpSent(mobile: string): void {\r\n this.mobile.set(mobile);\r\n this.state.set('verification');\r\n }\r\n onLoggedIn(): void {\r\n void this.completeExistingLogin();\r\n }\r\n\r\n onPasskeyLoggedIn(token2: string): void {\r\n this.finishLogin(token2);\r\n }\r\n\r\n onEnrollmentFinished(): void {\r\n this.finishLogin();\r\n }\r\n\r\n private async updatePasskeyAvailability(): Promise<void> {\r\n this.passkeyAvailable.set(await this.passkeyService.isPlatformAuthenticatorAvailable());\r\n }\r\n\r\n private async completeExistingLogin(): Promise<void> {\r\n this.loading.set(true);\r\n if (\r\n this.appSettings().PasskeyEnable &&\r\n this.appSettings().PasskeyPromptOnFirstLogin &&\r\n (await this.passkeyService.isPlatformAuthenticatorAvailable())\r\n ) {\r\n try {\r\n const status = await this.passkeyService.getEnrollmentStatus();\r\n if (this.passkeyService.canOfferEnrollment(status)) {\r\n this.loading.set(false);\r\n this.state.set('passkey-enrollment');\r\n return;\r\n }\r\n } catch (e) {\r\n console.error('Error checking passkey enrollment status:', e);\r\n // Passkey اختیاری است؛ خطای status نباید ورود موفق را متوقف کند.\r\n }\r\n }\r\n this.finishLogin();\r\n }\r\n\r\n private finishLogin(token2?: string): void {\r\n this.loading.set(false);\r\n this.verified.emit(token2);\r\n }\r\n}\r\n","<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #socialConnectionsTpl>\r\n @if(socialConnections().length > 0){\r\n <div class=\"social-connections tw-flex tw-flex-wrap tw-gap-2 tw-mt-3\">\r\n @for(btn of socialConnections(); track btn.id){\r\n <a class=\"social-connection-button tw-px-4 tw-py-3 tw-text-sm tw-font-medium\" [href]=\"btn.href\">\r\n @if(btn.logo){\r\n <img class=\"social-connection-logo\" [src]=\"btn.logo | picFieldSrc: 'ID':null:'':48:48\" alt=\"\" loading=\"lazy\" />\r\n }\r\n <span>{{ btn.title }}</span>\r\n </a>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('user-pass')\"\r\n >ورود با نام کاربری\r\n </a>\r\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\r\n <div class=\"passkey-entry tw-mt-5\">\r\n <button\r\n type=\"button\"\r\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('passkey')\"\r\n >\r\n ورود با اثر انگشت، چهره یا PIN دستگاه\r\n </button>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"socialConnectionsTpl\"></ng-container>\r\n </div>\r\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('enter-mobile')\"\r\n >ورود با شماره همراه\r\n </a>\r\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\r\n <div class=\"passkey-entry tw-mt-5\">\r\n <button\r\n type=\"button\"\r\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\r\n (click)=\"onChangeState('passkey')\"\r\n >\r\n ورود با اثر انگشت، چهره یا PIN دستگاه\r\n </button>\r\n </div>\r\n }\r\n <ng-container *ngTemplateOutlet=\"socialConnectionsTpl\"></ng-container>\r\n </div>\r\n </ba-user-pass>\r\n } @case ('passkey') {\r\n <ba-passkey\r\n mode=\"login\"\r\n [autoStart]=\"true\"\r\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\r\n (cancelled)=\"onChangeState('enter-mobile')\"\r\n >\r\n </ba-passkey>\r\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">ورود از طریق درگاه</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >ورود از طریق درگاه دولت من\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n signal,\r\n WritableSignal,\r\n OnInit,\r\n TemplateRef,\r\n ViewChild,\r\n inject\r\n} from '@angular/core';\r\nimport { LoginSettings } from '../controllers';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { PortalService } from 'barsa-novin-ray-core';\r\n\r\n@Component({\r\n selector: 'ba-login',\r\n templateUrl: './login.component.html',\r\n styleUrl: './login.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class LoginComponent implements OnInit {\r\n @ViewChild('template', { static: true, read: TemplateRef }) _errorTemplate: TemplateRef<any>;\r\n settings: Settings;\r\n appSettings: WritableSignal<LoginSettings> = signal({\r\n Logo: null,\r\n HideGovSso: true,\r\n Section1Title: '',\r\n Section1Description: '',\r\n Subtitle: '',\r\n Title: '',\r\n UserPassEnable: false,\r\n UsernameLabel: '',\r\n LogoOnTop: false,\r\n DefaultState: 'enter-mobile',\r\n GovSSOHref: '',\r\n OtpProvider: '',\r\n LoginType: 1,\r\n MobileDescription: '',\r\n UsernameDescription: '',\r\n LoginFooter: '' \r\n });\r\n logoUrl = '';\r\n backgroundUrl = '';\r\n title = '';\r\n hideGovSso = false;\r\n private _activatedRoute = inject(ActivatedRoute);\r\n private _portalService = inject(PortalService);\r\n ngOnInit(): void {\r\n const resolverData = this._activatedRoute.snapshot.data;\r\n if (this.settings?.LoginSettingsValue) {\r\n this.appSettings.set(this.settings?.LoginSettingsValue);\r\n } else if (resolverData) {\r\n this.appSettings.set(resolverData.loginSettings);\r\n }\r\n }\r\n onVerified(token2?: string): void {\r\n if (token2) {\r\n const currentUrl = new URL(window.location.origin);\r\n currentUrl.searchParams.set('token2', token2);\r\n window.location.href = currentUrl.toString();\r\n return;\r\n }\r\n window.location.href = window.location.origin;\r\n }\r\n}\r\ninterface Settings {\r\n LoginSettingsValue: LoginSettings;\r\n}\r\n","@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"login-page tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"login-panel tw-w-full md:tw-w-4/12 tw-relative tw-shadow-sm\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- فرم ورود -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n\r\n <hr class=\"login-divider tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"auth-link tw-pt-2\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n رمز عبور را فراموش کرده ام\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"login-page tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"login-hero-overlay tw-flex tw-items-center tw-h-full tw-px-20\">\r\n <div>\r\n <h2 class=\"login-hero-title tw-text-4xl tw-font-bold\">\r\n {{ appSettings().Section1Title }}\r\n </h2>\r\n <p class=\"login-hero-description tw-max-w-xl tw-mt-3\">\r\n {{ appSettings().Section1Description }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"login-title tw-text-2xl tw-font-bold tw-text-center\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"login-subtitle tw-text-xl tw-mt-1\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import { NgModule, inject } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { BarsaNovinRayCoreModule, BaseModule, DynamicComponentService } from 'barsa-novin-ray-core';\r\nimport {\r\n BarsaAuthComponent,\r\n EnterMobileComponent,\r\n LoginComponent,\r\n TimerCountDownComponent,\r\n UserPassComponent,\r\n VerificationComponent,\r\n PasskeyComponent\r\n} from '../public-api';\r\n\r\nconst components = [\r\n BarsaAuthComponent,\r\n EnterMobileComponent,\r\n VerificationComponent,\r\n TimerCountDownComponent,\r\n UserPassComponent,\r\n LoginComponent,\r\n PasskeyComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: [...components],\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule],\r\n exports: [...components]\r\n})\r\nexport class BarsaAuthModule extends BaseModule {\r\n protected dynamicComponents = [...components];\r\n /** Inserted by Angular inject() migration for backwards compatibility */\r\n constructor() {\r\n const dcm = inject(DynamicComponentService);\r\n super(dcm, 'BarsaAuthModule');\r\n this.dcm = dcm;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of barsa-auth\r\n */\r\n\r\nexport * from './lib/barsa-auth/barsa-auth.component';\r\nexport * from './lib/enter-mobile/enter-mobile.component';\r\nexport * from './lib/user-pass/user-pass.component';\r\nexport * from './lib/verification/verification.component';\r\nexport * from './lib/timer-countdown/timer-countdown.component';\r\nexport * from './lib/login/login.component';\r\nexport * from './lib/passkey/passkey.component';\r\nexport * from './lib/services/passkey.service';\r\nexport * from './lib/controllers';\r\n\r\nexport * from './lib/barsa-auth.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i4.TimerCountDownComponent","i2","i3.EnterMobileComponent","i4.VerificationComponent","i5.UserPassComponent","i6.PasskeyComponent","i2.BarsaAuthComponent"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "barsa-auth",
3
- "version": "3.0.8",
3
+ "version": "3.0.11",
4
4
  "peerDependencies": {
5
5
  "@angular/core": "^22.0.8",
6
6
  "@angular/common": "^22.0.8",
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { EventEmitter, WritableSignal, TemplateRef, QueryList, ElementRef, NgZone, OnInit } from '@angular/core';
2
+ import { EventEmitter, WritableSignal, Signal, TemplateRef, QueryList, ElementRef, NgZone, OnInit } from '@angular/core';
3
3
  import * as i10 from 'barsa-novin-ray-core';
4
- import { BaseController, IViewBase, FilePictureInfoModel, PortalService, ApplicationCtrlrService, ViewBase, BaseComponent, BaseModule } from 'barsa-novin-ray-core';
4
+ import { BaseController, IViewBase, FilePictureInfoModel, MoForReportModelBase, MetaobjectDataModel, PortalService, ApplicationCtrlrService, ViewBase, BaseComponent, BaseModule } from 'barsa-novin-ray-core';
5
5
  import * as i9 from '@angular/forms';
6
6
  import { FormGroup } from '@angular/forms';
7
7
  import { HttpClient } from '@angular/common/http';
@@ -56,6 +56,17 @@ interface ILoginVerificationView extends IViewBase {
56
56
  setLoading: (loading: boolean) => void;
57
57
  }
58
58
 
59
+ interface SocialConnectionProviderRef {
60
+ Id: string;
61
+ $TypeDefId?: string;
62
+ $Caption: string;
63
+ }
64
+ interface SocialConnectionItem extends MetaobjectDataModel {
65
+ Title?: string;
66
+ A_SocialConnectionProvider_Logo?: FilePictureInfoModel | null;
67
+ SocialConnectionProvider?: SocialConnectionProviderRef | null;
68
+ }
69
+ type SocialConnectionReport = MoForReportModelBase<SocialConnectionItem>;
59
70
  type LoginState = 'user-pass' | 'enter-mobile' | 'verification';
60
71
  type AuthViewState = LoginState | 'passkey' | 'passkey-enrollment';
61
72
  type PasskeyMode = 'login' | 'enrollment';
@@ -87,6 +98,7 @@ interface LoginSettings {
87
98
  Theme$Caption?: string;
88
99
  PasskeyEnable?: boolean;
89
100
  PasskeyPromptOnFirstLogin?: boolean;
101
+ SocialConnections?: SocialConnectionReport | null;
90
102
  }
91
103
  type PasskeyTransport = 'ble' | 'cable' | 'hybrid' | 'internal' | 'nfc' | 'smart-card' | 'usb';
92
104
  interface PasskeyCredentialDescriptorJson {
@@ -169,6 +181,18 @@ interface PasskeyAuthenticationVerifyResponse {
169
181
  token2: string;
170
182
  }
171
183
 
184
+ interface SocialConnectionButton {
185
+ /** شناسه‌ی آیتم، برای track */
186
+ id: string;
187
+ /** Title؛ اگر خالی بود providerName */
188
+ title: string;
189
+ /** SocialConnectionProvider.$Caption (فرض A1: همان Name ِ provider در سرور) */
190
+ providerName: string;
191
+ href: string;
192
+ /** null اگر FileId نبود یا IsDeleted بود */
193
+ logo: FilePictureInfoModel | null;
194
+ }
195
+
172
196
  declare class BarsaAuthComponent {
173
197
  verified: EventEmitter<string | undefined>;
174
198
  appSettings: _angular_core.InputSignal<LoginSettings>;
@@ -176,6 +200,7 @@ declare class BarsaAuthComponent {
176
200
  mobile: WritableSignal<string>;
177
201
  loading: WritableSignal<boolean>;
178
202
  passkeyAvailable: WritableSignal<boolean>;
203
+ socialConnections: Signal<SocialConnectionButton[]>;
179
204
  _portalService: PortalService;
180
205
  _applicationCtrlrService: ApplicationCtrlrService;
181
206
  private readonly passkeyService;
@@ -371,4 +396,4 @@ declare class BarsaAuthModule extends BaseModule {
371
396
  }
372
397
 
373
398
  export { BarsaAuthComponent, BarsaAuthModule, EnterMobileComponent, LoginComponent, LoginMobileController, LoginUserPassController, LoginVerificationController, PasskeyComponent, PasskeyService, TimerCountDownComponent, UserPassComponent, VerificationComponent };
374
- export type { AuthViewState, ILoginMobileView, ILoginUserPassView, ILoginVerificationView, LoginSettings, LoginState, PasskeyAuthenticationCredentialJson, PasskeyAuthenticationOptionsJson, PasskeyAuthenticationVerifyResponse, PasskeyCeremonyOptions, PasskeyCredentialDescriptorJson, PasskeyEnrollmentStatus, PasskeyMode, PasskeyRegistrationCredentialJson, PasskeyRegistrationOptionsJson, PasskeyRegistrationVerifyResponse, PasskeyTransport };
399
+ export type { AuthViewState, ILoginMobileView, ILoginUserPassView, ILoginVerificationView, LoginSettings, LoginState, PasskeyAuthenticationCredentialJson, PasskeyAuthenticationOptionsJson, PasskeyAuthenticationVerifyResponse, PasskeyCeremonyOptions, PasskeyCredentialDescriptorJson, PasskeyEnrollmentStatus, PasskeyMode, PasskeyRegistrationCredentialJson, PasskeyRegistrationOptionsJson, PasskeyRegistrationVerifyResponse, PasskeyTransport, SocialConnectionItem, SocialConnectionProviderRef, SocialConnectionReport };