@sambath999/localize-token 12.3.9 → 12.4.0

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.
@@ -193,8 +193,13 @@ class LocalizeTokenService {
193
193
  this.isRevokingTokenSubject = new BehaviorSubject(false);
194
194
  this.defaultConfig = {
195
195
  mainDomain: extractMainDomain(),
196
- authTokenName: 'auth-token',
197
- refreshTokenName: '_lze_rftkp_',
196
+ authToken: {
197
+ name: 'auth-token',
198
+ },
199
+ refreshToken: {
200
+ name: 'refresh-token',
201
+ requestUrl: '/api/token/revoke'
202
+ },
198
203
  };
199
204
  this.isInitialized = false;
200
205
  this.decodeToken = (token) => jwt_decode.jwtDecode(token);
@@ -214,11 +219,12 @@ class LocalizeTokenService {
214
219
  }
215
220
  get authToken() { return this.storageGet(); }
216
221
  set authToken(value) {
222
+ var _a;
217
223
  value
218
224
  ? this.storageSet(value)
219
- : LocalizeToken.storage.delete(this.config.authTokenName);
225
+ : LocalizeToken.storage.delete((_a = this.config.authToken) === null || _a === void 0 ? void 0 : _a.name);
220
226
  }
221
- get refreshToken() { return LocalizeToken.storage.get(this.config.refreshTokenName); }
227
+ get refreshToken() { var _a; return LocalizeToken.storage.get(((_a = this.config.refreshToken) === null || _a === void 0 ? void 0 : _a.name) || ''); }
222
228
  get accessToken() { var _a; return (_a = this.authToken) === null || _a === void 0 ? void 0 : _a.token; }
223
229
  set accessToken(value) {
224
230
  value && (this.authToken = { token: value, revoke: false });
@@ -228,32 +234,33 @@ class LocalizeTokenService {
228
234
  this.isRevokingTokenSubject.next(value);
229
235
  this.authToken && (this.authToken = Object.assign(Object.assign({}, this.authToken), { revoke: value }));
230
236
  }
231
- tenantToken(name) {
232
- if (!name)
233
- return undefined;
234
- return LocalizeToken.storage.get(name);
237
+ tenantToken() {
238
+ var _a;
239
+ return LocalizeToken.storage.get(((_a = this.config.tenantToken) === null || _a === void 0 ? void 0 : _a.name) || '');
235
240
  }
236
241
  storageGet() {
242
+ var _a;
237
243
  try {
238
- const encoded = LocalizeToken.storage.get(this.config.authTokenName);
244
+ const encoded = LocalizeToken.storage.get(((_a = this.config.authToken) === null || _a === void 0 ? void 0 : _a.name) || '');
239
245
  const decoded = atob(encoded || '');
240
246
  return JSON.parse(decoded);
241
247
  }
242
- catch (_a) {
248
+ catch (_b) {
243
249
  return undefined;
244
250
  }
245
251
  }
246
252
  storageSet(value) {
253
+ var _a;
247
254
  const base64 = btoa(JSON.stringify(value));
248
- LocalizeToken.storage.set(this.config.authTokenName, base64);
255
+ LocalizeToken.storage.set(((_a = this.config.authToken) === null || _a === void 0 ? void 0 : _a.name) || '', base64);
249
256
  }
250
- tokensValid(tenantTokenName) {
257
+ tokensValid() {
251
258
  var _a, _b;
252
259
  return !!((_a = this.refreshToken) === null || _a === void 0 ? void 0 : _a.length)
253
- && (!this.config.needTenant || !!((_b = this.tenantToken(tenantTokenName)) === null || _b === void 0 ? void 0 : _b.length));
260
+ && (!this.config.tenantToken || !!((_b = this.tenantToken()) === null || _b === void 0 ? void 0 : _b.length));
254
261
  }
255
262
  get decodeRefreshToken() {
256
- const token = LocalizeToken.storage.get(this.config.refreshTokenName);
263
+ const token = this.refreshToken;
257
264
  return !token ? null : this.decodeToken(token);
258
265
  }
259
266
  throwIfNotInitialized() {
@@ -563,14 +570,14 @@ class LocalizeApiService {
563
570
  this.func = (baseUrl) => (path, method = EMethod.GET, reqBody = null, reqHeaders) => this.request(baseUrl, path, method, reqBody, reqHeaders);
564
571
  }
565
572
  get isResolvingStartup() { return this.isResolvingStartupSubject.value; }
566
- get needTenant() { return this.localizeTokenService.config.needTenant; }
573
+ get needTenant() { return this.localizeTokenService.config.tenantToken !== undefined; }
567
574
  get isRequesting() { return this.isRequestingSubject.value; }
568
575
  get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }
569
576
  set isRevokingToken(value) { this.localizeTokenService.isRevokingToken = value; }
570
577
  get accessToken() { return this.localizeTokenService.accessToken; }
571
578
  set accessToken(value) { this.localizeTokenService.accessToken = value; }
572
579
  get refreshToken() { return this.localizeTokenService.refreshToken; }
573
- get tenantToken() { return this.localizeTokenService.tenantToken(this.config.tenantTokenName); }
580
+ get tenantToken() { return this.localizeTokenService.tenantToken(); }
574
581
  get config() {
575
582
  this.validateConfig();
576
583
  return this.configSubject.value;
@@ -644,12 +651,13 @@ class LocalizeApiService {
644
651
  });
645
652
  }
646
653
  revokeToken() {
654
+ var _a;
647
655
  return __awaiter(this, void 0, void 0, function* () {
648
656
  try {
649
657
  if (yield this.interceptRevokeToken())
650
658
  return;
651
659
  this.isRevokingToken = true;
652
- const apiOptions = Object.assign(Object.assign({}, this.buildApiOptions(this.localizeTokenService.config.revokeTokenUrl)), { refreshToken: true });
660
+ const apiOptions = Object.assign(Object.assign({}, this.buildApiOptions(((_a = this.localizeTokenService.config.refreshToken) === null || _a === void 0 ? void 0 : _a.requestUrl) || '')), { refreshToken: true });
653
661
  // const revokeToken = await this.performRequest(apiOptions);
654
662
  const revokeToken = yield ApiHelper.performRequestWithRetry(apiOptions, this.config, this.performRequest.bind(this));
655
663
  yield this.handleOnTokenRevoked(revokeToken);
@@ -712,12 +720,12 @@ class LocalizeApiService {
712
720
  });
713
721
  }
714
722
  validateConfig() {
715
- var _a;
716
- const config = this.configSubject.value;
717
- if (this.localizeTokenService.config.needTenant && !((_a = config.tenantTokenName) === null || _a === void 0 ? void 0 : _a.trim().length)) {
723
+ var _a, _b, _c, _d;
724
+ if (this.localizeTokenService.config.tenantToken
725
+ && !((_b = (_a = this.localizeTokenService.config.tenantToken) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim().length)) {
718
726
  throw Error('Tenant token is required but tenantTokenName is not configured');
719
727
  }
720
- if (!this.localizeTokenService.config.revokeTokenUrl.trim().length) {
728
+ if (!((_d = (_c = this.localizeTokenService.config.refreshToken) === null || _c === void 0 ? void 0 : _c.requestUrl) === null || _d === void 0 ? void 0 : _d.trim().length)) {
721
729
  throw Error('Revoke token URL is not configured - token refresh will not work');
722
730
  }
723
731
  }
@@ -775,7 +783,7 @@ class LocalizeLogindlgComponent {
775
783
  this.cdt.detectChanges();
776
784
  }
777
785
  clickLogin() {
778
- var _a, _b;
786
+ var _a, _b, _c;
779
787
  return __awaiter(this, void 0, void 0, function* () {
780
788
  if (!this.isValidPassword) {
781
789
  return this.showMessage("error", "Password is required and must be at least 6 characters");
@@ -787,7 +795,7 @@ class LocalizeLogindlgComponent {
787
795
  }
788
796
  this.tokenService.accessToken = loginRes.tokens.accessToken;
789
797
  const cookieOptions = { expires: (_b = this.loginConfig.expire) !== null && _b !== void 0 ? _b : 365 };
790
- LocalizeToken.storage.set(this.config.refreshTokenName, loginRes.tokens.refreshToken, cookieOptions);
798
+ LocalizeToken.storage.set(((_c = this.config.refreshToken) === null || _c === void 0 ? void 0 : _c.name) || '', loginRes.tokens.refreshToken, cookieOptions);
791
799
  this.success = true;
792
800
  setTimeout(() => {
793
801
  this.dlgConfig.dismissableMask = true;
@@ -817,10 +825,10 @@ class LocalizeLogindlgComponent {
817
825
  });
818
826
  }
819
827
  getHeaders() {
820
- var _a, _b;
828
+ var _a, _b, _c;
821
829
  return {
822
- [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: (_a = LocalizeToken.storage.get(this.config.refreshTokenName)) !== null && _a !== void 0 ? _a : "",
823
- [LocalizeToken.httpHeaders.X_TENANT]: (_b = LocalizeToken.storage.get(this.loginConfig.tenantTokenName)) !== null && _b !== void 0 ? _b : "",
830
+ [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: (_b = LocalizeToken.storage.get(((_a = this.config.refreshToken) === null || _a === void 0 ? void 0 : _a.name) || '')) !== null && _b !== void 0 ? _b : "",
831
+ [LocalizeToken.httpHeaders.X_TENANT]: (_c = LocalizeToken.storage.get(this.loginConfig.tenantTokenName)) !== null && _c !== void 0 ? _c : "",
824
832
  };
825
833
  }
826
834
  get isValidPassword() {
@@ -1 +1 @@
1
- {"version":3,"file":"sambath999-localize-token.js","sources":["../../src/localize-token/helpers/localize.api.assets.ts","../../src/localize-token/localize.token.storage.ts","../../src/localize-token/localize.token.ts","../../src/localize-token/localize.token.service.ts","../../src/localize-token/helpers/interfaces.ts","../../src/localize-token/helpers/loccalize.api.helper.ts","../../src/localize-token/localize.api.service.ts","../../src/localize-token/localize.token.module.ts","../../src/localize-logindlg/localize-logindlg.component.ts","../../src/localize-logindlg/localize-logindlg.service.ts","../../src/localize-logindlg/localize-logindlg.module.ts","../../src/sambath999-localize-token.ts"],"sourcesContent":["export const LOCALIZE_API_ASSETS = {\r\n network: {\r\n noConnection: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <svg id=\"lze-no-connection\" data-name=\"Layer 2\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 77.29 70.98\">\r\n <defs>\r\n <style> .cls-1 { fill: #fff; } .cls-2, .cls-3 { fill: #e30613; } .cls-3 { stroke: #e30613; stroke-miterlimit: 10; stroke-width: .25px; } </style>\r\n </defs>\r\n <g id=\"Layer_3\" data-name=\"Layer 3\">\r\n <g>\r\n <path class=\"cls-1\" d=\"m73.29,35c-1.2,0-2.33-.53-3.09-1.46-.48-.57-11.23-13.2-31.55-13.2s-31.11,12.66-31.56,13.2c-1.4,1.71-3.92,1.95-5.63.55-1.71-1.4-1.95-3.92-.55-5.63.54-.66,13.47-16.12,37.74-16.12s37.2,15.46,37.74,16.12c1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.61.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m63.96,45.66c-1.19,0-2.32-.53-3.08-1.44-5.79-6.05-13.86-9.39-22.24-9.21-8.38-.18-16.45,3.16-22.24,9.22-1.46,1.65-3.99,1.81-5.64.35-1.57-1.39-1.8-3.77-.52-5.43,7.32-7.89,17.64-12.29,28.4-12.12,10.76-.17,21.08,4.24,28.4,12.12,1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.6.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m53.3,56.32c-1.24,0-2.41-.57-3.16-1.55-5.73-6.35-15.52-6.85-21.87-1.13-.4.36-.77.73-1.13,1.13-1.36,1.73-3.88,2.03-5.61.67-1.71-1.34-2.03-3.8-.73-5.54,8.39-9.85,23.18-11.04,33.03-2.65.95.81,1.84,1.69,2.65,2.65,1.34,1.75,1,4.26-.75,5.6-.7.53-1.55.82-2.43.82Z\"/>\r\n </g>\r\n <path class=\"cls-2\" d=\"m47.21,9.45l-4.06,41.36c-.64,5.42-8.39,5.39-9.01,0,0,0-4.06-41.36-4.06-41.36-.46-4.73,2.99-8.94,7.72-9.4,5.33-.58,9.97,4.09,9.4,9.4h0Z\"/>\r\n <circle class=\"cls-3\" cx=\"38.64\" cy=\"64.79\" r=\"6.07\"/>\r\n </g>\r\n </svg>`\r\n }\r\n}","import { extractMainDomain } from \"./localize.token\";\r\n\r\nexport interface ICookieOptions {\r\n /**\r\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\r\n */\r\n expires?: number | Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n samesite?: \"strict\" | \"lax\" | \"none\";\r\n}\r\n\r\n/**\r\n* Assembly of @package ng2-cookies @see https://www.npmjs.com/package/ng2-cookies\r\n*\r\n* Reassembled by\r\n* @author sambath999\r\n* @date_29_09_2021\r\n* Updated from raw parameters to\r\n* @param {ICookieOptions} options and added another newer cookie flag\r\n* @param {string} samesite\r\n* @param {constant} SameSiteTypes, @param {string} strict \"strict\", @param {string} lax \"lax\", @param {string} none \"none\"\r\n*\r\n* @enum\r\n*/\r\nexport class LocalizeTokenStorage {\r\n\r\n private get getDefaultOptions(): ICookieOptions {\r\n const mainDomain = extractMainDomain(window.location.hostname);\r\n return {\r\n path: '/',\r\n domain: mainDomain,\r\n secure: true,\r\n // samesite: SameSiteType.strict,\r\n expires: 1\r\n }\r\n }\r\n\r\n private readonly defaultOptions: ICookieOptions;\r\n constructor(_defaultOptions?: ICookieOptions) {\r\n this.defaultOptions = _defaultOptions ?? this.getDefaultOptions;\r\n }\r\n\r\n /**\r\n * Checks the existence of a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the cookie\r\n * @returns existence of the cookie\r\n */\r\n check(name: string): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n return regexp.test(document.cookie);\r\n }\r\n\r\n /**\r\n * Retrieves a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the Cookie\r\n * @returns The Cookie's value\r\n */\r\n get(name: string): string | undefined {\r\n if (!this.check(name)) return undefined;\r\n\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n const result = regexp.exec(document.cookie);\r\n return result ? decodeURIComponent(result[1]) : undefined;\r\n }\r\n\r\n /**\r\n * Retrieves a a list of all cookie avaiable\r\n *\r\n * @returns Object with all Cookies\r\n */\r\n getAll(): any {\r\n const cookies: any = {};\r\n if (document.cookie) {\r\n const split = document.cookie.split(';');\r\n for (const s of split) {\r\n const currCookie = s.split('=');\r\n currCookie[0] = currCookie[0].trim();\r\n cookies[decodeURIComponent(currCookie[0])] = decodeURIComponent(currCookie[1]);\r\n }\r\n }\r\n\r\n return cookies;\r\n }\r\n\r\n set(name: string, value: string, options?: ICookieOptions) {\r\n options ??= this.defaultOptions;\r\n const { expires, path, domain, secure, samesite } = { ...this.defaultOptions, ...options };\r\n let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`;\r\n\r\n if (expires) {\r\n const dtExpires = typeof expires === 'number' ? new Date(Date.now() + expires * 864e5) : expires;\r\n cookieStr += `expires=${dtExpires.toUTCString()};`;\r\n }\r\n\r\n cookieStr += path ? `path=${path};` : '';\r\n cookieStr += domain ? `domain=${domain};` : '';\r\n cookieStr += secure ? 'secure;' : '';\r\n cookieStr += samesite ? `samesite=${samesite};` : '';\r\n\r\n document.cookie = cookieStr;\r\n }\r\n\r\n /**\r\n * Removes specified Cookie\r\n *\r\n * @param {string} name Cookie's identification\r\n * @param {string} path Path relative to the domain where the cookie should be avaiable. Default /\r\n * @param {string} domain Domain where the cookie should be avaiable. Default current domain\r\n */\r\n delete(name: string, path: string = '/', domain: string = window.location.hostname): void {\r\n this.set(name, '', { path, domain, expires: -1 });\r\n }\r\n\r\n /**\r\n * Delete all cookie avaiable\r\n */\r\n deleteAll(path?: string, domain?: string): void {\r\n const cookies = this.getAll();\r\n\r\n for (const cookieName of Object.keys(cookies)) {\r\n this.delete(cookieName, path, domain);\r\n }\r\n }\r\n\r\n}\r\n","import { LocalizeTokenStorage } from \"./localize.token.storage\";\r\nexport interface ILocalizeTokenConfig {\r\n /**\r\n * The main domain of the application to set the cookies to be available for cross application with subdomains.\r\n * \r\n * Default is location.hostname (current domain) and automatically set extracted main domain if it is subdomain.\r\n */\r\n mainDomain?: string;\r\n authTokenName?: string;\r\n // tenantTokenName?: string;\r\n refreshTokenName?: string;\r\n /**\r\n * Flag to determine if the tenant token is required.\r\n */\r\n needTenant: boolean;\r\n isProduction: boolean;\r\n revokeTokenUrl: string;\r\n}\r\n\r\nexport class LocalizeToken {\r\n\r\n static readonly storage = new LocalizeTokenStorage();\r\n\r\n static readonly httpHeaders = {\r\n AUTHORIZATION: 'Authorization',\r\n X_TENANT: 'X-Tenant',\r\n X_REFRESH_TOKEN: 'X-RefreshToken',\r\n CONTENT_TYPE: 'Content-Type',\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Waits for a specified amount of time.\r\n * @param milliseconds - The milliseconds to wait.\r\n * @param when - The condition to wait for. Default is true.\r\n * @returns - Promise<void>\r\n */\r\nexport async function waitFor(milliseconds: number, when: boolean = true) {\r\n if (!when) return;\r\n await new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n/**\r\n * Waits until the condition is met.\r\n * @param when - The condition to wait for.\r\n * @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.\r\n */\r\nexport async function waitUntil(when: () => any, intervalNumber: number = 50) {\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n const cond = when();\r\n const result = cond instanceof Promise ? await cond : cond;\r\n if (result) {\r\n clearInterval(interval);\r\n resolve(true);\r\n }\r\n }, intervalNumber);\r\n });\r\n}\r\n\r\nexport function extractMainDomain(subdomain?: string): string {\r\n subdomain ??= window.location.hostname;\r\n const parts = subdomain.split('.');\r\n return parts.length > 2 ? parts.slice(-2).join('.') : subdomain;\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { extractMainDomain, ILocalizeTokenConfig, LocalizeToken } from './localize.token';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as jwt_decode from 'jwt-decode';\r\nexport interface JwtPayload extends jwt_decode.JwtPayload {\r\n // Define the structure of your JWT payload here\r\n email: string;\r\n sub: string;\r\n name: string;\r\n iat: number;\r\n exp: number;\r\n // Add other fields as needed\r\n}\r\n\r\ninterface IAuthToken {\r\n token: string;\r\n revoke: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LocalizeTokenService implements OnDestroy {\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeTokenConfig>>({});\r\n readonly isRevokingTokenSubject = new BehaviorSubject<boolean>(false);\r\n private readonly defaultConfig: Partial<ILocalizeTokenConfig> = {\r\n mainDomain: extractMainDomain(),\r\n authTokenName: 'auth-token',\r\n refreshTokenName: '_lze_rftkp_',\r\n }\r\n\r\n get config(): ILocalizeTokenConfig {\r\n this.throwIfNotInitialized();\r\n return this.configSubject.value as ILocalizeTokenConfig;\r\n }\r\n\r\n private isInitialized = false;\r\n\r\n init(config: ILocalizeTokenConfig) {\r\n console.log('LocalizeTokenService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n this.isInitialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // this.configSubject.complete();\r\n // this.isRevokingTokenSubject.complete();\r\n }\r\n\r\n private get authToken() { return this.storageGet() }\r\n private set authToken(value: IAuthToken | undefined) {\r\n value\r\n ? this.storageSet(value)\r\n : LocalizeToken.storage.delete(this.config.authTokenName!);\r\n }\r\n\r\n get refreshToken() { return LocalizeToken.storage.get(this.config.refreshTokenName!) }\r\n get accessToken() { return this.authToken?.token }\r\n\r\n set accessToken(value: string | undefined) {\r\n value && (this.authToken = { token: value, revoke: false })\r\n }\r\n\r\n get isRevokingToken() { return this.isRevokingTokenSubject.value /* this.authToken?.revoke ?? false */ }\r\n\r\n set isRevokingToken(value: boolean) {\r\n this.isRevokingTokenSubject.next(value);\r\n this.authToken && (this.authToken = { ...this.authToken, revoke: value })\r\n }\r\n\r\n tenantToken(name: string | undefined) {\r\n if (!name) return undefined;\r\n return LocalizeToken.storage.get(name)\r\n }\r\n\r\n private storageGet() {\r\n try {\r\n const encoded = LocalizeToken.storage.get(this.config.authTokenName!);\r\n const decoded = atob(encoded || '');\r\n return JSON.parse(decoded) as IAuthToken;\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n\r\n private storageSet(value: IAuthToken) {\r\n const base64 = btoa(JSON.stringify(value));\r\n LocalizeToken.storage.set(this.config.authTokenName!, base64);\r\n }\r\n\r\n tokensValid(tenantTokenName?: string): boolean {\r\n return !!this.refreshToken?.length\r\n && (!this.config.needTenant || !!this.tenantToken(tenantTokenName)?.length);\r\n }\r\n\r\n decodeToken = (token: string) => jwt_decode.jwtDecode<JwtPayload>(token);\r\n get decodeRefreshToken() {\r\n const token = LocalizeToken.storage.get(this.config.refreshTokenName!);\r\n return !token ? null : this.decodeToken(token);\r\n }\r\n\r\n private throwIfNotInitialized() {\r\n if (!this.isInitialized) {\r\n throw new Error('LocalizeTokenService is not initialized. Call init() method before using it.');\r\n }\r\n }\r\n\r\n}\r\n","\r\n/**\r\n * Http method options\r\n */\r\nexport enum EMethod {\r\n POST = 'post',\r\n GET = 'get',\r\n PUT = 'put',\r\n DELETE = 'delete',\r\n PATCH = 'patch',\r\n}\r\n\r\nexport interface IOnConnectionError {\r\n /**\r\n * Callback function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n callback?: (error: INormalizedError) => Promise<void> | any;\r\n /**\r\n * If true, the request will block the screen with overlay on connection errors.\r\n * Default is false.\r\n */\r\n blockScreen?: boolean;\r\n\r\n /** Optional z-index for the block screen overlay.\r\n * Default is 10000.\r\n */\r\n blockScreenZIndex?: number;\r\n\r\n /**\r\n * Optional message to display when a connection error occurs.\r\n */\r\n message?: string;\r\n suggestionMessage?: string;\r\n}\r\n\r\ninterface IRetryOptions {\r\n\r\n /**\r\n * Maximum number of retries for a failed request.\r\n * Default is 100.\r\n */\r\n maxRetries?: number;\r\n\r\n /**\r\n * Delay in milliseconds before retrying a failed request.\r\n * Default is 500ms.\r\n */\r\n delay?: number;\r\n\r\n /**\r\n * Function to determine if a request should be retried based on the error.\r\n * If not provided, the default function will retry for network errors and server errors (status 500-599).\r\n * @param error - The error object from the failed request.\r\n * @returns true if the request should be retried, false otherwise.\r\n */\r\n retryFunction?: (error: INormalizedError) => Promise<boolean> | any;\r\n\r\n /**\r\n * Function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n onConnectionError?: IOnConnectionError;\r\n\r\n}\r\n\r\nexport interface ILocalizeApiConfigs {\r\n tenantTokenName?: string;\r\n onPrepareRequest?: () => Promise<void> | any;\r\n onAutoLogout?: () => Promise<void> | any;\r\n onRevokeUnauthorized?: () => Promise<void> | any;\r\n\r\n waitEachRequest?: {\r\n milliseconds: number;\r\n };\r\n enableRequestCancellation?: boolean;\r\n\r\n /**\r\n * Config for retrying failed requests.\r\n * If not provided, the default retry options will be used.\r\n */\r\n retryOptions?: IRetryOptions;\r\n}\r\n\r\nexport interface IApiOptions {\r\n headers?: { [key: string]: string };\r\n method: EMethod;\r\n requestUrl: string;\r\n requestBody?: any;\r\n isFormData?: boolean;\r\n /**\r\n * If true, the request will use the refresh token for authorization.\r\n */\r\n refreshToken?: boolean;\r\n}\r\n\r\nexport interface IHeader {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface INormalizedError {\r\n code: string;\r\n message: string;\r\n details?: any;\r\n status: number;\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { IApiOptions, ILocalizeApiConfigs, INormalizedError, IOnConnectionError } from \"./interfaces\";\r\nimport { takeUntil, catchError, throwError, Subject } from \"rxjs\";\r\nimport { waitFor } from \"../localize.token\";\r\nimport { LOCALIZE_API_ASSETS } from \"./localize.api.assets\";\r\n\r\ninterface IRequestInstance {\r\n client: HttpClient;\r\n destroy$: () => Subject<void>;\r\n}\r\n\r\ninterface IRetryOptions {\r\n maxRetries: () => number;\r\n delay: number;\r\n callback: () => Promise<any> | any;\r\n retryUnless?: (error: any) => boolean;\r\n onError?: (error: any) => Promise<void> | any;\r\n connectionError?: IOnConnectionError\r\n}\r\n\r\nclass LocalizeApiHelper {\r\n\r\n readonly defaultRetryOptions: Partial<IRetryOptions> = {\r\n connectionError: {\r\n message: 'Connection error occurred. Please wait',\r\n blockScreen: true,\r\n blockScreenZIndex: 10000\r\n }\r\n };\r\n\r\n async performRetry<T = any>(options: IRetryOptions): Promise<T> {\r\n let attempts = 0;\r\n let lastError: any;\r\n let consoleCount = 0;\r\n\r\n // Merge default retry options with provided options\r\n options = { ...this.defaultRetryOptions, ...options }\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n\r\n while (attempts < options.maxRetries()) {\r\n try {\r\n const result = await options.callback();\r\n this.removeBlocker(styleElement);\r\n return result;\r\n\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (consoleCount >= 7) {\r\n console.clear();\r\n consoleCount = 0;\r\n }\r\n\r\n if (options.retryUnless && !options.retryUnless(error))\r\n throw error; // If the error should not be retried, rethrow it\r\n\r\n // Handle connection error\r\n styleElement = await this.onConnectionError(options, error);\r\n\r\n if (options.onError)\r\n await this.invokeHook(options.onError.bind(this, error));\r\n\r\n if (attempts >= options.maxRetries() - 1)\r\n throw error;\r\n\r\n attempts++;\r\n consoleCount++;\r\n console.warn(`Attempt ${attempts} failed. Retrying...`, error);\r\n await waitFor(options.delay);\r\n }\r\n }\r\n\r\n console.warn(`Failed after ${options.maxRetries} attempts`);\r\n throw lastError;\r\n }\r\n\r\n async performRequestWithRetry<T = any>(\r\n options: IApiOptions,\r\n config: ILocalizeApiConfigs,\r\n performRequest: <T = any>(options: IApiOptions) => Promise<T>\r\n ): Promise<T> {\r\n\r\n const retryUnless = config.retryOptions?.retryFunction\r\n || this.isConnectionError;\r\n\r\n return await this.performRetry({\r\n connectionError: config.retryOptions?.onConnectionError,\r\n maxRetries: () => config.retryOptions?.maxRetries ?? 1000,\r\n delay: config.retryOptions?.delay ?? 500,\r\n callback: () => performRequest<T>(options),\r\n retryUnless: retryUnless,\r\n })\r\n }\r\n\r\n buildUrl(baseUrl: string, path: string): string {\r\n const normalizedUrl = `${baseUrl.trim().replace(/\\/?$/, '/')}${path.trim().replace(/^\\//, '')}`;\r\n return normalizedUrl.endsWith('/')\r\n ? normalizedUrl.slice(0, -1)\r\n : normalizedUrl;\r\n }\r\n\r\n normalizeError(error: HttpErrorResponse): INormalizedError {\r\n return {\r\n code: error.error?.code || `HTTP_${error.status}`,\r\n message: error.error?.message || error.message,\r\n details: error.error?.details,\r\n status: error.status\r\n };\r\n }\r\n\r\n async invokeHook(callback?: () => Promise<any> | any): Promise<any> {\r\n if (!callback) return;\r\n\r\n const result = callback();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n\r\n createRequest<T = any>(\r\n instance: Required<IRequestInstance>,\r\n method: string,\r\n url: string,\r\n body: any,\r\n options: { headers: HttpHeaders }\r\n ) {\r\n const request$ = instance.client.request<T>(method, url, {\r\n ...options,\r\n body,\r\n observe: 'response',\r\n }).pipe(\r\n takeUntil(instance.destroy$()),\r\n catchError((error: HttpErrorResponse) => {\r\n // Convert to a non-observable error to handle in the promise\r\n return throwError(() => this.normalizeError(error));\r\n })\r\n );\r\n\r\n return request$;\r\n }\r\n\r\n defaultRetryFunction(error: INormalizedError): boolean {\r\n\r\n // Don't retry for other errors (like 400, 401, 403, etc.)\r\n if (!this.isConnectionError(error))\r\n throw error;\r\n\r\n return true;\r\n }\r\n\r\n isConnectionError(error: INormalizedError): boolean {\r\n const isNetworkError = error.status === 0;\r\n const isServerError = error.status >= 1000 && error.status < 600;\r\n return isNetworkError || isServerError;\r\n }\r\n\r\n async onConnectionError(\r\n options: IRetryOptions,\r\n error: any\r\n ): Promise<Promise<void> | any> {\r\n\r\n if (!options.connectionError)\r\n return;\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n if (this.isConnectionError(error)) {\r\n\r\n styleElement = this.screenBlocker(options, error, true);\r\n\r\n await this.invokeHook(options.connectionError.callback?.bind(this, error));\r\n return styleElement;\r\n } else {\r\n this.screenBlocker(options, error, false);\r\n styleElement?.remove();\r\n }\r\n }\r\n\r\n screenBlocker(optons: IRetryOptions,\r\n error?: any,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n if (error instanceof HttpErrorResponse)\r\n error = this.normalizeError(error);\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.message || 'An error occurred';\r\n const suggestinMessage = optons.connectionError?.suggestionMessage\r\n || 'Please check your internet connection or the server status.';\r\n\r\n const zIndex = optons.connectionError?.blockScreenZIndex || 10000;\r\n\r\n const body = document.body;\r\n const blcokerHtml = `\r\n <div class=\"lze-blocker\">\r\n ${LOCALIZE_API_ASSETS.network.noConnection}\r\n <div class=\"lze-blocker__message\">\r\n ${message}\r\n <span class=\"lze-blocker__dotting\">\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n </span>\r\n </div>\r\n <div class=\"lze-blocker__error\">${errorMessage}</div>\r\n <div class=\"lze-blocker__error_suggestion\">${suggestinMessage}</div>\r\n </div>\r\n `;\r\n const style = `\r\n div.lze-blocker {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.85) !important;\r\n z-index: ${zIndex};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n color: #fff !important;\r\n font-family: Arial, sans-serif;\r\n text-align: center;\r\n padding: 20px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n svg#lze-no-connection {\r\n width: 75px;\r\n height: 75px;\r\n margin-bottom: 20px;\r\n }\r\n \r\n div.lze-blocker__message {\r\n color: #fff !important;\r\n font-size: 18px !important;\r\n margin-bottom: 10px;\r\n }\r\n \r\n .lze-blocker__dotting {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n span.lze-blocker__dot {\r\n display: inline-block;\r\n width: 7px;\r\n height: 7px;\r\n background-color: #ffffff !important;\r\n border-radius: 50%;\r\n margin-left: 3px;\r\n opacity: 0.3;\r\n animation: dotting 1s infinite;\r\n }\r\n .lze-blocker__dot:nth-child(1) {\r\n animation-delay: 0s;\r\n opacity: 1;\r\n }\r\n .lze-blocker__dot:nth-child(2) {\r\n animation-delay: 0.2s;\r\n }\r\n .lze-blocker__dot:nth-child(3) {\r\n animation-delay: 0.4s;\r\n }\r\n\r\n @keyframes dotting {\r\n 0%, 80%, 100% { opacity: 0.3; }\r\n 40% { opacity: 1; }\r\n }\r\n\r\n div.lze-blocker__error {\r\n color: #f00;\r\n font-size: 14px !important;\r\n margin-bottom: 10px;\r\n text-shadow: 0 0 1px #ff5f5f !important;\r\n }\r\n\r\n div.lze-blocker__error_suggestion {\r\n color: #ccc !important;\r\n font-size: 14px !important;\r\n margin-top: 10px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `;\r\n\r\n const styleElement = document.createElement('style');\r\n\r\n if (add) {\r\n if (!document.querySelector('.lze-blocker')) {\r\n styleElement.innerHTML = style;\r\n document.head.appendChild(styleElement);\r\n body.insertAdjacentHTML('beforeend', blcokerHtml);\r\n }\r\n } else {\r\n this.removeBlocker(styleElement);\r\n }\r\n\r\n return styleElement;\r\n }\r\n\r\n private removeBlocker(styleElement: HTMLStyleElement | undefined): void {\r\n const blocker = document.querySelector('.lze-blocker');\r\n blocker?.remove();\r\n styleElement?.remove();\r\n }\r\n}\r\n\r\nexport const ApiHelper = new LocalizeApiHelper();","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { LocalizeTokenService } from \"./localize.token.service\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { LocalizeToken, waitFor, waitUntil } from \"./localize.token\";\r\nimport { BehaviorSubject, Subject } from \"rxjs\";\r\nimport { ILocalizeApiConfigs, IApiOptions, EMethod, IHeader } from \"./helpers/interfaces\";\r\nimport { ApiHelper } from \"./public-api\";\r\n\r\nconst SCHEMES = LocalizeToken.httpHeaders;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeApiConfigs>>({});\r\n readonly isRequestingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isResolvingStartupSubject = new BehaviorSubject<boolean>(false);\r\n get isResolvingStartup() { return this.isResolvingStartupSubject.value; }\r\n\r\n get needTenant(): boolean { return this.localizeTokenService.config.needTenant; }\r\n\r\n get isRequesting() { return this.isRequestingSubject.value; }\r\n get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }\r\n set isRevokingToken(value: boolean) { this.localizeTokenService.isRevokingToken = value; }\r\n\r\n get accessToken(): string | undefined { return this.localizeTokenService.accessToken; }\r\n set accessToken(value: string | undefined) { this.localizeTokenService.accessToken = value; }\r\n\r\n get refreshToken(): string | undefined { return this.localizeTokenService.refreshToken; }\r\n get tenantToken(): string | undefined { return this.localizeTokenService.tenantToken(this.config.tenantTokenName); }\r\n\r\n private defaultConfig: Partial<ILocalizeApiConfigs> = {\r\n waitEachRequest: { milliseconds: 0 },\r\n enableRequestCancellation: true,\r\n\r\n retryOptions: {\r\n maxRetries: 1000,\r\n delay: 1000,\r\n retryFunction: ApiHelper.defaultRetryFunction.bind(this),\r\n },\r\n\r\n };\r\n\r\n private get config(): Partial<ILocalizeApiConfigs> {\r\n this.validateConfig();\r\n return this.configSubject.value;\r\n }\r\n\r\n private apiOptions: Partial<IApiOptions> = {\r\n method: EMethod.GET,\r\n requestBody: null,\r\n };\r\n\r\n constructor(readonly httpClient: HttpClient,\r\n private readonly localizeTokenService: LocalizeTokenService\r\n ) { }\r\n\r\n /**\r\n * Initialize the API service.\r\n * @param apiConfigs - The API configurations.\r\n */\r\n init(apiConfigs: ILocalizeApiConfigs) {\r\n console.log('LocalizeApiService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...apiConfigs });\r\n }\r\n\r\n cancelPendingRequests(): void {\r\n this.config.enableRequestCancellation\r\n && this.destroy$.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n // this.isResolvingStartupSubject.complete();\r\n // this.isRequestingSubject.complete();\r\n // this.configSubject.complete();\r\n }\r\n\r\n /**\r\n * A higher-order function that returns a curried function for making API requests.\r\n *\r\n * @param baseUrl - The base URL of the API.\r\n * @returns A curried function that can be used to make API requests.\r\n */\r\n func = (baseUrl: string) =>\r\n <T = any>(path: string, method: EMethod = EMethod.GET, reqBody: any = null, reqHeaders?: IHeader) =>\r\n this.request<T>(baseUrl, path, method, reqBody, reqHeaders)\r\n\r\n public async request<T = any>(baseUrl: string,\r\n path: string,\r\n method: EMethod = EMethod.GET,\r\n reqBody: any = null,\r\n reqHeaders?: IHeader): Promise<T> {\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n await ApiHelper.invokeHook(this.config.onPrepareRequest);\r\n\r\n const apiOptions = this.buildApiOptions(baseUrl, path, method, reqBody, reqHeaders);\r\n\r\n try {\r\n await this.toWaitForPreviousRequest();\r\n\r\n return await ApiHelper.performRequestWithRetry<T>(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n }\r\n catch (error: any) {\r\n return await this.handleOnRequestError(error, apiOptions);\r\n }\r\n }\r\n\r\n private async handleOnRequestError(error: HttpErrorResponse, options: IApiOptions): Promise<any> {\r\n if (error.status !== 401)\r\n throw error;\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 500,\r\n retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),\r\n callback: async () => {\r\n // Only handle 401 Unauthorized errors\r\n await this.revokeToken();\r\n\r\n // Retry the request with the new access token\r\n return await this.performRequest(options);\r\n }\r\n })\r\n\r\n }\r\n\r\n private async performRequest<T = any>(options: IApiOptions): Promise<T> {\r\n\r\n // Build the request options\r\n const buildOptions = { headers: this.buildHeaderOptions(options) };\r\n\r\n // Create the request observable\r\n const request$ = ApiHelper.createRequest<T>({\r\n client: this.httpClient,\r\n destroy$: () => this.destroy$\r\n }, options.method, options.requestUrl, options.requestBody, buildOptions);\r\n\r\n // Set the isRequesting state to true before making the request\r\n this.isRequestingSubject.next(true);\r\n\r\n const response = await new Promise<any>((resolve, reject) =>\r\n request$.subscribe({ next: (res) => resolve(res.body), error: reject }));\r\n\r\n // Reset the isRequesting state after the request completes\r\n this.isRequestingSubject.next(false);\r\n\r\n return response;\r\n }\r\n\r\n private async revokeToken(): Promise<void> {\r\n\r\n try {\r\n if (await this.interceptRevokeToken())\r\n return;\r\n\r\n this.isRevokingToken = true;\r\n\r\n const apiOptions: IApiOptions = {\r\n ...this.buildApiOptions(this.localizeTokenService.config.revokeTokenUrl),\r\n refreshToken: true,\r\n }\r\n\r\n // const revokeToken = await this.performRequest(apiOptions);\r\n const revokeToken = await ApiHelper.performRequestWithRetry(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n await this.handleOnTokenRevoked(revokeToken);\r\n\r\n } catch (error: any) {\r\n // Handle the error, log it\r\n await ApiHelper.invokeHook(this.config.onAutoLogout);\r\n\r\n } finally {\r\n // Reset the revoking token state\r\n this.isRevokingToken = false;\r\n }\r\n }\r\n\r\n /** default http request options */\r\n private buildHeaderOptions(options: IApiOptions): HttpHeaders {\r\n\r\n const headers: { [key: string]: string } = {\r\n ...(options.refreshToken && { [SCHEMES.X_REFRESH_TOKEN]: `${this.refreshToken}` }),\r\n ...(!options.isFormData && { [SCHEMES.CONTENT_TYPE]: 'application/json' }),\r\n [SCHEMES.AUTHORIZATION]: `Bearer ${this.accessToken}`,\r\n ...(this.needTenant && { [SCHEMES.X_TENANT]: `${this.tenantToken}` })\r\n };\r\n\r\n return new HttpHeaders({ ...headers, ...options.headers });\r\n }\r\n\r\n private buildApiOptions(\r\n baseUrl: string,\r\n path: string = '',\r\n method: EMethod = EMethod.GET,\r\n requestBody: any = null,\r\n headers?: { [key: string]: string }\r\n ): IApiOptions {\r\n\r\n const requestUrl = ApiHelper.buildUrl(baseUrl, path);\r\n const isFormData = requestBody && requestBody instanceof FormData;\r\n return {\r\n ...this.apiOptions,\r\n ...{ headers, method, requestUrl, requestBody, isFormData }\r\n };\r\n }\r\n\r\n\r\n private async toWaitForPreviousRequest() {\r\n this.isRevokingToken &&\r\n (await waitUntil(() => !this.isRevokingToken));\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n this.config.waitEachRequest?.milliseconds &&\r\n (await waitFor(this.config.waitEachRequest.milliseconds, this.isRequesting));\r\n }\r\n\r\n\r\n private async handleOnTokenRevoked(response: any): Promise<void> {\r\n\r\n if (response?.status) {\r\n // If the response is successful, update the access token\r\n this.accessToken = response.message;\r\n\r\n } else {\r\n // If the response indicates an error, invoke the onRevokeUnauthorized hook\r\n console.warn('Token revocation failed, refresh token is expired.', response.message);\r\n await ApiHelper.invokeHook(this.config.onRevokeUnauthorized);\r\n }\r\n\r\n }\r\n\r\n private async interceptRevokeToken() {\r\n\r\n if (this.isRevokingToken) {\r\n console.warn('Token is already being revoked. Waiting for the current operation to complete...');\r\n await waitUntil(() => !this.isRevokingToken);\r\n return true;\r\n }\r\n\r\n if (!this.refreshToken) {\r\n // await ApiHelper.invokeHook(this.apiConfigs.onAutoLogout);\r\n throw new Error('Refresh token is missing. Please login again.');\r\n }\r\n return false;\r\n }\r\n\r\n validateConfig(): void {\r\n const config = this.configSubject.value as ILocalizeApiConfigs;\r\n if (this.localizeTokenService.config.needTenant && !config.tenantTokenName?.trim().length) {\r\n throw Error('Tenant token is required but tenantTokenName is not configured');\r\n }\r\n\r\n if (!this.localizeTokenService.config.revokeTokenUrl.trim().length) {\r\n throw Error('Revoke token URL is not configured - token refresh will not work');\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { LocalizeTokenService } from './localize.token.service';\r\nimport { LocalizeApiService } from './localize.api.service';\r\n\r\n@NgModule({\r\n providers: [\r\n LocalizeTokenService,\r\n LocalizeApiService\r\n ]\r\n})\r\nexport class LocalizeTokenModule { }","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { DynamicDialogConfig, DynamicDialogRef } from \"primeng/dynamicdialog\";\r\nimport { JwtPayload, LocalizeTokenService } from \"../localize-token/localize.token.service\";\r\nimport { LocalizeToken } from \"../localize-token/localize.token\";\r\nimport { ILoginDialogConfig, ILoginDialogProperties } from \"./localize-logindlg.service\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Component({\r\n styles: [`\r\n #login-dlg-wrap {\r\n width: 100%;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n padding: 30px;\r\n height: 100%;\r\n }\r\n \r\n .login-dlg-elm {\r\n margin-top: 1rem;\r\n }\r\n\r\n .login-dlg-elm.login-dlg-suggest {\r\n display: flex ;\r\n align-items: center;\r\n user-select: none;\r\n border-bottom: solid 1px #ddd;\r\n border-radius: 5px;\r\n padding: 5px 10px;\r\n background: #f9f9f9;\r\n box-shadow: 1px 5px 10px -12px #000;\r\n }\r\n \r\n #login-dlg-header {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n \r\n #login-dlg-header h3 {\r\n font-weight: bold;\r\n font-size: 0.9rem;\r\n color: orange;\r\n text-align: center;\r\n }\r\n \r\n #login-logo {\r\n height: 55px;\r\n width: 55px;\r\n /* background: url(\"/assets/images/logo-300px.png\") no-repeat; */\r\n background-size: contain !important;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup {\r\n height: 45px;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon {\r\n height: 45px;\r\n border-radius: 15px 0 0 15px;\r\n width: 50px;\r\n }\r\n #login-dlg-content *{\r\n font-size: .9rem;\r\n /* font-family: 'Lexend', 'Roboto', sans-serif, 'material-icons-round'; */\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon * {\r\n font-size: 1rem;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup input {\r\n height: 45px;\r\n border-radius: 0 15px 15px 0;\r\n }\r\n \r\n #login-dlg-content button {\r\n height: 45px;\r\n border-radius: 15px;\r\n }\r\n \r\n /*check animation block*/\r\n \r\n .check-animation-wrap {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: calc(100% - 200px);\r\n min-height: 400px;\r\n }\r\n \r\n .check-main-container {\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n \r\n .check-container {\r\n width: 6.25rem;\r\n height: 7.5rem;\r\n display: flex;\r\n flex-flow: column;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n \r\n .check-container .check-background {\r\n width: 100%;\r\n height: calc(100% - 1.25rem);\r\n background: linear-gradient(to bottom right, #5de593, #41d67c);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n transform: scale(0.84);\r\n border-radius: 50%;\r\n animation: animateContainer 0.75s ease-out forwards 0.75s;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n }\r\n \r\n .check-container .check-background svg {\r\n width: 65%;\r\n transform: translateY(0.25rem);\r\n stroke-dasharray: 80;\r\n stroke-dashoffset: 80;\r\n animation: animateCheck 0.35s forwards 1.25s ease-out;\r\n min-width: auto !important;\r\n }\r\n \r\n .check-container .check-shadow {\r\n bottom: calc(-15% - 5px);\r\n left: 0;\r\n border-radius: 50%;\r\n background: radial-gradient(closest-side, rgba(73, 218, 131, 1), transparent);\r\n animation: animateShadow 0.75s ease-out forwards 0.75s;\r\n }\r\n \r\n @keyframes animateContainer {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 25% {\r\n opacity: 1;\r\n transform: scale(0.9);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 43.75% {\r\n transform: scale(1.15);\r\n box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 62.5% {\r\n transform: scale(1);\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 81.25% {\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 100% {\r\n opacity: 1;\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n }\r\n \r\n @keyframes animateCheck {\r\n from {\r\n stroke-dashoffset: 80;\r\n }\r\n \r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n \r\n @keyframes animateShadow {\r\n 0% {\r\n opacity: 0;\r\n width: 100%;\r\n height: 15%;\r\n }\r\n \r\n 25% {\r\n opacity: 0.25;\r\n }\r\n \r\n 43.75% {\r\n width: 40%;\r\n height: 7%;\r\n opacity: 0.35;\r\n }\r\n \r\n 100% {\r\n width: 85%;\r\n height: 15%;\r\n opacity: 0.25;\r\n }\r\n }\r\n #login-dlg-wrap .loader-wrap {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height:100%;\r\n width:100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n background: #ffffff42;\r\n backdrop-filter: blur(1px);\r\n }\r\n\r\n #login-dlg-wrap .login-dlg-loader {\r\n border: 15px solid #e7e7e7;\r\n border-top: 15px solid #52dba1;\r\n border-radius: 50%;\r\n width: 100px;\r\n height: 100px;\r\n animation: spinloader 2s linear infinite;\r\n }\r\n\r\n #login-dlg-wrap .loader-wrap::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 70px;\r\n height: 70px;\r\n transform: translate(-50%, -50%);\r\n z-index: 1;\r\n border: 15px solid #e7e7e700;\r\n border-top: 15px solid #52dba1c9;\r\n border-radius: 50%;\r\n animation: spinloader .75s linear infinite;\r\n }\r\n\r\n @keyframes spinloader {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `<p-toast key=\"$login-dlg\" position=\"top-center\"></p-toast>\r\n <div id=\"login-dlg-wrap\">\r\n <div id=\"login-dlg-header\">\r\n <div id=\"login-logo\" class=\"p-mb-2\" style=\"background: url('{{properties.logoImage}}') no-repeat\"></div>\r\n <h3 *ngIf=\"!success\" [innerHTML]=\"sanitizedTitle\"></h3>\r\n <h3 *ngIf=\"success\" style=\"color:green !important;\">{{properties.loginSuccessMessage}}</h3>\r\n </div>\r\n <div id=\"login-dlg-content\">\r\n <ng-container *ngIf=\"!success\">\r\n <div *ngIf=\"loading\" class=\"loader-wrap\">\r\n <div class=\"login-dlg-loader\"></div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">person</i>\r\n </span>\r\n <input disabled pInputText type=\"text\" placeholder=\"{{properties.username?.placeHolder}}\" [value]=\"decodeToken?.email\" />\r\n </div>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">lock</i>\r\n </span>\r\n <input [disabled]=\"loading\" (keydown.enter)=\"clickLogin()\" pInputText type=\"password\" \r\n placeholder=\"{{properties.password?.placeHolder}}\" [(ngModel)]=\"password\"\r\n autofocus />\r\n </div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <button style=\"width: 100%;\" pButton type=\"button\" label=\"{{properties.loginButton?.placeHolder}}\" (click)=\"clickLogin()\"\r\n [disabled]=\"!password || loading\"></button>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm login-dlg-suggest\" style=\"display:flex;align-items: center;user-select: none;\">\r\n <span>{{properties.logoutButton?.message}}</span>\r\n <button class=\"p-button-text\" pButton type=\"button\" label=\"{{properties.logoutButton?.placeHolder}}\" \r\n (click)=\"clickLogout()\"></button>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"success\">\r\n <div style=\"margin-top:35px;\"></div>\r\n <div class=\"check-animation-wrap\">\r\n <div class=\"check-main-container\">\r\n <div class=\"check-container\">\r\n <div class=\"check-background\">\r\n <svg viewBox=\"0 0 65 51\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 25L27.3077 44L58.5 7\" stroke=\"white\" stroke-width=\"13\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>`,\r\n selector: \"app-localize-logindlg\",\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class LocalizeLogindlgComponent implements OnInit {\r\n readonly messageKey = \"$login-dlg\";\r\n password: any;\r\n readonly decodeToken: JwtPayload | null;\r\n loading = false;\r\n success = false;\r\n private get config() { return this.tokenService.config; }\r\n private readonly loginConfig: ILoginDialogConfig\r\n\r\n private logout?: () => any\r\n private loginUrl?: string;\r\n readonly properties: ILoginDialogProperties;\r\n\r\n\r\n constructor(\r\n private readonly messageService: MessageService,\r\n private readonly cdt: ChangeDetectorRef,\r\n private readonly dlgRef: DynamicDialogRef,\r\n private readonly dlgConfig: DynamicDialogConfig,\r\n private readonly tokenService: LocalizeTokenService,\r\n private readonly httpClient: HttpClient,\r\n private readonly sanitizer: DomSanitizer\r\n ) {\r\n this.decodeToken = this.tokenService.decodeRefreshToken;\r\n this.loginConfig = this.dlgConfig.data.loginConfig;\r\n this.properties = this.loginConfig.properties!;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dlgConfig.closable = false;\r\n this.logout = this.loginConfig.logoutFunc;\r\n this.loginUrl = this.loginConfig.loginUrl\r\n\r\n if (!this.decodeToken) {\r\n this.showMessage(\"error\", \"Token is invalid\");\r\n setTimeout(() => this.logout?.(), 2000);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdt.detectChanges();\r\n }\r\n\r\n async clickLogin() {\r\n if (!this.isValidPassword) {\r\n return this.showMessage(\"error\", \"Password is required and must be at least 6 characters\");\r\n }\r\n\r\n this.loading = true;\r\n const loginRes = await this.login();\r\n if (!loginRes?.status) {\r\n return this.showMessage(\"error\", loginRes.message ?? \"An error occurred\");\r\n }\r\n\r\n this.tokenService.accessToken = loginRes.tokens.accessToken;\r\n const cookieOptions = { expires: this.loginConfig.expire ?? 365 }\r\n LocalizeToken.storage.set(this.config.refreshTokenName!, loginRes.tokens.refreshToken, cookieOptions);\r\n this.success = true;\r\n setTimeout(() => {\r\n this.dlgConfig.dismissableMask = true;\r\n this.dlgConfig.modal = false;\r\n this.dlgRef.close(true);\r\n }, 2000);\r\n }\r\n\r\n private async login() {\r\n if (!this.loginUrl?.trim().length) {\r\n this.showMessage(\"error\", \"Login url is required\");\r\n throw new Error(\"Login url is required\");\r\n }\r\n\r\n try {\r\n\r\n if (this.loginConfig.loginFunction) {\r\n console.log(\"Using custom login function\");\r\n return await this.loginConfig.loginFunction(this.decodeToken?.email ?? '', this.password.trim(), this.getHeaders());\r\n }\r\n\r\n return await new Promise<any>((resolve, reject) =>\r\n this.httpClient.post(this.loginUrl!,\r\n { password: this.password.trim() },\r\n { headers: this.getHeaders() }).subscribe({ next: resolve, error: reject }));\r\n\r\n } catch (e: any) {\r\n this.showMessage(\"error\", e.message);\r\n return null;\r\n }\r\n }\r\n\r\n private getHeaders() {\r\n return {\r\n [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: LocalizeToken.storage.get(this.config.refreshTokenName!) ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: LocalizeToken.storage.get(this.loginConfig.tenantTokenName!) ?? \"\",\r\n };\r\n }\r\n\r\n get isValidPassword(): boolean {\r\n this.loading = false;\r\n return this.properties.passwordValidator\r\n ? this.properties.passwordValidator(this.password)\r\n : this.password && this.password.trim().length >= 6 && this.password.trim().length <= 50;\r\n }\r\n\r\n clickLogout = () => this.logout?.();\r\n\r\n private showMessage(severity: string, summary: string) {\r\n this.messageService.add({ key: this.messageKey, severity, summary });\r\n this.loading = false;\r\n }\r\n\r\n get sanitizedTitle() {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.properties.title ?? '');\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { LocalizeLogindlgComponent } from './localize-logindlg.component';\nexport interface ILoginDialogPlaceHolder {\n /**\n * Message to display in the input field, typically used for error messages or hints.\n * This is optional and can be used to provide additional context or instructions to the user.\n */\n message?: string;\n /**\n * Placeholder or label text for the input field\n */\n placeHolder?: string;\n}\n\nexport interface ILoginDialogProperties {\n /**\n * Title of the login dialog\n */\n title?: string;\n loginSuccessMessage?: string;\n /**\n * Logog image path or URL to display in the login dialog\n * If not provided, the \"/assets/images/logo-300px.png\" image will be used.\n */\n logoImage?: string;\n username?: ILoginDialogPlaceHolder;\n password?: ILoginDialogPlaceHolder;\n loginButton?: ILoginDialogPlaceHolder;\n logoutButton?: ILoginDialogPlaceHolder;\n /**\n * Function to validate the password.\n * If not provided, the default validation checks if the password is between 6 and 50 characters long.\n * @param password\n * @returns\n */\n passwordValidator?: (password: string) => boolean;\n}\n\nexport interface ILoginDialogConfig {\n loginUrl?: string;\n logoutUrl?: string;\n loginFunction?: (username: string, password: string, headers?: { [key: string]: string }) => Promise<any>;\n logoutFunc?: () => void;\n /**\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\n */\n expire?: number;\n tenantTokenName?: string;\n /**\n * Configuration for the login dialog.\n * This interface defines the properties that can be used to customize the login dialog's behavior and appearance\n */\n properties?: ILoginDialogProperties;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeLogindlgService {\n\n constructor(private readonly injector: Injector) { }\n\n async openLoginDialog(loginConfig: ILoginDialogConfig, config?: DynamicDialogConfig) {\n\n config = this.intercepDialogConfig(config);\n this.initConfig(loginConfig);\n\n config.data = { ...(config.data || {}), ...{ loginConfig } };\n\n const dialogService = this.injector.get(DialogService);\n const dialog = dialogService.open(LocalizeLogindlgComponent, config);\n\n await new Promise<void>((resolve) =>\n dialog.onClose.subscribe(res => {\n if (res) {\n resolve();\n }\n }));\n }\n\n private intercepDialogConfig(config?: DynamicDialogConfig) {\n config ??= {\n header: 'Login',\n style: { 'max-width': '400px', width: '100%', 'height': '650px' },\n modal: true,\n closable: false,\n showHeader: false,\n }\n\n config = {\n ...config, ...{\n contentStyle: { 'height': '100%', 'border-radius': '20px' }\n }\n }\n config.style = { ...config.style, ...{ 'border-radius': '20px' } };\n return config;\n }\n\n\n private initConfig(loginConfig: ILoginDialogConfig) {\n loginConfig ??= {}\n loginConfig.properties ??= {\n title: 'Your session is expired!<br/> Please login again to continue.',\n loginSuccessMessage: 'You have successfully logged in.',\n logoImage: '/assets/images/logo-300px.png',\n username: { placeHolder: 'Username' },\n password: { placeHolder: 'Password' },\n loginButton: { placeHolder: 'Login' },\n logoutButton: {\n message: 'No, I want to login with another user.',\n placeHolder: 'Logout'\n }\n }\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { LocalizeLogindlgComponent } from \"./localize-logindlg.component\";\nimport { ToastModule } from \"primeng/toast\";\nimport { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { LocalizeLogindlgService } from \"./localize-logindlg.service\";\n\n@NgModule({\n declarations: [LocalizeLogindlgComponent],\n exports: [LocalizeLogindlgComponent],\n imports: [\n CommonModule,\n ToastModule,\n InputTextModule,\n BrowserModule,\n FormsModule,\n ButtonModule,\n ],\n providers: [LocalizeLogindlgService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class LocalizeLogindlgModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sambath999-localize-token.js","sources":["../../src/localize-token/helpers/localize.api.assets.ts","../../src/localize-token/localize.token.storage.ts","../../src/localize-token/localize.token.ts","../../src/localize-token/localize.token.service.ts","../../src/localize-token/helpers/interfaces.ts","../../src/localize-token/helpers/loccalize.api.helper.ts","../../src/localize-token/localize.api.service.ts","../../src/localize-token/localize.token.module.ts","../../src/localize-logindlg/localize-logindlg.component.ts","../../src/localize-logindlg/localize-logindlg.service.ts","../../src/localize-logindlg/localize-logindlg.module.ts","../../src/sambath999-localize-token.ts"],"sourcesContent":["export const LOCALIZE_API_ASSETS = {\r\n network: {\r\n noConnection: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <svg id=\"lze-no-connection\" data-name=\"Layer 2\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 77.29 70.98\">\r\n <defs>\r\n <style> .cls-1 { fill: #fff; } .cls-2, .cls-3 { fill: #e30613; } .cls-3 { stroke: #e30613; stroke-miterlimit: 10; stroke-width: .25px; } </style>\r\n </defs>\r\n <g id=\"Layer_3\" data-name=\"Layer 3\">\r\n <g>\r\n <path class=\"cls-1\" d=\"m73.29,35c-1.2,0-2.33-.53-3.09-1.46-.48-.57-11.23-13.2-31.55-13.2s-31.11,12.66-31.56,13.2c-1.4,1.71-3.92,1.95-5.63.55-1.71-1.4-1.95-3.92-.55-5.63.54-.66,13.47-16.12,37.74-16.12s37.2,15.46,37.74,16.12c1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.61.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m63.96,45.66c-1.19,0-2.32-.53-3.08-1.44-5.79-6.05-13.86-9.39-22.24-9.21-8.38-.18-16.45,3.16-22.24,9.22-1.46,1.65-3.99,1.81-5.64.35-1.57-1.39-1.8-3.77-.52-5.43,7.32-7.89,17.64-12.29,28.4-12.12,10.76-.17,21.08,4.24,28.4,12.12,1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.6.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m53.3,56.32c-1.24,0-2.41-.57-3.16-1.55-5.73-6.35-15.52-6.85-21.87-1.13-.4.36-.77.73-1.13,1.13-1.36,1.73-3.88,2.03-5.61.67-1.71-1.34-2.03-3.8-.73-5.54,8.39-9.85,23.18-11.04,33.03-2.65.95.81,1.84,1.69,2.65,2.65,1.34,1.75,1,4.26-.75,5.6-.7.53-1.55.82-2.43.82Z\"/>\r\n </g>\r\n <path class=\"cls-2\" d=\"m47.21,9.45l-4.06,41.36c-.64,5.42-8.39,5.39-9.01,0,0,0-4.06-41.36-4.06-41.36-.46-4.73,2.99-8.94,7.72-9.4,5.33-.58,9.97,4.09,9.4,9.4h0Z\"/>\r\n <circle class=\"cls-3\" cx=\"38.64\" cy=\"64.79\" r=\"6.07\"/>\r\n </g>\r\n </svg>`\r\n }\r\n}","import { extractMainDomain } from \"./localize.token\";\r\n\r\nexport interface ICookieOptions {\r\n /**\r\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\r\n */\r\n expires?: number | Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n samesite?: \"strict\" | \"lax\" | \"none\";\r\n}\r\n\r\n/**\r\n* Assembly of @package ng2-cookies @see https://www.npmjs.com/package/ng2-cookies\r\n*\r\n* Reassembled by\r\n* @author sambath999\r\n* @date_29_09_2021\r\n* Updated from raw parameters to\r\n* @param {ICookieOptions} options and added another newer cookie flag\r\n* @param {string} samesite\r\n* @param {constant} SameSiteTypes, @param {string} strict \"strict\", @param {string} lax \"lax\", @param {string} none \"none\"\r\n*\r\n* @enum\r\n*/\r\nexport class LocalizeTokenStorage {\r\n\r\n private get getDefaultOptions(): ICookieOptions {\r\n const mainDomain = extractMainDomain(window.location.hostname);\r\n return {\r\n path: '/',\r\n domain: mainDomain,\r\n secure: true,\r\n // samesite: SameSiteType.strict,\r\n expires: 1\r\n }\r\n }\r\n\r\n private readonly defaultOptions: ICookieOptions;\r\n constructor(_defaultOptions?: ICookieOptions) {\r\n this.defaultOptions = _defaultOptions ?? this.getDefaultOptions;\r\n }\r\n\r\n /**\r\n * Checks the existence of a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the cookie\r\n * @returns existence of the cookie\r\n */\r\n check(name: string): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n return regexp.test(document.cookie);\r\n }\r\n\r\n /**\r\n * Retrieves a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the Cookie\r\n * @returns The Cookie's value\r\n */\r\n get(name: string): string | undefined {\r\n if (!this.check(name)) return undefined;\r\n\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n const result = regexp.exec(document.cookie);\r\n return result ? decodeURIComponent(result[1]) : undefined;\r\n }\r\n\r\n /**\r\n * Retrieves a a list of all cookie avaiable\r\n *\r\n * @returns Object with all Cookies\r\n */\r\n getAll(): any {\r\n const cookies: any = {};\r\n if (document.cookie) {\r\n const split = document.cookie.split(';');\r\n for (const s of split) {\r\n const currCookie = s.split('=');\r\n currCookie[0] = currCookie[0].trim();\r\n cookies[decodeURIComponent(currCookie[0])] = decodeURIComponent(currCookie[1]);\r\n }\r\n }\r\n\r\n return cookies;\r\n }\r\n\r\n set(name: string, value: string, options?: ICookieOptions) {\r\n options ??= this.defaultOptions;\r\n const { expires, path, domain, secure, samesite } = { ...this.defaultOptions, ...options };\r\n let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`;\r\n\r\n if (expires) {\r\n const dtExpires = typeof expires === 'number' ? new Date(Date.now() + expires * 864e5) : expires;\r\n cookieStr += `expires=${dtExpires.toUTCString()};`;\r\n }\r\n\r\n cookieStr += path ? `path=${path};` : '';\r\n cookieStr += domain ? `domain=${domain};` : '';\r\n cookieStr += secure ? 'secure;' : '';\r\n cookieStr += samesite ? `samesite=${samesite};` : '';\r\n\r\n document.cookie = cookieStr;\r\n }\r\n\r\n /**\r\n * Removes specified Cookie\r\n *\r\n * @param {string} name Cookie's identification\r\n * @param {string} path Path relative to the domain where the cookie should be avaiable. Default /\r\n * @param {string} domain Domain where the cookie should be avaiable. Default current domain\r\n */\r\n delete(name: string, path: string = '/', domain: string = window.location.hostname): void {\r\n this.set(name, '', { path, domain, expires: -1 });\r\n }\r\n\r\n /**\r\n * Delete all cookie avaiable\r\n */\r\n deleteAll(path?: string, domain?: string): void {\r\n const cookies = this.getAll();\r\n\r\n for (const cookieName of Object.keys(cookies)) {\r\n this.delete(cookieName, path, domain);\r\n }\r\n }\r\n\r\n}\r\n","import { LocalizeTokenStorage } from \"./localize.token.storage\";\r\n\r\ninterface ILocalizeTokenTokens {\r\n name: string;\r\n requestUrl?: string;\r\n}\r\n\r\nexport interface ILocalizeTokenConfig {\r\n /**\r\n * The main domain of the application to set the cookies to be available for cross application with subdomains.\r\n * \r\n * Default is location.hostname (current domain) and automatically set extracted main domain if it is subdomain.\r\n */\r\n mainDomain?: string;\r\n \r\n isProduction: boolean;\r\n authToken?: ILocalizeTokenTokens;\r\n refreshToken?: ILocalizeTokenTokens;\r\n tenantToken?: ILocalizeTokenTokens;\r\n}\r\n\r\nexport class LocalizeToken {\r\n\r\n static readonly storage = new LocalizeTokenStorage();\r\n\r\n static readonly httpHeaders = {\r\n AUTHORIZATION: 'Authorization',\r\n X_TENANT: 'X-Tenant',\r\n X_REFRESH_TOKEN: 'X-RefreshToken',\r\n CONTENT_TYPE: 'Content-Type',\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Waits for a specified amount of time.\r\n * @param milliseconds - The milliseconds to wait.\r\n * @param when - The condition to wait for. Default is true.\r\n * @returns - Promise<void>\r\n */\r\nexport async function waitFor(milliseconds: number, when: boolean = true) {\r\n if (!when) return;\r\n await new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n/**\r\n * Waits until the condition is met.\r\n * @param when - The condition to wait for.\r\n * @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.\r\n */\r\nexport async function waitUntil(when: () => any, intervalNumber: number = 50) {\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n const cond = when();\r\n const result = cond instanceof Promise ? await cond : cond;\r\n if (result) {\r\n clearInterval(interval);\r\n resolve(true);\r\n }\r\n }, intervalNumber);\r\n });\r\n}\r\n\r\nexport function extractMainDomain(subdomain?: string): string {\r\n subdomain ??= window.location.hostname;\r\n const parts = subdomain.split('.');\r\n return parts.length > 2 ? parts.slice(-2).join('.') : subdomain;\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { extractMainDomain, ILocalizeTokenConfig, LocalizeToken } from './localize.token';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as jwt_decode from 'jwt-decode';\r\nexport interface JwtPayload extends jwt_decode.JwtPayload {\r\n // Define the structure of your JWT payload here\r\n email: string;\r\n sub: string;\r\n name: string;\r\n iat: number;\r\n exp: number;\r\n // Add other fields as needed\r\n}\r\n\r\ninterface IAuthToken {\r\n token: string;\r\n revoke: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LocalizeTokenService implements OnDestroy {\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeTokenConfig>>({});\r\n readonly isRevokingTokenSubject = new BehaviorSubject<boolean>(false);\r\n private readonly defaultConfig: Partial<ILocalizeTokenConfig> = {\r\n mainDomain: extractMainDomain(),\r\n authToken: {\r\n name: 'auth-token',\r\n },\r\n refreshToken: {\r\n name: 'refresh-token',\r\n requestUrl: '/api/token/revoke'\r\n },\r\n }\r\n\r\n get config(): ILocalizeTokenConfig {\r\n this.throwIfNotInitialized();\r\n return this.configSubject.value as ILocalizeTokenConfig;\r\n }\r\n\r\n private isInitialized = false;\r\n\r\n init(config: ILocalizeTokenConfig) {\r\n console.log('LocalizeTokenService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n this.isInitialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // this.configSubject.complete();\r\n // this.isRevokingTokenSubject.complete();\r\n }\r\n\r\n private get authToken() { return this.storageGet() }\r\n private set authToken(value: IAuthToken | undefined) {\r\n value\r\n ? this.storageSet(value)\r\n : LocalizeToken.storage.delete(this.config.authToken?.name!);\r\n }\r\n\r\n get refreshToken() { return LocalizeToken.storage.get(this.config.refreshToken?.name || '') }\r\n get accessToken() { return this.authToken?.token }\r\n\r\n set accessToken(value: string | undefined) {\r\n value && (this.authToken = { token: value, revoke: false })\r\n }\r\n\r\n get isRevokingToken() { return this.isRevokingTokenSubject.value /* this.authToken?.revoke ?? false */ }\r\n\r\n set isRevokingToken(value: boolean) {\r\n this.isRevokingTokenSubject.next(value);\r\n this.authToken && (this.authToken = { ...this.authToken, revoke: value })\r\n }\r\n\r\n tenantToken() {\r\n return LocalizeToken.storage.get(this.config.tenantToken?.name || '');\r\n }\r\n\r\n private storageGet() {\r\n try {\r\n const encoded = LocalizeToken.storage.get(this.config.authToken?.name || '');\r\n const decoded = atob(encoded || '');\r\n return JSON.parse(decoded) as IAuthToken;\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n\r\n private storageSet(value: IAuthToken) {\r\n const base64 = btoa(JSON.stringify(value));\r\n LocalizeToken.storage.set(this.config.authToken?.name || '', base64);\r\n }\r\n\r\n tokensValid(): boolean {\r\n return !!this.refreshToken?.length\r\n && (!this.config.tenantToken || !!this.tenantToken()?.length);\r\n }\r\n\r\n decodeToken = (token: string) => jwt_decode.jwtDecode<JwtPayload>(token);\r\n get decodeRefreshToken() {\r\n const token = this.refreshToken;\r\n return !token ? null : this.decodeToken(token);\r\n }\r\n\r\n private throwIfNotInitialized() {\r\n if (!this.isInitialized) {\r\n throw new Error('LocalizeTokenService is not initialized. Call init() method before using it.');\r\n }\r\n }\r\n\r\n}\r\n","\r\n/**\r\n * Http method options\r\n */\r\nexport enum EMethod {\r\n POST = 'post',\r\n GET = 'get',\r\n PUT = 'put',\r\n DELETE = 'delete',\r\n PATCH = 'patch',\r\n}\r\n\r\nexport interface IOnConnectionError {\r\n /**\r\n * Callback function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n callback?: (error: INormalizedError) => Promise<void> | any;\r\n /**\r\n * If true, the request will block the screen with overlay on connection errors.\r\n * Default is false.\r\n */\r\n blockScreen?: boolean;\r\n\r\n /** Optional z-index for the block screen overlay.\r\n * Default is 10000.\r\n */\r\n blockScreenZIndex?: number;\r\n\r\n /**\r\n * Optional message to display when a connection error occurs.\r\n */\r\n message?: string;\r\n suggestionMessage?: string;\r\n}\r\n\r\ninterface IRetryOptions {\r\n\r\n /**\r\n * Maximum number of retries for a failed request.\r\n * Default is 100.\r\n */\r\n maxRetries?: number;\r\n\r\n /**\r\n * Delay in milliseconds before retrying a failed request.\r\n * Default is 500ms.\r\n */\r\n delay?: number;\r\n\r\n /**\r\n * Function to determine if a request should be retried based on the error.\r\n * If not provided, the default function will retry for network errors and server errors (status 500-599).\r\n * @param error - The error object from the failed request.\r\n * @returns true if the request should be retried, false otherwise.\r\n */\r\n retryFunction?: (error: INormalizedError) => Promise<boolean> | any;\r\n\r\n /**\r\n * Function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n onConnectionError?: IOnConnectionError;\r\n\r\n}\r\n\r\nexport interface ILocalizeApiConfigs {\r\n onPrepareRequest?: () => Promise<void> | any;\r\n onAutoLogout?: () => Promise<void> | any;\r\n onRevokeUnauthorized?: () => Promise<void> | any;\r\n\r\n waitEachRequest?: {\r\n milliseconds: number;\r\n };\r\n enableRequestCancellation?: boolean;\r\n\r\n /**\r\n * Config for retrying failed requests.\r\n * If not provided, the default retry options will be used.\r\n */\r\n retryOptions?: IRetryOptions;\r\n}\r\n\r\nexport interface IApiOptions {\r\n headers?: { [key: string]: string };\r\n method: EMethod;\r\n requestUrl: string;\r\n requestBody?: any;\r\n isFormData?: boolean;\r\n /**\r\n * If true, the request will use the refresh token for authorization.\r\n */\r\n refreshToken?: boolean;\r\n}\r\n\r\nexport interface IHeader {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface INormalizedError {\r\n code: string;\r\n message: string;\r\n details?: any;\r\n status: number;\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { IApiOptions, ILocalizeApiConfigs, INormalizedError, IOnConnectionError } from \"./interfaces\";\r\nimport { takeUntil, catchError, throwError, Subject } from \"rxjs\";\r\nimport { waitFor } from \"../localize.token\";\r\nimport { LOCALIZE_API_ASSETS } from \"./localize.api.assets\";\r\n\r\ninterface IRequestInstance {\r\n client: HttpClient;\r\n destroy$: () => Subject<void>;\r\n}\r\n\r\ninterface IRetryOptions {\r\n maxRetries: () => number;\r\n delay: number;\r\n callback: () => Promise<any> | any;\r\n retryUnless?: (error: any) => boolean;\r\n onError?: (error: any) => Promise<void> | any;\r\n connectionError?: IOnConnectionError\r\n}\r\n\r\nclass LocalizeApiHelper {\r\n\r\n readonly defaultRetryOptions: Partial<IRetryOptions> = {\r\n connectionError: {\r\n message: 'Connection error occurred. Please wait',\r\n blockScreen: true,\r\n blockScreenZIndex: 10000\r\n }\r\n };\r\n\r\n async performRetry<T = any>(options: IRetryOptions): Promise<T> {\r\n let attempts = 0;\r\n let lastError: any;\r\n let consoleCount = 0;\r\n\r\n // Merge default retry options with provided options\r\n options = { ...this.defaultRetryOptions, ...options }\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n\r\n while (attempts < options.maxRetries()) {\r\n try {\r\n const result = await options.callback();\r\n this.removeBlocker(styleElement);\r\n return result;\r\n\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (consoleCount >= 7) {\r\n console.clear();\r\n consoleCount = 0;\r\n }\r\n\r\n if (options.retryUnless && !options.retryUnless(error))\r\n throw error; // If the error should not be retried, rethrow it\r\n\r\n // Handle connection error\r\n styleElement = await this.onConnectionError(options, error);\r\n\r\n if (options.onError)\r\n await this.invokeHook(options.onError.bind(this, error));\r\n\r\n if (attempts >= options.maxRetries() - 1)\r\n throw error;\r\n\r\n attempts++;\r\n consoleCount++;\r\n console.warn(`Attempt ${attempts} failed. Retrying...`, error);\r\n await waitFor(options.delay);\r\n }\r\n }\r\n\r\n console.warn(`Failed after ${options.maxRetries} attempts`);\r\n throw lastError;\r\n }\r\n\r\n async performRequestWithRetry<T = any>(\r\n options: IApiOptions,\r\n config: ILocalizeApiConfigs,\r\n performRequest: <T = any>(options: IApiOptions) => Promise<T>\r\n ): Promise<T> {\r\n\r\n const retryUnless = config.retryOptions?.retryFunction\r\n || this.isConnectionError;\r\n\r\n return await this.performRetry({\r\n connectionError: config.retryOptions?.onConnectionError,\r\n maxRetries: () => config.retryOptions?.maxRetries ?? 1000,\r\n delay: config.retryOptions?.delay ?? 500,\r\n callback: () => performRequest<T>(options),\r\n retryUnless: retryUnless,\r\n })\r\n }\r\n\r\n buildUrl(baseUrl: string, path: string): string {\r\n const normalizedUrl = `${baseUrl.trim().replace(/\\/?$/, '/')}${path.trim().replace(/^\\//, '')}`;\r\n return normalizedUrl.endsWith('/')\r\n ? normalizedUrl.slice(0, -1)\r\n : normalizedUrl;\r\n }\r\n\r\n normalizeError(error: HttpErrorResponse): INormalizedError {\r\n return {\r\n code: error.error?.code || `HTTP_${error.status}`,\r\n message: error.error?.message || error.message,\r\n details: error.error?.details,\r\n status: error.status\r\n };\r\n }\r\n\r\n async invokeHook(callback?: () => Promise<any> | any): Promise<any> {\r\n if (!callback) return;\r\n\r\n const result = callback();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n\r\n createRequest<T = any>(\r\n instance: Required<IRequestInstance>,\r\n method: string,\r\n url: string,\r\n body: any,\r\n options: { headers: HttpHeaders }\r\n ) {\r\n const request$ = instance.client.request<T>(method, url, {\r\n ...options,\r\n body,\r\n observe: 'response',\r\n }).pipe(\r\n takeUntil(instance.destroy$()),\r\n catchError((error: HttpErrorResponse) => {\r\n // Convert to a non-observable error to handle in the promise\r\n return throwError(() => this.normalizeError(error));\r\n })\r\n );\r\n\r\n return request$;\r\n }\r\n\r\n defaultRetryFunction(error: INormalizedError): boolean {\r\n\r\n // Don't retry for other errors (like 400, 401, 403, etc.)\r\n if (!this.isConnectionError(error))\r\n throw error;\r\n\r\n return true;\r\n }\r\n\r\n isConnectionError(error: INormalizedError): boolean {\r\n const isNetworkError = error.status === 0;\r\n const isServerError = error.status >= 1000 && error.status < 600;\r\n return isNetworkError || isServerError;\r\n }\r\n\r\n async onConnectionError(\r\n options: IRetryOptions,\r\n error: any\r\n ): Promise<Promise<void> | any> {\r\n\r\n if (!options.connectionError)\r\n return;\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n if (this.isConnectionError(error)) {\r\n\r\n styleElement = this.screenBlocker(options, error, true);\r\n\r\n await this.invokeHook(options.connectionError.callback?.bind(this, error));\r\n return styleElement;\r\n } else {\r\n this.screenBlocker(options, error, false);\r\n styleElement?.remove();\r\n }\r\n }\r\n\r\n screenBlocker(optons: IRetryOptions,\r\n error?: any,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n if (error instanceof HttpErrorResponse)\r\n error = this.normalizeError(error);\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.message || 'An error occurred';\r\n const suggestinMessage = optons.connectionError?.suggestionMessage\r\n || 'Please check your internet connection or the server status.';\r\n\r\n const zIndex = optons.connectionError?.blockScreenZIndex || 10000;\r\n\r\n const body = document.body;\r\n const blcokerHtml = `\r\n <div class=\"lze-blocker\">\r\n ${LOCALIZE_API_ASSETS.network.noConnection}\r\n <div class=\"lze-blocker__message\">\r\n ${message}\r\n <span class=\"lze-blocker__dotting\">\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n </span>\r\n </div>\r\n <div class=\"lze-blocker__error\">${errorMessage}</div>\r\n <div class=\"lze-blocker__error_suggestion\">${suggestinMessage}</div>\r\n </div>\r\n `;\r\n const style = `\r\n div.lze-blocker {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.85) !important;\r\n z-index: ${zIndex};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n color: #fff !important;\r\n font-family: Arial, sans-serif;\r\n text-align: center;\r\n padding: 20px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n svg#lze-no-connection {\r\n width: 75px;\r\n height: 75px;\r\n margin-bottom: 20px;\r\n }\r\n \r\n div.lze-blocker__message {\r\n color: #fff !important;\r\n font-size: 18px !important;\r\n margin-bottom: 10px;\r\n }\r\n \r\n .lze-blocker__dotting {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n span.lze-blocker__dot {\r\n display: inline-block;\r\n width: 7px;\r\n height: 7px;\r\n background-color: #ffffff !important;\r\n border-radius: 50%;\r\n margin-left: 3px;\r\n opacity: 0.3;\r\n animation: dotting 1s infinite;\r\n }\r\n .lze-blocker__dot:nth-child(1) {\r\n animation-delay: 0s;\r\n opacity: 1;\r\n }\r\n .lze-blocker__dot:nth-child(2) {\r\n animation-delay: 0.2s;\r\n }\r\n .lze-blocker__dot:nth-child(3) {\r\n animation-delay: 0.4s;\r\n }\r\n\r\n @keyframes dotting {\r\n 0%, 80%, 100% { opacity: 0.3; }\r\n 40% { opacity: 1; }\r\n }\r\n\r\n div.lze-blocker__error {\r\n color: #f00;\r\n font-size: 14px !important;\r\n margin-bottom: 10px;\r\n text-shadow: 0 0 1px #ff5f5f !important;\r\n }\r\n\r\n div.lze-blocker__error_suggestion {\r\n color: #ccc !important;\r\n font-size: 14px !important;\r\n margin-top: 10px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `;\r\n\r\n const styleElement = document.createElement('style');\r\n\r\n if (add) {\r\n if (!document.querySelector('.lze-blocker')) {\r\n styleElement.innerHTML = style;\r\n document.head.appendChild(styleElement);\r\n body.insertAdjacentHTML('beforeend', blcokerHtml);\r\n }\r\n } else {\r\n this.removeBlocker(styleElement);\r\n }\r\n\r\n return styleElement;\r\n }\r\n\r\n private removeBlocker(styleElement: HTMLStyleElement | undefined): void {\r\n const blocker = document.querySelector('.lze-blocker');\r\n blocker?.remove();\r\n styleElement?.remove();\r\n }\r\n}\r\n\r\nexport const ApiHelper = new LocalizeApiHelper();","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { LocalizeTokenService } from \"./localize.token.service\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { LocalizeToken, waitFor, waitUntil } from \"./localize.token\";\r\nimport { BehaviorSubject, Subject } from \"rxjs\";\r\nimport { ILocalizeApiConfigs, IApiOptions, EMethod, IHeader } from \"./helpers/interfaces\";\r\nimport { ApiHelper } from \"./public-api\";\r\n\r\nconst SCHEMES = LocalizeToken.httpHeaders;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeApiConfigs>>({});\r\n readonly isRequestingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isResolvingStartupSubject = new BehaviorSubject<boolean>(false);\r\n get isResolvingStartup() { return this.isResolvingStartupSubject.value; }\r\n\r\n get needTenant(): boolean { return this.localizeTokenService.config.tenantToken !== undefined; }\r\n\r\n get isRequesting() { return this.isRequestingSubject.value; }\r\n get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }\r\n set isRevokingToken(value: boolean) { this.localizeTokenService.isRevokingToken = value; }\r\n\r\n get accessToken(): string | undefined { return this.localizeTokenService.accessToken; }\r\n set accessToken(value: string | undefined) { this.localizeTokenService.accessToken = value; }\r\n\r\n get refreshToken(): string | undefined { return this.localizeTokenService.refreshToken; }\r\n get tenantToken(): string | undefined { return this.localizeTokenService.tenantToken(); }\r\n\r\n private defaultConfig: Partial<ILocalizeApiConfigs> = {\r\n waitEachRequest: { milliseconds: 0 },\r\n enableRequestCancellation: true,\r\n\r\n retryOptions: {\r\n maxRetries: 1000,\r\n delay: 1000,\r\n retryFunction: ApiHelper.defaultRetryFunction.bind(this),\r\n },\r\n\r\n };\r\n\r\n private get config(): Partial<ILocalizeApiConfigs> {\r\n this.validateConfig();\r\n return this.configSubject.value;\r\n }\r\n\r\n private apiOptions: Partial<IApiOptions> = {\r\n method: EMethod.GET,\r\n requestBody: null,\r\n };\r\n\r\n constructor(readonly httpClient: HttpClient,\r\n private readonly localizeTokenService: LocalizeTokenService\r\n ) { }\r\n\r\n /**\r\n * Initialize the API service.\r\n * @param apiConfigs - The API configurations.\r\n */\r\n init(apiConfigs: ILocalizeApiConfigs) {\r\n console.log('LocalizeApiService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...apiConfigs });\r\n }\r\n\r\n cancelPendingRequests(): void {\r\n this.config.enableRequestCancellation\r\n && this.destroy$.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n // this.isResolvingStartupSubject.complete();\r\n // this.isRequestingSubject.complete();\r\n // this.configSubject.complete();\r\n }\r\n\r\n /**\r\n * A higher-order function that returns a curried function for making API requests.\r\n *\r\n * @param baseUrl - The base URL of the API.\r\n * @returns A curried function that can be used to make API requests.\r\n */\r\n func = (baseUrl: string) =>\r\n <T = any>(path: string, method: EMethod = EMethod.GET, reqBody: any = null, reqHeaders?: IHeader) =>\r\n this.request<T>(baseUrl, path, method, reqBody, reqHeaders)\r\n\r\n public async request<T = any>(baseUrl: string,\r\n path: string,\r\n method: EMethod = EMethod.GET,\r\n reqBody: any = null,\r\n reqHeaders?: IHeader): Promise<T> {\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n await ApiHelper.invokeHook(this.config.onPrepareRequest);\r\n\r\n const apiOptions = this.buildApiOptions(baseUrl, path, method, reqBody, reqHeaders);\r\n\r\n try {\r\n await this.toWaitForPreviousRequest();\r\n\r\n return await ApiHelper.performRequestWithRetry<T>(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n }\r\n catch (error: any) {\r\n return await this.handleOnRequestError(error, apiOptions);\r\n }\r\n }\r\n\r\n private async handleOnRequestError(error: HttpErrorResponse, options: IApiOptions): Promise<any> {\r\n if (error.status !== 401)\r\n throw error;\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 500,\r\n retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),\r\n callback: async () => {\r\n // Only handle 401 Unauthorized errors\r\n await this.revokeToken();\r\n\r\n // Retry the request with the new access token\r\n return await this.performRequest(options);\r\n }\r\n })\r\n\r\n }\r\n\r\n private async performRequest<T = any>(options: IApiOptions): Promise<T> {\r\n\r\n // Build the request options\r\n const buildOptions = { headers: this.buildHeaderOptions(options) };\r\n\r\n // Create the request observable\r\n const request$ = ApiHelper.createRequest<T>({\r\n client: this.httpClient,\r\n destroy$: () => this.destroy$\r\n }, options.method, options.requestUrl, options.requestBody, buildOptions);\r\n\r\n // Set the isRequesting state to true before making the request\r\n this.isRequestingSubject.next(true);\r\n\r\n const response = await new Promise<any>((resolve, reject) =>\r\n request$.subscribe({ next: (res) => resolve(res.body), error: reject }));\r\n\r\n // Reset the isRequesting state after the request completes\r\n this.isRequestingSubject.next(false);\r\n\r\n return response;\r\n }\r\n\r\n private async revokeToken(): Promise<void> {\r\n\r\n try {\r\n if (await this.interceptRevokeToken())\r\n return;\r\n\r\n this.isRevokingToken = true;\r\n\r\n const apiOptions: IApiOptions = {\r\n ...this.buildApiOptions(this.localizeTokenService.config.refreshToken?.requestUrl || ''),\r\n refreshToken: true,\r\n }\r\n\r\n // const revokeToken = await this.performRequest(apiOptions);\r\n const revokeToken = await ApiHelper.performRequestWithRetry(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n await this.handleOnTokenRevoked(revokeToken);\r\n\r\n } catch (error: any) {\r\n // Handle the error, log it\r\n await ApiHelper.invokeHook(this.config.onAutoLogout);\r\n\r\n } finally {\r\n // Reset the revoking token state\r\n this.isRevokingToken = false;\r\n }\r\n }\r\n\r\n /** default http request options */\r\n private buildHeaderOptions(options: IApiOptions): HttpHeaders {\r\n\r\n const headers: { [key: string]: string } = {\r\n ...(options.refreshToken && { [SCHEMES.X_REFRESH_TOKEN]: `${this.refreshToken}` }),\r\n ...(!options.isFormData && { [SCHEMES.CONTENT_TYPE]: 'application/json' }),\r\n [SCHEMES.AUTHORIZATION]: `Bearer ${this.accessToken}`,\r\n ...(this.needTenant && { [SCHEMES.X_TENANT]: `${this.tenantToken}` })\r\n };\r\n\r\n return new HttpHeaders({ ...headers, ...options.headers });\r\n }\r\n\r\n private buildApiOptions(\r\n baseUrl: string,\r\n path: string = '',\r\n method: EMethod = EMethod.GET,\r\n requestBody: any = null,\r\n headers?: { [key: string]: string }\r\n ): IApiOptions {\r\n\r\n const requestUrl = ApiHelper.buildUrl(baseUrl, path);\r\n const isFormData = requestBody && requestBody instanceof FormData;\r\n return {\r\n ...this.apiOptions,\r\n ...{ headers, method, requestUrl, requestBody, isFormData }\r\n };\r\n }\r\n\r\n\r\n private async toWaitForPreviousRequest() {\r\n this.isRevokingToken &&\r\n (await waitUntil(() => !this.isRevokingToken));\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n this.config.waitEachRequest?.milliseconds &&\r\n (await waitFor(this.config.waitEachRequest.milliseconds, this.isRequesting));\r\n }\r\n\r\n\r\n private async handleOnTokenRevoked(response: any): Promise<void> {\r\n\r\n if (response?.status) {\r\n // If the response is successful, update the access token\r\n this.accessToken = response.message;\r\n\r\n } else {\r\n // If the response indicates an error, invoke the onRevokeUnauthorized hook\r\n console.warn('Token revocation failed, refresh token is expired.', response.message);\r\n await ApiHelper.invokeHook(this.config.onRevokeUnauthorized);\r\n }\r\n\r\n }\r\n\r\n private async interceptRevokeToken() {\r\n\r\n if (this.isRevokingToken) {\r\n console.warn('Token is already being revoked. Waiting for the current operation to complete...');\r\n await waitUntil(() => !this.isRevokingToken);\r\n return true;\r\n }\r\n\r\n if (!this.refreshToken) {\r\n // await ApiHelper.invokeHook(this.apiConfigs.onAutoLogout);\r\n throw new Error('Refresh token is missing. Please login again.');\r\n }\r\n return false;\r\n }\r\n\r\n validateConfig(): void {\r\n if (this.localizeTokenService.config.tenantToken\r\n && !this.localizeTokenService.config.tenantToken?.name?.trim().length) {\r\n throw Error('Tenant token is required but tenantTokenName is not configured');\r\n }\r\n\r\n if (!this.localizeTokenService.config.refreshToken?.requestUrl?.trim().length) {\r\n throw Error('Revoke token URL is not configured - token refresh will not work');\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { LocalizeTokenService } from './localize.token.service';\r\nimport { LocalizeApiService } from './localize.api.service';\r\n\r\n@NgModule({\r\n providers: [\r\n LocalizeTokenService,\r\n LocalizeApiService\r\n ]\r\n})\r\nexport class LocalizeTokenModule { }","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { DynamicDialogConfig, DynamicDialogRef } from \"primeng/dynamicdialog\";\r\nimport { JwtPayload, LocalizeTokenService } from \"../localize-token/localize.token.service\";\r\nimport { LocalizeToken } from \"../localize-token/localize.token\";\r\nimport { ILoginDialogConfig, ILoginDialogProperties } from \"./localize-logindlg.service\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Component({\r\n styles: [`\r\n #login-dlg-wrap {\r\n width: 100%;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n padding: 30px;\r\n height: 100%;\r\n }\r\n \r\n .login-dlg-elm {\r\n margin-top: 1rem;\r\n }\r\n\r\n .login-dlg-elm.login-dlg-suggest {\r\n display: flex ;\r\n align-items: center;\r\n user-select: none;\r\n border-bottom: solid 1px #ddd;\r\n border-radius: 5px;\r\n padding: 5px 10px;\r\n background: #f9f9f9;\r\n box-shadow: 1px 5px 10px -12px #000;\r\n }\r\n \r\n #login-dlg-header {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n \r\n #login-dlg-header h3 {\r\n font-weight: bold;\r\n font-size: 0.9rem;\r\n color: orange;\r\n text-align: center;\r\n }\r\n \r\n #login-logo {\r\n height: 55px;\r\n width: 55px;\r\n /* background: url(\"/assets/images/logo-300px.png\") no-repeat; */\r\n background-size: contain !important;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup {\r\n height: 45px;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon {\r\n height: 45px;\r\n border-radius: 15px 0 0 15px;\r\n width: 50px;\r\n }\r\n #login-dlg-content *{\r\n font-size: .9rem;\r\n /* font-family: 'Lexend', 'Roboto', sans-serif, 'material-icons-round'; */\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon * {\r\n font-size: 1rem;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup input {\r\n height: 45px;\r\n border-radius: 0 15px 15px 0;\r\n }\r\n \r\n #login-dlg-content button {\r\n height: 45px;\r\n border-radius: 15px;\r\n }\r\n \r\n /*check animation block*/\r\n \r\n .check-animation-wrap {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: calc(100% - 200px);\r\n min-height: 400px;\r\n }\r\n \r\n .check-main-container {\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n \r\n .check-container {\r\n width: 6.25rem;\r\n height: 7.5rem;\r\n display: flex;\r\n flex-flow: column;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n \r\n .check-container .check-background {\r\n width: 100%;\r\n height: calc(100% - 1.25rem);\r\n background: linear-gradient(to bottom right, #5de593, #41d67c);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n transform: scale(0.84);\r\n border-radius: 50%;\r\n animation: animateContainer 0.75s ease-out forwards 0.75s;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n }\r\n \r\n .check-container .check-background svg {\r\n width: 65%;\r\n transform: translateY(0.25rem);\r\n stroke-dasharray: 80;\r\n stroke-dashoffset: 80;\r\n animation: animateCheck 0.35s forwards 1.25s ease-out;\r\n min-width: auto !important;\r\n }\r\n \r\n .check-container .check-shadow {\r\n bottom: calc(-15% - 5px);\r\n left: 0;\r\n border-radius: 50%;\r\n background: radial-gradient(closest-side, rgba(73, 218, 131, 1), transparent);\r\n animation: animateShadow 0.75s ease-out forwards 0.75s;\r\n }\r\n \r\n @keyframes animateContainer {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 25% {\r\n opacity: 1;\r\n transform: scale(0.9);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 43.75% {\r\n transform: scale(1.15);\r\n box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 62.5% {\r\n transform: scale(1);\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 81.25% {\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 100% {\r\n opacity: 1;\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n }\r\n \r\n @keyframes animateCheck {\r\n from {\r\n stroke-dashoffset: 80;\r\n }\r\n \r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n \r\n @keyframes animateShadow {\r\n 0% {\r\n opacity: 0;\r\n width: 100%;\r\n height: 15%;\r\n }\r\n \r\n 25% {\r\n opacity: 0.25;\r\n }\r\n \r\n 43.75% {\r\n width: 40%;\r\n height: 7%;\r\n opacity: 0.35;\r\n }\r\n \r\n 100% {\r\n width: 85%;\r\n height: 15%;\r\n opacity: 0.25;\r\n }\r\n }\r\n #login-dlg-wrap .loader-wrap {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height:100%;\r\n width:100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n background: #ffffff42;\r\n backdrop-filter: blur(1px);\r\n }\r\n\r\n #login-dlg-wrap .login-dlg-loader {\r\n border: 15px solid #e7e7e7;\r\n border-top: 15px solid #52dba1;\r\n border-radius: 50%;\r\n width: 100px;\r\n height: 100px;\r\n animation: spinloader 2s linear infinite;\r\n }\r\n\r\n #login-dlg-wrap .loader-wrap::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 70px;\r\n height: 70px;\r\n transform: translate(-50%, -50%);\r\n z-index: 1;\r\n border: 15px solid #e7e7e700;\r\n border-top: 15px solid #52dba1c9;\r\n border-radius: 50%;\r\n animation: spinloader .75s linear infinite;\r\n }\r\n\r\n @keyframes spinloader {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `<p-toast key=\"$login-dlg\" position=\"top-center\"></p-toast>\r\n <div id=\"login-dlg-wrap\">\r\n <div id=\"login-dlg-header\">\r\n <div id=\"login-logo\" class=\"p-mb-2\" style=\"background: url('{{properties.logoImage}}') no-repeat\"></div>\r\n <h3 *ngIf=\"!success\" [innerHTML]=\"sanitizedTitle\"></h3>\r\n <h3 *ngIf=\"success\" style=\"color:green !important;\">{{properties.loginSuccessMessage}}</h3>\r\n </div>\r\n <div id=\"login-dlg-content\">\r\n <ng-container *ngIf=\"!success\">\r\n <div *ngIf=\"loading\" class=\"loader-wrap\">\r\n <div class=\"login-dlg-loader\"></div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">person</i>\r\n </span>\r\n <input disabled pInputText type=\"text\" placeholder=\"{{properties.username?.placeHolder}}\" [value]=\"decodeToken?.email\" />\r\n </div>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">lock</i>\r\n </span>\r\n <input [disabled]=\"loading\" (keydown.enter)=\"clickLogin()\" pInputText type=\"password\" \r\n placeholder=\"{{properties.password?.placeHolder}}\" [(ngModel)]=\"password\"\r\n autofocus />\r\n </div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <button style=\"width: 100%;\" pButton type=\"button\" label=\"{{properties.loginButton?.placeHolder}}\" (click)=\"clickLogin()\"\r\n [disabled]=\"!password || loading\"></button>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm login-dlg-suggest\" style=\"display:flex;align-items: center;user-select: none;\">\r\n <span>{{properties.logoutButton?.message}}</span>\r\n <button class=\"p-button-text\" pButton type=\"button\" label=\"{{properties.logoutButton?.placeHolder}}\" \r\n (click)=\"clickLogout()\"></button>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"success\">\r\n <div style=\"margin-top:35px;\"></div>\r\n <div class=\"check-animation-wrap\">\r\n <div class=\"check-main-container\">\r\n <div class=\"check-container\">\r\n <div class=\"check-background\">\r\n <svg viewBox=\"0 0 65 51\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 25L27.3077 44L58.5 7\" stroke=\"white\" stroke-width=\"13\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>`,\r\n selector: \"app-localize-logindlg\",\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class LocalizeLogindlgComponent implements OnInit {\r\n readonly messageKey = \"$login-dlg\";\r\n password: any;\r\n readonly decodeToken: JwtPayload | null;\r\n loading = false;\r\n success = false;\r\n private get config() { return this.tokenService.config; }\r\n private readonly loginConfig: ILoginDialogConfig\r\n\r\n private logout?: () => any\r\n private loginUrl?: string;\r\n readonly properties: ILoginDialogProperties;\r\n\r\n\r\n constructor(\r\n private readonly messageService: MessageService,\r\n private readonly cdt: ChangeDetectorRef,\r\n private readonly dlgRef: DynamicDialogRef,\r\n private readonly dlgConfig: DynamicDialogConfig,\r\n private readonly tokenService: LocalizeTokenService,\r\n private readonly httpClient: HttpClient,\r\n private readonly sanitizer: DomSanitizer\r\n ) {\r\n this.decodeToken = this.tokenService.decodeRefreshToken;\r\n this.loginConfig = this.dlgConfig.data.loginConfig;\r\n this.properties = this.loginConfig.properties!;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dlgConfig.closable = false;\r\n this.logout = this.loginConfig.logoutFunc;\r\n this.loginUrl = this.loginConfig.loginUrl\r\n\r\n if (!this.decodeToken) {\r\n this.showMessage(\"error\", \"Token is invalid\");\r\n setTimeout(() => this.logout?.(), 2000);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdt.detectChanges();\r\n }\r\n\r\n async clickLogin() {\r\n if (!this.isValidPassword) {\r\n return this.showMessage(\"error\", \"Password is required and must be at least 6 characters\");\r\n }\r\n\r\n this.loading = true;\r\n const loginRes = await this.login();\r\n if (!loginRes?.status) {\r\n return this.showMessage(\"error\", loginRes.message ?? \"An error occurred\");\r\n }\r\n\r\n this.tokenService.accessToken = loginRes.tokens.accessToken;\r\n const cookieOptions = { expires: this.loginConfig.expire ?? 365 }\r\n LocalizeToken.storage.set(this.config.refreshToken?.name || '', loginRes.tokens.refreshToken, cookieOptions);\r\n this.success = true;\r\n setTimeout(() => {\r\n this.dlgConfig.dismissableMask = true;\r\n this.dlgConfig.modal = false;\r\n this.dlgRef.close(true);\r\n }, 2000);\r\n }\r\n\r\n private async login() {\r\n if (!this.loginUrl?.trim().length) {\r\n this.showMessage(\"error\", \"Login url is required\");\r\n throw new Error(\"Login url is required\");\r\n }\r\n\r\n try {\r\n\r\n if (this.loginConfig.loginFunction) {\r\n console.log(\"Using custom login function\");\r\n return await this.loginConfig.loginFunction(this.decodeToken?.email ?? '', this.password.trim(), this.getHeaders());\r\n }\r\n\r\n return await new Promise<any>((resolve, reject) =>\r\n this.httpClient.post(this.loginUrl!,\r\n { password: this.password.trim() },\r\n { headers: this.getHeaders() }).subscribe({ next: resolve, error: reject }));\r\n\r\n } catch (e: any) {\r\n this.showMessage(\"error\", e.message);\r\n return null;\r\n }\r\n }\r\n\r\n private getHeaders() {\r\n return {\r\n [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: LocalizeToken.storage.get(this.config.refreshToken?.name || '') ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: LocalizeToken.storage.get(this.loginConfig.tenantTokenName!) ?? \"\",\r\n };\r\n }\r\n\r\n get isValidPassword(): boolean {\r\n this.loading = false;\r\n return this.properties.passwordValidator\r\n ? this.properties.passwordValidator(this.password)\r\n : this.password && this.password.trim().length >= 6 && this.password.trim().length <= 50;\r\n }\r\n\r\n clickLogout = () => this.logout?.();\r\n\r\n private showMessage(severity: string, summary: string) {\r\n this.messageService.add({ key: this.messageKey, severity, summary });\r\n this.loading = false;\r\n }\r\n\r\n get sanitizedTitle() {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.properties.title ?? '');\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { LocalizeLogindlgComponent } from './localize-logindlg.component';\nexport interface ILoginDialogPlaceHolder {\n /**\n * Message to display in the input field, typically used for error messages or hints.\n * This is optional and can be used to provide additional context or instructions to the user.\n */\n message?: string;\n /**\n * Placeholder or label text for the input field\n */\n placeHolder?: string;\n}\n\nexport interface ILoginDialogProperties {\n /**\n * Title of the login dialog\n */\n title?: string;\n loginSuccessMessage?: string;\n /**\n * Logog image path or URL to display in the login dialog\n * If not provided, the \"/assets/images/logo-300px.png\" image will be used.\n */\n logoImage?: string;\n username?: ILoginDialogPlaceHolder;\n password?: ILoginDialogPlaceHolder;\n loginButton?: ILoginDialogPlaceHolder;\n logoutButton?: ILoginDialogPlaceHolder;\n /**\n * Function to validate the password.\n * If not provided, the default validation checks if the password is between 6 and 50 characters long.\n * @param password\n * @returns\n */\n passwordValidator?: (password: string) => boolean;\n}\n\nexport interface ILoginDialogConfig {\n loginUrl?: string;\n logoutUrl?: string;\n loginFunction?: (username: string, password: string, headers?: { [key: string]: string }) => Promise<any>;\n logoutFunc?: () => void;\n /**\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\n */\n expire?: number;\n tenantTokenName?: string;\n /**\n * Configuration for the login dialog.\n * This interface defines the properties that can be used to customize the login dialog's behavior and appearance\n */\n properties?: ILoginDialogProperties;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeLogindlgService {\n\n constructor(private readonly injector: Injector) { }\n\n async openLoginDialog(loginConfig: ILoginDialogConfig, config?: DynamicDialogConfig) {\n\n config = this.intercepDialogConfig(config);\n this.initConfig(loginConfig);\n\n config.data = { ...(config.data || {}), ...{ loginConfig } };\n\n const dialogService = this.injector.get(DialogService);\n const dialog = dialogService.open(LocalizeLogindlgComponent, config);\n\n await new Promise<void>((resolve) =>\n dialog.onClose.subscribe(res => {\n if (res) {\n resolve();\n }\n }));\n }\n\n private intercepDialogConfig(config?: DynamicDialogConfig) {\n config ??= {\n header: 'Login',\n style: { 'max-width': '400px', width: '100%', 'height': '650px' },\n modal: true,\n closable: false,\n showHeader: false,\n }\n\n config = {\n ...config, ...{\n contentStyle: { 'height': '100%', 'border-radius': '20px' }\n }\n }\n config.style = { ...config.style, ...{ 'border-radius': '20px' } };\n return config;\n }\n\n\n private initConfig(loginConfig: ILoginDialogConfig) {\n loginConfig ??= {}\n loginConfig.properties ??= {\n title: 'Your session is expired!<br/> Please login again to continue.',\n loginSuccessMessage: 'You have successfully logged in.',\n logoImage: '/assets/images/logo-300px.png',\n username: { placeHolder: 'Username' },\n password: { placeHolder: 'Password' },\n loginButton: { placeHolder: 'Login' },\n logoutButton: {\n message: 'No, I want to login with another user.',\n placeHolder: 'Logout'\n }\n }\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { LocalizeLogindlgComponent } from \"./localize-logindlg.component\";\nimport { ToastModule } from \"primeng/toast\";\nimport { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { LocalizeLogindlgService } from \"./localize-logindlg.service\";\n\n@NgModule({\n declarations: [LocalizeLogindlgComponent],\n exports: [LocalizeLogindlgComponent],\n imports: [\n CommonModule,\n ToastModule,\n InputTextModule,\n BrowserModule,\n FormsModule,\n ButtonModule,\n ],\n providers: [LocalizeLogindlgService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class LocalizeLogindlgModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -54,7 +54,6 @@ interface IRetryOptions {
54
54
  onConnectionError?: IOnConnectionError;
55
55
  }
56
56
  export interface ILocalizeApiConfigs {
57
- tenantTokenName?: string;
58
57
  onPrepareRequest?: () => Promise<void> | any;
59
58
  onAutoLogout?: () => Promise<void> | any;
60
59
  onRevokeUnauthorized?: () => Promise<void> | any;