@sambath999/localize-token 19.0.4 → 19.0.6
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.
- package/fesm2022/sambath999-localize-token.mjs +36 -28
- package/fesm2022/sambath999-localize-token.mjs.map +1 -1
- package/localize-token/helpers/interfaces.d.ts +3 -8
- package/localize-token/helpers/loccalize.api.helper.d.ts +4 -5
- package/localize-token/localize.token.d.ts +1 -0
- package/localize-token/localize.token.service.d.ts +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ import { DialogService } from 'primeng/dynamicdialog';
|
|
|
7
7
|
import { BehaviorSubject, takeUntil, catchError, throwError, Subject } from 'rxjs';
|
|
8
8
|
import * as jwt_decode from 'jwt-decode';
|
|
9
9
|
import * as i4 from '@angular/common/http';
|
|
10
|
-
import {
|
|
10
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
11
11
|
import * as i5 from '@angular/platform-browser';
|
|
12
12
|
import { BrowserModule } from '@angular/platform-browser';
|
|
13
13
|
import * as i6 from '@angular/common';
|
|
@@ -154,11 +154,18 @@ async function waitFor(milliseconds, when = true) {
|
|
|
154
154
|
* @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.
|
|
155
155
|
*/
|
|
156
156
|
async function waitUntil(when, intervalNumber = 50) {
|
|
157
|
+
async function isConditionMet() {
|
|
158
|
+
const cond = when();
|
|
159
|
+
const result = cond instanceof Promise
|
|
160
|
+
? await cond
|
|
161
|
+
: cond;
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
if (await isConditionMet())
|
|
165
|
+
return;
|
|
157
166
|
await new Promise(resolve => {
|
|
158
167
|
const interval = setInterval(async () => {
|
|
159
|
-
|
|
160
|
-
const result = cond instanceof Promise ? await cond : cond;
|
|
161
|
-
if (result) {
|
|
168
|
+
if (await isConditionMet()) {
|
|
162
169
|
clearInterval(interval);
|
|
163
170
|
resolve(true);
|
|
164
171
|
}
|
|
@@ -230,8 +237,11 @@ class LocalizeTokenService {
|
|
|
230
237
|
LocalizeToken.storage.set(this.config.authToken?.name || '', base64);
|
|
231
238
|
}
|
|
232
239
|
tokensValid() {
|
|
233
|
-
|
|
234
|
-
|
|
240
|
+
if (!this.refreshToken?.length)
|
|
241
|
+
return false;
|
|
242
|
+
if (this.config.requiredTenant && !this.tenantToken?.length)
|
|
243
|
+
return false;
|
|
244
|
+
return true;
|
|
235
245
|
}
|
|
236
246
|
decodeToken = (token) => jwt_decode.jwtDecode(token);
|
|
237
247
|
get decodeRefreshToken() {
|
|
@@ -597,6 +607,13 @@ var EMethod;
|
|
|
597
607
|
EMethod["DELETE"] = "delete";
|
|
598
608
|
EMethod["PATCH"] = "patch";
|
|
599
609
|
})(EMethod || (EMethod = {}));
|
|
610
|
+
// export interface INormalizedError {
|
|
611
|
+
// error: any;
|
|
612
|
+
// code: string;
|
|
613
|
+
// message: string;
|
|
614
|
+
// details?: any;
|
|
615
|
+
// status: number;
|
|
616
|
+
// }
|
|
600
617
|
|
|
601
618
|
class LocalizeApiHelper {
|
|
602
619
|
defaultRetryOptions = {
|
|
@@ -659,14 +676,6 @@ class LocalizeApiHelper {
|
|
|
659
676
|
? normalizedUrl.slice(0, -1)
|
|
660
677
|
: normalizedUrl;
|
|
661
678
|
}
|
|
662
|
-
normalizeError(error) {
|
|
663
|
-
return {
|
|
664
|
-
code: error.error?.code || `HTTP_${error.status}`,
|
|
665
|
-
message: error.error?.message || error.message,
|
|
666
|
-
details: error.error?.details,
|
|
667
|
-
status: error.status
|
|
668
|
-
};
|
|
669
|
-
}
|
|
670
679
|
async invokeHook(callback) {
|
|
671
680
|
if (!callback)
|
|
672
681
|
return;
|
|
@@ -682,7 +691,7 @@ class LocalizeApiHelper {
|
|
|
682
691
|
observe: 'response',
|
|
683
692
|
}).pipe(takeUntil(instance.destroy$()), catchError((error) => {
|
|
684
693
|
// Convert to a non-observable error to handle in the promise
|
|
685
|
-
return throwError(() =>
|
|
694
|
+
return throwError(() => error);
|
|
686
695
|
}));
|
|
687
696
|
return request$;
|
|
688
697
|
}
|
|
@@ -714,11 +723,9 @@ class LocalizeApiHelper {
|
|
|
714
723
|
screenBlocker(optons, error, add = true) {
|
|
715
724
|
if (!optons.connectionError?.blockScreen)
|
|
716
725
|
return;
|
|
717
|
-
if (error instanceof HttpErrorResponse)
|
|
718
|
-
error = this.normalizeError(error);
|
|
719
726
|
const message = optons.connectionError?.message
|
|
720
727
|
|| 'Connection error occurred. Please wait';
|
|
721
|
-
const errorMessage = error?.message || 'An error occurred';
|
|
728
|
+
const errorMessage = error?.error?.message || 'An error occurred';
|
|
722
729
|
const suggestinMessage = optons.connectionError?.suggestionMessage
|
|
723
730
|
|| 'Please check your internet connection or the server status.';
|
|
724
731
|
const zIndex = optons.connectionError?.blockScreenZIndex || 10000;
|
|
@@ -894,9 +901,6 @@ class LocalizeApiService {
|
|
|
894
901
|
ngOnDestroy() {
|
|
895
902
|
this.destroy$.next();
|
|
896
903
|
this.destroy$.complete();
|
|
897
|
-
// this.isResolvingStartupSubject.complete();
|
|
898
|
-
// this.isRequestingSubject.complete();
|
|
899
|
-
// this.configSubject.complete();
|
|
900
904
|
}
|
|
901
905
|
/**
|
|
902
906
|
* A higher-order function that returns a curried function for making API requests.
|
|
@@ -920,10 +924,10 @@ class LocalizeApiService {
|
|
|
920
924
|
async handleOnRequestError(error, options) {
|
|
921
925
|
if (error.status !== 401)
|
|
922
926
|
throw error;
|
|
923
|
-
await waitUntil(() => !this.isResolvingStartup,
|
|
927
|
+
await waitUntil(() => !this.isResolvingStartup, 50);
|
|
924
928
|
return await ApiHelper.performRetry({
|
|
925
929
|
maxRetries: () => 1000,
|
|
926
|
-
delay:
|
|
930
|
+
delay: 10,
|
|
927
931
|
retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),
|
|
928
932
|
callback: async () => {
|
|
929
933
|
// Only handle 401 Unauthorized errors
|
|
@@ -989,11 +993,15 @@ class LocalizeApiService {
|
|
|
989
993
|
};
|
|
990
994
|
}
|
|
991
995
|
async toWaitForPreviousRequest() {
|
|
992
|
-
this.isRevokingToken
|
|
993
|
-
|
|
996
|
+
if (this.isRevokingToken) {
|
|
997
|
+
await waitUntil(() => !this.isRevokingToken);
|
|
998
|
+
}
|
|
994
999
|
// to wait for each request in 50ms, even if the request is not completed
|
|
995
|
-
this.config.waitEachRequest?.milliseconds
|
|
996
|
-
|
|
1000
|
+
const waitMilliseconds = this.config.waitEachRequest?.milliseconds;
|
|
1001
|
+
if (waitMilliseconds && this.isRequesting) {
|
|
1002
|
+
// console.warn(`Request throttling: Another request is in progress. Waiting for ${waitMilliseconds}ms.`);
|
|
1003
|
+
await waitFor(waitMilliseconds, this.isRequesting);
|
|
1004
|
+
}
|
|
997
1005
|
}
|
|
998
1006
|
async handleOnTokenRevoked(response) {
|
|
999
1007
|
if (response?.status) {
|
|
@@ -1019,7 +1027,7 @@ class LocalizeApiService {
|
|
|
1019
1027
|
return false;
|
|
1020
1028
|
}
|
|
1021
1029
|
validateConfig() {
|
|
1022
|
-
if (this.localizeTokenService.config.
|
|
1030
|
+
if (this.localizeTokenService.config.requiredTenant
|
|
1023
1031
|
&& !this.localizeTokenService.config.tenantToken?.name?.trim().length) {
|
|
1024
1032
|
throw Error('Tenant token is required but tenantTokenName is not configured');
|
|
1025
1033
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sambath999-localize-token.mjs","sources":["../../../../../dev/src/localize-token/localize.token.storage.ts","../../../../../dev/src/localize-token/localize.token.ts","../../../../../dev/src/localize-token/localize.token.service.ts","../../../../../dev/src/localize-logindlg/localize-logindlg.component.ts","../../../../../dev/src/localize-logindlg/localize-logindlg.service.ts","../../../../../dev/src/localize-logindlg/localize-logindlg.module.ts","../../../../../dev/src/localize-token/helpers/localize.api.assets.ts","../../../../../dev/src/localize-token/helpers/interfaces.ts","../../../../../dev/src/localize-token/helpers/loccalize.api.helper.ts","../../../../../dev/src/localize-token/localize.api.service.ts","../../../../../dev/src/localize-token/localize.token.module.ts","../../../../../dev/src/localize-api-token/localize-api-token.service.ts","../../../../../dev/src/localize-api-token/localize-api-token.module.ts","../../../../../dev/src/public-api.ts","../../../../../dev/src/sambath999-localize-token.ts"],"sourcesContent":["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 tenantToken() { return LocalizeToken.storage.get(this.config.tenantToken?.name || '') }\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 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","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 standalone: false,\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]: this.tokenService.refreshToken ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: this.tokenService.tenantToken ?? \"\",\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 /**\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 { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { ToastModule } from 'primeng/toast';\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","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}","\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 \"./helpers/loccalize.api.helper\";\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 { Injectable } from '@angular/core';\nimport { LocalizeLogindlgService } from '../localize-logindlg/localize-logindlg.service';\nimport { ILocalizeApiConfigs } from '../localize-token/helpers/interfaces';\nimport { LocalizeApiService } from '../localize-token/localize.api.service';\nimport { ILocalizeTokenConfig } from '../localize-token/localize.token';\nimport { LocalizeTokenService } from '../localize-token/localize.token.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeApiTokenService {\n readonly api: LocalizeApiService;\n readonly token: LocalizeTokenService;\n readonly loginDialog: LocalizeLogindlgService;\n\n constructor(tokenService: LocalizeTokenService,\n apiService: LocalizeApiService,\n loginDialogService: LocalizeLogindlgService) {\n this.api = apiService;\n this.token = tokenService;\n this.loginDialog = loginDialogService;\n }\n\n initialize(tokenConfig: ILocalizeTokenConfig, apiConfig: ILocalizeApiConfigs) {\n // Initialize the LocalizeTokenService with the provided token configuration\n this.token.init(tokenConfig);\n\n // Initialize the LocalizeApiService with the provided API configuration\n this.api.init(apiConfig);\n\n console.log('LocalizeApiTokenService initialized with token and API configurations.');\n\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LocalizeLogindlgModule } from '../localize-logindlg/localize-logindlg.module';\nimport { LocalizeTokenModule } from '../localize-token/localize.token.module';\nimport { LocalizeApiTokenService } from './localize-api-token.service';\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n LocalizeTokenModule,\n LocalizeLogindlgModule\n ],\n providers: [\n LocalizeApiTokenService\n ]\n})\nexport class LocalizeApiTokenModule { }\n","//#region login dialog\r\nexport * from './localize-logindlg/localize-logindlg.component'\r\nexport * from './localize-logindlg/localize-logindlg.module'\r\nexport * from './localize-logindlg/localize-logindlg.service'\r\n\r\n//#region localize token\r\nexport * from './localize-token/helpers/localize.api.assets';\r\nexport * from './localize-token/helpers/interfaces';\r\nexport * from './localize-token/helpers/loccalize.api.helper';\r\nexport * from './localize-token/localize.token.service';\r\nexport * from './localize-token/localize.token';\r\nexport * from './localize-token/localize.token.storage';\r\nexport * from './localize-token/localize.token.module';\r\nexport * from './localize-token/localize.api.service';\r\n\r\n//#region localize api token\r\nexport * from './localize-api-token/localize-api-token.service';\r\nexport * from './localize-api-token/localize-api-token.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.LocalizeTokenService","i1","i2.LocalizeTokenService","i1.LocalizeTokenService","i2.LocalizeApiService","i3.LocalizeLogindlgService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sambath999-localize-token.mjs","sources":["../../../../../dev/src/localize-token/localize.token.storage.ts","../../../../../dev/src/localize-token/localize.token.ts","../../../../../dev/src/localize-token/localize.token.service.ts","../../../../../dev/src/localize-logindlg/localize-logindlg.component.ts","../../../../../dev/src/localize-logindlg/localize-logindlg.service.ts","../../../../../dev/src/localize-logindlg/localize-logindlg.module.ts","../../../../../dev/src/localize-token/helpers/localize.api.assets.ts","../../../../../dev/src/localize-token/helpers/interfaces.ts","../../../../../dev/src/localize-token/helpers/loccalize.api.helper.ts","../../../../../dev/src/localize-token/localize.api.service.ts","../../../../../dev/src/localize-token/localize.token.module.ts","../../../../../dev/src/localize-api-token/localize-api-token.service.ts","../../../../../dev/src/localize-api-token/localize-api-token.module.ts","../../../../../dev/src/public-api.ts","../../../../../dev/src/sambath999-localize-token.ts"],"sourcesContent":["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 requiredTenant?: boolean;\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\r\n async function isConditionMet() {\r\n const cond = when();\r\n const result = cond instanceof Promise\r\n ? await cond\r\n : cond;\r\n return result;\r\n }\r\n\r\n if (await isConditionMet()) return;\r\n\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n if (await isConditionMet()) {\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 tenantToken() { return LocalizeToken.storage.get(this.config.tenantToken?.name || '') }\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 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 | undefined {\r\n if (!this.refreshToken?.length) return false;\r\n if (this.config.requiredTenant && !this.tenantToken?.length) return false;\r\n return true;\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","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 standalone: false,\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]: this.tokenService.refreshToken ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: this.tokenService.tenantToken ?? \"\",\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 /**\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 { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { ToastModule } from 'primeng/toast';\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","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 { HttpErrorResponse } from \"@angular/common/http\";\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: HttpErrorResponse) => 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: HttpErrorResponse) => 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\n// export interface INormalizedError {\r\n// error: any;\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, 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 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(() => error);\r\n })\r\n );\r\n\r\n return request$;\r\n }\r\n\r\n defaultRetryFunction(error: HttpErrorResponse): 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: HttpErrorResponse): 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?: HttpErrorResponse,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.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 \"./helpers/loccalize.api.helper\";\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 }\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, 50);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 10,\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 if (this.isRevokingToken) {\r\n await waitUntil(() => !this.isRevokingToken);\r\n }\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n const waitMilliseconds = this.config.waitEachRequest?.milliseconds;\r\n if (waitMilliseconds && this.isRequesting) {\r\n // console.warn(`Request throttling: Another request is in progress. Waiting for ${waitMilliseconds}ms.`);\r\n await waitFor(waitMilliseconds, this.isRequesting);\r\n }\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.requiredTenant\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 { Injectable } from '@angular/core';\nimport { LocalizeLogindlgService } from '../localize-logindlg/localize-logindlg.service';\nimport { ILocalizeApiConfigs } from '../localize-token/helpers/interfaces';\nimport { LocalizeApiService } from '../localize-token/localize.api.service';\nimport { ILocalizeTokenConfig } from '../localize-token/localize.token';\nimport { LocalizeTokenService } from '../localize-token/localize.token.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeApiTokenService {\n readonly api: LocalizeApiService;\n readonly token: LocalizeTokenService;\n readonly loginDialog: LocalizeLogindlgService;\n\n constructor(tokenService: LocalizeTokenService,\n apiService: LocalizeApiService,\n loginDialogService: LocalizeLogindlgService) {\n this.api = apiService;\n this.token = tokenService;\n this.loginDialog = loginDialogService;\n }\n\n initialize(tokenConfig: ILocalizeTokenConfig, apiConfig: ILocalizeApiConfigs) {\n // Initialize the LocalizeTokenService with the provided token configuration\n this.token.init(tokenConfig);\n\n // Initialize the LocalizeApiService with the provided API configuration\n this.api.init(apiConfig);\n\n console.log('LocalizeApiTokenService initialized with token and API configurations.');\n\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LocalizeLogindlgModule } from '../localize-logindlg/localize-logindlg.module';\nimport { LocalizeTokenModule } from '../localize-token/localize.token.module';\nimport { LocalizeApiTokenService } from './localize-api-token.service';\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n LocalizeTokenModule,\n LocalizeLogindlgModule\n ],\n providers: [\n LocalizeApiTokenService\n ]\n})\nexport class LocalizeApiTokenModule { }\n","//#region login dialog\r\nexport * from './localize-logindlg/localize-logindlg.component'\r\nexport * from './localize-logindlg/localize-logindlg.module'\r\nexport * from './localize-logindlg/localize-logindlg.service'\r\n\r\n//#region localize token\r\nexport * from './localize-token/helpers/localize.api.assets';\r\nexport * from './localize-token/helpers/interfaces';\r\nexport * from './localize-token/helpers/loccalize.api.helper';\r\nexport * from './localize-token/localize.token.service';\r\nexport * from './localize-token/localize.token';\r\nexport * from './localize-token/localize.token.storage';\r\nexport * from './localize-token/localize.token.module';\r\nexport * from './localize-token/localize.api.service';\r\n\r\n//#region localize api token\r\nexport * from './localize-api-token/localize-api-token.service';\r\nexport * from './localize-api-token/localize-api-token.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.LocalizeTokenService","i1","i2.LocalizeTokenService","i1.LocalizeTokenService","i2.LocalizeApiService","i3.LocalizeLogindlgService"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HttpErrorResponse } from "@angular/common/http";
|
|
1
2
|
/**
|
|
2
3
|
* Http method options
|
|
3
4
|
*/
|
|
@@ -13,7 +14,7 @@ export interface IOnConnectionError {
|
|
|
13
14
|
* Callback function to execute when a connection error occurs.
|
|
14
15
|
* This function should return a Promise or any value.
|
|
15
16
|
*/
|
|
16
|
-
callback?: (error:
|
|
17
|
+
callback?: (error: HttpErrorResponse) => Promise<void> | any;
|
|
17
18
|
/**
|
|
18
19
|
* If true, the request will block the screen with overlay on connection errors.
|
|
19
20
|
* Default is false.
|
|
@@ -46,7 +47,7 @@ interface IRetryOptions {
|
|
|
46
47
|
* @param error - The error object from the failed request.
|
|
47
48
|
* @returns true if the request should be retried, false otherwise.
|
|
48
49
|
*/
|
|
49
|
-
retryFunction?: (error:
|
|
50
|
+
retryFunction?: (error: HttpErrorResponse) => Promise<boolean> | any;
|
|
50
51
|
/**
|
|
51
52
|
* Function to execute when a connection error occurs.
|
|
52
53
|
* This function should return a Promise or any value.
|
|
@@ -83,10 +84,4 @@ export interface IApiOptions {
|
|
|
83
84
|
export interface IHeader {
|
|
84
85
|
[key: string]: string;
|
|
85
86
|
}
|
|
86
|
-
export interface INormalizedError {
|
|
87
|
-
code: string;
|
|
88
|
-
message: string;
|
|
89
|
-
details?: any;
|
|
90
|
-
status: number;
|
|
91
|
-
}
|
|
92
87
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpClient, HttpErrorResponse, HttpHeaders } from "@angular/common/http";
|
|
2
|
-
import { IApiOptions, ILocalizeApiConfigs,
|
|
2
|
+
import { IApiOptions, ILocalizeApiConfigs, IOnConnectionError } from "./interfaces";
|
|
3
3
|
import { Subject } from "rxjs";
|
|
4
4
|
interface IRequestInstance {
|
|
5
5
|
client: HttpClient;
|
|
@@ -18,15 +18,14 @@ declare class LocalizeApiHelper {
|
|
|
18
18
|
performRetry<T = any>(options: IRetryOptions): Promise<T>;
|
|
19
19
|
performRequestWithRetry<T = any>(options: IApiOptions, config: ILocalizeApiConfigs, performRequest: <T = any>(options: IApiOptions) => Promise<T>): Promise<T>;
|
|
20
20
|
buildUrl(baseUrl: string, path: string): string;
|
|
21
|
-
normalizeError(error: HttpErrorResponse): INormalizedError;
|
|
22
21
|
invokeHook(callback?: () => Promise<any> | any): Promise<any>;
|
|
23
22
|
createRequest<T = any>(instance: Required<IRequestInstance>, method: string, url: string, body: any, options: {
|
|
24
23
|
headers: HttpHeaders;
|
|
25
24
|
}): import("rxjs").Observable<import("@angular/common/http").HttpResponse<T>>;
|
|
26
|
-
defaultRetryFunction(error:
|
|
27
|
-
isConnectionError(error:
|
|
25
|
+
defaultRetryFunction(error: HttpErrorResponse): boolean;
|
|
26
|
+
isConnectionError(error: HttpErrorResponse): boolean;
|
|
28
27
|
onConnectionError(options: IRetryOptions, error: any): Promise<Promise<void> | any>;
|
|
29
|
-
screenBlocker(optons: IRetryOptions, error?:
|
|
28
|
+
screenBlocker(optons: IRetryOptions, error?: HttpErrorResponse, add?: boolean): HTMLStyleElement | undefined;
|
|
30
29
|
private removeBlocker;
|
|
31
30
|
}
|
|
32
31
|
export declare const ApiHelper: LocalizeApiHelper;
|
|
@@ -14,6 +14,7 @@ export interface ILocalizeTokenConfig {
|
|
|
14
14
|
authToken?: ILocalizeTokenTokens;
|
|
15
15
|
refreshToken?: ILocalizeTokenTokens;
|
|
16
16
|
tenantToken?: ILocalizeTokenTokens;
|
|
17
|
+
requiredTenant?: boolean;
|
|
17
18
|
}
|
|
18
19
|
export declare class LocalizeToken {
|
|
19
20
|
static readonly storage: LocalizeTokenStorage;
|
|
@@ -28,7 +28,7 @@ export declare class LocalizeTokenService implements OnDestroy {
|
|
|
28
28
|
set isRevokingToken(value: boolean);
|
|
29
29
|
private storageGet;
|
|
30
30
|
private storageSet;
|
|
31
|
-
tokensValid(): boolean;
|
|
31
|
+
tokensValid(): boolean | undefined;
|
|
32
32
|
decodeToken: (token: string) => JwtPayload;
|
|
33
33
|
get decodeRefreshToken(): JwtPayload;
|
|
34
34
|
private throwIfNotInitialized;
|