@web-portal/core-infrastructure 0.0.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ import * as i1$1 from '@angular/router';
4
4
  import { Router, NavigationEnd } from '@angular/router';
5
5
  import { BehaviorSubject, distinctUntilChanged, tap, filter, map, catchError, of, throwError, firstValueFrom, Observable, Subject, takeUntil, fromEvent } from 'rxjs';
6
6
  import * as i1$2 from '@angular/common/http';
7
- import { HttpClient, HttpRequest, HttpEventType, HttpHeaders, HttpResponse, HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
7
+ import { HttpClient, HttpRequest, HttpEventType, HttpHeaders, HttpParams, HttpResponse, HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
8
8
  import { BREAKPOINTS_VALUE } from '@web-portal/core-base';
9
9
  import * as i1 from '@angular/cdk/layout';
10
10
  import { isPlatformBrowser, DOCUMENT } from '@angular/common';
@@ -21,6 +21,10 @@ import * as i1$4 from '@angular/platform-browser';
21
21
  */
22
22
  const AUTH_DIALOG_SERVICE = new InjectionToken('AUTH_DIALOG_SERVICE');
23
23
 
24
+ // Các key dùng chung trong sessionStorage để nhận diện trạng thái load trang và điều hướng SPA
25
+ const LOAD_IS_RELOAD_KEY = "__LOAD_IS_RELOAD__";
26
+ const HAS_NAVIGATED_KEY = "__HAS_NAVIGATED__";
27
+
24
28
  class BreakpointService {
25
29
  constructor(breakpointObserver) {
26
30
  this.breakpointObserver = breakpointObserver;
@@ -786,19 +790,22 @@ class AuthService extends ApiService {
786
790
  }
787
791
  login(returnUrl) {
788
792
  try {
789
- const url = `${this.baseUrl}/login?returnUrl=${returnUrl}`;
790
- this._get(url, null, false).subscribe({
793
+ const url = `${this.baseUrl}/login`;
794
+ const params = new HttpParams().set("returnUrl", returnUrl || "");
795
+ console.log("[AuthService] Calling login with GET method", { url, returnUrl });
796
+ this._get(url, params, false).subscribe({
791
797
  next: (url) => {
798
+ console.log("[AuthService] Login success, redirecting to:", url);
792
799
  window.location.href = url;
793
800
  return;
794
801
  },
795
802
  error: err => {
796
- console.log("err:", err);
803
+ console.error("[AuthService] Login error:", err);
797
804
  }
798
805
  });
799
806
  }
800
807
  catch (err) {
801
- console.log("error:", err);
808
+ console.error("[AuthService] Login exception:", err);
802
809
  }
803
810
  return;
804
811
  }
@@ -836,24 +843,9 @@ class SessionValidationError extends Error {
836
843
  }
837
844
  }
838
845
 
839
- const LOAD_IS_RELOAD_KEY$1 = "__LOAD_IS_RELOAD__";
840
- const HAS_NAVIGATED_KEY$1 = "__HAS_NAVIGATED__";
841
846
  function isPageReload$1() {
842
847
  try {
843
- return window.sessionStorage.getItem(LOAD_IS_RELOAD_KEY$1) === "1";
844
- }
845
- catch {
846
- return false;
847
- }
848
- }
849
- /**
850
- * Kiểm tra xem đây có phải là điều hướng nội bộ SPA sau lần điều hướng đầu tiên hay không.
851
- * - Lần điều hướng đầu tiên sau khi app load: HAS_NAVIGATED_KEY chưa được set.
852
- * - Các lần điều hướng sau đó trong SPA: HAS_NAVIGATED_KEY === "1".
853
- */
854
- function hasNavigatedInSpa$1() {
855
- try {
856
- return window.sessionStorage.getItem(HAS_NAVIGATED_KEY$1) === "1";
848
+ return window.sessionStorage.getItem(LOAD_IS_RELOAD_KEY) === "1";
857
849
  }
858
850
  catch {
859
851
  return false;
@@ -864,7 +856,7 @@ function hasNavigatedInSpa$1() {
864
856
  */
865
857
  function markSpaNavigated() {
866
858
  try {
867
- window.sessionStorage.setItem(HAS_NAVIGATED_KEY$1, "1");
859
+ window.sessionStorage.setItem(HAS_NAVIGATED_KEY, "1");
868
860
  }
869
861
  catch {
870
862
  // ignore
@@ -901,9 +893,9 @@ class AuthGuard {
901
893
  }
902
894
  // Chỉ khi điều hướng thành công (đã auth + có quyền) và không phải reload
903
895
  // mới đánh dấu là đã có điều hướng SPA.
904
- // if (!isPageReload()) {
905
- // markSpaNavigated();
906
- // }
896
+ if (!isPageReload$1()) {
897
+ markSpaNavigated();
898
+ }
907
899
  return true;
908
900
  }
909
901
  // Nếu F5/reload → đá thẳng qua login, không popup
@@ -980,28 +972,14 @@ function hasSessionUser() {
980
972
  return false;
981
973
  }
982
974
  }
983
- /**
984
- * Xác định lần load hiện tại có phải là F5/Reload không
985
- * Dùng PerformanceNavigationTiming để tránh phụ thuộc vào sessionStorage flag.
986
- */
987
975
  function isPageReload() {
988
976
  try {
989
- if (typeof performance === "undefined") {
990
- return false;
991
- }
992
- const nav = performance.getEntriesByType("navigation")[0] || undefined;
993
- if (nav && nav.type) {
994
- return nav.type === "reload";
995
- }
996
- const legacyNav = performance.navigation;
997
- return legacyNav && legacyNav.type === 1; // TYPE_RELOAD
977
+ return window.sessionStorage.getItem(LOAD_IS_RELOAD_KEY) === "1";
998
978
  }
999
979
  catch {
1000
980
  return false;
1001
981
  }
1002
982
  }
1003
- const HAS_NAVIGATED_KEY = "__HAS_NAVIGATED__";
1004
- const LOAD_IS_RELOAD_KEY = "__LOAD_IS_RELOAD__";
1005
983
  /**
1006
984
  * Đã từng điều hướng nội bộ SPA sau khi app load chưa.
1007
985
  * - Lần load / điều hướng đầu tiên: key chưa được set.
@@ -1015,6 +993,19 @@ function hasNavigatedInSpa() {
1015
993
  return false;
1016
994
  }
1017
995
  }
996
+ // Xác định request có phải là request API (gửi qua ApiService) hay không
997
+ function isApiRequest(req) {
998
+ try {
999
+ // Các request API chuẩn đều được gắn header ConcungContextID / gateway-api từ ApiService
1000
+ if (req.headers && req.headers.has("gateway-api")) {
1001
+ return true;
1002
+ }
1003
+ return false;
1004
+ }
1005
+ catch {
1006
+ return false;
1007
+ }
1008
+ }
1018
1009
  // Functional interceptor for newer Angular versions
1019
1010
  const authInterceptor = (req, next) => {
1020
1011
  const router = inject(Router);
@@ -1028,8 +1019,11 @@ const authInterceptor = (req, next) => {
1028
1019
  await ensureReLoginDialog(injector, authService, storage);
1029
1020
  return;
1030
1021
  }
1031
- window.sessionStorage.setItem("__HAS_NAVIGATED__", "0");
1032
- window.sessionStorage.setItem("__LOAD_IS_RELOAD__", "0");
1022
+ // Chỉ reset cờ reload / điều hướng khi đây là response cho request API
1023
+ if (isApiRequest(req)) {
1024
+ window.sessionStorage.setItem(LOAD_IS_RELOAD_KEY, "0");
1025
+ window.sessionStorage.setItem(HAS_NAVIGATED_KEY, "0");
1026
+ }
1033
1027
  }
1034
1028
  }, async (error) => {
1035
1029
  if (error instanceof HttpErrorResponse) {
@@ -1059,7 +1053,7 @@ async function ensureReLoginDialog(injector, authService, storage) {
1059
1053
  authService.login(returnUrl);
1060
1054
  return;
1061
1055
  }
1062
- // 2. Nếu điều hướng nội bộ SPA (đang ở lần load/điều hướng)
1056
+ // 2. Nếu chưa từng điều hướng nội bộ SPA (đang ở lần load/điều hướng đầu)
1063
1057
  // → coi là full load / direct access, không popup, redirect login luôn
1064
1058
  if (hasNavigatedInSpa()) {
1065
1059
  const returnUrl = window.location.href;
@@ -1 +1 @@
1
- {"version":3,"file":"web-portal-core-infrastructure.mjs","sources":["../../../../projects/core/infrastructure/src/lib/services/auth/auth-dialog.interface.ts","../../../../projects/core/infrastructure/src/lib/services/breakpoint.service.ts","../../../../projects/core/infrastructure/src/lib/services/cache.service.ts","../../../../projects/core/infrastructure/src/lib/services/platform.service.ts","../../../../projects/core/infrastructure/src/lib/services/api.service.ts","../../../../projects/core/infrastructure/src/lib/services/auth/storage.service.ts","../../../../projects/core/infrastructure/src/lib/services/auth/auth.service.ts","../../../../projects/core/infrastructure/src/lib/guards/auth.guard.ts","../../../../projects/core/infrastructure/src/lib/interceptors/auth.interceptor.ts","../../../../projects/core/infrastructure/src/lib/interceptors/ajax-request.interceptor.ts","../../../../projects/core/infrastructure/src/lib/interceptors/duplicate-request.interceptor.ts","../../../../projects/core/infrastructure/src/lib/interceptors/error.interceptor.ts","../../../../projects/core/infrastructure/src/lib/services/loading.service.ts","../../../../projects/core/infrastructure/src/lib/interceptors/loading-bar.interceptor.ts","../../../../projects/core/infrastructure/src/lib/services/app-config.service.ts","../../../../projects/core/infrastructure/src/lib/services/app-initialize.service.ts","../../../../projects/core/infrastructure/src/lib/services/cookie.service.ts","../../../../projects/core/infrastructure/src/lib/services/document.service.ts","../../../../projects/core/infrastructure/src/lib/services/loader.service.ts","../../../../projects/core/infrastructure/src/lib/services/file.service.ts","../../../../projects/core/infrastructure/src/lib/services/file-gcs.service.ts","../../../../projects/core/infrastructure/src/lib/services/file-aia-gcs.service.ts","../../../../projects/core/infrastructure/src/lib/services/file-wap-gcs.service.ts","../../../../projects/core/infrastructure/src/lib/services/loading-spinner.service.ts","../../../../projects/core/infrastructure/src/lib/services/local-storage.service.ts","../../../../projects/core/infrastructure/src/lib/services/overlay.service.ts","../../../../projects/core/infrastructure/src/lib/services/request-cache.service.ts","../../../../projects/core/infrastructure/src/lib/services/responsive.service.ts","../../../../projects/core/infrastructure/src/lib/services/search-event-bridge.service.ts","../../../../projects/core/infrastructure/src/lib/services/seo.service.ts","../../../../projects/core/infrastructure/src/lib/services/session-storage.service.ts","../../../../projects/core/infrastructure/src/lib/services/window.service.ts","../../../../projects/core/infrastructure/src/public-api.ts","../../../../projects/core/infrastructure/src/web-portal-core-infrastructure.ts"],"sourcesContent":["/**\r\n * Interface for authentication dialog service\r\n * App should provide implementation via AUTH_DIALOG_SERVICE token\r\n */\r\nexport interface IAuthDialogService {\r\n openReLoginDialog(): Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Injection token for AuthDialogService\r\n * App should provide implementation in app.config.ts\r\n */\r\nimport { InjectionToken } from '@angular/core';\r\nexport const AUTH_DIALOG_SERVICE = new InjectionToken<IAuthDialogService>('AUTH_DIALOG_SERVICE');\r\n","import { BreakpointObserver, Breakpoints } from \"@angular/cdk/layout\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject, distinctUntilChanged } from \"rxjs\";\r\nimport { BREAKPOINTS_VALUE } from \"@web-portal/core-base\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class BreakpointService {\r\n private BreakpointsSubject: BehaviorSubject<Breakpoints> =\r\n new BehaviorSubject<Breakpoints>({\r\n isBigDesktopUp: false,\r\n isDesktopUp: false,\r\n isPhoneOnly: false,\r\n isTabletLandscapeUp: false,\r\n isTabletPortraitUp: false\r\n });\r\n breakpointsResult$ = this.BreakpointsSubject.asObservable();\r\n\r\n constructor(private breakpointObserver: BreakpointObserver) {\r\n this.breakpoint$.subscribe(state => {\r\n const newBreakpoints: Breakpoints = {\r\n isPhoneOnly: state.breakpoints[BREAKPOINTS_VALUE.FOR_PHONE_ONLY],\r\n isTabletPortraitUp:\r\n state.breakpoints[BREAKPOINTS_VALUE.FOR_TABLET_PORTRAIT_UP],\r\n isTabletLandscapeUp:\r\n state.breakpoints[BREAKPOINTS_VALUE.FOR_TABLET_LANDSCAPE_UP],\r\n isDesktopUp: state.breakpoints[BREAKPOINTS_VALUE.FOR_DESKTOP_UP],\r\n isBigDesktopUp: state.breakpoints[BREAKPOINTS_VALUE.FOR_BIG_DESKTOP_UP]\r\n };\r\n\r\n this.setBreakpoints(newBreakpoints);\r\n });\r\n }\r\n\r\n private readonly breakpoint$ = this.breakpointObserver\r\n .observe([\r\n //for-big-desktop-up\r\n BREAKPOINTS_VALUE.FOR_BIG_DESKTOP_UP,\r\n\r\n //for-desktop-up\r\n BREAKPOINTS_VALUE.FOR_DESKTOP_UP,\r\n\r\n //for-tablet-landscape-up\r\n BREAKPOINTS_VALUE.FOR_TABLET_LANDSCAPE_UP,\r\n\r\n //for-tablet-portrait-up\r\n BREAKPOINTS_VALUE.FOR_TABLET_PORTRAIT_UP,\r\n\r\n //for-phone-only\r\n BREAKPOINTS_VALUE.FOR_PHONE_ONLY\r\n ])\r\n .pipe(distinctUntilChanged());\r\n\r\n public setBreakpoints(breakpoints: Breakpoints) {\r\n this.BreakpointsSubject.next(breakpoints);\r\n }\r\n\r\n public getBreakpoints(): Breakpoints {\r\n return this.BreakpointsSubject.getValue()\r\n ? this.BreakpointsSubject.getValue()\r\n : {\r\n isPhoneOnly: false,\r\n isTabletPortraitUp: false,\r\n isTabletLandscapeUp: true,\r\n isDesktopUp: false,\r\n isBigDesktopUp: false\r\n };\r\n }\r\n}\r\n\r\nexport interface Breakpoints {\r\n isPhoneOnly: boolean;\r\n isTabletPortraitUp: boolean;\r\n isTabletLandscapeUp: boolean;\r\n isDesktopUp: boolean;\r\n isBigDesktopUp: boolean;\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n// Cache configuration constants\r\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000; // 5 minutes\r\nconst MAX_CACHE_SIZE = 100;\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class CacheService {\r\n private cache = new Map<\r\n string,\r\n { data: any; timestamp: number; lastAccess: number }\r\n >();\r\n private readonly DEFAULT_TTL = DEFAULT_CACHE_TIME;\r\n private readonly MAX_CACHE_SIZE = MAX_CACHE_SIZE;\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Get data from cache by key\r\n * @param key Cache key\r\n * @returns Cached data or null if not found or expired\r\n */\r\n get(key: string): any | null {\r\n const item = this.cache.get(key);\r\n if (!item) return null;\r\n\r\n const now = Date.now();\r\n if (now - item.timestamp > this.DEFAULT_TTL) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n // Update last access time\r\n item.lastAccess = now;\r\n this.cache.set(key, item);\r\n\r\n return item.data;\r\n }\r\n\r\n /**\r\n * Store data in cache\r\n * @param key Cache key\r\n * @param data Data to store\r\n * @param ttl Time to live for the cache entry (in milliseconds)\r\n */\r\n set(key: string, data: any, ttl: number = this.DEFAULT_TTL): void {\r\n const now = Date.now();\r\n\r\n // Check if cache has reached size limit\r\n if (this.cache.size >= this.MAX_CACHE_SIZE && !this.cache.has(key)) {\r\n this.removeLeastRecentlyUsed();\r\n }\r\n\r\n this.cache.set(key, {\r\n data,\r\n timestamp: now,\r\n lastAccess: now\r\n });\r\n }\r\n\r\n /**\r\n * Check if cache has valid (non-expired) data for key\r\n * @param key Cache key\r\n * @returns True if cache has valid data\r\n */\r\n has(key: string): boolean {\r\n const item = this.cache.get(key);\r\n if (!item) return false;\r\n\r\n const now = Date.now();\r\n if (now - item.timestamp > this.DEFAULT_TTL) {\r\n this.remove(key);\r\n return false;\r\n }\r\n\r\n // Update last access time\r\n item.lastAccess = now;\r\n this.cache.set(key, item);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove item from cache by key\r\n * @param key Cache key\r\n */\r\n remove(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n /**\r\n * Clear all cache data\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n\r\n /**\r\n * Generate a unique key for a given URL and optional parameters\r\n * @param url Base URL\r\n * @param params Optional query parameters\r\n * @returns Generated key\r\n */\r\n generateKey(url: string, params?: any): string {\r\n if (!params) return url;\r\n return `${url}?${JSON.stringify(params)}`;\r\n }\r\n\r\n /**\r\n * Remove the least recently used item from cache when it reaches MAX_CACHE_SIZE\r\n * @private\r\n */\r\n private removeLeastRecentlyUsed(): void {\r\n let oldestKey: string | null = null;\r\n let oldestAccess = Date.now();\r\n\r\n // Find the least recently used item\r\n this.cache.forEach((value, key) => {\r\n if (value.lastAccess < oldestAccess) {\r\n oldestAccess = value.lastAccess;\r\n oldestKey = key;\r\n }\r\n });\r\n\r\n // Remove the least recently used item\r\n if (oldestKey) {\r\n this.remove(oldestKey);\r\n }\r\n }\r\n}\r\n","import { isPlatformBrowser } from \"@angular/common\";\r\nimport { Inject, Injectable, PLATFORM_ID } from \"@angular/core\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class PlatformService {\r\n constructor(@Inject(PLATFORM_ID) private platformId: Object) {}\r\n\r\n get isBrowser(): boolean {\r\n return isPlatformBrowser(this.platformId);\r\n }\r\n\r\n get isServer(): boolean {\r\n return !isPlatformBrowser(this.platformId);\r\n }\r\n\r\n runOnBrowser(callback: Function): any {\r\n if (this.isBrowser) {\r\n return callback();\r\n }\r\n return null;\r\n }\r\n\r\n runOnServer(callback: Function): any {\r\n if (this.isServer) {\r\n return callback();\r\n }\r\n return null;\r\n }\r\n\r\n getWindow(): Window | null {\r\n return this.isBrowser ? window : null;\r\n }\r\n\r\n getDocument(): Document | null {\r\n return this.isBrowser ? document : null;\r\n }\r\n\r\n getNavigator(): Navigator | null {\r\n return this.isBrowser ? navigator : null;\r\n }\r\n\r\n getLocalStorage(): Storage | null {\r\n return this.isBrowser ? localStorage : null;\r\n }\r\n\r\n getSessionStorage(): Storage | null {\r\n return this.isBrowser ? sessionStorage : null;\r\n }\r\n}\r\n","import { Injectable, inject, Optional, Inject } from \"@angular/core\";\r\nimport { catchError, filter, map, tap } from \"rxjs\";\r\nimport {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n HttpRequest,\r\n HttpResponse,\r\n HttpEventType,\r\n HttpEvent\r\n} from \"@angular/common/http\";\r\nimport { throwError, Observable, of } from \"rxjs\";\r\n// Note: environment is not imported in library - will be injected or passed from app\r\nimport { Breakpoints, BreakpointService } from \"./breakpoint.service\";\r\nimport { CacheService } from \"./cache.service\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n// Constants\r\nconst HTTP_STATUS = {\r\n OK: 200,\r\n NO_CONTENT: 204,\r\n BAD_REQUEST: 400,\r\n NOT_ACCEPTABLE: 406\r\n} as const;\r\n\r\nconst ERROR_MESSAGES = {\r\n INVALID_DATA: \"Dữ liệu không hợp lệ\",\r\n INVALID_DATA_RETRY: \"Dữ liệu không hợp lệ. Vui lòng thao tác lại\",\r\n NO_CONTENT: \"Không có dữ liệu hoặc không có quyền xem dữ liệu\"\r\n} as const;\r\n\r\nconst PLATFORM_ID = {\r\n PHONE: \"1\",\r\n DESKTOP: \"2\"\r\n} as const;\r\n\r\nconst HEADER_GATEWAY_API = \"gateway-api\" as const;\r\n\r\n/**\r\n * Configuration cho ApiService (optional)\r\n */\r\nexport interface ApiServiceConfig {\r\n /** Base URL cho service (optional) */\r\n baseUrl?: string;\r\n /** Gateway API name (optional) - e.g., \"mdm-api\", \"ecom-api\", \"se-api\" */\r\n gatewayApi?: string;\r\n}\r\n\r\n/**\r\n * Injection token cho ApiServiceConfig - chỉ dùng để tránh lỗi DI\r\n * Thực tế config không được inject, chỉ truyền trực tiếp khi extend\r\n */\r\nexport const API_SERVICE_CONFIG = Symbol(\"API_SERVICE_CONFIG\");\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class ApiService {\r\n readonly isBrowser: boolean;\r\n protected customHeaders: Record<string, string> = {};\r\n protected baseUrl?: string;\r\n protected serviceName?: string;\r\n private readonly _http = inject(HttpClient);\r\n private readonly _breakpoints = inject(BreakpointService);\r\n private readonly _cache = inject(CacheService);\r\n private readonly _platformService = inject(PlatformService);\r\n\r\n breakpoints: Breakpoints;\r\n\r\n /**\r\n * Constructor của ApiService\r\n * @param config - Config cho service (optional khi inject trực tiếp, bắt buộc khi extend)\r\n * Note: Config không được inject qua DI, chỉ truyền trực tiếp khi extend class\r\n */\r\n constructor(\r\n @Optional() @Inject(API_SERVICE_CONFIG) config?: ApiServiceConfig | string\r\n ) {\r\n // Không inject config qua DI - chỉ nhận khi extend class\r\n // Khi inject trực tiếp qua DI, config sẽ là undefined\r\n // Khi extend class, bắt buộc phải truyền config vào super()\r\n this.isBrowser = this._platformService.isBrowser;\r\n this._breakpoints.breakpointsResult$.subscribe(observer => {\r\n this.breakpoints = observer;\r\n });\r\n\r\n // Tự động initialize nếu có config\r\n if (config) {\r\n this._initializeInternal(config);\r\n }\r\n }\r\n\r\n /**\r\n * Initialize service với config - Tự động được gọi trong constructor\r\n * @protected\r\n */\r\n protected _initializeInternal(config: ApiServiceConfig | string): void {\r\n const parsedConfig = this._parseConfig(config);\r\n this.baseUrl = parsedConfig.baseUrl;\r\n this.serviceName = parsedConfig.gatewayApi;\r\n\r\n if (parsedConfig.gatewayApi) {\r\n this._setGatewayApiHeader(parsedConfig.gatewayApi);\r\n }\r\n }\r\n\r\n /**\r\n * Protected GET request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _get<T>(\r\n url: string,\r\n params?: HttpParams,\r\n useCache: boolean = false\r\n ): Observable<T> {\r\n return this._handleCachedRequest<T>(\r\n () => this.sendRequest<T>(\"GET\", url, null, params),\r\n url,\r\n params?.toString(),\r\n useCache\r\n );\r\n }\r\n\r\n /**\r\n * Protected GET by ID request\r\n * @protected\r\n */\r\n protected _getById<T>(\r\n url: string,\r\n id: number,\r\n useCache: boolean = true\r\n ): Observable<T> {\r\n const fullUrl = `${url}/${id}`;\r\n return this._handleCachedRequest<T>(\r\n () => this.sendRequest<T>(\"GET\", fullUrl),\r\n fullUrl,\r\n undefined,\r\n useCache\r\n );\r\n }\r\n\r\n /**\r\n * Protected DELETE request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _delete<T>(url: string, id: string): Observable<T> {\r\n return this.sendRequest<T>(\"DELETE\", `${url}/${id}`);\r\n }\r\n\r\n /**\r\n * Protected PUT request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _put<T>(url: string, value: unknown): Observable<T> {\r\n return this.sendRequest<T>(\"PUT\", url, value);\r\n }\r\n\r\n /**\r\n * Protected POST request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _post<T>(\r\n url: string,\r\n value?: unknown,\r\n useCache: boolean = false\r\n ): Observable<T> {\r\n return this._handleCachedRequest<T>(\r\n () => this.sendRequest<T>(\"POST\", url, value),\r\n url,\r\n value,\r\n useCache\r\n );\r\n }\r\n\r\n /**\r\n * Protected POST FormData request\r\n * @protected\r\n */\r\n protected _postFormData<T>(\r\n url: string,\r\n value?: Record<string, unknown>\r\n ): Observable<T> {\r\n const formData = this._createFormData(value);\r\n return this._sendFormDataRequest<T>(url, formData, true);\r\n }\r\n\r\n /**\r\n * Protected POST File request\r\n * @protected\r\n */\r\n protected _postFile<T>(\r\n url: string,\r\n file: File,\r\n value?: Record<string, unknown>\r\n ): Observable<T> {\r\n const formData = this._createFormData(value);\r\n formData.append(\"file\", file);\r\n return this._sendFormDataRequest<T>(url, formData, false);\r\n }\r\n\r\n // ====== Public methods for backward compatibility ======\r\n // Các methods này giữ lại để backward compatibility\r\n // Child classes nên sử dụng protected methods với prefix _\r\n\r\n /**\r\n * GET request với optional caching\r\n * @deprecated Sử dụng protected _get() trong child classes để tránh shadowing\r\n */\r\n // get<T>(\r\n // url: string,\r\n // params?: HttpParams,\r\n // useCache: boolean = false\r\n // ): Observable<T> {\r\n // return this._get<T>(url, params, useCache);\r\n // }\r\n\r\n // /**\r\n // * GET request by ID với caching enabled by default\r\n // * @deprecated Sử dụng protected _getById() trong child classes để tránh shadowing\r\n // */\r\n // getById<T>(url: string, id: number, useCache: boolean = true): Observable<T> {\r\n // return this._getById<T>(url, id, useCache);\r\n // }\r\n\r\n /**\r\n * DELETE request\r\n * @deprecated Sử dụng protected _delete() trong child classes để tránh shadowing\r\n * Note: Method này đã bị remove để tránh conflict. Sử dụng _delete() trong child classes.\r\n */\r\n // delete<T>(url: string, id: string): Observable<T> {\r\n // return this._delete<T>(url, id);\r\n // }\r\n\r\n /**\r\n * PUT request\r\n * @deprecated Sử dụng protected _put() trong child classes để tránh shadowing\r\n */\r\n put<T>(url: string, value: unknown): Observable<T> {\r\n return this._put<T>(url, value);\r\n }\r\n\r\n /**\r\n * POST request với optional caching\r\n * @deprecated Sử dụng protected _post() trong child classes để tránh shadowing\r\n */\r\n post<T>(\r\n url: string,\r\n value?: unknown,\r\n useCache: boolean = false\r\n ): Observable<T> {\r\n return this._post<T>(url, value, useCache);\r\n }\r\n\r\n /**\r\n * POST request với FormData\r\n * @deprecated Sử dụng protected _postFormData() trong child classes để tránh shadowing\r\n */\r\n postFormData<T>(url: string, value?: Record<string, unknown>): Observable<T> {\r\n return this._postFormData<T>(url, value);\r\n }\r\n\r\n /**\r\n * POST request với File upload\r\n * @deprecated Sử dụng protected _postFile() trong child classes để tránh shadowing\r\n */\r\n postFile<T>(\r\n url: string,\r\n file: File,\r\n value?: Record<string, unknown>\r\n ): Observable<T> {\r\n return this._postFile<T>(url, file, value);\r\n }\r\n\r\n /**\r\n * Send HTTP request và process response\r\n * @private\r\n */\r\n private sendRequest<T>(\r\n method: string,\r\n url: string,\r\n data: unknown | null = null,\r\n params?: HttpParams\r\n ): Observable<T> {\r\n const requestOptions = new HttpRequest(method.toUpperCase(), url, data, {\r\n headers: this.setHeaders(),\r\n params: params,\r\n withCredentials: true,\r\n responseType: \"json\"\r\n });\r\n\r\n console.log(`[ApiService] Request: ${method} ${url}`, { \r\n headers: requestOptions.headers.keys().reduce((acc, key) => ({ ...acc, [key]: requestOptions.headers.get(key) }), {}),\r\n params: params?.toString(),\r\n data \r\n });\r\n\r\n return this._http.request<CRUDResult>(requestOptions).pipe(\r\n tap({\r\n next: (event) => console.log(`[ApiService] Event for ${url}:`, event),\r\n error: (error) => console.error(`[ApiService] Request Error for ${url}:`, error)\r\n }),\r\n filter(\r\n (event: HttpEvent<CRUDResult>) => event?.type === HttpEventType.Response\r\n ),\r\n map((response: HttpResponse<CRUDResult>) => {\r\n console.log(`[ApiService] Full Response Object for ${url}:`, response);\r\n return response.body as CRUDResult;\r\n }),\r\n tap((apiResponse: CRUDResult) => {\r\n console.log(`[ApiService] Raw Body from ${url}:`, apiResponse);\r\n if (apiResponse.status !== HTTP_STATUS.OK) {\r\n throw {\r\n status: apiResponse.status,\r\n message: apiResponse.message\r\n };\r\n }\r\n // Nếu status == 200 nhưng data == null thì ném lỗi với status 204\r\n if (apiResponse.status === HTTP_STATUS.OK && apiResponse.data === null) {\r\n throw {\r\n status: HTTP_STATUS.NO_CONTENT,\r\n message: ERROR_MESSAGES.NO_CONTENT\r\n };\r\n }\r\n }),\r\n map((apiResponse: CRUDResult) => apiResponse.data as T),\r\n catchError((error: unknown) => {\r\n console.error(`[ApiService] Caught Error for ${url}:`, error);\r\n return this._handleError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Send FormData request\r\n * @private\r\n */\r\n private _sendFormDataRequest<T>(\r\n url: string,\r\n formData: FormData,\r\n includeHeaders: boolean\r\n ): Observable<T> {\r\n const req = new HttpRequest(\"POST\", url, formData, {\r\n reportProgress: true,\r\n responseType: \"json\",\r\n ...(includeHeaders && { headers: this.setHeaders() })\r\n });\r\n\r\n return this._http.request<CRUDResult>(req).pipe(\r\n filter(\r\n (event: HttpEvent<CRUDResult>) => event.type === HttpEventType.Response\r\n ),\r\n map((response: HttpResponse<CRUDResult>) => response.body as CRUDResult),\r\n tap((apiResponse: CRUDResult) => {\r\n if (apiResponse.status !== HTTP_STATUS.OK) {\r\n throw {\r\n status: apiResponse.status,\r\n message: apiResponse.message\r\n };\r\n }\r\n // Nếu status == 200 nhưng data == null thì ném lỗi với status 204\r\n if (apiResponse.status === HTTP_STATUS.OK && apiResponse.data === null) {\r\n throw {\r\n status: HTTP_STATUS.NO_CONTENT,\r\n message: ERROR_MESSAGES.NO_CONTENT\r\n };\r\n }\r\n }),\r\n map((apiResponse: CRUDResult) => apiResponse.data as T),\r\n catchError((error: unknown) => this._handleError(error))\r\n );\r\n }\r\n\r\n /**\r\n * Get default headers cho mọi request\r\n * @protected\r\n */\r\n protected getDefaultHeaders(): Record<string, string> {\r\n return {\r\n ConcungContextID: this.generateUUID(),\r\n ...(this.isBrowser && { returnUrl: window.location.href }),\r\n Platform_id: this.breakpoints?.isPhoneOnly\r\n ? PLATFORM_ID.PHONE\r\n : PLATFORM_ID.DESKTOP\r\n };\r\n }\r\n\r\n /**\r\n * Set headers cho request\r\n * @protected\r\n */\r\n protected setHeaders(customHeaders?: Record<string, string>): HttpHeaders {\r\n const headersObj: Record<string, string> = {\r\n ...this.customHeaders,\r\n ...this.getDefaultHeaders(),\r\n ...(customHeaders || {})\r\n };\r\n\r\n let headers = new HttpHeaders();\r\n Object.entries(headersObj).forEach(([key, value]) => {\r\n headers = headers.set(key, value);\r\n });\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Convert object thành query string\r\n * @param obj - Object chứa key-value pairs\r\n * @returns Query string\r\n */\r\n objectToQueryString(obj: Record<string, unknown>): string {\r\n const queryParams: string[] = [];\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n const encodedValue = encodeURIComponent(String(value));\r\n queryParams.push(`${encodeURIComponent(key)}=${encodedValue}`);\r\n }\r\n });\r\n\r\n return queryParams.join(\"&\");\r\n }\r\n\r\n /**\r\n * Generate UUID v4\r\n * @returns UUID string without dashes\r\n */\r\n generateUUID(): string {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\r\n .replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n })\r\n .replace(/-/g, \"\");\r\n }\r\n\r\n /**\r\n * Handle cached request logic\r\n * @private\r\n */\r\n private _handleCachedRequest<T>(\r\n requestFn: () => Observable<T>,\r\n url: string,\r\n params: unknown,\r\n useCache: boolean\r\n ): Observable<T> {\r\n if (!useCache) {\r\n return requestFn();\r\n }\r\n\r\n const cacheKey = this._cache.generateKey(url, params);\r\n const cachedData = this._cache.get(cacheKey);\r\n\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n\r\n return requestFn().pipe(\r\n tap(response => {\r\n this._cache.set(cacheKey, response);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Create FormData từ object\r\n * @private\r\n */\r\n private _createFormData(value?: Record<string, unknown>): FormData {\r\n const formData = new FormData();\r\n\r\n if (value) {\r\n Object.entries(value).forEach(([key, val]) => {\r\n if (val !== undefined && val !== null) {\r\n formData.append(key, val as string | Blob);\r\n }\r\n });\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Handle errors từ HTTP requests\r\n * @private\r\n */\r\n private _handleError(error: unknown): Observable<never> {\r\n // Log error in development (environment check removed for library)\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(\"API Error:\", error);\r\n }\r\n\r\n const httpError = error as {\r\n status?: number;\r\n error?: { message?: string };\r\n message?: string;\r\n };\r\n\r\n // Handle 406 Not Acceptable\r\n if (httpError?.status === HTTP_STATUS.NOT_ACCEPTABLE) {\r\n const rawMessage =\r\n (httpError.error as string | { message?: string }) ??\r\n httpError?.message;\r\n const message = this._extractErrorMessage(\r\n rawMessage,\r\n ERROR_MESSAGES.INVALID_DATA\r\n );\r\n return throwError(() => ({\r\n status: HTTP_STATUS.NOT_ACCEPTABLE,\r\n message\r\n }));\r\n }\r\n\r\n // Handle 400 Bad Request\r\n if (httpError?.status === HTTP_STATUS.BAD_REQUEST) {\r\n return throwError(() => ({\r\n status: httpError.status,\r\n message: httpError?.error?.message || ERROR_MESSAGES.INVALID_DATA_RETRY\r\n }));\r\n }\r\n\r\n // Return original error for other cases\r\n return throwError(() => error);\r\n }\r\n\r\n /**\r\n * Extract error message từ various formats\r\n * @private\r\n */\r\n private _extractErrorMessage(raw: unknown, fallback: string): string {\r\n if (typeof raw === \"string\" && raw.trim().length > 0) {\r\n return raw;\r\n }\r\n\r\n if (raw && typeof raw === \"object\" && \"message\" in raw) {\r\n return String((raw as { message: unknown }).message) || fallback;\r\n }\r\n\r\n return fallback;\r\n }\r\n\r\n /**\r\n * Parse config từ string hoặc object\r\n * @private\r\n */\r\n private _parseConfig(config: ApiServiceConfig | string): {\r\n gatewayApi?: string;\r\n baseUrl?: string;\r\n } {\r\n if (typeof config === \"string\") {\r\n return { gatewayApi: config };\r\n }\r\n\r\n return {\r\n gatewayApi: config.gatewayApi,\r\n baseUrl: config.baseUrl\r\n };\r\n }\r\n\r\n /**\r\n * Set gateway-api header cho tất cả requests\r\n * @private\r\n */\r\n private _setGatewayApiHeader(serviceName: string): void {\r\n this.customHeaders = {\r\n ...this.customHeaders,\r\n [HEADER_GATEWAY_API]: serviceName\r\n };\r\n }\r\n\r\n /**\r\n * Override gateway-api header cho request cụ thể\r\n * @param gatewayApi - Gateway API name\r\n * @returns Instance để support method chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * this.withGatewayApi('other-api')._get('/endpoint');\r\n * ```\r\n */\r\n protected withGatewayApi(gatewayApi: string): this {\r\n this.customHeaders = {\r\n ...this.customHeaders,\r\n [HEADER_GATEWAY_API]: gatewayApi\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Get current service name\r\n * @returns Gateway API name hoặc undefined\r\n */\r\n protected getServiceName(): string | undefined {\r\n return this.serviceName;\r\n }\r\n\r\n /**\r\n * Get base URL for current service\r\n * @returns Base URL hoặc undefined\r\n */\r\n protected getBaseUrl(): string | undefined {\r\n return this.baseUrl;\r\n }\r\n}\r\n\r\nexport interface CRUDResult {\r\n status: number;\r\n message: string;\r\n data: any;\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\nconst USER_KEY = \"UserPrincipal\";\r\nconst AUTH_EXPIRED_KEY = \"__AUTH_EXPIRED__\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class StorageService {\r\n clean(): void {\r\n window.sessionStorage.clear();\r\n }\r\n\r\n public saveUser(user: any): void {\r\n window.sessionStorage.removeItem(USER_KEY);\r\n window.sessionStorage.setItem(USER_KEY, JSON.stringify(user));\r\n // phiên mới hợp lệ → clear cờ hết hạn\r\n this.setAuthExpired(false);\r\n }\r\n\r\n public removeUser(): void {\r\n window.sessionStorage.removeItem(USER_KEY);\r\n }\r\n\r\n public getUser(): any {\r\n const user = window.sessionStorage.getItem(USER_KEY);\r\n if (user) {\r\n return JSON.parse(user);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public isLoggedIn(): boolean {\r\n const user = window.sessionStorage.getItem(USER_KEY);\r\n if (user) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public setAuthExpired(value: boolean): void {\r\n try {\r\n window.sessionStorage.setItem(AUTH_EXPIRED_KEY, value ? \"1\" : \"0\");\r\n } catch {}\r\n }\r\n\r\n public isAuthExpired(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(AUTH_EXPIRED_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserPrincipal } from \"@web-portal/core-domain\";\r\nimport { StorageService } from \"./storage.service\";\r\nimport { ApiService } from \"../api.service\";\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AuthService extends ApiService {\r\n private _user: UserPrincipal | null;\r\n\r\n private isReLogin: boolean = false;\r\n\r\n getIsReLogin(): boolean {\r\n return this.isReLogin;\r\n }\r\n\r\n setIsReLogin(value: boolean): void {\r\n this.isReLogin = value;\r\n }\r\n\r\n constructor(private _storageService: StorageService) {\r\n super({ baseUrl: \"/accounts\" });\r\n }\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n var isValidSession = await this.isValidSession();\r\n if (!isValidSession) {\r\n this._storageService.removeUser();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n async isValidSession(): Promise<boolean> {\r\n try {\r\n let response = await firstValueFrom(\r\n this._post<UserPrincipal>(`${this.baseUrl}/checkLogin`, null)\r\n );\r\n const user = response as UserPrincipal;\r\n if (user == null || user == undefined || user.UserID <= 0) {\r\n return false;\r\n }\r\n\r\n this._user = user;\r\n this._storageService.saveUser(this._user);\r\n return true;\r\n } catch (err) {\r\n console.log(\"error:\", err);\r\n return false;\r\n }\r\n }\r\n\r\n getCurrentUser() {\r\n var currentUser = this._storageService.getUser();\r\n return currentUser;\r\n }\r\n\r\n hasPermission(roleFunctionName: string): boolean {\r\n var currentUser = this._storageService.getUser();\r\n const user = currentUser as UserPrincipal;\r\n if (user == null) return false;\r\n return user.UserPermission?.map(x => x.RoleFunctionName).includes(\r\n roleFunctionName\r\n );\r\n }\r\n\r\n login(returnUrl) {\r\n try {\r\n const url = `${this.baseUrl}/login?returnUrl=${returnUrl}`;\r\n this._get<string>(url, null, false).subscribe({\r\n next: (url: any) => {\r\n window.location.href = url;\r\n return;\r\n },\r\n error: err => {\r\n console.log(\"err:\", err);\r\n }\r\n });\r\n } catch (err) {\r\n console.log(\"error:\", err);\r\n }\r\n return;\r\n }\r\n\r\n logout(): boolean {\r\n try {\r\n this._post<string>(`${this.baseUrl}/logout`).subscribe({\r\n next: async (url: string) => {\r\n this._storageService.clean();\r\n window.location.href = url;\r\n },\r\n error: err => {\r\n console.log(\"err:\", err);\r\n }\r\n });\r\n\r\n return true;\r\n } catch (err) {\r\n console.log(\"error:\", err);\r\n }\r\n return true;\r\n }\r\n}\r\n\r\nexport class SessionValidationError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"SessionValidationError\";\r\n }\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot, Router } from \"@angular/router\";\r\nimport { AUTH_DIALOG_SERVICE, IAuthDialogService } from \"../services/auth/auth-dialog.interface\";\r\nimport { StorageService } from \"../services/auth/storage.service\";\r\nimport { AuthService } from \"../services/auth/auth.service\";\r\n\r\nconst LOAD_IS_RELOAD_KEY = \"__LOAD_IS_RELOAD__\";\r\nconst HAS_NAVIGATED_KEY = \"__HAS_NAVIGATED__\";\r\n\r\nfunction isPageReload(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(LOAD_IS_RELOAD_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Kiểm tra xem đây có phải là điều hướng nội bộ SPA sau lần điều hướng đầu tiên hay không.\r\n * - Lần điều hướng đầu tiên sau khi app load: HAS_NAVIGATED_KEY chưa được set.\r\n * - Các lần điều hướng sau đó trong SPA: HAS_NAVIGATED_KEY === \"1\".\r\n */\r\nfunction hasNavigatedInSpa(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(HAS_NAVIGATED_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Đánh dấu rằng đã có ít nhất một lần điều hướng SPA sau khi app được load.\r\n */\r\nfunction markSpaNavigated(): void {\r\n try {\r\n window.sessionStorage.setItem(HAS_NAVIGATED_KEY, \"1\");\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AuthGuard {\r\n // Lazy inject AuthDialogService to avoid circular dependency\r\n private _authDialog: IAuthDialogService | null = null;\r\n private get authDialog(): IAuthDialogService | null {\r\n if (!this._authDialog) {\r\n this._authDialog = this.injector.get<IAuthDialogService>(AUTH_DIALOG_SERVICE, null);\r\n }\r\n return this._authDialog;\r\n }\r\n\r\n constructor(\r\n private readonly router: Router,\r\n private readonly _authService: AuthService,\r\n private readonly storage: StorageService,\r\n private readonly injector: Injector\r\n ) {\r\n this._authService.setIsReLogin(false);\r\n }\r\n\r\n async canActivate(route: ActivatedRouteSnapshot) {\r\n const requiredPermission = route.data.permission as string;\r\n var returnUrl = window.document.URL;\r\n // Ghi nhận trạng thái có user trong session TRƯỚC khi gọi isAuthenticated()\r\n const hadSessionUser = this.storage.isLoggedIn();\r\n var isAuthenticated = await this._authService.isAuthenticated();\r\n if (isAuthenticated) {\r\n this._authService.setIsReLogin(true);\r\n\r\n const hasPermission = this._authService.hasPermission(requiredPermission);\r\n if (!hasPermission) {\r\n this.router.navigate([\"page-403\"], { skipLocationChange: true });\r\n return false;\r\n }\r\n // Chỉ khi điều hướng thành công (đã auth + có quyền) và không phải reload\r\n // mới đánh dấu là đã có điều hướng SPA.\r\n // if (!isPageReload()) {\r\n // markSpaNavigated();\r\n // }\r\n return true;\r\n }\r\n\r\n // Nếu F5/reload → đá thẳng qua login, không popup\r\n if (isPageReload()) {\r\n this._authService.login(returnUrl);\r\n return false;\r\n }\r\n\r\n // Nếu trước đó chưa có user trong session (chưa từng login)\r\n // → redirect thẳng đến login, không show popup\r\n if (!hadSessionUser) {\r\n this._authService.login(returnUrl);\r\n return false;\r\n }\r\n\r\n // Nếu đã có user nhưng session hết hạn → show popup re-login\r\n if (!this.authDialog) {\r\n // Fallback: redirect to login if dialog service not provided\r\n this._authService.login(returnUrl);\r\n return false;\r\n }\r\n const confirmed = await this.authDialog.openReLoginDialog();\r\n if (confirmed) {\r\n // Mở popup đăng nhập lại, không reload trang hiện tại\r\n const screenX =\r\n typeof window.screenX != \"undefined\"\r\n ? window.screenX\r\n : window.screenLeft;\r\n const screenY =\r\n typeof window.screenY != \"undefined\"\r\n ? window.screenY\r\n : window.screenTop;\r\n const outerWidth =\r\n typeof window.outerWidth != \"undefined\"\r\n ? window.outerWidth\r\n : document.body.clientWidth;\r\n const outerHeight =\r\n typeof window.outerHeight != \"undefined\"\r\n ? window.outerHeight\r\n : document.body.clientHeight - 22;\r\n const width = 550;\r\n const height = 600;\r\n const left = screenX + (outerWidth - width) / 2;\r\n const top = screenY + (outerHeight - height) / 3;\r\n const features = [\r\n `width=${width}`,\r\n `height=${height}`,\r\n `left=${left}`,\r\n `top=${top}`,\r\n \"resizable=yes\",\r\n \"scrollbars=yes\",\r\n \"status=no\",\r\n \"location=no\",\r\n \"menubar=no\",\r\n \"toolbar=no\"\r\n ].join(\",\");\r\n\r\n const popupReturnUrl = `${window.document.baseURI}` + \"account/relogin\";\r\n window.open(\r\n `/accounts/relogin?returnUrl=${popupReturnUrl}`,\r\n \"Đăng nhập lại\",\r\n features\r\n );\r\n }\r\n\r\n // Hủy điều hướng hiện tại để không reload\r\n return false;\r\n }\r\n}\r\n","import { inject, Injector } from \"@angular/core\";\nimport {\n HttpErrorResponse,\n HttpResponse,\n HttpHeaders,\n HttpInterceptorFn\n} from \"@angular/common/http\";\nimport { tap } from \"rxjs/operators\";\nimport { Router } from \"@angular/router\";\nimport { CRUDResult } from \"../services/api.service\";\nimport { StorageService } from \"../services/auth/storage.service\";\nimport { AuthService } from \"../services/auth/auth.service\";\nimport { AUTH_DIALOG_SERVICE, IAuthDialogService } from \"../services/auth/auth-dialog.interface\";\n\n// Helper functions\nlet isShowingDialog = false;\n\nfunction hasSessionUser(): boolean {\n try {\n return !!window.sessionStorage.getItem(\"UserPrincipal\");\n } catch {\n return false;\n }\n}\n\n/**\n * Xác định lần load hiện tại có phải là F5/Reload không\n * Dùng PerformanceNavigationTiming để tránh phụ thuộc vào sessionStorage flag.\n */\nfunction isPageReload(): boolean {\n try {\n if (typeof performance === \"undefined\") {\n return false;\n }\n\n const nav =\n (performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined) || undefined;\n\n if (nav && (nav as any).type) {\n return (nav as any).type === \"reload\";\n }\n\n const legacyNav = (performance as any).navigation;\n return legacyNav && legacyNav.type === 1; // TYPE_RELOAD\n } catch {\n return false;\n }\n}\n\nconst HAS_NAVIGATED_KEY = \"__HAS_NAVIGATED__\";\nconst LOAD_IS_RELOAD_KEY = \"__LOAD_IS_RELOAD__\";\n\n/**\n * Đã từng điều hướng nội bộ SPA sau khi app load chưa.\n * - Lần load / điều hướng đầu tiên: key chưa được set.\n * - Các lần điều hướng SPA sau đó: key = \"1\".\n */\nfunction hasNavigatedInSpa(): boolean {\n try {\n return window.sessionStorage.getItem(HAS_NAVIGATED_KEY) === \"1\";\n } catch {\n return false;\n }\n}\n\n// Functional interceptor for newer Angular versions\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const router = inject(Router);\n const authService = inject(AuthService);\n const storage = inject(StorageService);\n const injector = inject(Injector);\n\n return next(req).pipe(\n tap(\n async response => {\n if (response instanceof HttpResponse) {\n const body = response.body as CRUDResult;\n if (body?.status === 401) {\n await ensureReLoginDialog(injector, authService, storage);\n return;\n }\n window.sessionStorage.setItem(\"__HAS_NAVIGATED__\", \"0\");\n window.sessionStorage.setItem(\"__LOAD_IS_RELOAD__\", \"0\");\n }\n },\n async error => {\n if (error instanceof HttpErrorResponse) {\n const respError = error as HttpErrorResponse;\n if (respError.status === 403) {\n router.navigate([\"/page-403\"]);\n } else if (respError.status === 401) {\n await ensureReLoginDialog(injector, authService, storage);\n return;\n }\n }\n }\n )\n );\n};\n\nasync function ensureReLoginDialog(\n injector: Injector,\n authService: AuthService,\n storage: StorageService\n): Promise<void> {\n // Lazy inject AuthDialogService to avoid circular dependency\n const authDialog = injector.get<IAuthDialogService>(AUTH_DIALOG_SERVICE, null);\n if (!authDialog) {\n // Fallback: redirect to login if dialog service not provided\n const returnUrl = window.location.href;\n authService.login(returnUrl);\n return;\n }\n // 1. Nếu đang reload trang (F5) và backend trả 401 → luôn redirect login, không popup\n if (isPageReload()) {\n const returnUrl = window.location.href;\n authService.login(returnUrl);\n return;\n }\n\n // 2. Nếu điều hướng nội bộ SPA (đang ở lần load/điều hướng)\n // → coi là full load / direct access, không popup, redirect login luôn\n if (hasNavigatedInSpa()) {\n const returnUrl = window.location.href;\n authService.login(returnUrl);\n return;\n }\n\n // 3. Nếu chưa có user trong session (first load ẩn danh) và chưa đặt cờ hết hạn → redirect ngay đến login\n if (!hasSessionUser() && !storage.isAuthExpired()) {\n const returnUrl = window.location.href;\n authService.login(returnUrl);\n return;\n }\n\n // 4. Các trường hợp còn lại:\n // - Request là HttpClient (AJAX)\n // - Không phải reload\n // - Đã từng điều hướng SPA\n // → Đây là lúc hiển thị popup re-login\n if (isShowingDialog) return;\n isShowingDialog = true;\n try {\n const confirmed = await authDialog.openReLoginDialog();\n if (confirmed) {\n storage.setAuthExpired(false);\n openReLogin();\n } else {\n storage.setAuthExpired(true);\n }\n } finally {\n isShowingDialog = false;\n }\n}\n\nfunction setHeaders(): HttpHeaders {\n let headers = new HttpHeaders();\n headers = headers.set(\n \"ConcungContextID\",\n generateUUID().toString().replace(/-/g, \"\")\n );\n headers = headers.set(\"returnUrl\", window.location.href);\n return headers;\n}\n\nfunction openReLogin(): boolean {\n var newwindow;\n let screenX: number =\n typeof window.screenX != \"undefined\" ? window.screenX : window.screenLeft;\n let screenY: number =\n typeof window.screenY != \"undefined\" ? window.screenY : window.screenTop;\n let outerWidth: number =\n typeof window.outerWidth != \"undefined\"\n ? window.outerWidth\n : document.body.clientWidth;\n let outerHeight: number =\n typeof window.outerHeight != \"undefined\"\n ? window.outerHeight\n : document.body.clientHeight - 22;\n\n let width = 550;\n let height = 600;\n let left = screenX + (outerWidth - width) / 2;\n let top = screenY + (outerHeight - height) / 3;\n\n let features = [\n `width=${width}`,\n `height=${height}`,\n `left=${left}`,\n `top=${top}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n \"status=no\",\n \"location=no\",\n \"menubar=no\",\n \"toolbar=no\"\n ].join(\",\");\n\n setTimeout(() => {\n var returnUrl = `${window.document.baseURI}` + \"account/relogin\";\n newwindow = window.open(\n `/accounts/relogin?returnUrl=${returnUrl}`,\n \"Đăng nhập lại\",\n features\n );\n\n if (window.focus && newwindow) {\n newwindow.focus();\n }\n }, 100);\n\n return false;\n}\n\nfunction generateUUID() {\n let dt = new Date().getTime();\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(\n /[xy]/g,\n function (c) {\n const r = (dt + Math.random() * 16) % 16 | 0;\n dt = Math.floor(dt / 16);\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n }\n );\n return uuid.replace(/-/g, \"\");\n}\n","import { HttpInterceptorFn } from \"@angular/common/http\";\r\n\r\n/**\r\n * Ensure ASP.NET's Request.IsAjaxRequest() recognizes Angular HttpClient calls,\r\n * so server can return 401 instead of 302 (redirect) for unauthorized API requests.\r\n *\r\n * ASP.NET MVC's IsAjaxRequest() checks for header:\r\n * X-Requested-With: XMLHttpRequest\r\n */\r\nexport const ajaxRequestInterceptor: HttpInterceptorFn = (req, next) => {\r\n // If caller already set it, respect existing value.\r\n if (req.headers.has(\"X-Requested-With\")) {\r\n return next(req);\r\n }\r\n\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n \"X-Requested-With\": \"XMLHttpRequest\"\r\n }\r\n })\r\n );\r\n};\r\n\r\n\r\n","import {\r\n HttpInterceptorFn,\r\n HttpRequest,\r\n HttpHandlerFn\r\n} from \"@angular/common/http\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError, switchMap, take } from \"rxjs/operators\";\r\n\r\n// Cache để lưu trữ pending requests\r\nconst pendingRequests = new Map<string, Observable<any>>();\r\n\r\nexport const duplicateRequestInterceptor: HttpInterceptorFn = (\r\n request: HttpRequest<unknown>,\r\n next: HttpHandlerFn\r\n): Observable<any> => {\r\n // Chỉ áp dụng cho GET requests\r\n if (request.method !== \"GET\") {\r\n return next(request);\r\n }\r\n\r\n const cacheKey = generateCacheKey(request);\r\n\r\n // Kiểm tra nếu có request đang pending\r\n if (pendingRequests.has(cacheKey)) {\r\n console.log(\r\n `[DuplicateRequestInterceptor] Duplicate request detected for: ${cacheKey}`\r\n );\r\n return pendingRequests.get(cacheKey)!;\r\n }\r\n\r\n // Tạo request mới\r\n const request$ = next(request).pipe(\r\n take(1),\r\n catchError(error => {\r\n // Xóa request khỏi pending khi có lỗi\r\n pendingRequests.delete(cacheKey);\r\n throw error;\r\n }),\r\n switchMap(response => {\r\n // Xóa request khỏi pending khi hoàn thành\r\n pendingRequests.delete(cacheKey);\r\n return of(response);\r\n })\r\n );\r\n\r\n // Lưu request vào pending\r\n pendingRequests.set(cacheKey, request$);\r\n\r\n return request$;\r\n};\r\n\r\nfunction generateCacheKey(request: HttpRequest<any>): string {\r\n const url = request.url;\r\n const params = request.params.toString();\r\n return `${request.method}:${url}${params ? `?${params}` : \"\"}`;\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode\r\n} from \"@angular/common/http\";\r\nimport { catchError, throwError } from \"rxjs\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n/**\r\n * Global Error Interceptor\r\n * Handles HTTP errors globally and shows appropriate user-friendly messages\r\n */\r\nexport const errorInterceptor: HttpInterceptorFn = (req, next) => {\r\n const messageService = inject(MessageService);\r\n const router = inject(Router);\r\n\r\n return next(req).pipe(\r\n catchError((error: HttpErrorResponse) => {\r\n // Don't show error for auth interceptor handled errors\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Auth interceptor already handles this\r\n return throwError(() => error);\r\n }\r\n\r\n // Don't show error for cancelled requests\r\n if (error.status === 0 && error.error?.name === \"TimeoutError\") {\r\n return throwError(() => error);\r\n }\r\n\r\n // Handle different error statuses\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Lỗi dữ liệu\",\r\n // detail:\r\n // error.error?.message ||\r\n // \"Dữ liệu không hợp lệ. Vui lòng kiểm tra lại.\",\r\n // life: 3000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.Unauthorized:\r\n // Already handled by auth interceptor\r\n return throwError(() => error);\r\n\r\n case HttpStatusCode.Forbidden:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Không có quyền\",\r\n // detail: \"Bạn không có quyền thực hiện thao tác này.\",\r\n // life: 3000\r\n // });\r\n router.navigate([\"/notfound\"]);\r\n break;\r\n\r\n case HttpStatusCode.NotFound:\r\n // messageService.add({\r\n // severity: \"warn\",\r\n // summary: \"Không tìm thấy\",\r\n // detail: error.error?.message || \"Tài nguyên không tồn tại.\",\r\n // life: 3000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.InternalServerError:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Lỗi server\",\r\n // detail: \"Server đang gặp sự cố. Vui lòng thử lại sau.\",\r\n // life: 4000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.ServiceUnavailable:\r\n case HttpStatusCode.GatewayTimeout:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Dịch vụ không khả dụng\",\r\n // detail: \"Dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau.\",\r\n // life: 4000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.NotAcceptable:\r\n // 406 - Let component handle the error message\r\n // Component will show appropriate toast via effect\r\n break;\r\n\r\n case 0:\r\n // Network error or CORS error\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Lỗi kết nối\",\r\n // detail:\r\n // \"Không thể kết nối đến server. Vui lòng kiểm tra kết nối mạng.\",\r\n // life: 4000\r\n // });\r\n break;\r\n\r\n default:\r\n const errorMessage =\r\n error.error?.message || \"Có lỗi xảy ra. Vui lòng thử lại.\";\r\n messageService.add({\r\n severity: \"error\",\r\n summary: \"Lỗi\",\r\n detail: errorMessage,\r\n life: 3000\r\n });\r\n }\r\n\r\n return throwError(() => error);\r\n })\r\n );\r\n};\r\n","import { Injectable, signal } from \"@angular/core\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class LoadingService {\r\n private activeRequestsCount = 0;\r\n readonly isLoading = signal(false);\r\n\r\n start(): void {\r\n this.activeRequestsCount++;\r\n if (!this.isLoading()) this.isLoading.set(true);\r\n }\r\n\r\n stop(): void {\r\n if (this.activeRequestsCount > 0) this.activeRequestsCount--;\r\n if (this.activeRequestsCount === 0 && this.isLoading()) {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.activeRequestsCount = 0;\r\n this.isLoading.set(false);\r\n }\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport { HttpInterceptorFn } from \"@angular/common/http\";\r\nimport { finalize } from \"rxjs/operators\";\r\nimport { LoadingService } from \"../services/loading.service\";\r\n\r\nexport const loadingInterceptor: HttpInterceptorFn = (req, next) => {\r\n const loadingService = inject(LoadingService);\r\n\r\n // Skip loading for specific APIs that are called frequently\r\n const skipLoadingUrls = [\r\n // Add more URLs here if needed\r\n ];\r\n\r\n const shouldSkipLoading = skipLoadingUrls.some(url => req.url.includes(url));\r\n\r\n if (shouldSkipLoading) {\r\n return next(req);\r\n }\r\n\r\n loadingService.start();\r\n\r\n return next(req).pipe(finalize(() => loadingService.stop()));\r\n};\r\n","import { Injectable, Inject, Optional } from \"@angular/core\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { BehaviorSubject, Observable, of } from \"rxjs\";\r\nimport { map, tap, catchError } from \"rxjs/operators\";\r\nimport { AppConfigModel, AppConfigResponse } from \"@web-portal/core-domain\";\r\n\r\n// Environment interface for library\r\nexport interface AppEnvironment {\r\n production?: boolean;\r\n appConfig?: {\r\n Environment?: string;\r\n ClientID?: string;\r\n };\r\n landingPageConfig?: {\r\n cacheClearUrlForCreate?: string | null;\r\n cacheClearUrlForUpdate?: string | null;\r\n };\r\n}\r\n\r\n// Injection token for environment (optional - app can provide it)\r\nexport const APP_ENVIRONMENT = Symbol('APP_ENVIRONMENT');\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AppConfigService {\r\n private configSubject = new BehaviorSubject<AppConfigModel | null>(null);\r\n private config: AppConfigModel | null = null;\r\n private environment: AppEnvironment | null = null;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Optional() @Inject(APP_ENVIRONMENT) env?: AppEnvironment\r\n ) {\r\n // Try to get environment from injection, or from window (for backward compatibility)\r\n this.environment = env || (typeof window !== 'undefined' && (window as any).__ENVIRONMENT__) || null;\r\n }\r\n\r\n /**\r\n * Lấy config từ backend và lưu vào service, fallback về environment nếu fail\r\n */\r\n loadConfig(): Observable<AppConfigModel> {\r\n return this.http.post<AppConfigResponse>(\"/api1/configs\", {}).pipe(\r\n map(response => response.data),\r\n tap(config => {\r\n this.config = config;\r\n this.configSubject.next(config);\r\n }),\r\n catchError(error => {\r\n console.warn(\r\n \"⚠️ Failed to load config from backend, using fallback from environment:\",\r\n error\r\n );\r\n return this.loadFallbackConfig();\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Load fallback config từ environment\r\n */\r\n private loadFallbackConfig(): Observable<AppConfigModel> {\r\n const env = this.environment?.appConfig;\r\n const fallbackConfig: AppConfigModel = {\r\n Environment: env?.Environment || \"\",\r\n ClientID: env?.ClientID || \"\"\r\n };\r\n\r\n this.config = fallbackConfig;\r\n this.configSubject.next(fallbackConfig);\r\n return of(fallbackConfig);\r\n }\r\n\r\n /**\r\n * Lấy config hiện tại (observable)\r\n */\r\n getConfig(): Observable<AppConfigModel | null> {\r\n return this.configSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Lấy config hiện tại (sync)\r\n */\r\n getConfigSync(): AppConfigModel | null {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Lấy Environment\r\n */\r\n getEnvironment(): string {\r\n const env = this.environment?.appConfig;\r\n return this.config?.Environment || env?.Environment || \"\";\r\n }\r\n\r\n /**\r\n * Lấy ClientID/ClientName\r\n */\r\n getClientName(): string {\r\n const env = this.environment?.appConfig;\r\n return this.config?.ClientID || env?.ClientID || \"\";\r\n }\r\n\r\n /**\r\n * Check xem đã load config chưa\r\n */\r\n isConfigLoaded(): boolean {\r\n return this.config !== null;\r\n }\r\n\r\n /**\r\n * Check xem config có được load từ backend hay fallback\r\n */\r\n isLoadedFromBackend(): boolean {\r\n // Compare với environment để check xem có được load từ backend không\r\n const env = this.environment?.appConfig;\r\n return (\r\n this.config !== null &&\r\n env &&\r\n this.config.Environment !== env.Environment\r\n );\r\n }\r\n\r\n /**\r\n * Lấy URL để clear cache khi tạo mới landing page\r\n */\r\n getCacheClearUrlForCreate(): string | null {\r\n return this.environment?.landingPageConfig?.cacheClearUrlForCreate || null;\r\n }\r\n\r\n /**\r\n * Lấy URL để clear cache khi cập nhật landing page\r\n */\r\n getCacheClearUrlForUpdate(): string | null {\r\n return this.environment?.landingPageConfig?.cacheClearUrlForUpdate || null;\r\n }\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { AppConfigService } from \"./app-config.service\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class AppInitializeService {\r\n private initAppSubject = new BehaviorSubject<boolean>(false);\r\n private appConfigService = inject(AppConfigService);\r\n\r\n initialize(): Observable<boolean> {\r\n return this.initAppSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Khởi tạo app: Load config từ backend hoặc fallback từ environment\r\n */\r\n initializeApp(): Observable<boolean> {\r\n return this.appConfigService.loadConfig().pipe(\r\n map(() => {\r\n this.setInitialize(true);\r\n\r\n const configSource = this.appConfigService.isLoadedFromBackend()\r\n ? \"backend\"\r\n : \"environment fallback\";\r\n return true;\r\n })\r\n // Không cần catchError nữa vì service đã handle fallback internally\r\n );\r\n }\r\n\r\n setInitialize(data: boolean) {\r\n this.initAppSubject.next(data);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { CookieService as NgxCookieService } from \"ngx-cookie-service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class CookieService {\r\n constructor(private cookieService: NgxCookieService) {}\r\n\r\n set(name: string, value: string, days: number = 1): void {\r\n this.cookieService.set(name, value, days);\r\n }\r\n\r\n get(name: string): string {\r\n return this.cookieService.get(name);\r\n }\r\n\r\n delete(name: string): void {\r\n this.cookieService.delete(name);\r\n }\r\n\r\n check(name: string): boolean {\r\n return this.cookieService.check(name);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class DocumentService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n get nativeDocument(): Document | null {\r\n return this.platformService.getDocument();\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LoaderService {\r\n private _loading = new BehaviorSubject<boolean>(false);\r\n public readonly loading$ = this._loading.asObservable();\r\n\r\n show() {\r\n this._loading.next(true);\r\n }\r\n\r\n hide() {\r\n this._loading.next(false);\r\n }\r\n}\r\n","import { Inject, Injectable } from \"@angular/core\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport {\r\n HttpClient,\r\n HttpEvent,\r\n HttpRequest,\r\n HttpEventType\r\n} from \"@angular/common/http\";\r\nimport { LoaderService } from \"./loader.service\";\r\nimport { DOCUMENT } from \"@angular/common\";\r\nimport { map, filter, catchError } from \"rxjs/operators\";\r\nimport moment from \"moment-timezone\";\r\n\r\n// Timezone cấu hình chung cho app (GMT+7 - Việt Nam)\r\nconst APP_TIMEZONE = \"Asia/Ho_Chi_Minh\";\r\n\r\n/**\r\n * Format datetime để chèn vào tên file download, theo timezone Việt Nam.\r\n * Mặc định dùng format an toàn cho filename: YYYYMMDD_HHmmss\r\n */\r\nfunction formatDateForFileName(\r\n date: Date | string | null | undefined,\r\n format: string = \"YYYYMMDD_HHmmss\"\r\n): string {\r\n if (!date) return \"\";\r\n\r\n const d = typeof date === \"string\" ? new Date(date) : date;\r\n if (isNaN(d.getTime())) return \"\";\r\n\r\n return moment.tz(d, APP_TIMEZONE).format(format);\r\n}\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileService {\r\n baseUrl = \"/api1/files\";\r\n baseUrlForFileHandler = \"/api1/files/filehandler\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _loader: LoaderService\r\n ) {}\r\n\r\n uploadExcel(file: File): Observable<HttpEvent<any>> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrlForFileHandler}/uploadExcel`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n downloadExcel(filePathOrRes: any, fileName: string = \"\") {\r\n this._loader.show();\r\n\r\n // Support passing raw path or API response { data: path } or { file_path: path }\r\n let filePath: string | undefined = undefined;\r\n if (typeof filePathOrRes === \"string\") {\r\n filePath = filePathOrRes;\r\n } else if (filePathOrRes) {\r\n filePath =\r\n filePathOrRes.data || filePathOrRes.file_path || filePathOrRes.FilePath;\r\n }\r\n\r\n if (!filePath) {\r\n this._loader.hide();\r\n return;\r\n }\r\n\r\n if (!fileName) {\r\n const timestamp = Date.now();\r\n fileName = `file_${timestamp}.xlsx`;\r\n }\r\n\r\n const encodedPath = encodeURIComponent(filePath);\r\n this._http\r\n .get(\r\n `${this.baseUrlForFileHandler}/downloadExcel?filePath=${encodedPath}`,\r\n {\r\n responseType: \"blob\"\r\n }\r\n )\r\n .subscribe({\r\n next: response => {\r\n if (response) {\r\n let blob = new Blob([response]);\r\n this.createElementDownload(blob, fileName);\r\n }\r\n this._loader.hide();\r\n },\r\n error: () => {\r\n this._loader.hide();\r\n }\r\n });\r\n }\r\n\r\n public exportExcel(sheet_datas: any, fileName: string): any {\r\n this._loader.show();\r\n this.exportExcelBase(sheet_datas).subscribe(event => {\r\n if (event.body) {\r\n let blob = new Blob([event.body]);\r\n this.createElementDownload(blob, fileName);\r\n this._loader.hide();\r\n }\r\n });\r\n }\r\n\r\n private exportExcelBase(sheet_datas: any): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"sheet_datas\", JSON.stringify(sheet_datas));\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrlForFileHandler}/exportExcel`,\r\n formData,\r\n { responseType: \"blob\" }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n private createElementDownload(blob: Blob, fileName: string = \"\") {\r\n const parts: string[] = fileName.split(\".\");\r\n let extention = parts.pop();\r\n // Phần tên file không bao gồm extension (có thể chứa dấu chấm ở giữa)\r\n let name = parts.join(\".\");\r\n\r\n // Thêm timestamp theo timezone Việt Nam vào tên file để dễ phân biệt\r\n const timestamp = formatDateForFileName(new Date());\r\n const safeBaseName = timestamp ? `${name}_${timestamp}` : name;\r\n\r\n const finalExtension = extention || \"xlsx\";\r\n const downLoadFileName = `${safeBaseName}.${finalExtension}`;\r\n let downloadLink = document.createElement(\"a\");\r\n downloadLink.href = window.URL.createObjectURL(blob);\r\n downloadLink.setAttribute(\"download\", downLoadFileName);\r\n document.body.appendChild(downloadLink);\r\n downloadLink.click();\r\n setTimeout(() => {\r\n document.body.removeChild(downloadLink);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Convert image file to WebP format\r\n * @param file - Image file to convert\r\n * @returns Observable<File> - Returns the original file if already WebP, otherwise returns converted WebP file\r\n */\r\n convertToWebp(file: File): Observable<File> {\r\n // Kiểm tra nếu file đã là định dạng webp\r\n const isWebP =\r\n file.type === \"image/webp\" || file.name.toLowerCase().endsWith(\".webp\");\r\n\r\n if (isWebP) {\r\n // Nếu đã là webp, trả về file gốc\r\n return of(file);\r\n }\r\n\r\n // Kiểm tra xem có phải file hình không\r\n if (!file.type.startsWith(\"image/\")) {\r\n return of(file); // Nếu không phải hình, trả về file gốc\r\n }\r\n\r\n // Upload file để convert sang webp\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/convertToWebp`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"blob\"\r\n }\r\n );\r\n\r\n return this._http.request(req).pipe(\r\n filter((event: HttpEvent<Blob>) => event.type === HttpEventType.Response),\r\n map((event: any) => {\r\n const blob = event.body as Blob;\r\n if (!blob) {\r\n throw new Error(\"Không nhận được file sau khi convert\");\r\n }\r\n\r\n // Tạo tên file mới với extension .webp\r\n const fileNameWithoutExt = file.name.replace(/\\.[^/.]+$/, \"\");\r\n const webpFileName = `${fileNameWithoutExt}.webp`;\r\n\r\n // Convert blob thành File object\r\n const webpFile = new File([blob], webpFileName, {\r\n type: \"image/webp\",\r\n lastModified: Date.now()\r\n });\r\n\r\n return webpFile;\r\n }),\r\n catchError((error: any) => {\r\n // Nếu có lỗi, trả về file gốc\r\n console.error(\"Lỗi khi convert sang WebP:\", error);\r\n return of(file);\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, firstValueFrom } from \"rxjs\";\r\nimport { HttpClient, HttpRequest } from \"@angular/common/http\";\r\nimport { ApiService } from \"./api.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileGCSService {\r\n baseUrl = \"/api1/files/gcs\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _apiService: ApiService\r\n ) {}\r\n\r\n getSignedLink(filePath: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getSignedLink?filePath=${filePath}`\r\n );\r\n }\r\n\r\n attachFile(file: File): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n attachFilePromise(file: File): Promise<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return firstValueFrom(this._http.request(req));\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, firstValueFrom } from \"rxjs\";\r\nimport { HttpClient, HttpRequest } from \"@angular/common/http\";\r\nimport { ApiService } from \"./api.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileAIA_GCSService {\r\n baseUrl = \"/api1/files/aia-gcs\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _apiService: ApiService\r\n ) {}\r\n\r\n getSignedLink(filePath: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getSignedLink?filePath=${filePath}`\r\n );\r\n }\r\n\r\n attachFile(file: File): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n attachFilePromise(file: File): Promise<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return firstValueFrom(this._http.request(req));\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, firstValueFrom } from \"rxjs\";\r\nimport { HttpClient, HttpRequest } from \"@angular/common/http\";\r\nimport { ApiService } from \"./api.service\";\r\n\r\nexport interface ImageUploadResult {\r\n url: string; // URL from GCS (absolute or relative)\r\n filePath: string; // Storage path on server\r\n fileName: string; // Generated filename\r\n originalName: string; // Original filename\r\n}\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileWAPGCSService {\r\n baseUrl = \"/api1/files/wap-gcs\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _apiService: ApiService\r\n ) {}\r\n\r\n getSignedLink(filePath: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getSignedLink?filePath=${filePath}`\r\n );\r\n }\r\n\r\n getPresignedLink(fileName: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getPresignedLink?fileName=${fileName}`\r\n );\r\n }\r\n\r\n setPublic(filePath: string): Observable<boolean> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/setPublic?filePath=${filePath}`\r\n );\r\n }\r\n\r\n attachFile(file: File): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n attachFilePromise(file: File): Promise<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return firstValueFrom(this._http.request(req));\r\n }\r\n\r\n uploadFile(file: File): Observable<ImageUploadResult> {\r\n return new Observable(observer => {\r\n let xhr: XMLHttpRequest | null = null;\r\n\r\n // Tạo tên file unique để tránh trùng tên khi upload nhiều lần\r\n const uniqueFileName = this.generateUniqueFileName(file.name);\r\n\r\n firstValueFrom(this.getPresignedLink(uniqueFileName))\r\n .then(presignedData => {\r\n if (!presignedData) {\r\n throw new Error(\"Không nhận được presigned link từ server\");\r\n }\r\n\r\n const presignedURL =\r\n presignedData.PreSignedURL ||\r\n presignedData.preSignedURL ||\r\n presignedData.url;\r\n const filePath = presignedData.FilePath || presignedData.filePath;\r\n const absoluteURL =\r\n presignedData.AbsoluteURL || presignedData.absoluteURL;\r\n\r\n if (!presignedURL) {\r\n throw new Error(\"Presigned URL không hợp lệ\");\r\n }\r\n\r\n const contentType = file.type || \"application/octet-stream\";\r\n xhr = new XMLHttpRequest();\r\n\r\n const cleanup = () => {\r\n if (xhr) {\r\n xhr.upload.removeEventListener(\"progress\", progressHandler);\r\n xhr.removeEventListener(\"load\", loadHandler);\r\n xhr.removeEventListener(\"error\", errorHandler);\r\n xhr.removeEventListener(\"timeout\", timeoutHandler);\r\n xhr.abort();\r\n xhr = null;\r\n }\r\n };\r\n\r\n const progressHandler = (_event: ProgressEvent) => {\r\n // No-op: progress not consumed by current callers\r\n };\r\n\r\n const loadHandler = async () => {\r\n if (xhr && xhr.status === 200) {\r\n try {\r\n if (filePath) {\r\n const setPublicResult = await firstValueFrom(\r\n this.setPublic(filePath)\r\n );\r\n if (setPublicResult !== true) {\r\n throw new Error(\"Set public không thành công\");\r\n }\r\n }\r\n\r\n const finalUrl = absoluteURL || presignedURL;\r\n const result = this.buildResult(file, filePath, finalUrl);\r\n\r\n cleanup();\r\n observer.next(result);\r\n observer.complete();\r\n } catch (err: any) {\r\n cleanup();\r\n const msg =\r\n err?.message ||\r\n \"Upload thành công nhưng setPublic thất bại. Vui lòng thử lại.\";\r\n observer.error(new Error(msg));\r\n }\r\n } else if (xhr) {\r\n const errorMessage = `Upload file thất bại: ${xhr.statusText} (${xhr.status})`;\r\n cleanup();\r\n observer.error(new Error(errorMessage));\r\n }\r\n };\r\n\r\n const errorHandler = () => {\r\n if (!xhr) return;\r\n\r\n let userMessage = \"Upload file thất bại\";\r\n\r\n if (xhr.status === 0) {\r\n userMessage =\r\n \"Không thể kết nối đến máy chủ lưu trữ. Máy chủ không phản hồi.\";\r\n } else if (xhr.status >= 500) {\r\n userMessage = \"Lỗi máy chủ. Vui lòng thử lại sau.\";\r\n } else if (xhr.status >= 400) {\r\n userMessage = `Lỗi yêu cầu: ${xhr.statusText}`;\r\n }\r\n\r\n cleanup();\r\n observer.error(new Error(userMessage));\r\n };\r\n\r\n const timeoutHandler = () => {\r\n cleanup();\r\n observer.error(\r\n new Error(\"Kết nối đến máy chủ hết thời gian. Vui lòng thử lại.\")\r\n );\r\n };\r\n\r\n xhr.upload.addEventListener(\"progress\", progressHandler);\r\n xhr.addEventListener(\"load\", loadHandler);\r\n xhr.addEventListener(\"error\", errorHandler);\r\n xhr.addEventListener(\"timeout\", timeoutHandler);\r\n\r\n xhr.timeout = 60000 * 5;\r\n xhr.open(\"PUT\", presignedURL, true);\r\n xhr.setRequestHeader(\"Content-Type\", contentType);\r\n xhr.send(file);\r\n })\r\n .catch(error => {\r\n if (xhr) {\r\n xhr.abort();\r\n xhr = null;\r\n }\r\n\r\n let userMessage = \"Upload file thất bại\";\r\n\r\n if (error.errorMessage) {\r\n userMessage = error.errorMessage;\r\n } else if (\r\n error.code === \"ECONNABORTED\" ||\r\n error.message?.includes(\"timeout\")\r\n ) {\r\n userMessage =\r\n \"Kết nối đến máy chủ hết thời gian. Vui lòng thử lại.\";\r\n } else if (\r\n error.message?.includes(\"failed to respond\") ||\r\n error.message?.includes(\"Network Error\")\r\n ) {\r\n userMessage =\r\n \"Không thể kết nối đến máy chủ lưu trữ. Máy chủ không phản hồi.\";\r\n } else if (error.message) {\r\n userMessage = `Lỗi kết nối: ${error.message}`;\r\n } else if (error.error?.message) {\r\n userMessage = error.error.message;\r\n }\r\n\r\n observer.error(new Error(userMessage));\r\n });\r\n\r\n return () => {\r\n if (xhr) {\r\n xhr.abort();\r\n xhr = null;\r\n }\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Tạo tên file unique bằng cách thêm timestamp và random string\r\n * Format: originalname-timestamp-random.ext\r\n */\r\n private generateUniqueFileName(originalFileName: string): string {\r\n const timestamp = Date.now();\r\n const randomString = Math.random().toString(36).substring(2, 9);\r\n\r\n // Tách tên file và extension\r\n const lastDotIndex = originalFileName.lastIndexOf(\".\");\r\n if (lastDotIndex === -1) {\r\n // Không có extension\r\n return `${originalFileName}-${timestamp}-${randomString}`;\r\n }\r\n\r\n const nameWithoutExt = originalFileName.substring(0, lastDotIndex);\r\n const extension = originalFileName.substring(lastDotIndex);\r\n\r\n return `${nameWithoutExt}-${timestamp}-${randomString}${extension}`;\r\n }\r\n\r\n private extractFileName(filePath: string): string {\r\n return filePath.split(\"/\").pop() || \"\";\r\n }\r\n\r\n private buildResult(\r\n file: File,\r\n filePath: string,\r\n url: string\r\n ): ImageUploadResult {\r\n return {\r\n url,\r\n filePath,\r\n fileName: this.extractFileName(filePath) || file.name,\r\n originalName: file.name\r\n };\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LoadingSpinnerService {\r\n private _loading = new BehaviorSubject<boolean>(false);\r\n public readonly loading$ = this._loading.asObservable();\r\n\r\n show() {\r\n this._loading.next(true);\r\n }\r\n\r\n hide() {\r\n this._loading.next(false);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LocalStorageService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n setItem(key: string, value: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n localStorage.setItem(key, value);\r\n });\r\n }\r\n\r\n getItem(key: string): string | null {\r\n return this.platformService.runOnBrowser(() => {\r\n return localStorage.getItem(key);\r\n });\r\n }\r\n\r\n removeItem(key: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n localStorage.removeItem(key);\r\n });\r\n }\r\n\r\n clear(): void {\r\n this.platformService.runOnBrowser(() => {\r\n localStorage.clear();\r\n });\r\n }\r\n\r\n hasKey(key: string): boolean {\r\n return (\r\n this.platformService.runOnBrowser(() => {\r\n return localStorage.getItem(key) !== null;\r\n }) || false\r\n );\r\n }\r\n}\r\n","import { DOCUMENT } from \"@angular/common\";\r\nimport { Inject, Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class OverlayService {\r\n private isOverlaySubject: BehaviorSubject<boolean> =\r\n new BehaviorSubject<boolean>(false);\r\n isOverlay$ = this.isOverlaySubject.asObservable();\r\n private overlayRequestors: Set<string> = new Set(); // Set lưu các component yêu cầu overlay\r\n\r\n htmlWrapperElement: any;\r\n\r\n constructor(@Inject(DOCUMENT) private _document: Document) {\r\n this.htmlWrapperElement = this._document.querySelector(\"html\");\r\n }\r\n\r\n onShowOverlay(requestor: string) {\r\n this.overlayRequestors.add(requestor); // Thêm component vào Set\r\n if (this.overlayRequestors.size === 1) {\r\n // Chỉ hiển thị overlay nếu là yêu cầu đầu tiên\r\n this.isOverlaySubject.next(true);\r\n this.htmlWrapperElement.style.overflow = \"hidden\";\r\n }\r\n }\r\n\r\n onHiddenOverlay(requestor: string) {\r\n this.overlayRequestors.delete(requestor); // Xóa component khỏi Set\r\n if (this.overlayRequestors.size === 0) {\r\n // Chỉ ẩn overlay nếu không còn yêu cầu nào\r\n this.isOverlaySubject.next(false);\r\n this.htmlWrapperElement.style.overflow = \"auto\";\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, of, BehaviorSubject } from \"rxjs\";\r\nimport { tap, catchError } from \"rxjs/operators\";\r\n\r\nexport interface CacheEntry<T> {\r\n data: T;\r\n timestamp: number;\r\n ttl: number; // Time to live in milliseconds\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class RequestCacheService {\r\n private cache = new Map<string, CacheEntry<any>>();\r\n private pendingRequests = new Map<string, Observable<any>>();\r\n private cacheStats = new BehaviorSubject<{ hits: number; misses: number }>({\r\n hits: 0,\r\n misses: 0\r\n });\r\n\r\n constructor() {\r\n // Cleanup expired cache entries every 5 minutes\r\n setInterval(() => this.cleanupExpiredEntries(), 5 * 60 * 1000);\r\n }\r\n\r\n /**\r\n * Lấy dữ liệu từ cache hoặc thực hiện request mới\r\n */\r\n get<T>(\r\n key: string,\r\n requestFn: () => Observable<T>,\r\n ttl: number = 5 * 60 * 1000\r\n ): Observable<T> {\r\n // Kiểm tra cache\r\n const cached = this.getFromCache<T>(key);\r\n if (cached) {\r\n this.incrementHits();\r\n return of(cached);\r\n }\r\n\r\n // Kiểm tra pending requests\r\n if (this.pendingRequests.has(key)) {\r\n return this.pendingRequests.get(key)!;\r\n }\r\n\r\n // Thực hiện request mới\r\n this.incrementMisses();\r\n const request$ = requestFn().pipe(\r\n tap(data => {\r\n this.setCache(key, data, ttl);\r\n this.pendingRequests.delete(key);\r\n }),\r\n catchError(error => {\r\n this.pendingRequests.delete(key);\r\n throw error;\r\n })\r\n );\r\n\r\n this.pendingRequests.set(key, request$);\r\n return request$;\r\n }\r\n\r\n /**\r\n * Lấy dữ liệu từ cache\r\n */\r\n private getFromCache<T>(key: string): T | null {\r\n const entry = this.cache.get(key);\r\n if (!entry) return null;\r\n\r\n const now = Date.now();\r\n if (now - entry.timestamp > entry.ttl) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n return entry.data;\r\n }\r\n\r\n /**\r\n * Lưu dữ liệu vào cache\r\n */\r\n private setCache<T>(key: string, data: T, ttl: number): void {\r\n this.cache.set(key, {\r\n data,\r\n timestamp: Date.now(),\r\n ttl\r\n });\r\n }\r\n\r\n /**\r\n * Xóa cache entry\r\n */\r\n clearCache(key: string): void {\r\n this.cache.delete(key);\r\n this.pendingRequests.delete(key);\r\n }\r\n\r\n /**\r\n * Xóa toàn bộ cache\r\n */\r\n clearAllCache(): void {\r\n this.cache.clear();\r\n this.pendingRequests.clear();\r\n }\r\n\r\n /**\r\n * Dọn dẹp cache entries đã hết hạn\r\n */\r\n private cleanupExpiredEntries(): void {\r\n const now = Date.now();\r\n for (const [key, entry] of this.cache.entries()) {\r\n if (now - entry.timestamp > entry.ttl) {\r\n this.cache.delete(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Tạo cache key từ URL và parameters\r\n */\r\n generateKey(url: string, params?: any): string {\r\n const paramsStr = params ? JSON.stringify(params) : \"\";\r\n return `${url}${paramsStr}`;\r\n }\r\n\r\n /**\r\n * Lấy thống kê cache\r\n */\r\n getStats(): Observable<{ hits: number; misses: number }> {\r\n return this.cacheStats.asObservable();\r\n }\r\n\r\n private incrementHits(): void {\r\n const stats = this.cacheStats.value;\r\n this.cacheStats.next({ ...stats, hits: stats.hits + 1 });\r\n }\r\n\r\n private incrementMisses(): void {\r\n const stats = this.cacheStats.value;\r\n this.cacheStats.next({ ...stats, misses: stats.misses + 1 });\r\n }\r\n\r\n /**\r\n * Log cache statistics\r\n */\r\n logStats(): void {\r\n const stats = this.cacheStats.value;\r\n const total = stats.hits + stats.misses;\r\n const hitRate = total > 0 ? ((stats.hits / total) * 100).toFixed(2) : \"0\";\r\n\r\n // console.log(`[RequestCacheService] Cache Stats:`, {\r\n // hits: stats.hits,\r\n // misses: stats.misses,\r\n // total,\r\n // hitRate: `${hitRate}%`,\r\n // cacheSize: this.cache.size,\r\n // pendingRequests: this.pendingRequests.size\r\n // });\r\n }\r\n}\r\n","import { Injectable, Type } from \"@angular/core\";\r\nimport { BreakpointService } from \"./breakpoint.service\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { ViewType } from \"@web-portal/core-domain\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class ResponsiveService {\r\n private currentView = new BehaviorSubject<ViewType>(ViewType.DESKTOP);\r\n currentView$ = this.currentView.asObservable();\r\n\r\n constructor(private breakpointService: BreakpointService) {\r\n this.breakpointService.breakpointsResult$.subscribe(breakpoints => {\r\n if (breakpoints.isDesktopUp) {\r\n this.currentView.next(ViewType.DESKTOP);\r\n } else if (breakpoints.isPhoneOnly) {\r\n this.currentView.next(ViewType.MOBILE);\r\n } else {\r\n this.currentView.next(ViewType.DESKTOP); // Default to desktop\r\n }\r\n });\r\n }\r\n}\r\n","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport {\r\n BehaviorSubject,\r\n Subject,\r\n Observable,\r\n fromEvent,\r\n filter,\r\n map,\r\n takeUntil\r\n} from \"rxjs\";\r\nimport { Router, NavigationEnd } from \"@angular/router\";\r\n\r\n/**\r\n * Search Event Types for Shell-MFE Communication\r\n * These mirror the types from the Search MFE but are simplified for cross-app communication\r\n */\r\nexport enum ShellSearchEventType {\r\n NAVIGATION_TO_SEARCH = \"NAVIGATION_TO_SEARCH\",\r\n NAVIGATION_AWAY_FROM_SEARCH = \"NAVIGATION_AWAY_FROM_SEARCH\",\r\n NAVIGATION_REQUEST = \"NAVIGATION_REQUEST\",\r\n ROUTE_ACCESSED_DIRECTLY = \"ROUTE_ACCESSED_DIRECTLY\",\r\n ROUTE_RELOADED = \"ROUTE_RELOADED\",\r\n SEARCH_INITIATED = \"SEARCH_INITIATED\",\r\n FILTER_CHANGED = \"FILTER_CHANGED\",\r\n SORT_CHANGED = \"SORT_CHANGED\"\r\n}\r\n\r\n/**\r\n * Shell Search Event Payload\r\n */\r\nexport interface ShellSearchEventPayload {\r\n type: ShellSearchEventType;\r\n source: \"shell\" | \"mfe-search\";\r\n timestamp: number;\r\n route?: string;\r\n queryParams?: Record<string, any>;\r\n data?: any;\r\n correlationId?: string;\r\n}\r\n\r\n/**\r\n * Cross-MFE Communication Interface\r\n */\r\nexport interface MFECommunicationEvent extends MessageEvent {\r\n data: {\r\n type: \"SEARCH_EVENT\";\r\n payload: ShellSearchEventPayload;\r\n };\r\n}\r\n\r\n/**\r\n * Search Event Bridge Service for Shell Application\r\n * Handles communication between Shell and Search MFE via postMessage and routing\r\n */\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class SearchEventBridgeService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly eventSubject =\r\n new BehaviorSubject<ShellSearchEventPayload | null>(null);\r\n\r\n // Current route tracking\r\n private currentRoute: string = \"\";\r\n private previousRoute: string = \"\";\r\n private isSearchRoute: boolean = false;\r\n\r\n constructor(private router: Router) {\r\n this.initializeRouteTracking();\r\n this.initializePostMessageListener();\r\n }\r\n\r\n /**\r\n * Get observable stream of search events\r\n */\r\n getEventStream(): Observable<ShellSearchEventPayload> {\r\n return this.eventSubject.pipe(\r\n filter(event => event !== null),\r\n takeUntil(this.destroy$)\r\n ) as Observable<ShellSearchEventPayload>;\r\n }\r\n\r\n /**\r\n * Emit a search event from Shell\r\n */\r\n emitShellEvent(type: ShellSearchEventType, data?: any): void {\r\n const event: ShellSearchEventPayload = {\r\n type,\r\n source: \"shell\",\r\n timestamp: Date.now(),\r\n route: this.currentRoute,\r\n queryParams: this.getQueryParams(),\r\n data,\r\n correlationId: this.generateCorrelationId()\r\n };\r\n\r\n this.eventSubject.next(event);\r\n this.postMessageToMFE(event);\r\n }\r\n\r\n /**\r\n * Navigate to search page with query\r\n */\r\n navigateToSearch(\r\n searchQuery: string,\r\n additionalParams?: Record<string, any>\r\n ): void {\r\n const queryParams = {\r\n q: searchQuery,\r\n ...additionalParams\r\n };\r\n\r\n // Emit navigation event\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_TO_SEARCH, {\r\n searchQuery,\r\n queryParams\r\n });\r\n\r\n // Perform navigation\r\n this.router.navigate([\"/tim-kiem\"], { queryParams });\r\n }\r\n\r\n /**\r\n * Update search query in current route\r\n */\r\n updateSearchQuery(searchQuery: string, replaceUrl: boolean = false): void {\r\n const currentParams = this.getQueryParams();\r\n const newParams = {\r\n ...currentParams,\r\n q: searchQuery\r\n };\r\n\r\n this.router.navigate([], {\r\n relativeTo: this.router.routerState.root,\r\n queryParams: newParams,\r\n replaceUrl\r\n });\r\n }\r\n\r\n /**\r\n * Clear search and navigate to home\r\n */\r\n clearSearchAndNavigateHome(): void {\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_AWAY_FROM_SEARCH, {\r\n targetRoute: \"/\"\r\n });\r\n\r\n this.router.navigate([\"/\"]);\r\n }\r\n\r\n /**\r\n * Check if currently on search route\r\n */\r\n isOnSearchRoute(): boolean {\r\n return this.isSearchRoute;\r\n }\r\n\r\n /**\r\n * Get current route info\r\n */\r\n getCurrentRouteInfo(): {\r\n route: string;\r\n queryParams: Record<string, any>;\r\n isSearchRoute: boolean;\r\n } {\r\n return {\r\n route: this.currentRoute,\r\n queryParams: this.getQueryParams(),\r\n isSearchRoute: this.isSearchRoute\r\n };\r\n }\r\n\r\n /**\r\n * Initialize route tracking\r\n */\r\n private initializeRouteTracking(): void {\r\n this.router.events\r\n .pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe((event: NavigationEnd) => {\r\n this.handleRouteChange(event);\r\n });\r\n\r\n // Handle initial route\r\n this.currentRoute = this.router.url;\r\n this.isSearchRoute = this.checkIfSearchRoute(this.currentRoute);\r\n }\r\n\r\n /**\r\n * Handle route changes\r\n */\r\n private handleRouteChange(event: NavigationEnd): void {\r\n this.previousRoute = this.currentRoute;\r\n this.currentRoute = event.url;\r\n const wasSearchRoute = this.isSearchRoute;\r\n this.isSearchRoute = this.checkIfSearchRoute(this.currentRoute);\r\n\r\n // Emit appropriate events based on route change\r\n if (!wasSearchRoute && this.isSearchRoute) {\r\n // Navigated to search\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_TO_SEARCH, {\r\n fromRoute: this.previousRoute,\r\n toRoute: this.currentRoute\r\n });\r\n } else if (wasSearchRoute && !this.isSearchRoute) {\r\n // Navigated away from search\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_AWAY_FROM_SEARCH, {\r\n fromRoute: this.previousRoute,\r\n toRoute: this.currentRoute\r\n });\r\n } else if (this.isSearchRoute) {\r\n // Navigation within search (filter/sort changes)\r\n this.detectSearchNavigationType();\r\n }\r\n }\r\n\r\n /**\r\n * Detect type of navigation within search page\r\n */\r\n private detectSearchNavigationType(): void {\r\n const currentParams = this.getQueryParams();\r\n const urlPath = this.currentRoute.split(\"?\")[0];\r\n\r\n // Check if it's a direct access or reload\r\n if (this.isDirectAccess()) {\r\n this.emitShellEvent(ShellSearchEventType.ROUTE_ACCESSED_DIRECTLY, {\r\n route: urlPath,\r\n queryParams: currentParams\r\n });\r\n } else if (this.isPageReload()) {\r\n this.emitShellEvent(ShellSearchEventType.ROUTE_RELOADED, {\r\n route: urlPath,\r\n queryParams: currentParams\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Check if current route is search route\r\n */\r\n private checkIfSearchRoute(route: string): boolean {\r\n return route.includes(\"/tim-kiem\");\r\n }\r\n\r\n /**\r\n * Check if this is direct access (no previous route or referrer)\r\n */\r\n private isDirectAccess(): boolean {\r\n return (\r\n !this.previousRoute ||\r\n (typeof window !== \"undefined\" && !document.referrer) ||\r\n (typeof window !== \"undefined\" && !window.history.length)\r\n );\r\n }\r\n\r\n /**\r\n * Check if this is a page reload\r\n */\r\n private isPageReload(): boolean {\r\n if (typeof window !== \"undefined\" && typeof performance !== \"undefined\") {\r\n const navigation = (performance as any).navigation;\r\n return navigation?.type === \"reload\";\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get current query parameters\r\n */\r\n private getQueryParams(): Record<string, any> {\r\n const urlTree = this.router.parseUrl(this.currentRoute);\r\n return urlTree.queryParams;\r\n }\r\n\r\n /**\r\n * Initialize postMessage listener for MFE communication\r\n */\r\n private initializePostMessageListener(): void {\r\n if (typeof window === \"undefined\") return;\r\n\r\n fromEvent<MFECommunicationEvent>(window, \"message\")\r\n .pipe(\r\n filter(event => this.isValidMFEEvent(event)),\r\n map(event => event.data.payload),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(payload => {\r\n this.handleMFEEvent(payload);\r\n });\r\n }\r\n\r\n /**\r\n * Validate incoming postMessage events\r\n */\r\n private isValidMFEEvent(event: MessageEvent): event is MFECommunicationEvent {\r\n return (\r\n event.data &&\r\n event.data.type === \"SEARCH_EVENT\" &&\r\n event.data.payload &&\r\n event.data.payload.source === \"mfe-search\"\r\n );\r\n }\r\n\r\n /**\r\n * Send event to MFE via postMessage\r\n */\r\n private postMessageToMFE(event: ShellSearchEventPayload): void {\r\n if (typeof window === \"undefined\") return;\r\n\r\n // Find MFE iframes or windows\r\n const mfeFrames = document.querySelectorAll(\r\n 'iframe[src*=\"5201\"], iframe[src*=\"mfe-search\"]'\r\n );\r\n\r\n mfeFrames.forEach(frame => {\r\n try {\r\n (frame as HTMLIFrameElement).contentWindow?.postMessage(\r\n {\r\n type: \"SEARCH_EVENT\",\r\n payload: event\r\n },\r\n \"*\"\r\n );\r\n } catch (error) {\r\n console.warn(\r\n \"[SearchEventBridge] Failed to send message to MFE:\",\r\n error\r\n );\r\n }\r\n });\r\n\r\n // Also try window.parent in case Shell is embedded\r\n try {\r\n window.parent?.postMessage(\r\n {\r\n type: \"SEARCH_EVENT\",\r\n payload: event\r\n },\r\n \"*\"\r\n );\r\n } catch (error) {\r\n // Ignore cross-origin errors\r\n }\r\n }\r\n\r\n /**\r\n * Generate correlation ID for event tracking\r\n */\r\n private generateCorrelationId(): string {\r\n return `shell_${Date.now()}_${Math.random().toString(36).substring(2)}`;\r\n }\r\n\r\n /**\r\n * Get event history for debugging\r\n */\r\n getEventHistory(): ShellSearchEventPayload[] {\r\n // Implementation would store recent events for debugging\r\n return [];\r\n }\r\n\r\n /**\r\n * Public method to handle events from MFE (called by wrapper)\r\n */\r\n handleMFEEvent(payload: ShellSearchEventPayload): void {\r\n // Re-emit the event for Shell consumers\r\n this.eventSubject.next(payload);\r\n\r\n // Handle specific events that require Shell action\r\n switch (payload.type) {\r\n case ShellSearchEventType.NAVIGATION_TO_SEARCH:\r\n // Handle navigation request from MFE\r\n if (payload.data?.searchQuery) {\r\n this.navigateToSearch(\r\n payload.data.searchQuery,\r\n payload.data?.additionalParams\r\n );\r\n } else if (payload.data?.queryParams) {\r\n // For cases like image search where only queryParams are provided\r\n this.router.navigate([\"/tim-kiem\"], {\r\n queryParams: payload.data.queryParams\r\n });\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.NAVIGATION_AWAY_FROM_SEARCH:\r\n // Handle navigation away from search\r\n if (payload.data?.targetRoute) {\r\n this.router.navigate([payload.data.targetRoute]);\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.NAVIGATION_REQUEST:\r\n // Handle general navigation request from MFE\r\n if (payload.data?.targetRoute) {\r\n this.router.navigate([payload.data.targetRoute]);\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.SEARCH_INITIATED:\r\n // Update URL if needed\r\n if (payload.data?.searchQuery) {\r\n this.updateSearchQuery(payload.data.searchQuery, true);\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.FILTER_CHANGED:\r\n case ShellSearchEventType.SORT_CHANGED:\r\n // These are handled by the MFE but can trigger Shell-level analytics\r\n break;\r\n }\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/**\r\n * Factory function for providing the service\r\n */\r\nexport function provideSearchEventBridge() {\r\n return {\r\n provide: SearchEventBridgeService,\r\n useClass: SearchEventBridgeService\r\n };\r\n}\r\n","import { Inject, Injectable } from \"@angular/core\";\r\nimport { Meta, Title } from \"@angular/platform-browser\";\r\nimport { DOCUMENT } from \"@angular/common\";\r\nimport { SeoSocialShareData } from \"@web-portal/core-domain\";\r\n\r\nexport enum NgxSeoMetaTagAttr {\r\n name = \"name\",\r\n property = \"property\"\r\n}\r\n\r\nexport interface NgxSeoMetaTag {\r\n attr: NgxSeoMetaTagAttr;\r\n attrValue: string;\r\n value?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class SeoService {\r\n constructor(\r\n private readonly meta: Meta,\r\n private readonly title: Title,\r\n // tslint:disable-next-line: variable-name\r\n @Inject(DOCUMENT) private readonly _document: Document\r\n ) {}\r\n\r\n public setData(data: SeoSocialShareData): void {\r\n this.setSection(data.section);\r\n if (typeof data.keywords !== \"undefined\") {\r\n this.setKeywords(data.keywords);\r\n }\r\n //this.setKeywords(data.keywords);\r\n this.setTitle(data.title);\r\n this.setType(data.type);\r\n this.setDescription(data.description);\r\n this.setImage(data.image);\r\n this.setUrl(data.url);\r\n this.setPublished(data.published);\r\n this.setModified(data.modified);\r\n this.setAuthor(data.author);\r\n }\r\n\r\n public setKeywords(keywords: string): void {\r\n if (Boolean(keywords)) {\r\n this.meta.updateTag({ name: \"keywords\", content: keywords });\r\n } else {\r\n this.meta.removeTag(`name='keywords'`);\r\n }\r\n }\r\n\r\n public setSection(section?: string): void {\r\n if (Boolean(section)) {\r\n //this.meta.updateTag({ name: 'article:section', content: section });\r\n if (typeof section !== \"undefined\") {\r\n this.meta.updateTag({ name: \"article:section\", content: section });\r\n }\r\n } else {\r\n this.meta.removeTag(`name='article:section'`);\r\n }\r\n }\r\n\r\n public setTitle(title: string = \"\") {\r\n this.title.setTitle(title);\r\n if (title && title.length) {\r\n this.meta.updateTag({ name: \"twitter:title\", content: title });\r\n this.meta.updateTag({ name: \"twitter:image:alt\", content: title });\r\n this.meta.updateTag({ property: \"og:image:alt\", content: title });\r\n this.meta.updateTag({ property: \"og:title\", content: title });\r\n this.meta.updateTag({ name: \"title\", content: title });\r\n } else {\r\n this.meta.removeTag(`name='twitter:title'`);\r\n this.meta.removeTag(`name='twitter:image:alt'`);\r\n this.meta.removeTag(`property='og:image:alt'`);\r\n this.meta.removeTag(`property='og:title'`);\r\n this.meta.removeTag(`name='title'`);\r\n }\r\n }\r\n\r\n public setType(type?: string) {\r\n if (type && type.length) {\r\n this.meta.updateTag({ property: \"og:type\", content: type });\r\n } else {\r\n this.meta.removeTag(`property='og:type'`);\r\n }\r\n }\r\n\r\n public setDescription(description?: string) {\r\n if (description && description.length) {\r\n this.meta.updateTag({\r\n name: \"twitter:description\",\r\n content: description\r\n });\r\n this.meta.updateTag({ property: \"og:description\", content: description });\r\n this.meta.updateTag({ name: \"description\", content: description });\r\n } else {\r\n this.meta.removeTag(`name='twitter:description'`);\r\n this.meta.removeTag(`property='og:description'`);\r\n this.meta.removeTag(`name='description'`);\r\n }\r\n }\r\n\r\n public setImage(image?: string) {\r\n if (image && image.length) {\r\n this.meta.updateTag({ name: \"twitter:image\", content: image });\r\n this.meta.updateTag({ property: \"og:image\", content: image });\r\n this.meta.updateTag({ property: \"og:image:height\", content: \"630\" });\r\n } else {\r\n this.meta.removeTag(`name='twitter:image'`);\r\n this.meta.removeTag(`property='og:image'`);\r\n this.meta.removeTag(`property='og:image:height'`);\r\n }\r\n }\r\n\r\n public setUrl(url?: string) {\r\n if (url && url.length) {\r\n this.meta.updateTag({ property: \"og:url\", content: url });\r\n } else {\r\n this.meta.removeTag(`property='og:url'`);\r\n }\r\n this.setCanonicalUrl(url);\r\n }\r\n\r\n public setPublished(publishedDateString?: string) {\r\n if (publishedDateString) {\r\n const publishedDate = new Date(publishedDateString);\r\n this.meta.updateTag({\r\n name: \"article:published_time\",\r\n content: publishedDate.toISOString()\r\n });\r\n this.meta.updateTag({\r\n name: \"published_date\",\r\n content: publishedDate.toISOString()\r\n });\r\n } else {\r\n this.meta.removeTag(`name='article:published_time'`);\r\n this.meta.removeTag(`name='publication_date'`);\r\n }\r\n }\r\n\r\n public setModified(modifiedDateString?: string) {\r\n if (modifiedDateString) {\r\n const modifiedDate = new Date(modifiedDateString);\r\n this.meta.updateTag({\r\n name: \"article:modified_time\",\r\n content: modifiedDate.toISOString()\r\n });\r\n this.meta.updateTag({\r\n name: \"og:updated_time\",\r\n content: modifiedDate.toISOString()\r\n });\r\n } else {\r\n this.meta.removeTag(`name='article:modified_time'`);\r\n this.meta.removeTag(`name='og:updated_time'`);\r\n }\r\n }\r\n\r\n public setAuthor(author?: string) {\r\n if (author && author.length) {\r\n this.meta.updateTag({ name: \"article:author\", content: author });\r\n this.meta.updateTag({ name: \"author\", content: author });\r\n } else {\r\n this.meta.removeTag(`name='article:author'`);\r\n this.meta.removeTag(`name='author'`);\r\n }\r\n }\r\n\r\n public setTwitterSiteCreator(site?: string): void {\r\n if (Boolean(site)) {\r\n //this.meta.updateTag({ name: 'twitter:site', content: site });\r\n if (typeof site !== \"undefined\") {\r\n this.meta.updateTag({ name: \"twitter:site\", content: site });\r\n this.meta.updateTag({ name: \"twitter:creator\", content: site });\r\n }\r\n } else {\r\n this.meta.removeTag(`name='twitter:site'`);\r\n this.meta.removeTag(`name='twitter:creator'`);\r\n }\r\n }\r\n\r\n public setTwitterCard(card?: string): void {\r\n if (Boolean(card)) {\r\n if (typeof card !== \"undefined\") {\r\n this.meta.updateTag({ name: \"twitter:card\", content: card });\r\n }\r\n } else {\r\n this.meta.removeTag(`name='twitter:card'`);\r\n }\r\n }\r\n\r\n public setFbAppId(appId?: string): void {\r\n if (Boolean(appId)) {\r\n if (typeof appId !== \"undefined\") {\r\n this.meta.updateTag({ property: \"fb:app_id\", content: appId });\r\n }\r\n } else {\r\n this.meta.removeTag(`property='fb:app_id'`);\r\n }\r\n }\r\n\r\n public setMetaTag(metaTag: NgxSeoMetaTag): void {\r\n if (Boolean(metaTag.value)) {\r\n if (\r\n typeof metaTag !== \"undefined\" &&\r\n typeof metaTag.attr !== \"undefined\" &&\r\n typeof metaTag.attrValue !== \"undefined\" &&\r\n typeof metaTag.value !== \"undefined\"\r\n ) {\r\n const metaTagObject = {\r\n [metaTag.attr]: metaTag.attrValue,\r\n content: metaTag.value\r\n };\r\n this.meta.updateTag(metaTagObject);\r\n }\r\n } else {\r\n const selector = `${metaTag.attr}='${metaTag.attrValue}'`;\r\n this.meta.removeTag(selector);\r\n }\r\n }\r\n\r\n public setMetaTags(metaTags: NgxSeoMetaTag[]): void {\r\n for (const metaTag of metaTags) {\r\n this.setMetaTag(metaTag);\r\n }\r\n }\r\n\r\n public setCanonicalUrl(url?: string) {\r\n // first remove potential previous url\r\n const selector = `link[rel='canonical']`;\r\n const canonicalElement = this._document.head.querySelector(selector);\r\n if (canonicalElement) {\r\n this._document.head.removeChild(canonicalElement);\r\n }\r\n\r\n if (url && url.length) {\r\n const link: HTMLLinkElement = this._document.createElement(\"link\");\r\n link.setAttribute(\"rel\", \"canonical\");\r\n this._document.head.appendChild(link);\r\n link.setAttribute(\"href\", url);\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class SessionStorageService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n setItem(key: string, value: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n sessionStorage.setItem(key, value);\r\n });\r\n }\r\n\r\n getItem(key: string): string | null {\r\n return this.platformService.runOnBrowser(() => {\r\n return sessionStorage.getItem(key);\r\n });\r\n }\r\n\r\n removeItem(key: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n sessionStorage.removeItem(key);\r\n });\r\n }\r\n\r\n clear(): void {\r\n this.platformService.runOnBrowser(() => {\r\n sessionStorage.clear();\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class WindowService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n get nativeWindow(): Window | null {\r\n return this.platformService.getWindow();\r\n }\r\n\r\n get configApp(): AppConfig | null {\r\n return this.nativeWindow?.__CONFIG_APP__ ?? null;\r\n }\r\n\r\n getConfigValue<T = any>(key: keyof AppConfig): T | null {\r\n return (this.configApp?.[key] as T) ?? null;\r\n }\r\n}\r\n\r\n// src/custom-types.d.ts\r\ninterface AppConfig {\r\n googleAnalyticsKey?: string;\r\n apiUrl?: string;\r\n environment?: string;\r\n // Thêm các key khác nếu cần\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n __CONFIG_APP__?: AppConfig;\r\n }\r\n}\r\n\r\nexport {}; // cần thiết để được xem là module\r\n","/*\r\n * Public API Surface of core/infrastructure\r\n */\r\n\r\n// Guards\r\nexport * from './lib/guards/auth.guard';\r\n\r\n// Interceptors\r\nexport * from './lib/interceptors/auth.interceptor';\r\nexport * from './lib/interceptors/ajax-request.interceptor';\r\nexport * from './lib/interceptors/duplicate-request.interceptor';\r\nexport * from './lib/interceptors/error.interceptor';\r\nexport * from './lib/interceptors/loading-bar.interceptor';\r\n\r\n// Services\r\nexport * from './lib/services/api.service';\r\nexport * from './lib/services/app-config.service';\r\nexport * from './lib/services/app-initialize.service';\r\nexport * from './lib/services/breakpoint.service';\r\nexport * from './lib/services/cache.service';\r\nexport * from './lib/services/cookie.service';\r\nexport * from './lib/services/document.service';\r\nexport * from './lib/services/file.service';\r\nexport * from './lib/services/file-gcs.service';\r\nexport * from './lib/services/file-aia-gcs.service';\r\nexport * from './lib/services/file-wap-gcs.service';\r\nexport * from './lib/services/loader.service';\r\nexport * from './lib/services/loading.service';\r\nexport * from './lib/services/loading-spinner.service';\r\nexport * from './lib/services/local-storage.service';\r\nexport * from './lib/services/notification.service';\r\nexport * from './lib/services/overlay.service';\r\nexport * from './lib/services/platform.service';\r\nexport * from './lib/services/request-cache.service';\r\nexport * from './lib/services/responsive.service';\r\nexport * from './lib/services/search-event-bridge.service';\r\nexport * from './lib/services/seo.service';\r\nexport * from './lib/services/session-storage.service';\r\nexport * from './lib/services/window.service';\r\n\r\n// Auth Services\r\nexport * from './lib/services/auth/auth.service';\r\nexport * from './lib/services/auth/storage.service';\r\n\r\n// Types and Tokens\r\nexport type { AppEnvironment } from './lib/services/app-config.service';\r\nexport { APP_ENVIRONMENT } from './lib/services/app-config.service';\r\nexport type { IAuthDialogService } from './lib/services/auth/auth-dialog.interface';\r\nexport { AUTH_DIALOG_SERVICE } from './lib/services/auth/auth-dialog.interface';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PLATFORM_ID","i1.StorageService","LOAD_IS_RELOAD_KEY","HAS_NAVIGATED_KEY","isPageReload","hasNavigatedInSpa","i1","i2.AuthService","i3.StorageService","tap","catchError","map","i1.PlatformService","filter","i2.LoaderService","i2.ApiService","i1.BreakpointService"],"mappings":"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"}
1
+ {"version":3,"file":"web-portal-core-infrastructure.mjs","sources":["../../../../projects/core/infrastructure/src/lib/services/auth/auth-dialog.interface.ts","../../../../projects/core/infrastructure/src/lib/services/auth/auth-session-keys.ts","../../../../projects/core/infrastructure/src/lib/services/breakpoint.service.ts","../../../../projects/core/infrastructure/src/lib/services/cache.service.ts","../../../../projects/core/infrastructure/src/lib/services/platform.service.ts","../../../../projects/core/infrastructure/src/lib/services/api.service.ts","../../../../projects/core/infrastructure/src/lib/services/auth/storage.service.ts","../../../../projects/core/infrastructure/src/lib/services/auth/auth.service.ts","../../../../projects/core/infrastructure/src/lib/guards/auth.guard.ts","../../../../projects/core/infrastructure/src/lib/interceptors/auth.interceptor.ts","../../../../projects/core/infrastructure/src/lib/interceptors/ajax-request.interceptor.ts","../../../../projects/core/infrastructure/src/lib/interceptors/duplicate-request.interceptor.ts","../../../../projects/core/infrastructure/src/lib/interceptors/error.interceptor.ts","../../../../projects/core/infrastructure/src/lib/services/loading.service.ts","../../../../projects/core/infrastructure/src/lib/interceptors/loading-bar.interceptor.ts","../../../../projects/core/infrastructure/src/lib/services/app-config.service.ts","../../../../projects/core/infrastructure/src/lib/services/app-initialize.service.ts","../../../../projects/core/infrastructure/src/lib/services/cookie.service.ts","../../../../projects/core/infrastructure/src/lib/services/document.service.ts","../../../../projects/core/infrastructure/src/lib/services/loader.service.ts","../../../../projects/core/infrastructure/src/lib/services/file.service.ts","../../../../projects/core/infrastructure/src/lib/services/file-gcs.service.ts","../../../../projects/core/infrastructure/src/lib/services/file-aia-gcs.service.ts","../../../../projects/core/infrastructure/src/lib/services/file-wap-gcs.service.ts","../../../../projects/core/infrastructure/src/lib/services/loading-spinner.service.ts","../../../../projects/core/infrastructure/src/lib/services/local-storage.service.ts","../../../../projects/core/infrastructure/src/lib/services/overlay.service.ts","../../../../projects/core/infrastructure/src/lib/services/request-cache.service.ts","../../../../projects/core/infrastructure/src/lib/services/responsive.service.ts","../../../../projects/core/infrastructure/src/lib/services/search-event-bridge.service.ts","../../../../projects/core/infrastructure/src/lib/services/seo.service.ts","../../../../projects/core/infrastructure/src/lib/services/session-storage.service.ts","../../../../projects/core/infrastructure/src/lib/services/window.service.ts","../../../../projects/core/infrastructure/src/public-api.ts","../../../../projects/core/infrastructure/src/web-portal-core-infrastructure.ts"],"sourcesContent":["/**\r\n * Interface for authentication dialog service\r\n * App should provide implementation via AUTH_DIALOG_SERVICE token\r\n */\r\nexport interface IAuthDialogService {\r\n openReLoginDialog(): Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Injection token for AuthDialogService\r\n * App should provide implementation in app.config.ts\r\n */\r\nimport { InjectionToken } from '@angular/core';\r\nexport const AUTH_DIALOG_SERVICE = new InjectionToken<IAuthDialogService>('AUTH_DIALOG_SERVICE');\r\n","// Các key dùng chung trong sessionStorage để nhận diện trạng thái load trang và điều hướng SPA\r\n\r\nexport const LOAD_IS_RELOAD_KEY = \"__LOAD_IS_RELOAD__\";\r\nexport const HAS_NAVIGATED_KEY = \"__HAS_NAVIGATED__\";\r\n\r\n\r\n","import { BreakpointObserver, Breakpoints } from \"@angular/cdk/layout\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject, distinctUntilChanged } from \"rxjs\";\r\nimport { BREAKPOINTS_VALUE } from \"@web-portal/core-base\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class BreakpointService {\r\n private BreakpointsSubject: BehaviorSubject<Breakpoints> =\r\n new BehaviorSubject<Breakpoints>({\r\n isBigDesktopUp: false,\r\n isDesktopUp: false,\r\n isPhoneOnly: false,\r\n isTabletLandscapeUp: false,\r\n isTabletPortraitUp: false\r\n });\r\n breakpointsResult$ = this.BreakpointsSubject.asObservable();\r\n\r\n constructor(private breakpointObserver: BreakpointObserver) {\r\n this.breakpoint$.subscribe(state => {\r\n const newBreakpoints: Breakpoints = {\r\n isPhoneOnly: state.breakpoints[BREAKPOINTS_VALUE.FOR_PHONE_ONLY],\r\n isTabletPortraitUp:\r\n state.breakpoints[BREAKPOINTS_VALUE.FOR_TABLET_PORTRAIT_UP],\r\n isTabletLandscapeUp:\r\n state.breakpoints[BREAKPOINTS_VALUE.FOR_TABLET_LANDSCAPE_UP],\r\n isDesktopUp: state.breakpoints[BREAKPOINTS_VALUE.FOR_DESKTOP_UP],\r\n isBigDesktopUp: state.breakpoints[BREAKPOINTS_VALUE.FOR_BIG_DESKTOP_UP]\r\n };\r\n\r\n this.setBreakpoints(newBreakpoints);\r\n });\r\n }\r\n\r\n private readonly breakpoint$ = this.breakpointObserver\r\n .observe([\r\n //for-big-desktop-up\r\n BREAKPOINTS_VALUE.FOR_BIG_DESKTOP_UP,\r\n\r\n //for-desktop-up\r\n BREAKPOINTS_VALUE.FOR_DESKTOP_UP,\r\n\r\n //for-tablet-landscape-up\r\n BREAKPOINTS_VALUE.FOR_TABLET_LANDSCAPE_UP,\r\n\r\n //for-tablet-portrait-up\r\n BREAKPOINTS_VALUE.FOR_TABLET_PORTRAIT_UP,\r\n\r\n //for-phone-only\r\n BREAKPOINTS_VALUE.FOR_PHONE_ONLY\r\n ])\r\n .pipe(distinctUntilChanged());\r\n\r\n public setBreakpoints(breakpoints: Breakpoints) {\r\n this.BreakpointsSubject.next(breakpoints);\r\n }\r\n\r\n public getBreakpoints(): Breakpoints {\r\n return this.BreakpointsSubject.getValue()\r\n ? this.BreakpointsSubject.getValue()\r\n : {\r\n isPhoneOnly: false,\r\n isTabletPortraitUp: false,\r\n isTabletLandscapeUp: true,\r\n isDesktopUp: false,\r\n isBigDesktopUp: false\r\n };\r\n }\r\n}\r\n\r\nexport interface Breakpoints {\r\n isPhoneOnly: boolean;\r\n isTabletPortraitUp: boolean;\r\n isTabletLandscapeUp: boolean;\r\n isDesktopUp: boolean;\r\n isBigDesktopUp: boolean;\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n// Cache configuration constants\r\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000; // 5 minutes\r\nconst MAX_CACHE_SIZE = 100;\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class CacheService {\r\n private cache = new Map<\r\n string,\r\n { data: any; timestamp: number; lastAccess: number }\r\n >();\r\n private readonly DEFAULT_TTL = DEFAULT_CACHE_TIME;\r\n private readonly MAX_CACHE_SIZE = MAX_CACHE_SIZE;\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Get data from cache by key\r\n * @param key Cache key\r\n * @returns Cached data or null if not found or expired\r\n */\r\n get(key: string): any | null {\r\n const item = this.cache.get(key);\r\n if (!item) return null;\r\n\r\n const now = Date.now();\r\n if (now - item.timestamp > this.DEFAULT_TTL) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n // Update last access time\r\n item.lastAccess = now;\r\n this.cache.set(key, item);\r\n\r\n return item.data;\r\n }\r\n\r\n /**\r\n * Store data in cache\r\n * @param key Cache key\r\n * @param data Data to store\r\n * @param ttl Time to live for the cache entry (in milliseconds)\r\n */\r\n set(key: string, data: any, ttl: number = this.DEFAULT_TTL): void {\r\n const now = Date.now();\r\n\r\n // Check if cache has reached size limit\r\n if (this.cache.size >= this.MAX_CACHE_SIZE && !this.cache.has(key)) {\r\n this.removeLeastRecentlyUsed();\r\n }\r\n\r\n this.cache.set(key, {\r\n data,\r\n timestamp: now,\r\n lastAccess: now\r\n });\r\n }\r\n\r\n /**\r\n * Check if cache has valid (non-expired) data for key\r\n * @param key Cache key\r\n * @returns True if cache has valid data\r\n */\r\n has(key: string): boolean {\r\n const item = this.cache.get(key);\r\n if (!item) return false;\r\n\r\n const now = Date.now();\r\n if (now - item.timestamp > this.DEFAULT_TTL) {\r\n this.remove(key);\r\n return false;\r\n }\r\n\r\n // Update last access time\r\n item.lastAccess = now;\r\n this.cache.set(key, item);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove item from cache by key\r\n * @param key Cache key\r\n */\r\n remove(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n /**\r\n * Clear all cache data\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n\r\n /**\r\n * Generate a unique key for a given URL and optional parameters\r\n * @param url Base URL\r\n * @param params Optional query parameters\r\n * @returns Generated key\r\n */\r\n generateKey(url: string, params?: any): string {\r\n if (!params) return url;\r\n return `${url}?${JSON.stringify(params)}`;\r\n }\r\n\r\n /**\r\n * Remove the least recently used item from cache when it reaches MAX_CACHE_SIZE\r\n * @private\r\n */\r\n private removeLeastRecentlyUsed(): void {\r\n let oldestKey: string | null = null;\r\n let oldestAccess = Date.now();\r\n\r\n // Find the least recently used item\r\n this.cache.forEach((value, key) => {\r\n if (value.lastAccess < oldestAccess) {\r\n oldestAccess = value.lastAccess;\r\n oldestKey = key;\r\n }\r\n });\r\n\r\n // Remove the least recently used item\r\n if (oldestKey) {\r\n this.remove(oldestKey);\r\n }\r\n }\r\n}\r\n","import { isPlatformBrowser } from \"@angular/common\";\r\nimport { Inject, Injectable, PLATFORM_ID } from \"@angular/core\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class PlatformService {\r\n constructor(@Inject(PLATFORM_ID) private platformId: Object) {}\r\n\r\n get isBrowser(): boolean {\r\n return isPlatformBrowser(this.platformId);\r\n }\r\n\r\n get isServer(): boolean {\r\n return !isPlatformBrowser(this.platformId);\r\n }\r\n\r\n runOnBrowser(callback: Function): any {\r\n if (this.isBrowser) {\r\n return callback();\r\n }\r\n return null;\r\n }\r\n\r\n runOnServer(callback: Function): any {\r\n if (this.isServer) {\r\n return callback();\r\n }\r\n return null;\r\n }\r\n\r\n getWindow(): Window | null {\r\n return this.isBrowser ? window : null;\r\n }\r\n\r\n getDocument(): Document | null {\r\n return this.isBrowser ? document : null;\r\n }\r\n\r\n getNavigator(): Navigator | null {\r\n return this.isBrowser ? navigator : null;\r\n }\r\n\r\n getLocalStorage(): Storage | null {\r\n return this.isBrowser ? localStorage : null;\r\n }\r\n\r\n getSessionStorage(): Storage | null {\r\n return this.isBrowser ? sessionStorage : null;\r\n }\r\n}\r\n","import { Injectable, inject, Optional, Inject } from \"@angular/core\";\r\nimport { catchError, filter, map, tap } from \"rxjs\";\r\nimport {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n HttpRequest,\r\n HttpResponse,\r\n HttpEventType,\r\n HttpEvent\r\n} from \"@angular/common/http\";\r\nimport { throwError, Observable, of } from \"rxjs\";\r\n// Note: environment is not imported in library - will be injected or passed from app\r\nimport { Breakpoints, BreakpointService } from \"./breakpoint.service\";\r\nimport { CacheService } from \"./cache.service\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n// Constants\r\nconst HTTP_STATUS = {\r\n OK: 200,\r\n NO_CONTENT: 204,\r\n BAD_REQUEST: 400,\r\n NOT_ACCEPTABLE: 406\r\n} as const;\r\n\r\nconst ERROR_MESSAGES = {\r\n INVALID_DATA: \"Dữ liệu không hợp lệ\",\r\n INVALID_DATA_RETRY: \"Dữ liệu không hợp lệ. Vui lòng thao tác lại\",\r\n NO_CONTENT: \"Không có dữ liệu hoặc không có quyền xem dữ liệu\"\r\n} as const;\r\n\r\nconst PLATFORM_ID = {\r\n PHONE: \"1\",\r\n DESKTOP: \"2\"\r\n} as const;\r\n\r\nconst HEADER_GATEWAY_API = \"gateway-api\" as const;\r\n\r\n/**\r\n * Configuration cho ApiService (optional)\r\n */\r\nexport interface ApiServiceConfig {\r\n /** Base URL cho service (optional) */\r\n baseUrl?: string;\r\n /** Gateway API name (optional) - e.g., \"mdm-api\", \"ecom-api\", \"se-api\" */\r\n gatewayApi?: string;\r\n}\r\n\r\n/**\r\n * Injection token cho ApiServiceConfig - chỉ dùng để tránh lỗi DI\r\n * Thực tế config không được inject, chỉ truyền trực tiếp khi extend\r\n */\r\nexport const API_SERVICE_CONFIG = Symbol(\"API_SERVICE_CONFIG\");\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class ApiService {\r\n readonly isBrowser: boolean;\r\n protected customHeaders: Record<string, string> = {};\r\n protected baseUrl?: string;\r\n protected serviceName?: string;\r\n private readonly _http = inject(HttpClient);\r\n private readonly _breakpoints = inject(BreakpointService);\r\n private readonly _cache = inject(CacheService);\r\n private readonly _platformService = inject(PlatformService);\r\n\r\n breakpoints: Breakpoints;\r\n\r\n /**\r\n * Constructor của ApiService\r\n * @param config - Config cho service (optional khi inject trực tiếp, bắt buộc khi extend)\r\n * Note: Config không được inject qua DI, chỉ truyền trực tiếp khi extend class\r\n */\r\n constructor(\r\n @Optional() @Inject(API_SERVICE_CONFIG) config?: ApiServiceConfig | string\r\n ) {\r\n // Không inject config qua DI - chỉ nhận khi extend class\r\n // Khi inject trực tiếp qua DI, config sẽ là undefined\r\n // Khi extend class, bắt buộc phải truyền config vào super()\r\n this.isBrowser = this._platformService.isBrowser;\r\n this._breakpoints.breakpointsResult$.subscribe(observer => {\r\n this.breakpoints = observer;\r\n });\r\n\r\n // Tự động initialize nếu có config\r\n if (config) {\r\n this._initializeInternal(config);\r\n }\r\n }\r\n\r\n /**\r\n * Initialize service với config - Tự động được gọi trong constructor\r\n * @protected\r\n */\r\n protected _initializeInternal(config: ApiServiceConfig | string): void {\r\n const parsedConfig = this._parseConfig(config);\r\n this.baseUrl = parsedConfig.baseUrl;\r\n this.serviceName = parsedConfig.gatewayApi;\r\n\r\n if (parsedConfig.gatewayApi) {\r\n this._setGatewayApiHeader(parsedConfig.gatewayApi);\r\n }\r\n }\r\n\r\n /**\r\n * Protected GET request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _get<T>(\r\n url: string,\r\n params?: HttpParams,\r\n useCache: boolean = false\r\n ): Observable<T> {\r\n return this._handleCachedRequest<T>(\r\n () => this.sendRequest<T>(\"GET\", url, null, params),\r\n url,\r\n params?.toString(),\r\n useCache\r\n );\r\n }\r\n\r\n /**\r\n * Protected GET by ID request\r\n * @protected\r\n */\r\n protected _getById<T>(\r\n url: string,\r\n id: number,\r\n useCache: boolean = true\r\n ): Observable<T> {\r\n const fullUrl = `${url}/${id}`;\r\n return this._handleCachedRequest<T>(\r\n () => this.sendRequest<T>(\"GET\", fullUrl),\r\n fullUrl,\r\n undefined,\r\n useCache\r\n );\r\n }\r\n\r\n /**\r\n * Protected DELETE request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _delete<T>(url: string, id: string): Observable<T> {\r\n return this.sendRequest<T>(\"DELETE\", `${url}/${id}`);\r\n }\r\n\r\n /**\r\n * Protected PUT request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _put<T>(url: string, value: unknown): Observable<T> {\r\n return this.sendRequest<T>(\"PUT\", url, value);\r\n }\r\n\r\n /**\r\n * Protected POST request - Sử dụng trong child classes để tránh shadowing\r\n * @protected\r\n */\r\n protected _post<T>(\r\n url: string,\r\n value?: unknown,\r\n useCache: boolean = false\r\n ): Observable<T> {\r\n return this._handleCachedRequest<T>(\r\n () => this.sendRequest<T>(\"POST\", url, value),\r\n url,\r\n value,\r\n useCache\r\n );\r\n }\r\n\r\n /**\r\n * Protected POST FormData request\r\n * @protected\r\n */\r\n protected _postFormData<T>(\r\n url: string,\r\n value?: Record<string, unknown>\r\n ): Observable<T> {\r\n const formData = this._createFormData(value);\r\n return this._sendFormDataRequest<T>(url, formData, true);\r\n }\r\n\r\n /**\r\n * Protected POST File request\r\n * @protected\r\n */\r\n protected _postFile<T>(\r\n url: string,\r\n file: File,\r\n value?: Record<string, unknown>\r\n ): Observable<T> {\r\n const formData = this._createFormData(value);\r\n formData.append(\"file\", file);\r\n return this._sendFormDataRequest<T>(url, formData, false);\r\n }\r\n\r\n // ====== Public methods for backward compatibility ======\r\n // Các methods này giữ lại để backward compatibility\r\n // Child classes nên sử dụng protected methods với prefix _\r\n\r\n /**\r\n * GET request với optional caching\r\n * @deprecated Sử dụng protected _get() trong child classes để tránh shadowing\r\n */\r\n // get<T>(\r\n // url: string,\r\n // params?: HttpParams,\r\n // useCache: boolean = false\r\n // ): Observable<T> {\r\n // return this._get<T>(url, params, useCache);\r\n // }\r\n\r\n // /**\r\n // * GET request by ID với caching enabled by default\r\n // * @deprecated Sử dụng protected _getById() trong child classes để tránh shadowing\r\n // */\r\n // getById<T>(url: string, id: number, useCache: boolean = true): Observable<T> {\r\n // return this._getById<T>(url, id, useCache);\r\n // }\r\n\r\n /**\r\n * DELETE request\r\n * @deprecated Sử dụng protected _delete() trong child classes để tránh shadowing\r\n * Note: Method này đã bị remove để tránh conflict. Sử dụng _delete() trong child classes.\r\n */\r\n // delete<T>(url: string, id: string): Observable<T> {\r\n // return this._delete<T>(url, id);\r\n // }\r\n\r\n /**\r\n * PUT request\r\n * @deprecated Sử dụng protected _put() trong child classes để tránh shadowing\r\n */\r\n put<T>(url: string, value: unknown): Observable<T> {\r\n return this._put<T>(url, value);\r\n }\r\n\r\n /**\r\n * POST request với optional caching\r\n * @deprecated Sử dụng protected _post() trong child classes để tránh shadowing\r\n */\r\n post<T>(\r\n url: string,\r\n value?: unknown,\r\n useCache: boolean = false\r\n ): Observable<T> {\r\n return this._post<T>(url, value, useCache);\r\n }\r\n\r\n /**\r\n * POST request với FormData\r\n * @deprecated Sử dụng protected _postFormData() trong child classes để tránh shadowing\r\n */\r\n postFormData<T>(url: string, value?: Record<string, unknown>): Observable<T> {\r\n return this._postFormData<T>(url, value);\r\n }\r\n\r\n /**\r\n * POST request với File upload\r\n * @deprecated Sử dụng protected _postFile() trong child classes để tránh shadowing\r\n */\r\n postFile<T>(\r\n url: string,\r\n file: File,\r\n value?: Record<string, unknown>\r\n ): Observable<T> {\r\n return this._postFile<T>(url, file, value);\r\n }\r\n\r\n /**\r\n * Send HTTP request và process response\r\n * @private\r\n */\r\n private sendRequest<T>(\r\n method: string,\r\n url: string,\r\n data: unknown | null = null,\r\n params?: HttpParams\r\n ): Observable<T> {\r\n const requestOptions = new HttpRequest(method.toUpperCase(), url, data, {\r\n headers: this.setHeaders(),\r\n params: params,\r\n withCredentials: true,\r\n responseType: \"json\"\r\n });\r\n\r\n console.log(`[ApiService] Request: ${method} ${url}`, { \r\n headers: requestOptions.headers.keys().reduce((acc, key) => ({ ...acc, [key]: requestOptions.headers.get(key) }), {}),\r\n params: params?.toString(),\r\n data \r\n });\r\n\r\n return this._http.request<CRUDResult>(requestOptions).pipe(\r\n tap({\r\n next: (event) => console.log(`[ApiService] Event for ${url}:`, event),\r\n error: (error) => console.error(`[ApiService] Request Error for ${url}:`, error)\r\n }),\r\n filter(\r\n (event: HttpEvent<CRUDResult>) => event?.type === HttpEventType.Response\r\n ),\r\n map((response: HttpResponse<CRUDResult>) => {\r\n console.log(`[ApiService] Full Response Object for ${url}:`, response);\r\n return response.body as CRUDResult;\r\n }),\r\n tap((apiResponse: CRUDResult) => {\r\n console.log(`[ApiService] Raw Body from ${url}:`, apiResponse);\r\n if (apiResponse.status !== HTTP_STATUS.OK) {\r\n throw {\r\n status: apiResponse.status,\r\n message: apiResponse.message\r\n };\r\n }\r\n // Nếu status == 200 nhưng data == null thì ném lỗi với status 204\r\n if (apiResponse.status === HTTP_STATUS.OK && apiResponse.data === null) {\r\n throw {\r\n status: HTTP_STATUS.NO_CONTENT,\r\n message: ERROR_MESSAGES.NO_CONTENT\r\n };\r\n }\r\n }),\r\n map((apiResponse: CRUDResult) => apiResponse.data as T),\r\n catchError((error: unknown) => {\r\n console.error(`[ApiService] Caught Error for ${url}:`, error);\r\n return this._handleError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Send FormData request\r\n * @private\r\n */\r\n private _sendFormDataRequest<T>(\r\n url: string,\r\n formData: FormData,\r\n includeHeaders: boolean\r\n ): Observable<T> {\r\n const req = new HttpRequest(\"POST\", url, formData, {\r\n reportProgress: true,\r\n responseType: \"json\",\r\n ...(includeHeaders && { headers: this.setHeaders() })\r\n });\r\n\r\n return this._http.request<CRUDResult>(req).pipe(\r\n filter(\r\n (event: HttpEvent<CRUDResult>) => event.type === HttpEventType.Response\r\n ),\r\n map((response: HttpResponse<CRUDResult>) => response.body as CRUDResult),\r\n tap((apiResponse: CRUDResult) => {\r\n if (apiResponse.status !== HTTP_STATUS.OK) {\r\n throw {\r\n status: apiResponse.status,\r\n message: apiResponse.message\r\n };\r\n }\r\n // Nếu status == 200 nhưng data == null thì ném lỗi với status 204\r\n if (apiResponse.status === HTTP_STATUS.OK && apiResponse.data === null) {\r\n throw {\r\n status: HTTP_STATUS.NO_CONTENT,\r\n message: ERROR_MESSAGES.NO_CONTENT\r\n };\r\n }\r\n }),\r\n map((apiResponse: CRUDResult) => apiResponse.data as T),\r\n catchError((error: unknown) => this._handleError(error))\r\n );\r\n }\r\n\r\n /**\r\n * Get default headers cho mọi request\r\n * @protected\r\n */\r\n protected getDefaultHeaders(): Record<string, string> {\r\n return {\r\n ConcungContextID: this.generateUUID(),\r\n ...(this.isBrowser && { returnUrl: window.location.href }),\r\n Platform_id: this.breakpoints?.isPhoneOnly\r\n ? PLATFORM_ID.PHONE\r\n : PLATFORM_ID.DESKTOP\r\n };\r\n }\r\n\r\n /**\r\n * Set headers cho request\r\n * @protected\r\n */\r\n protected setHeaders(customHeaders?: Record<string, string>): HttpHeaders {\r\n const headersObj: Record<string, string> = {\r\n ...this.customHeaders,\r\n ...this.getDefaultHeaders(),\r\n ...(customHeaders || {})\r\n };\r\n\r\n let headers = new HttpHeaders();\r\n Object.entries(headersObj).forEach(([key, value]) => {\r\n headers = headers.set(key, value);\r\n });\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Convert object thành query string\r\n * @param obj - Object chứa key-value pairs\r\n * @returns Query string\r\n */\r\n objectToQueryString(obj: Record<string, unknown>): string {\r\n const queryParams: string[] = [];\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n const encodedValue = encodeURIComponent(String(value));\r\n queryParams.push(`${encodeURIComponent(key)}=${encodedValue}`);\r\n }\r\n });\r\n\r\n return queryParams.join(\"&\");\r\n }\r\n\r\n /**\r\n * Generate UUID v4\r\n * @returns UUID string without dashes\r\n */\r\n generateUUID(): string {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\r\n .replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n })\r\n .replace(/-/g, \"\");\r\n }\r\n\r\n /**\r\n * Handle cached request logic\r\n * @private\r\n */\r\n private _handleCachedRequest<T>(\r\n requestFn: () => Observable<T>,\r\n url: string,\r\n params: unknown,\r\n useCache: boolean\r\n ): Observable<T> {\r\n if (!useCache) {\r\n return requestFn();\r\n }\r\n\r\n const cacheKey = this._cache.generateKey(url, params);\r\n const cachedData = this._cache.get(cacheKey);\r\n\r\n if (cachedData) {\r\n return of(cachedData);\r\n }\r\n\r\n return requestFn().pipe(\r\n tap(response => {\r\n this._cache.set(cacheKey, response);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Create FormData từ object\r\n * @private\r\n */\r\n private _createFormData(value?: Record<string, unknown>): FormData {\r\n const formData = new FormData();\r\n\r\n if (value) {\r\n Object.entries(value).forEach(([key, val]) => {\r\n if (val !== undefined && val !== null) {\r\n formData.append(key, val as string | Blob);\r\n }\r\n });\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Handle errors từ HTTP requests\r\n * @private\r\n */\r\n private _handleError(error: unknown): Observable<never> {\r\n // Log error in development (environment check removed for library)\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(\"API Error:\", error);\r\n }\r\n\r\n const httpError = error as {\r\n status?: number;\r\n error?: { message?: string };\r\n message?: string;\r\n };\r\n\r\n // Handle 406 Not Acceptable\r\n if (httpError?.status === HTTP_STATUS.NOT_ACCEPTABLE) {\r\n const rawMessage =\r\n (httpError.error as string | { message?: string }) ??\r\n httpError?.message;\r\n const message = this._extractErrorMessage(\r\n rawMessage,\r\n ERROR_MESSAGES.INVALID_DATA\r\n );\r\n return throwError(() => ({\r\n status: HTTP_STATUS.NOT_ACCEPTABLE,\r\n message\r\n }));\r\n }\r\n\r\n // Handle 400 Bad Request\r\n if (httpError?.status === HTTP_STATUS.BAD_REQUEST) {\r\n return throwError(() => ({\r\n status: httpError.status,\r\n message: httpError?.error?.message || ERROR_MESSAGES.INVALID_DATA_RETRY\r\n }));\r\n }\r\n\r\n // Return original error for other cases\r\n return throwError(() => error);\r\n }\r\n\r\n /**\r\n * Extract error message từ various formats\r\n * @private\r\n */\r\n private _extractErrorMessage(raw: unknown, fallback: string): string {\r\n if (typeof raw === \"string\" && raw.trim().length > 0) {\r\n return raw;\r\n }\r\n\r\n if (raw && typeof raw === \"object\" && \"message\" in raw) {\r\n return String((raw as { message: unknown }).message) || fallback;\r\n }\r\n\r\n return fallback;\r\n }\r\n\r\n /**\r\n * Parse config từ string hoặc object\r\n * @private\r\n */\r\n private _parseConfig(config: ApiServiceConfig | string): {\r\n gatewayApi?: string;\r\n baseUrl?: string;\r\n } {\r\n if (typeof config === \"string\") {\r\n return { gatewayApi: config };\r\n }\r\n\r\n return {\r\n gatewayApi: config.gatewayApi,\r\n baseUrl: config.baseUrl\r\n };\r\n }\r\n\r\n /**\r\n * Set gateway-api header cho tất cả requests\r\n * @private\r\n */\r\n private _setGatewayApiHeader(serviceName: string): void {\r\n this.customHeaders = {\r\n ...this.customHeaders,\r\n [HEADER_GATEWAY_API]: serviceName\r\n };\r\n }\r\n\r\n /**\r\n * Override gateway-api header cho request cụ thể\r\n * @param gatewayApi - Gateway API name\r\n * @returns Instance để support method chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * this.withGatewayApi('other-api')._get('/endpoint');\r\n * ```\r\n */\r\n protected withGatewayApi(gatewayApi: string): this {\r\n this.customHeaders = {\r\n ...this.customHeaders,\r\n [HEADER_GATEWAY_API]: gatewayApi\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Get current service name\r\n * @returns Gateway API name hoặc undefined\r\n */\r\n protected getServiceName(): string | undefined {\r\n return this.serviceName;\r\n }\r\n\r\n /**\r\n * Get base URL for current service\r\n * @returns Base URL hoặc undefined\r\n */\r\n protected getBaseUrl(): string | undefined {\r\n return this.baseUrl;\r\n }\r\n}\r\n\r\nexport interface CRUDResult {\r\n status: number;\r\n message: string;\r\n data: any;\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\nconst USER_KEY = \"UserPrincipal\";\r\nconst AUTH_EXPIRED_KEY = \"__AUTH_EXPIRED__\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class StorageService {\r\n clean(): void {\r\n window.sessionStorage.clear();\r\n }\r\n\r\n public saveUser(user: any): void {\r\n window.sessionStorage.removeItem(USER_KEY);\r\n window.sessionStorage.setItem(USER_KEY, JSON.stringify(user));\r\n // phiên mới hợp lệ → clear cờ hết hạn\r\n this.setAuthExpired(false);\r\n }\r\n\r\n public removeUser(): void {\r\n window.sessionStorage.removeItem(USER_KEY);\r\n }\r\n\r\n public getUser(): any {\r\n const user = window.sessionStorage.getItem(USER_KEY);\r\n if (user) {\r\n return JSON.parse(user);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public isLoggedIn(): boolean {\r\n const user = window.sessionStorage.getItem(USER_KEY);\r\n if (user) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public setAuthExpired(value: boolean): void {\r\n try {\r\n window.sessionStorage.setItem(AUTH_EXPIRED_KEY, value ? \"1\" : \"0\");\r\n } catch {}\r\n }\r\n\r\n public isAuthExpired(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(AUTH_EXPIRED_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserPrincipal } from \"@web-portal/core-domain\";\r\nimport { StorageService } from \"./storage.service\";\r\nimport { ApiService } from \"../api.service\";\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { HttpParams } from \"@angular/common/http\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AuthService extends ApiService {\r\n private _user: UserPrincipal | null;\r\n\r\n private isReLogin: boolean = false;\r\n\r\n getIsReLogin(): boolean {\r\n return this.isReLogin;\r\n }\r\n\r\n setIsReLogin(value: boolean): void {\r\n this.isReLogin = value;\r\n }\r\n\r\n constructor(private _storageService: StorageService) {\r\n super({ baseUrl: \"/accounts\" });\r\n }\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n var isValidSession = await this.isValidSession();\r\n if (!isValidSession) {\r\n this._storageService.removeUser();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n async isValidSession(): Promise<boolean> {\r\n try {\r\n let response = await firstValueFrom(\r\n this._post<UserPrincipal>(`${this.baseUrl}/checkLogin`, null)\r\n );\r\n const user = response as UserPrincipal;\r\n if (user == null || user == undefined || user.UserID <= 0) {\r\n return false;\r\n }\r\n\r\n this._user = user;\r\n this._storageService.saveUser(this._user);\r\n return true;\r\n } catch (err) {\r\n console.log(\"error:\", err);\r\n return false;\r\n }\r\n }\r\n\r\n getCurrentUser() {\r\n var currentUser = this._storageService.getUser();\r\n return currentUser;\r\n }\r\n\r\n hasPermission(roleFunctionName: string): boolean {\r\n var currentUser = this._storageService.getUser();\r\n const user = currentUser as UserPrincipal;\r\n if (user == null) return false;\r\n return user.UserPermission?.map(x => x.RoleFunctionName).includes(\r\n roleFunctionName\r\n );\r\n }\r\n\r\n login(returnUrl) {\r\n try {\r\n const url = `${this.baseUrl}/login`;\r\n const params = new HttpParams().set(\"returnUrl\", returnUrl || \"\");\r\n console.log(\"[AuthService] Calling login with GET method\", { url, returnUrl });\r\n this._get<string>(url, params, false).subscribe({\r\n next: (url: any) => {\r\n console.log(\"[AuthService] Login success, redirecting to:\", url);\r\n window.location.href = url;\r\n return;\r\n },\r\n error: err => {\r\n console.error(\"[AuthService] Login error:\", err);\r\n }\r\n });\r\n } catch (err) {\r\n console.error(\"[AuthService] Login exception:\", err);\r\n }\r\n return;\r\n }\r\n\r\n logout(): boolean {\r\n try {\r\n this._post<string>(`${this.baseUrl}/logout`).subscribe({\r\n next: async (url: string) => {\r\n this._storageService.clean();\r\n window.location.href = url;\r\n },\r\n error: err => {\r\n console.log(\"err:\", err);\r\n }\r\n });\r\n\r\n return true;\r\n } catch (err) {\r\n console.log(\"error:\", err);\r\n }\r\n return true;\r\n }\r\n}\r\n\r\nexport class SessionValidationError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"SessionValidationError\";\r\n }\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot, Router } from \"@angular/router\";\r\nimport { AUTH_DIALOG_SERVICE, IAuthDialogService } from \"../services/auth/auth-dialog.interface\";\r\nimport { StorageService } from \"../services/auth/storage.service\";\r\nimport { AuthService } from \"../services/auth/auth.service\";\r\nimport {\r\n HAS_NAVIGATED_KEY,\r\n LOAD_IS_RELOAD_KEY\r\n} from \"../services/auth/auth-session-keys\";\r\n\r\nfunction isPageReload(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(LOAD_IS_RELOAD_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Đánh dấu rằng đã có ít nhất một lần điều hướng SPA sau khi app được load.\r\n */\r\nfunction markSpaNavigated(): void {\r\n try {\r\n window.sessionStorage.setItem(HAS_NAVIGATED_KEY, \"1\");\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AuthGuard {\r\n // Lazy inject AuthDialogService to avoid circular dependency\r\n private _authDialog: IAuthDialogService | null = null;\r\n private get authDialog(): IAuthDialogService | null {\r\n if (!this._authDialog) {\r\n this._authDialog = this.injector.get<IAuthDialogService>(AUTH_DIALOG_SERVICE, null);\r\n }\r\n return this._authDialog;\r\n }\r\n\r\n constructor(\r\n private readonly router: Router,\r\n private readonly _authService: AuthService,\r\n private readonly storage: StorageService,\r\n private readonly injector: Injector\r\n ) {\r\n this._authService.setIsReLogin(false);\r\n }\r\n\r\n async canActivate(route: ActivatedRouteSnapshot) {\r\n const requiredPermission = route.data.permission as string;\r\n var returnUrl = window.document.URL;\r\n // Ghi nhận trạng thái có user trong session TRƯỚC khi gọi isAuthenticated()\r\n const hadSessionUser = this.storage.isLoggedIn();\r\n var isAuthenticated = await this._authService.isAuthenticated();\r\n if (isAuthenticated) {\r\n this._authService.setIsReLogin(true);\r\n\r\n const hasPermission = this._authService.hasPermission(requiredPermission);\r\n if (!hasPermission) {\r\n this.router.navigate([\"page-403\"], { skipLocationChange: true });\r\n return false;\r\n }\r\n // Chỉ khi điều hướng thành công (đã auth + có quyền) và không phải reload\r\n // mới đánh dấu là đã có điều hướng SPA.\r\n if (!isPageReload()) {\r\n markSpaNavigated();\r\n }\r\n return true;\r\n }\r\n\r\n // Nếu F5/reload → đá thẳng qua login, không popup\r\n if (isPageReload()) {\r\n this._authService.login(returnUrl);\r\n return false;\r\n }\r\n\r\n // Nếu trước đó chưa có user trong session (chưa từng login)\r\n // → redirect thẳng đến login, không show popup\r\n if (!hadSessionUser) {\r\n this._authService.login(returnUrl);\r\n return false;\r\n }\r\n\r\n // Nếu đã có user nhưng session hết hạn → show popup re-login\r\n if (!this.authDialog) {\r\n // Fallback: redirect to login if dialog service not provided\r\n this._authService.login(returnUrl);\r\n return false;\r\n }\r\n const confirmed = await this.authDialog.openReLoginDialog();\r\n if (confirmed) {\r\n // Mở popup đăng nhập lại, không reload trang hiện tại\r\n const screenX =\r\n typeof window.screenX != \"undefined\"\r\n ? window.screenX\r\n : window.screenLeft;\r\n const screenY =\r\n typeof window.screenY != \"undefined\"\r\n ? window.screenY\r\n : window.screenTop;\r\n const outerWidth =\r\n typeof window.outerWidth != \"undefined\"\r\n ? window.outerWidth\r\n : document.body.clientWidth;\r\n const outerHeight =\r\n typeof window.outerHeight != \"undefined\"\r\n ? window.outerHeight\r\n : document.body.clientHeight - 22;\r\n const width = 550;\r\n const height = 600;\r\n const left = screenX + (outerWidth - width) / 2;\r\n const top = screenY + (outerHeight - height) / 3;\r\n const features = [\r\n `width=${width}`,\r\n `height=${height}`,\r\n `left=${left}`,\r\n `top=${top}`,\r\n \"resizable=yes\",\r\n \"scrollbars=yes\",\r\n \"status=no\",\r\n \"location=no\",\r\n \"menubar=no\",\r\n \"toolbar=no\"\r\n ].join(\",\");\r\n\r\n const popupReturnUrl = `${window.document.baseURI}` + \"account/relogin\";\r\n window.open(\r\n `/accounts/relogin?returnUrl=${popupReturnUrl}`,\r\n \"Đăng nhập lại\",\r\n features\r\n );\r\n }\r\n\r\n // Hủy điều hướng hiện tại để không reload\r\n return false;\r\n }\r\n}\r\n","import { inject, Injector } from \"@angular/core\";\r\nimport {\r\n HttpErrorResponse,\r\n HttpResponse,\r\n HttpHeaders,\r\n HttpInterceptorFn\r\n} from \"@angular/common/http\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { Router } from \"@angular/router\";\r\nimport { CRUDResult } from \"../services/api.service\";\r\nimport { StorageService } from \"../services/auth/storage.service\";\r\nimport { AuthService } from \"../services/auth/auth.service\";\r\nimport { AUTH_DIALOG_SERVICE, IAuthDialogService } from \"../services/auth/auth-dialog.interface\";\r\nimport {\r\n HAS_NAVIGATED_KEY,\r\n LOAD_IS_RELOAD_KEY\r\n} from \"../services/auth/auth-session-keys\";\r\n\r\n// Helper functions\r\nlet isShowingDialog = false;\r\n\r\nfunction hasSessionUser(): boolean {\r\n try {\r\n return !!window.sessionStorage.getItem(\"UserPrincipal\");\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction isPageReload(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(LOAD_IS_RELOAD_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Đã từng điều hướng nội bộ SPA sau khi app load chưa.\r\n * - Lần load / điều hướng đầu tiên: key chưa được set.\r\n * - Các lần điều hướng SPA sau đó: key = \"1\".\r\n */\r\nfunction hasNavigatedInSpa(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(HAS_NAVIGATED_KEY) === \"1\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// Xác định request có phải là request API (gửi qua ApiService) hay không\r\nfunction isApiRequest(req: { headers?: HttpHeaders; url?: string }): boolean {\r\n try {\r\n // Các request API chuẩn đều được gắn header ConcungContextID / gateway-api từ ApiService\r\n if (req.headers && req.headers.has(\"gateway-api\")) {\r\n return true;\r\n }\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// Functional interceptor for newer Angular versions\r\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\r\n const router = inject(Router);\r\n const authService = inject(AuthService);\r\n const storage = inject(StorageService);\r\n const injector = inject(Injector);\r\n\r\n return next(req).pipe(\r\n tap(\r\n async response => {\r\n if (response instanceof HttpResponse) {\r\n const body = response.body as CRUDResult;\r\n if (body?.status === 401) {\r\n await ensureReLoginDialog(injector, authService, storage);\r\n return;\r\n }\r\n // Chỉ reset cờ reload / điều hướng khi đây là response cho request API\r\n if (isApiRequest(req)) {\r\n window.sessionStorage.setItem(LOAD_IS_RELOAD_KEY, \"0\");\r\n window.sessionStorage.setItem(HAS_NAVIGATED_KEY, \"0\");\r\n }\r\n\r\n }\r\n },\r\n async error => {\r\n if (error instanceof HttpErrorResponse) {\r\n const respError = error as HttpErrorResponse;\r\n if (respError.status === 403) {\r\n router.navigate([\"/page-403\"]);\r\n } else if (respError.status === 401) {\r\n await ensureReLoginDialog(injector, authService, storage);\r\n return;\r\n }\r\n }\r\n }\r\n )\r\n );\r\n};\r\n\r\nasync function ensureReLoginDialog(\r\n injector: Injector,\r\n authService: AuthService,\r\n storage: StorageService\r\n): Promise<void> {\r\n // Lazy inject AuthDialogService to avoid circular dependency\r\n const authDialog = injector.get<IAuthDialogService>(AUTH_DIALOG_SERVICE, null);\r\n if (!authDialog) {\r\n // Fallback: redirect to login if dialog service not provided\r\n const returnUrl = window.location.href;\r\n authService.login(returnUrl);\r\n return;\r\n }\r\n // 1. Nếu đang reload trang (F5) và backend trả 401 → luôn redirect login, không popup\r\n if (isPageReload()) {\r\n const returnUrl = window.location.href;\r\n authService.login(returnUrl);\r\n return;\r\n }\r\n\r\n // 2. Nếu chưa từng điều hướng nội bộ SPA (đang ở lần load/điều hướng đầu)\r\n // → coi là full load / direct access, không popup, redirect login luôn\r\n if (hasNavigatedInSpa()) {\r\n const returnUrl = window.location.href;\r\n authService.login(returnUrl);\r\n return;\r\n }\r\n\r\n // 3. Nếu chưa có user trong session (first load ẩn danh) và chưa đặt cờ hết hạn → redirect ngay đến login\r\n if (!hasSessionUser() && !storage.isAuthExpired()) {\r\n const returnUrl = window.location.href;\r\n authService.login(returnUrl);\r\n return;\r\n }\r\n\r\n // 4. Các trường hợp còn lại:\r\n // - Request là HttpClient (AJAX)\r\n // - Không phải reload\r\n // - Đã từng điều hướng SPA\r\n // → Đây là lúc hiển thị popup re-login\r\n if (isShowingDialog) return;\r\n isShowingDialog = true;\r\n try {\r\n const confirmed = await authDialog.openReLoginDialog();\r\n if (confirmed) {\r\n storage.setAuthExpired(false);\r\n openReLogin();\r\n } else {\r\n storage.setAuthExpired(true);\r\n }\r\n } finally {\r\n isShowingDialog = false;\r\n }\r\n}\r\n\r\nfunction setHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n headers = headers.set(\r\n \"ConcungContextID\",\r\n generateUUID().toString().replace(/-/g, \"\")\r\n );\r\n headers = headers.set(\"returnUrl\", window.location.href);\r\n return headers;\r\n}\r\n\r\nfunction openReLogin(): boolean {\r\n var newwindow;\r\n let screenX: number =\r\n typeof window.screenX != \"undefined\" ? window.screenX : window.screenLeft;\r\n let screenY: number =\r\n typeof window.screenY != \"undefined\" ? window.screenY : window.screenTop;\r\n let outerWidth: number =\r\n typeof window.outerWidth != \"undefined\"\r\n ? window.outerWidth\r\n : document.body.clientWidth;\r\n let outerHeight: number =\r\n typeof window.outerHeight != \"undefined\"\r\n ? window.outerHeight\r\n : document.body.clientHeight - 22;\r\n\r\n let width = 550;\r\n let height = 600;\r\n let left = screenX + (outerWidth - width) / 2;\r\n let top = screenY + (outerHeight - height) / 3;\r\n\r\n let features = [\r\n `width=${width}`,\r\n `height=${height}`,\r\n `left=${left}`,\r\n `top=${top}`,\r\n \"resizable=yes\",\r\n \"scrollbars=yes\",\r\n \"status=no\",\r\n \"location=no\",\r\n \"menubar=no\",\r\n \"toolbar=no\"\r\n ].join(\",\");\r\n\r\n setTimeout(() => {\r\n var returnUrl = `${window.document.baseURI}` + \"account/relogin\";\r\n newwindow = window.open(\r\n `/accounts/relogin?returnUrl=${returnUrl}`,\r\n \"Đăng nhập lại\",\r\n features\r\n );\r\n\r\n if (window.focus && newwindow) {\r\n newwindow.focus();\r\n }\r\n }, 100);\r\n\r\n return false;\r\n}\r\n\r\nfunction generateUUID() {\r\n let dt = new Date().getTime();\r\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(\r\n /[xy]/g,\r\n function (c) {\r\n const r = (dt + Math.random() * 16) % 16 | 0;\r\n dt = Math.floor(dt / 16);\r\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\r\n }\r\n );\r\n return uuid.replace(/-/g, \"\");\r\n}\r\n","import { HttpInterceptorFn } from \"@angular/common/http\";\r\n\r\n/**\r\n * Ensure ASP.NET's Request.IsAjaxRequest() recognizes Angular HttpClient calls,\r\n * so server can return 401 instead of 302 (redirect) for unauthorized API requests.\r\n *\r\n * ASP.NET MVC's IsAjaxRequest() checks for header:\r\n * X-Requested-With: XMLHttpRequest\r\n */\r\nexport const ajaxRequestInterceptor: HttpInterceptorFn = (req, next) => {\r\n // If caller already set it, respect existing value.\r\n if (req.headers.has(\"X-Requested-With\")) {\r\n return next(req);\r\n }\r\n\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n \"X-Requested-With\": \"XMLHttpRequest\"\r\n }\r\n })\r\n );\r\n};\r\n\r\n\r\n","import {\r\n HttpInterceptorFn,\r\n HttpRequest,\r\n HttpHandlerFn\r\n} from \"@angular/common/http\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError, switchMap, take } from \"rxjs/operators\";\r\n\r\n// Cache để lưu trữ pending requests\r\nconst pendingRequests = new Map<string, Observable<any>>();\r\n\r\nexport const duplicateRequestInterceptor: HttpInterceptorFn = (\r\n request: HttpRequest<unknown>,\r\n next: HttpHandlerFn\r\n): Observable<any> => {\r\n // Chỉ áp dụng cho GET requests\r\n if (request.method !== \"GET\") {\r\n return next(request);\r\n }\r\n\r\n const cacheKey = generateCacheKey(request);\r\n\r\n // Kiểm tra nếu có request đang pending\r\n if (pendingRequests.has(cacheKey)) {\r\n console.log(\r\n `[DuplicateRequestInterceptor] Duplicate request detected for: ${cacheKey}`\r\n );\r\n return pendingRequests.get(cacheKey)!;\r\n }\r\n\r\n // Tạo request mới\r\n const request$ = next(request).pipe(\r\n take(1),\r\n catchError(error => {\r\n // Xóa request khỏi pending khi có lỗi\r\n pendingRequests.delete(cacheKey);\r\n throw error;\r\n }),\r\n switchMap(response => {\r\n // Xóa request khỏi pending khi hoàn thành\r\n pendingRequests.delete(cacheKey);\r\n return of(response);\r\n })\r\n );\r\n\r\n // Lưu request vào pending\r\n pendingRequests.set(cacheKey, request$);\r\n\r\n return request$;\r\n};\r\n\r\nfunction generateCacheKey(request: HttpRequest<any>): string {\r\n const url = request.url;\r\n const params = request.params.toString();\r\n return `${request.method}:${url}${params ? `?${params}` : \"\"}`;\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode\r\n} from \"@angular/common/http\";\r\nimport { catchError, throwError } from \"rxjs\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n/**\r\n * Global Error Interceptor\r\n * Handles HTTP errors globally and shows appropriate user-friendly messages\r\n */\r\nexport const errorInterceptor: HttpInterceptorFn = (req, next) => {\r\n const messageService = inject(MessageService);\r\n const router = inject(Router);\r\n\r\n return next(req).pipe(\r\n catchError((error: HttpErrorResponse) => {\r\n // Don't show error for auth interceptor handled errors\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Auth interceptor already handles this\r\n return throwError(() => error);\r\n }\r\n\r\n // Don't show error for cancelled requests\r\n if (error.status === 0 && error.error?.name === \"TimeoutError\") {\r\n return throwError(() => error);\r\n }\r\n\r\n // Handle different error statuses\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Lỗi dữ liệu\",\r\n // detail:\r\n // error.error?.message ||\r\n // \"Dữ liệu không hợp lệ. Vui lòng kiểm tra lại.\",\r\n // life: 3000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.Unauthorized:\r\n // Already handled by auth interceptor\r\n return throwError(() => error);\r\n\r\n case HttpStatusCode.Forbidden:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Không có quyền\",\r\n // detail: \"Bạn không có quyền thực hiện thao tác này.\",\r\n // life: 3000\r\n // });\r\n router.navigate([\"/notfound\"]);\r\n break;\r\n\r\n case HttpStatusCode.NotFound:\r\n // messageService.add({\r\n // severity: \"warn\",\r\n // summary: \"Không tìm thấy\",\r\n // detail: error.error?.message || \"Tài nguyên không tồn tại.\",\r\n // life: 3000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.InternalServerError:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Lỗi server\",\r\n // detail: \"Server đang gặp sự cố. Vui lòng thử lại sau.\",\r\n // life: 4000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.ServiceUnavailable:\r\n case HttpStatusCode.GatewayTimeout:\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Dịch vụ không khả dụng\",\r\n // detail: \"Dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau.\",\r\n // life: 4000\r\n // });\r\n break;\r\n\r\n case HttpStatusCode.NotAcceptable:\r\n // 406 - Let component handle the error message\r\n // Component will show appropriate toast via effect\r\n break;\r\n\r\n case 0:\r\n // Network error or CORS error\r\n // messageService.add({\r\n // severity: \"error\",\r\n // summary: \"Lỗi kết nối\",\r\n // detail:\r\n // \"Không thể kết nối đến server. Vui lòng kiểm tra kết nối mạng.\",\r\n // life: 4000\r\n // });\r\n break;\r\n\r\n default:\r\n const errorMessage =\r\n error.error?.message || \"Có lỗi xảy ra. Vui lòng thử lại.\";\r\n messageService.add({\r\n severity: \"error\",\r\n summary: \"Lỗi\",\r\n detail: errorMessage,\r\n life: 3000\r\n });\r\n }\r\n\r\n return throwError(() => error);\r\n })\r\n );\r\n};\r\n","import { Injectable, signal } from \"@angular/core\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class LoadingService {\r\n private activeRequestsCount = 0;\r\n readonly isLoading = signal(false);\r\n\r\n start(): void {\r\n this.activeRequestsCount++;\r\n if (!this.isLoading()) this.isLoading.set(true);\r\n }\r\n\r\n stop(): void {\r\n if (this.activeRequestsCount > 0) this.activeRequestsCount--;\r\n if (this.activeRequestsCount === 0 && this.isLoading()) {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.activeRequestsCount = 0;\r\n this.isLoading.set(false);\r\n }\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport { HttpInterceptorFn } from \"@angular/common/http\";\r\nimport { finalize } from \"rxjs/operators\";\r\nimport { LoadingService } from \"../services/loading.service\";\r\n\r\nexport const loadingInterceptor: HttpInterceptorFn = (req, next) => {\r\n const loadingService = inject(LoadingService);\r\n\r\n // Skip loading for specific APIs that are called frequently\r\n const skipLoadingUrls = [\r\n // Add more URLs here if needed\r\n ];\r\n\r\n const shouldSkipLoading = skipLoadingUrls.some(url => req.url.includes(url));\r\n\r\n if (shouldSkipLoading) {\r\n return next(req);\r\n }\r\n\r\n loadingService.start();\r\n\r\n return next(req).pipe(finalize(() => loadingService.stop()));\r\n};\r\n","import { Injectable, Inject, Optional } from \"@angular/core\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { BehaviorSubject, Observable, of } from \"rxjs\";\r\nimport { map, tap, catchError } from \"rxjs/operators\";\r\nimport { AppConfigModel, AppConfigResponse } from \"@web-portal/core-domain\";\r\n\r\n// Environment interface for library\r\nexport interface AppEnvironment {\r\n production?: boolean;\r\n appConfig?: {\r\n Environment?: string;\r\n ClientID?: string;\r\n };\r\n landingPageConfig?: {\r\n cacheClearUrlForCreate?: string | null;\r\n cacheClearUrlForUpdate?: string | null;\r\n };\r\n}\r\n\r\n// Injection token for environment (optional - app can provide it)\r\nexport const APP_ENVIRONMENT = Symbol('APP_ENVIRONMENT');\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AppConfigService {\r\n private configSubject = new BehaviorSubject<AppConfigModel | null>(null);\r\n private config: AppConfigModel | null = null;\r\n private environment: AppEnvironment | null = null;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Optional() @Inject(APP_ENVIRONMENT) env?: AppEnvironment\r\n ) {\r\n // Try to get environment from injection, or from window (for backward compatibility)\r\n this.environment = env || (typeof window !== 'undefined' && (window as any).__ENVIRONMENT__) || null;\r\n }\r\n\r\n /**\r\n * Lấy config từ backend và lưu vào service, fallback về environment nếu fail\r\n */\r\n loadConfig(): Observable<AppConfigModel> {\r\n return this.http.post<AppConfigResponse>(\"/api1/configs\", {}).pipe(\r\n map(response => response.data),\r\n tap(config => {\r\n this.config = config;\r\n this.configSubject.next(config);\r\n }),\r\n catchError(error => {\r\n console.warn(\r\n \"⚠️ Failed to load config from backend, using fallback from environment:\",\r\n error\r\n );\r\n return this.loadFallbackConfig();\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Load fallback config từ environment\r\n */\r\n private loadFallbackConfig(): Observable<AppConfigModel> {\r\n const env = this.environment?.appConfig;\r\n const fallbackConfig: AppConfigModel = {\r\n Environment: env?.Environment || \"\",\r\n ClientID: env?.ClientID || \"\"\r\n };\r\n\r\n this.config = fallbackConfig;\r\n this.configSubject.next(fallbackConfig);\r\n return of(fallbackConfig);\r\n }\r\n\r\n /**\r\n * Lấy config hiện tại (observable)\r\n */\r\n getConfig(): Observable<AppConfigModel | null> {\r\n return this.configSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Lấy config hiện tại (sync)\r\n */\r\n getConfigSync(): AppConfigModel | null {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Lấy Environment\r\n */\r\n getEnvironment(): string {\r\n const env = this.environment?.appConfig;\r\n return this.config?.Environment || env?.Environment || \"\";\r\n }\r\n\r\n /**\r\n * Lấy ClientID/ClientName\r\n */\r\n getClientName(): string {\r\n const env = this.environment?.appConfig;\r\n return this.config?.ClientID || env?.ClientID || \"\";\r\n }\r\n\r\n /**\r\n * Check xem đã load config chưa\r\n */\r\n isConfigLoaded(): boolean {\r\n return this.config !== null;\r\n }\r\n\r\n /**\r\n * Check xem config có được load từ backend hay fallback\r\n */\r\n isLoadedFromBackend(): boolean {\r\n // Compare với environment để check xem có được load từ backend không\r\n const env = this.environment?.appConfig;\r\n return (\r\n this.config !== null &&\r\n env &&\r\n this.config.Environment !== env.Environment\r\n );\r\n }\r\n\r\n /**\r\n * Lấy URL để clear cache khi tạo mới landing page\r\n */\r\n getCacheClearUrlForCreate(): string | null {\r\n return this.environment?.landingPageConfig?.cacheClearUrlForCreate || null;\r\n }\r\n\r\n /**\r\n * Lấy URL để clear cache khi cập nhật landing page\r\n */\r\n getCacheClearUrlForUpdate(): string | null {\r\n return this.environment?.landingPageConfig?.cacheClearUrlForUpdate || null;\r\n }\r\n}\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { AppConfigService } from \"./app-config.service\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class AppInitializeService {\r\n private initAppSubject = new BehaviorSubject<boolean>(false);\r\n private appConfigService = inject(AppConfigService);\r\n\r\n initialize(): Observable<boolean> {\r\n return this.initAppSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Khởi tạo app: Load config từ backend hoặc fallback từ environment\r\n */\r\n initializeApp(): Observable<boolean> {\r\n return this.appConfigService.loadConfig().pipe(\r\n map(() => {\r\n this.setInitialize(true);\r\n\r\n const configSource = this.appConfigService.isLoadedFromBackend()\r\n ? \"backend\"\r\n : \"environment fallback\";\r\n return true;\r\n })\r\n // Không cần catchError nữa vì service đã handle fallback internally\r\n );\r\n }\r\n\r\n setInitialize(data: boolean) {\r\n this.initAppSubject.next(data);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { CookieService as NgxCookieService } from \"ngx-cookie-service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class CookieService {\r\n constructor(private cookieService: NgxCookieService) {}\r\n\r\n set(name: string, value: string, days: number = 1): void {\r\n this.cookieService.set(name, value, days);\r\n }\r\n\r\n get(name: string): string {\r\n return this.cookieService.get(name);\r\n }\r\n\r\n delete(name: string): void {\r\n this.cookieService.delete(name);\r\n }\r\n\r\n check(name: string): boolean {\r\n return this.cookieService.check(name);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class DocumentService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n get nativeDocument(): Document | null {\r\n return this.platformService.getDocument();\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LoaderService {\r\n private _loading = new BehaviorSubject<boolean>(false);\r\n public readonly loading$ = this._loading.asObservable();\r\n\r\n show() {\r\n this._loading.next(true);\r\n }\r\n\r\n hide() {\r\n this._loading.next(false);\r\n }\r\n}\r\n","import { Inject, Injectable } from \"@angular/core\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport {\r\n HttpClient,\r\n HttpEvent,\r\n HttpRequest,\r\n HttpEventType\r\n} from \"@angular/common/http\";\r\nimport { LoaderService } from \"./loader.service\";\r\nimport { DOCUMENT } from \"@angular/common\";\r\nimport { map, filter, catchError } from \"rxjs/operators\";\r\nimport moment from \"moment-timezone\";\r\n\r\n// Timezone cấu hình chung cho app (GMT+7 - Việt Nam)\r\nconst APP_TIMEZONE = \"Asia/Ho_Chi_Minh\";\r\n\r\n/**\r\n * Format datetime để chèn vào tên file download, theo timezone Việt Nam.\r\n * Mặc định dùng format an toàn cho filename: YYYYMMDD_HHmmss\r\n */\r\nfunction formatDateForFileName(\r\n date: Date | string | null | undefined,\r\n format: string = \"YYYYMMDD_HHmmss\"\r\n): string {\r\n if (!date) return \"\";\r\n\r\n const d = typeof date === \"string\" ? new Date(date) : date;\r\n if (isNaN(d.getTime())) return \"\";\r\n\r\n return moment.tz(d, APP_TIMEZONE).format(format);\r\n}\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileService {\r\n baseUrl = \"/api1/files\";\r\n baseUrlForFileHandler = \"/api1/files/filehandler\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _loader: LoaderService\r\n ) {}\r\n\r\n uploadExcel(file: File): Observable<HttpEvent<any>> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrlForFileHandler}/uploadExcel`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n downloadExcel(filePathOrRes: any, fileName: string = \"\") {\r\n this._loader.show();\r\n\r\n // Support passing raw path or API response { data: path } or { file_path: path }\r\n let filePath: string | undefined = undefined;\r\n if (typeof filePathOrRes === \"string\") {\r\n filePath = filePathOrRes;\r\n } else if (filePathOrRes) {\r\n filePath =\r\n filePathOrRes.data || filePathOrRes.file_path || filePathOrRes.FilePath;\r\n }\r\n\r\n if (!filePath) {\r\n this._loader.hide();\r\n return;\r\n }\r\n\r\n if (!fileName) {\r\n const timestamp = Date.now();\r\n fileName = `file_${timestamp}.xlsx`;\r\n }\r\n\r\n const encodedPath = encodeURIComponent(filePath);\r\n this._http\r\n .get(\r\n `${this.baseUrlForFileHandler}/downloadExcel?filePath=${encodedPath}`,\r\n {\r\n responseType: \"blob\"\r\n }\r\n )\r\n .subscribe({\r\n next: response => {\r\n if (response) {\r\n let blob = new Blob([response]);\r\n this.createElementDownload(blob, fileName);\r\n }\r\n this._loader.hide();\r\n },\r\n error: () => {\r\n this._loader.hide();\r\n }\r\n });\r\n }\r\n\r\n public exportExcel(sheet_datas: any, fileName: string): any {\r\n this._loader.show();\r\n this.exportExcelBase(sheet_datas).subscribe(event => {\r\n if (event.body) {\r\n let blob = new Blob([event.body]);\r\n this.createElementDownload(blob, fileName);\r\n this._loader.hide();\r\n }\r\n });\r\n }\r\n\r\n private exportExcelBase(sheet_datas: any): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"sheet_datas\", JSON.stringify(sheet_datas));\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrlForFileHandler}/exportExcel`,\r\n formData,\r\n { responseType: \"blob\" }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n private createElementDownload(blob: Blob, fileName: string = \"\") {\r\n const parts: string[] = fileName.split(\".\");\r\n let extention = parts.pop();\r\n // Phần tên file không bao gồm extension (có thể chứa dấu chấm ở giữa)\r\n let name = parts.join(\".\");\r\n\r\n // Thêm timestamp theo timezone Việt Nam vào tên file để dễ phân biệt\r\n const timestamp = formatDateForFileName(new Date());\r\n const safeBaseName = timestamp ? `${name}_${timestamp}` : name;\r\n\r\n const finalExtension = extention || \"xlsx\";\r\n const downLoadFileName = `${safeBaseName}.${finalExtension}`;\r\n let downloadLink = document.createElement(\"a\");\r\n downloadLink.href = window.URL.createObjectURL(blob);\r\n downloadLink.setAttribute(\"download\", downLoadFileName);\r\n document.body.appendChild(downloadLink);\r\n downloadLink.click();\r\n setTimeout(() => {\r\n document.body.removeChild(downloadLink);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Convert image file to WebP format\r\n * @param file - Image file to convert\r\n * @returns Observable<File> - Returns the original file if already WebP, otherwise returns converted WebP file\r\n */\r\n convertToWebp(file: File): Observable<File> {\r\n // Kiểm tra nếu file đã là định dạng webp\r\n const isWebP =\r\n file.type === \"image/webp\" || file.name.toLowerCase().endsWith(\".webp\");\r\n\r\n if (isWebP) {\r\n // Nếu đã là webp, trả về file gốc\r\n return of(file);\r\n }\r\n\r\n // Kiểm tra xem có phải file hình không\r\n if (!file.type.startsWith(\"image/\")) {\r\n return of(file); // Nếu không phải hình, trả về file gốc\r\n }\r\n\r\n // Upload file để convert sang webp\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/convertToWebp`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"blob\"\r\n }\r\n );\r\n\r\n return this._http.request(req).pipe(\r\n filter((event: HttpEvent<Blob>) => event.type === HttpEventType.Response),\r\n map((event: any) => {\r\n const blob = event.body as Blob;\r\n if (!blob) {\r\n throw new Error(\"Không nhận được file sau khi convert\");\r\n }\r\n\r\n // Tạo tên file mới với extension .webp\r\n const fileNameWithoutExt = file.name.replace(/\\.[^/.]+$/, \"\");\r\n const webpFileName = `${fileNameWithoutExt}.webp`;\r\n\r\n // Convert blob thành File object\r\n const webpFile = new File([blob], webpFileName, {\r\n type: \"image/webp\",\r\n lastModified: Date.now()\r\n });\r\n\r\n return webpFile;\r\n }),\r\n catchError((error: any) => {\r\n // Nếu có lỗi, trả về file gốc\r\n console.error(\"Lỗi khi convert sang WebP:\", error);\r\n return of(file);\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, firstValueFrom } from \"rxjs\";\r\nimport { HttpClient, HttpRequest } from \"@angular/common/http\";\r\nimport { ApiService } from \"./api.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileGCSService {\r\n baseUrl = \"/api1/files/gcs\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _apiService: ApiService\r\n ) {}\r\n\r\n getSignedLink(filePath: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getSignedLink?filePath=${filePath}`\r\n );\r\n }\r\n\r\n attachFile(file: File): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n attachFilePromise(file: File): Promise<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return firstValueFrom(this._http.request(req));\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, firstValueFrom } from \"rxjs\";\r\nimport { HttpClient, HttpRequest } from \"@angular/common/http\";\r\nimport { ApiService } from \"./api.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileAIA_GCSService {\r\n baseUrl = \"/api1/files/aia-gcs\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _apiService: ApiService\r\n ) {}\r\n\r\n getSignedLink(filePath: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getSignedLink?filePath=${filePath}`\r\n );\r\n }\r\n\r\n attachFile(file: File): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n attachFilePromise(file: File): Promise<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return firstValueFrom(this._http.request(req));\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, firstValueFrom } from \"rxjs\";\r\nimport { HttpClient, HttpRequest } from \"@angular/common/http\";\r\nimport { ApiService } from \"./api.service\";\r\n\r\nexport interface ImageUploadResult {\r\n url: string; // URL from GCS (absolute or relative)\r\n filePath: string; // Storage path on server\r\n fileName: string; // Generated filename\r\n originalName: string; // Original filename\r\n}\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileWAPGCSService {\r\n baseUrl = \"/api1/files/wap-gcs\";\r\n constructor(\r\n private _http: HttpClient,\r\n private _apiService: ApiService\r\n ) {}\r\n\r\n getSignedLink(filePath: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getSignedLink?filePath=${filePath}`\r\n );\r\n }\r\n\r\n getPresignedLink(fileName: string): Observable<any> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/getPresignedLink?fileName=${fileName}`\r\n );\r\n }\r\n\r\n setPublic(filePath: string): Observable<boolean> {\r\n return this._apiService.post(\r\n `${this.baseUrl}/setPublic?filePath=${filePath}`\r\n );\r\n }\r\n\r\n attachFile(file: File): Observable<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return this._http.request(req);\r\n }\r\n\r\n attachFilePromise(file: File): Promise<any> {\r\n const formData: FormData = new FormData();\r\n formData.append(\"file\", file);\r\n const req = new HttpRequest(\r\n \"POST\",\r\n `${this.baseUrl}/attachFile`,\r\n formData,\r\n {\r\n reportProgress: true,\r\n responseType: \"json\"\r\n }\r\n );\r\n return firstValueFrom(this._http.request(req));\r\n }\r\n\r\n uploadFile(file: File): Observable<ImageUploadResult> {\r\n return new Observable(observer => {\r\n let xhr: XMLHttpRequest | null = null;\r\n\r\n // Tạo tên file unique để tránh trùng tên khi upload nhiều lần\r\n const uniqueFileName = this.generateUniqueFileName(file.name);\r\n\r\n firstValueFrom(this.getPresignedLink(uniqueFileName))\r\n .then(presignedData => {\r\n if (!presignedData) {\r\n throw new Error(\"Không nhận được presigned link từ server\");\r\n }\r\n\r\n const presignedURL =\r\n presignedData.PreSignedURL ||\r\n presignedData.preSignedURL ||\r\n presignedData.url;\r\n const filePath = presignedData.FilePath || presignedData.filePath;\r\n const absoluteURL =\r\n presignedData.AbsoluteURL || presignedData.absoluteURL;\r\n\r\n if (!presignedURL) {\r\n throw new Error(\"Presigned URL không hợp lệ\");\r\n }\r\n\r\n const contentType = file.type || \"application/octet-stream\";\r\n xhr = new XMLHttpRequest();\r\n\r\n const cleanup = () => {\r\n if (xhr) {\r\n xhr.upload.removeEventListener(\"progress\", progressHandler);\r\n xhr.removeEventListener(\"load\", loadHandler);\r\n xhr.removeEventListener(\"error\", errorHandler);\r\n xhr.removeEventListener(\"timeout\", timeoutHandler);\r\n xhr.abort();\r\n xhr = null;\r\n }\r\n };\r\n\r\n const progressHandler = (_event: ProgressEvent) => {\r\n // No-op: progress not consumed by current callers\r\n };\r\n\r\n const loadHandler = async () => {\r\n if (xhr && xhr.status === 200) {\r\n try {\r\n if (filePath) {\r\n const setPublicResult = await firstValueFrom(\r\n this.setPublic(filePath)\r\n );\r\n if (setPublicResult !== true) {\r\n throw new Error(\"Set public không thành công\");\r\n }\r\n }\r\n\r\n const finalUrl = absoluteURL || presignedURL;\r\n const result = this.buildResult(file, filePath, finalUrl);\r\n\r\n cleanup();\r\n observer.next(result);\r\n observer.complete();\r\n } catch (err: any) {\r\n cleanup();\r\n const msg =\r\n err?.message ||\r\n \"Upload thành công nhưng setPublic thất bại. Vui lòng thử lại.\";\r\n observer.error(new Error(msg));\r\n }\r\n } else if (xhr) {\r\n const errorMessage = `Upload file thất bại: ${xhr.statusText} (${xhr.status})`;\r\n cleanup();\r\n observer.error(new Error(errorMessage));\r\n }\r\n };\r\n\r\n const errorHandler = () => {\r\n if (!xhr) return;\r\n\r\n let userMessage = \"Upload file thất bại\";\r\n\r\n if (xhr.status === 0) {\r\n userMessage =\r\n \"Không thể kết nối đến máy chủ lưu trữ. Máy chủ không phản hồi.\";\r\n } else if (xhr.status >= 500) {\r\n userMessage = \"Lỗi máy chủ. Vui lòng thử lại sau.\";\r\n } else if (xhr.status >= 400) {\r\n userMessage = `Lỗi yêu cầu: ${xhr.statusText}`;\r\n }\r\n\r\n cleanup();\r\n observer.error(new Error(userMessage));\r\n };\r\n\r\n const timeoutHandler = () => {\r\n cleanup();\r\n observer.error(\r\n new Error(\"Kết nối đến máy chủ hết thời gian. Vui lòng thử lại.\")\r\n );\r\n };\r\n\r\n xhr.upload.addEventListener(\"progress\", progressHandler);\r\n xhr.addEventListener(\"load\", loadHandler);\r\n xhr.addEventListener(\"error\", errorHandler);\r\n xhr.addEventListener(\"timeout\", timeoutHandler);\r\n\r\n xhr.timeout = 60000 * 5;\r\n xhr.open(\"PUT\", presignedURL, true);\r\n xhr.setRequestHeader(\"Content-Type\", contentType);\r\n xhr.send(file);\r\n })\r\n .catch(error => {\r\n if (xhr) {\r\n xhr.abort();\r\n xhr = null;\r\n }\r\n\r\n let userMessage = \"Upload file thất bại\";\r\n\r\n if (error.errorMessage) {\r\n userMessage = error.errorMessage;\r\n } else if (\r\n error.code === \"ECONNABORTED\" ||\r\n error.message?.includes(\"timeout\")\r\n ) {\r\n userMessage =\r\n \"Kết nối đến máy chủ hết thời gian. Vui lòng thử lại.\";\r\n } else if (\r\n error.message?.includes(\"failed to respond\") ||\r\n error.message?.includes(\"Network Error\")\r\n ) {\r\n userMessage =\r\n \"Không thể kết nối đến máy chủ lưu trữ. Máy chủ không phản hồi.\";\r\n } else if (error.message) {\r\n userMessage = `Lỗi kết nối: ${error.message}`;\r\n } else if (error.error?.message) {\r\n userMessage = error.error.message;\r\n }\r\n\r\n observer.error(new Error(userMessage));\r\n });\r\n\r\n return () => {\r\n if (xhr) {\r\n xhr.abort();\r\n xhr = null;\r\n }\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Tạo tên file unique bằng cách thêm timestamp và random string\r\n * Format: originalname-timestamp-random.ext\r\n */\r\n private generateUniqueFileName(originalFileName: string): string {\r\n const timestamp = Date.now();\r\n const randomString = Math.random().toString(36).substring(2, 9);\r\n\r\n // Tách tên file và extension\r\n const lastDotIndex = originalFileName.lastIndexOf(\".\");\r\n if (lastDotIndex === -1) {\r\n // Không có extension\r\n return `${originalFileName}-${timestamp}-${randomString}`;\r\n }\r\n\r\n const nameWithoutExt = originalFileName.substring(0, lastDotIndex);\r\n const extension = originalFileName.substring(lastDotIndex);\r\n\r\n return `${nameWithoutExt}-${timestamp}-${randomString}${extension}`;\r\n }\r\n\r\n private extractFileName(filePath: string): string {\r\n return filePath.split(\"/\").pop() || \"\";\r\n }\r\n\r\n private buildResult(\r\n file: File,\r\n filePath: string,\r\n url: string\r\n ): ImageUploadResult {\r\n return {\r\n url,\r\n filePath,\r\n fileName: this.extractFileName(filePath) || file.name,\r\n originalName: file.name\r\n };\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LoadingSpinnerService {\r\n private _loading = new BehaviorSubject<boolean>(false);\r\n public readonly loading$ = this._loading.asObservable();\r\n\r\n show() {\r\n this._loading.next(true);\r\n }\r\n\r\n hide() {\r\n this._loading.next(false);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LocalStorageService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n setItem(key: string, value: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n localStorage.setItem(key, value);\r\n });\r\n }\r\n\r\n getItem(key: string): string | null {\r\n return this.platformService.runOnBrowser(() => {\r\n return localStorage.getItem(key);\r\n });\r\n }\r\n\r\n removeItem(key: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n localStorage.removeItem(key);\r\n });\r\n }\r\n\r\n clear(): void {\r\n this.platformService.runOnBrowser(() => {\r\n localStorage.clear();\r\n });\r\n }\r\n\r\n hasKey(key: string): boolean {\r\n return (\r\n this.platformService.runOnBrowser(() => {\r\n return localStorage.getItem(key) !== null;\r\n }) || false\r\n );\r\n }\r\n}\r\n","import { DOCUMENT } from \"@angular/common\";\r\nimport { Inject, Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class OverlayService {\r\n private isOverlaySubject: BehaviorSubject<boolean> =\r\n new BehaviorSubject<boolean>(false);\r\n isOverlay$ = this.isOverlaySubject.asObservable();\r\n private overlayRequestors: Set<string> = new Set(); // Set lưu các component yêu cầu overlay\r\n\r\n htmlWrapperElement: any;\r\n\r\n constructor(@Inject(DOCUMENT) private _document: Document) {\r\n this.htmlWrapperElement = this._document.querySelector(\"html\");\r\n }\r\n\r\n onShowOverlay(requestor: string) {\r\n this.overlayRequestors.add(requestor); // Thêm component vào Set\r\n if (this.overlayRequestors.size === 1) {\r\n // Chỉ hiển thị overlay nếu là yêu cầu đầu tiên\r\n this.isOverlaySubject.next(true);\r\n this.htmlWrapperElement.style.overflow = \"hidden\";\r\n }\r\n }\r\n\r\n onHiddenOverlay(requestor: string) {\r\n this.overlayRequestors.delete(requestor); // Xóa component khỏi Set\r\n if (this.overlayRequestors.size === 0) {\r\n // Chỉ ẩn overlay nếu không còn yêu cầu nào\r\n this.isOverlaySubject.next(false);\r\n this.htmlWrapperElement.style.overflow = \"auto\";\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, of, BehaviorSubject } from \"rxjs\";\r\nimport { tap, catchError } from \"rxjs/operators\";\r\n\r\nexport interface CacheEntry<T> {\r\n data: T;\r\n timestamp: number;\r\n ttl: number; // Time to live in milliseconds\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class RequestCacheService {\r\n private cache = new Map<string, CacheEntry<any>>();\r\n private pendingRequests = new Map<string, Observable<any>>();\r\n private cacheStats = new BehaviorSubject<{ hits: number; misses: number }>({\r\n hits: 0,\r\n misses: 0\r\n });\r\n\r\n constructor() {\r\n // Cleanup expired cache entries every 5 minutes\r\n setInterval(() => this.cleanupExpiredEntries(), 5 * 60 * 1000);\r\n }\r\n\r\n /**\r\n * Lấy dữ liệu từ cache hoặc thực hiện request mới\r\n */\r\n get<T>(\r\n key: string,\r\n requestFn: () => Observable<T>,\r\n ttl: number = 5 * 60 * 1000\r\n ): Observable<T> {\r\n // Kiểm tra cache\r\n const cached = this.getFromCache<T>(key);\r\n if (cached) {\r\n this.incrementHits();\r\n return of(cached);\r\n }\r\n\r\n // Kiểm tra pending requests\r\n if (this.pendingRequests.has(key)) {\r\n return this.pendingRequests.get(key)!;\r\n }\r\n\r\n // Thực hiện request mới\r\n this.incrementMisses();\r\n const request$ = requestFn().pipe(\r\n tap(data => {\r\n this.setCache(key, data, ttl);\r\n this.pendingRequests.delete(key);\r\n }),\r\n catchError(error => {\r\n this.pendingRequests.delete(key);\r\n throw error;\r\n })\r\n );\r\n\r\n this.pendingRequests.set(key, request$);\r\n return request$;\r\n }\r\n\r\n /**\r\n * Lấy dữ liệu từ cache\r\n */\r\n private getFromCache<T>(key: string): T | null {\r\n const entry = this.cache.get(key);\r\n if (!entry) return null;\r\n\r\n const now = Date.now();\r\n if (now - entry.timestamp > entry.ttl) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n return entry.data;\r\n }\r\n\r\n /**\r\n * Lưu dữ liệu vào cache\r\n */\r\n private setCache<T>(key: string, data: T, ttl: number): void {\r\n this.cache.set(key, {\r\n data,\r\n timestamp: Date.now(),\r\n ttl\r\n });\r\n }\r\n\r\n /**\r\n * Xóa cache entry\r\n */\r\n clearCache(key: string): void {\r\n this.cache.delete(key);\r\n this.pendingRequests.delete(key);\r\n }\r\n\r\n /**\r\n * Xóa toàn bộ cache\r\n */\r\n clearAllCache(): void {\r\n this.cache.clear();\r\n this.pendingRequests.clear();\r\n }\r\n\r\n /**\r\n * Dọn dẹp cache entries đã hết hạn\r\n */\r\n private cleanupExpiredEntries(): void {\r\n const now = Date.now();\r\n for (const [key, entry] of this.cache.entries()) {\r\n if (now - entry.timestamp > entry.ttl) {\r\n this.cache.delete(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Tạo cache key từ URL và parameters\r\n */\r\n generateKey(url: string, params?: any): string {\r\n const paramsStr = params ? JSON.stringify(params) : \"\";\r\n return `${url}${paramsStr}`;\r\n }\r\n\r\n /**\r\n * Lấy thống kê cache\r\n */\r\n getStats(): Observable<{ hits: number; misses: number }> {\r\n return this.cacheStats.asObservable();\r\n }\r\n\r\n private incrementHits(): void {\r\n const stats = this.cacheStats.value;\r\n this.cacheStats.next({ ...stats, hits: stats.hits + 1 });\r\n }\r\n\r\n private incrementMisses(): void {\r\n const stats = this.cacheStats.value;\r\n this.cacheStats.next({ ...stats, misses: stats.misses + 1 });\r\n }\r\n\r\n /**\r\n * Log cache statistics\r\n */\r\n logStats(): void {\r\n const stats = this.cacheStats.value;\r\n const total = stats.hits + stats.misses;\r\n const hitRate = total > 0 ? ((stats.hits / total) * 100).toFixed(2) : \"0\";\r\n\r\n // console.log(`[RequestCacheService] Cache Stats:`, {\r\n // hits: stats.hits,\r\n // misses: stats.misses,\r\n // total,\r\n // hitRate: `${hitRate}%`,\r\n // cacheSize: this.cache.size,\r\n // pendingRequests: this.pendingRequests.size\r\n // });\r\n }\r\n}\r\n","import { Injectable, Type } from \"@angular/core\";\r\nimport { BreakpointService } from \"./breakpoint.service\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { ViewType } from \"@web-portal/core-domain\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class ResponsiveService {\r\n private currentView = new BehaviorSubject<ViewType>(ViewType.DESKTOP);\r\n currentView$ = this.currentView.asObservable();\r\n\r\n constructor(private breakpointService: BreakpointService) {\r\n this.breakpointService.breakpointsResult$.subscribe(breakpoints => {\r\n if (breakpoints.isDesktopUp) {\r\n this.currentView.next(ViewType.DESKTOP);\r\n } else if (breakpoints.isPhoneOnly) {\r\n this.currentView.next(ViewType.MOBILE);\r\n } else {\r\n this.currentView.next(ViewType.DESKTOP); // Default to desktop\r\n }\r\n });\r\n }\r\n}\r\n","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport {\r\n BehaviorSubject,\r\n Subject,\r\n Observable,\r\n fromEvent,\r\n filter,\r\n map,\r\n takeUntil\r\n} from \"rxjs\";\r\nimport { Router, NavigationEnd } from \"@angular/router\";\r\n\r\n/**\r\n * Search Event Types for Shell-MFE Communication\r\n * These mirror the types from the Search MFE but are simplified for cross-app communication\r\n */\r\nexport enum ShellSearchEventType {\r\n NAVIGATION_TO_SEARCH = \"NAVIGATION_TO_SEARCH\",\r\n NAVIGATION_AWAY_FROM_SEARCH = \"NAVIGATION_AWAY_FROM_SEARCH\",\r\n NAVIGATION_REQUEST = \"NAVIGATION_REQUEST\",\r\n ROUTE_ACCESSED_DIRECTLY = \"ROUTE_ACCESSED_DIRECTLY\",\r\n ROUTE_RELOADED = \"ROUTE_RELOADED\",\r\n SEARCH_INITIATED = \"SEARCH_INITIATED\",\r\n FILTER_CHANGED = \"FILTER_CHANGED\",\r\n SORT_CHANGED = \"SORT_CHANGED\"\r\n}\r\n\r\n/**\r\n * Shell Search Event Payload\r\n */\r\nexport interface ShellSearchEventPayload {\r\n type: ShellSearchEventType;\r\n source: \"shell\" | \"mfe-search\";\r\n timestamp: number;\r\n route?: string;\r\n queryParams?: Record<string, any>;\r\n data?: any;\r\n correlationId?: string;\r\n}\r\n\r\n/**\r\n * Cross-MFE Communication Interface\r\n */\r\nexport interface MFECommunicationEvent extends MessageEvent {\r\n data: {\r\n type: \"SEARCH_EVENT\";\r\n payload: ShellSearchEventPayload;\r\n };\r\n}\r\n\r\n/**\r\n * Search Event Bridge Service for Shell Application\r\n * Handles communication between Shell and Search MFE via postMessage and routing\r\n */\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class SearchEventBridgeService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly eventSubject =\r\n new BehaviorSubject<ShellSearchEventPayload | null>(null);\r\n\r\n // Current route tracking\r\n private currentRoute: string = \"\";\r\n private previousRoute: string = \"\";\r\n private isSearchRoute: boolean = false;\r\n\r\n constructor(private router: Router) {\r\n this.initializeRouteTracking();\r\n this.initializePostMessageListener();\r\n }\r\n\r\n /**\r\n * Get observable stream of search events\r\n */\r\n getEventStream(): Observable<ShellSearchEventPayload> {\r\n return this.eventSubject.pipe(\r\n filter(event => event !== null),\r\n takeUntil(this.destroy$)\r\n ) as Observable<ShellSearchEventPayload>;\r\n }\r\n\r\n /**\r\n * Emit a search event from Shell\r\n */\r\n emitShellEvent(type: ShellSearchEventType, data?: any): void {\r\n const event: ShellSearchEventPayload = {\r\n type,\r\n source: \"shell\",\r\n timestamp: Date.now(),\r\n route: this.currentRoute,\r\n queryParams: this.getQueryParams(),\r\n data,\r\n correlationId: this.generateCorrelationId()\r\n };\r\n\r\n this.eventSubject.next(event);\r\n this.postMessageToMFE(event);\r\n }\r\n\r\n /**\r\n * Navigate to search page with query\r\n */\r\n navigateToSearch(\r\n searchQuery: string,\r\n additionalParams?: Record<string, any>\r\n ): void {\r\n const queryParams = {\r\n q: searchQuery,\r\n ...additionalParams\r\n };\r\n\r\n // Emit navigation event\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_TO_SEARCH, {\r\n searchQuery,\r\n queryParams\r\n });\r\n\r\n // Perform navigation\r\n this.router.navigate([\"/tim-kiem\"], { queryParams });\r\n }\r\n\r\n /**\r\n * Update search query in current route\r\n */\r\n updateSearchQuery(searchQuery: string, replaceUrl: boolean = false): void {\r\n const currentParams = this.getQueryParams();\r\n const newParams = {\r\n ...currentParams,\r\n q: searchQuery\r\n };\r\n\r\n this.router.navigate([], {\r\n relativeTo: this.router.routerState.root,\r\n queryParams: newParams,\r\n replaceUrl\r\n });\r\n }\r\n\r\n /**\r\n * Clear search and navigate to home\r\n */\r\n clearSearchAndNavigateHome(): void {\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_AWAY_FROM_SEARCH, {\r\n targetRoute: \"/\"\r\n });\r\n\r\n this.router.navigate([\"/\"]);\r\n }\r\n\r\n /**\r\n * Check if currently on search route\r\n */\r\n isOnSearchRoute(): boolean {\r\n return this.isSearchRoute;\r\n }\r\n\r\n /**\r\n * Get current route info\r\n */\r\n getCurrentRouteInfo(): {\r\n route: string;\r\n queryParams: Record<string, any>;\r\n isSearchRoute: boolean;\r\n } {\r\n return {\r\n route: this.currentRoute,\r\n queryParams: this.getQueryParams(),\r\n isSearchRoute: this.isSearchRoute\r\n };\r\n }\r\n\r\n /**\r\n * Initialize route tracking\r\n */\r\n private initializeRouteTracking(): void {\r\n this.router.events\r\n .pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe((event: NavigationEnd) => {\r\n this.handleRouteChange(event);\r\n });\r\n\r\n // Handle initial route\r\n this.currentRoute = this.router.url;\r\n this.isSearchRoute = this.checkIfSearchRoute(this.currentRoute);\r\n }\r\n\r\n /**\r\n * Handle route changes\r\n */\r\n private handleRouteChange(event: NavigationEnd): void {\r\n this.previousRoute = this.currentRoute;\r\n this.currentRoute = event.url;\r\n const wasSearchRoute = this.isSearchRoute;\r\n this.isSearchRoute = this.checkIfSearchRoute(this.currentRoute);\r\n\r\n // Emit appropriate events based on route change\r\n if (!wasSearchRoute && this.isSearchRoute) {\r\n // Navigated to search\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_TO_SEARCH, {\r\n fromRoute: this.previousRoute,\r\n toRoute: this.currentRoute\r\n });\r\n } else if (wasSearchRoute && !this.isSearchRoute) {\r\n // Navigated away from search\r\n this.emitShellEvent(ShellSearchEventType.NAVIGATION_AWAY_FROM_SEARCH, {\r\n fromRoute: this.previousRoute,\r\n toRoute: this.currentRoute\r\n });\r\n } else if (this.isSearchRoute) {\r\n // Navigation within search (filter/sort changes)\r\n this.detectSearchNavigationType();\r\n }\r\n }\r\n\r\n /**\r\n * Detect type of navigation within search page\r\n */\r\n private detectSearchNavigationType(): void {\r\n const currentParams = this.getQueryParams();\r\n const urlPath = this.currentRoute.split(\"?\")[0];\r\n\r\n // Check if it's a direct access or reload\r\n if (this.isDirectAccess()) {\r\n this.emitShellEvent(ShellSearchEventType.ROUTE_ACCESSED_DIRECTLY, {\r\n route: urlPath,\r\n queryParams: currentParams\r\n });\r\n } else if (this.isPageReload()) {\r\n this.emitShellEvent(ShellSearchEventType.ROUTE_RELOADED, {\r\n route: urlPath,\r\n queryParams: currentParams\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Check if current route is search route\r\n */\r\n private checkIfSearchRoute(route: string): boolean {\r\n return route.includes(\"/tim-kiem\");\r\n }\r\n\r\n /**\r\n * Check if this is direct access (no previous route or referrer)\r\n */\r\n private isDirectAccess(): boolean {\r\n return (\r\n !this.previousRoute ||\r\n (typeof window !== \"undefined\" && !document.referrer) ||\r\n (typeof window !== \"undefined\" && !window.history.length)\r\n );\r\n }\r\n\r\n /**\r\n * Check if this is a page reload\r\n */\r\n private isPageReload(): boolean {\r\n if (typeof window !== \"undefined\" && typeof performance !== \"undefined\") {\r\n const navigation = (performance as any).navigation;\r\n return navigation?.type === \"reload\";\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get current query parameters\r\n */\r\n private getQueryParams(): Record<string, any> {\r\n const urlTree = this.router.parseUrl(this.currentRoute);\r\n return urlTree.queryParams;\r\n }\r\n\r\n /**\r\n * Initialize postMessage listener for MFE communication\r\n */\r\n private initializePostMessageListener(): void {\r\n if (typeof window === \"undefined\") return;\r\n\r\n fromEvent<MFECommunicationEvent>(window, \"message\")\r\n .pipe(\r\n filter(event => this.isValidMFEEvent(event)),\r\n map(event => event.data.payload),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(payload => {\r\n this.handleMFEEvent(payload);\r\n });\r\n }\r\n\r\n /**\r\n * Validate incoming postMessage events\r\n */\r\n private isValidMFEEvent(event: MessageEvent): event is MFECommunicationEvent {\r\n return (\r\n event.data &&\r\n event.data.type === \"SEARCH_EVENT\" &&\r\n event.data.payload &&\r\n event.data.payload.source === \"mfe-search\"\r\n );\r\n }\r\n\r\n /**\r\n * Send event to MFE via postMessage\r\n */\r\n private postMessageToMFE(event: ShellSearchEventPayload): void {\r\n if (typeof window === \"undefined\") return;\r\n\r\n // Find MFE iframes or windows\r\n const mfeFrames = document.querySelectorAll(\r\n 'iframe[src*=\"5201\"], iframe[src*=\"mfe-search\"]'\r\n );\r\n\r\n mfeFrames.forEach(frame => {\r\n try {\r\n (frame as HTMLIFrameElement).contentWindow?.postMessage(\r\n {\r\n type: \"SEARCH_EVENT\",\r\n payload: event\r\n },\r\n \"*\"\r\n );\r\n } catch (error) {\r\n console.warn(\r\n \"[SearchEventBridge] Failed to send message to MFE:\",\r\n error\r\n );\r\n }\r\n });\r\n\r\n // Also try window.parent in case Shell is embedded\r\n try {\r\n window.parent?.postMessage(\r\n {\r\n type: \"SEARCH_EVENT\",\r\n payload: event\r\n },\r\n \"*\"\r\n );\r\n } catch (error) {\r\n // Ignore cross-origin errors\r\n }\r\n }\r\n\r\n /**\r\n * Generate correlation ID for event tracking\r\n */\r\n private generateCorrelationId(): string {\r\n return `shell_${Date.now()}_${Math.random().toString(36).substring(2)}`;\r\n }\r\n\r\n /**\r\n * Get event history for debugging\r\n */\r\n getEventHistory(): ShellSearchEventPayload[] {\r\n // Implementation would store recent events for debugging\r\n return [];\r\n }\r\n\r\n /**\r\n * Public method to handle events from MFE (called by wrapper)\r\n */\r\n handleMFEEvent(payload: ShellSearchEventPayload): void {\r\n // Re-emit the event for Shell consumers\r\n this.eventSubject.next(payload);\r\n\r\n // Handle specific events that require Shell action\r\n switch (payload.type) {\r\n case ShellSearchEventType.NAVIGATION_TO_SEARCH:\r\n // Handle navigation request from MFE\r\n if (payload.data?.searchQuery) {\r\n this.navigateToSearch(\r\n payload.data.searchQuery,\r\n payload.data?.additionalParams\r\n );\r\n } else if (payload.data?.queryParams) {\r\n // For cases like image search where only queryParams are provided\r\n this.router.navigate([\"/tim-kiem\"], {\r\n queryParams: payload.data.queryParams\r\n });\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.NAVIGATION_AWAY_FROM_SEARCH:\r\n // Handle navigation away from search\r\n if (payload.data?.targetRoute) {\r\n this.router.navigate([payload.data.targetRoute]);\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.NAVIGATION_REQUEST:\r\n // Handle general navigation request from MFE\r\n if (payload.data?.targetRoute) {\r\n this.router.navigate([payload.data.targetRoute]);\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.SEARCH_INITIATED:\r\n // Update URL if needed\r\n if (payload.data?.searchQuery) {\r\n this.updateSearchQuery(payload.data.searchQuery, true);\r\n }\r\n break;\r\n\r\n case ShellSearchEventType.FILTER_CHANGED:\r\n case ShellSearchEventType.SORT_CHANGED:\r\n // These are handled by the MFE but can trigger Shell-level analytics\r\n break;\r\n }\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/**\r\n * Factory function for providing the service\r\n */\r\nexport function provideSearchEventBridge() {\r\n return {\r\n provide: SearchEventBridgeService,\r\n useClass: SearchEventBridgeService\r\n };\r\n}\r\n","import { Inject, Injectable } from \"@angular/core\";\r\nimport { Meta, Title } from \"@angular/platform-browser\";\r\nimport { DOCUMENT } from \"@angular/common\";\r\nimport { SeoSocialShareData } from \"@web-portal/core-domain\";\r\n\r\nexport enum NgxSeoMetaTagAttr {\r\n name = \"name\",\r\n property = \"property\"\r\n}\r\n\r\nexport interface NgxSeoMetaTag {\r\n attr: NgxSeoMetaTagAttr;\r\n attrValue: string;\r\n value?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class SeoService {\r\n constructor(\r\n private readonly meta: Meta,\r\n private readonly title: Title,\r\n // tslint:disable-next-line: variable-name\r\n @Inject(DOCUMENT) private readonly _document: Document\r\n ) {}\r\n\r\n public setData(data: SeoSocialShareData): void {\r\n this.setSection(data.section);\r\n if (typeof data.keywords !== \"undefined\") {\r\n this.setKeywords(data.keywords);\r\n }\r\n //this.setKeywords(data.keywords);\r\n this.setTitle(data.title);\r\n this.setType(data.type);\r\n this.setDescription(data.description);\r\n this.setImage(data.image);\r\n this.setUrl(data.url);\r\n this.setPublished(data.published);\r\n this.setModified(data.modified);\r\n this.setAuthor(data.author);\r\n }\r\n\r\n public setKeywords(keywords: string): void {\r\n if (Boolean(keywords)) {\r\n this.meta.updateTag({ name: \"keywords\", content: keywords });\r\n } else {\r\n this.meta.removeTag(`name='keywords'`);\r\n }\r\n }\r\n\r\n public setSection(section?: string): void {\r\n if (Boolean(section)) {\r\n //this.meta.updateTag({ name: 'article:section', content: section });\r\n if (typeof section !== \"undefined\") {\r\n this.meta.updateTag({ name: \"article:section\", content: section });\r\n }\r\n } else {\r\n this.meta.removeTag(`name='article:section'`);\r\n }\r\n }\r\n\r\n public setTitle(title: string = \"\") {\r\n this.title.setTitle(title);\r\n if (title && title.length) {\r\n this.meta.updateTag({ name: \"twitter:title\", content: title });\r\n this.meta.updateTag({ name: \"twitter:image:alt\", content: title });\r\n this.meta.updateTag({ property: \"og:image:alt\", content: title });\r\n this.meta.updateTag({ property: \"og:title\", content: title });\r\n this.meta.updateTag({ name: \"title\", content: title });\r\n } else {\r\n this.meta.removeTag(`name='twitter:title'`);\r\n this.meta.removeTag(`name='twitter:image:alt'`);\r\n this.meta.removeTag(`property='og:image:alt'`);\r\n this.meta.removeTag(`property='og:title'`);\r\n this.meta.removeTag(`name='title'`);\r\n }\r\n }\r\n\r\n public setType(type?: string) {\r\n if (type && type.length) {\r\n this.meta.updateTag({ property: \"og:type\", content: type });\r\n } else {\r\n this.meta.removeTag(`property='og:type'`);\r\n }\r\n }\r\n\r\n public setDescription(description?: string) {\r\n if (description && description.length) {\r\n this.meta.updateTag({\r\n name: \"twitter:description\",\r\n content: description\r\n });\r\n this.meta.updateTag({ property: \"og:description\", content: description });\r\n this.meta.updateTag({ name: \"description\", content: description });\r\n } else {\r\n this.meta.removeTag(`name='twitter:description'`);\r\n this.meta.removeTag(`property='og:description'`);\r\n this.meta.removeTag(`name='description'`);\r\n }\r\n }\r\n\r\n public setImage(image?: string) {\r\n if (image && image.length) {\r\n this.meta.updateTag({ name: \"twitter:image\", content: image });\r\n this.meta.updateTag({ property: \"og:image\", content: image });\r\n this.meta.updateTag({ property: \"og:image:height\", content: \"630\" });\r\n } else {\r\n this.meta.removeTag(`name='twitter:image'`);\r\n this.meta.removeTag(`property='og:image'`);\r\n this.meta.removeTag(`property='og:image:height'`);\r\n }\r\n }\r\n\r\n public setUrl(url?: string) {\r\n if (url && url.length) {\r\n this.meta.updateTag({ property: \"og:url\", content: url });\r\n } else {\r\n this.meta.removeTag(`property='og:url'`);\r\n }\r\n this.setCanonicalUrl(url);\r\n }\r\n\r\n public setPublished(publishedDateString?: string) {\r\n if (publishedDateString) {\r\n const publishedDate = new Date(publishedDateString);\r\n this.meta.updateTag({\r\n name: \"article:published_time\",\r\n content: publishedDate.toISOString()\r\n });\r\n this.meta.updateTag({\r\n name: \"published_date\",\r\n content: publishedDate.toISOString()\r\n });\r\n } else {\r\n this.meta.removeTag(`name='article:published_time'`);\r\n this.meta.removeTag(`name='publication_date'`);\r\n }\r\n }\r\n\r\n public setModified(modifiedDateString?: string) {\r\n if (modifiedDateString) {\r\n const modifiedDate = new Date(modifiedDateString);\r\n this.meta.updateTag({\r\n name: \"article:modified_time\",\r\n content: modifiedDate.toISOString()\r\n });\r\n this.meta.updateTag({\r\n name: \"og:updated_time\",\r\n content: modifiedDate.toISOString()\r\n });\r\n } else {\r\n this.meta.removeTag(`name='article:modified_time'`);\r\n this.meta.removeTag(`name='og:updated_time'`);\r\n }\r\n }\r\n\r\n public setAuthor(author?: string) {\r\n if (author && author.length) {\r\n this.meta.updateTag({ name: \"article:author\", content: author });\r\n this.meta.updateTag({ name: \"author\", content: author });\r\n } else {\r\n this.meta.removeTag(`name='article:author'`);\r\n this.meta.removeTag(`name='author'`);\r\n }\r\n }\r\n\r\n public setTwitterSiteCreator(site?: string): void {\r\n if (Boolean(site)) {\r\n //this.meta.updateTag({ name: 'twitter:site', content: site });\r\n if (typeof site !== \"undefined\") {\r\n this.meta.updateTag({ name: \"twitter:site\", content: site });\r\n this.meta.updateTag({ name: \"twitter:creator\", content: site });\r\n }\r\n } else {\r\n this.meta.removeTag(`name='twitter:site'`);\r\n this.meta.removeTag(`name='twitter:creator'`);\r\n }\r\n }\r\n\r\n public setTwitterCard(card?: string): void {\r\n if (Boolean(card)) {\r\n if (typeof card !== \"undefined\") {\r\n this.meta.updateTag({ name: \"twitter:card\", content: card });\r\n }\r\n } else {\r\n this.meta.removeTag(`name='twitter:card'`);\r\n }\r\n }\r\n\r\n public setFbAppId(appId?: string): void {\r\n if (Boolean(appId)) {\r\n if (typeof appId !== \"undefined\") {\r\n this.meta.updateTag({ property: \"fb:app_id\", content: appId });\r\n }\r\n } else {\r\n this.meta.removeTag(`property='fb:app_id'`);\r\n }\r\n }\r\n\r\n public setMetaTag(metaTag: NgxSeoMetaTag): void {\r\n if (Boolean(metaTag.value)) {\r\n if (\r\n typeof metaTag !== \"undefined\" &&\r\n typeof metaTag.attr !== \"undefined\" &&\r\n typeof metaTag.attrValue !== \"undefined\" &&\r\n typeof metaTag.value !== \"undefined\"\r\n ) {\r\n const metaTagObject = {\r\n [metaTag.attr]: metaTag.attrValue,\r\n content: metaTag.value\r\n };\r\n this.meta.updateTag(metaTagObject);\r\n }\r\n } else {\r\n const selector = `${metaTag.attr}='${metaTag.attrValue}'`;\r\n this.meta.removeTag(selector);\r\n }\r\n }\r\n\r\n public setMetaTags(metaTags: NgxSeoMetaTag[]): void {\r\n for (const metaTag of metaTags) {\r\n this.setMetaTag(metaTag);\r\n }\r\n }\r\n\r\n public setCanonicalUrl(url?: string) {\r\n // first remove potential previous url\r\n const selector = `link[rel='canonical']`;\r\n const canonicalElement = this._document.head.querySelector(selector);\r\n if (canonicalElement) {\r\n this._document.head.removeChild(canonicalElement);\r\n }\r\n\r\n if (url && url.length) {\r\n const link: HTMLLinkElement = this._document.createElement(\"link\");\r\n link.setAttribute(\"rel\", \"canonical\");\r\n this._document.head.appendChild(link);\r\n link.setAttribute(\"href\", url);\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class SessionStorageService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n setItem(key: string, value: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n sessionStorage.setItem(key, value);\r\n });\r\n }\r\n\r\n getItem(key: string): string | null {\r\n return this.platformService.runOnBrowser(() => {\r\n return sessionStorage.getItem(key);\r\n });\r\n }\r\n\r\n removeItem(key: string): void {\r\n this.platformService.runOnBrowser(() => {\r\n sessionStorage.removeItem(key);\r\n });\r\n }\r\n\r\n clear(): void {\r\n this.platformService.runOnBrowser(() => {\r\n sessionStorage.clear();\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PlatformService } from \"./platform.service\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class WindowService {\r\n constructor(private platformService: PlatformService) {}\r\n\r\n get nativeWindow(): Window | null {\r\n return this.platformService.getWindow();\r\n }\r\n\r\n get configApp(): AppConfig | null {\r\n return this.nativeWindow?.__CONFIG_APP__ ?? null;\r\n }\r\n\r\n getConfigValue<T = any>(key: keyof AppConfig): T | null {\r\n return (this.configApp?.[key] as T) ?? null;\r\n }\r\n}\r\n\r\n// src/custom-types.d.ts\r\ninterface AppConfig {\r\n googleAnalyticsKey?: string;\r\n apiUrl?: string;\r\n environment?: string;\r\n // Thêm các key khác nếu cần\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n __CONFIG_APP__?: AppConfig;\r\n }\r\n}\r\n\r\nexport {}; // cần thiết để được xem là module\r\n","/*\r\n * Public API Surface of core/infrastructure\r\n */\r\n\r\n// Guards\r\nexport * from './lib/guards/auth.guard';\r\n\r\n// Interceptors\r\nexport * from './lib/interceptors/auth.interceptor';\r\nexport * from './lib/interceptors/ajax-request.interceptor';\r\nexport * from './lib/interceptors/duplicate-request.interceptor';\r\nexport * from './lib/interceptors/error.interceptor';\r\nexport * from './lib/interceptors/loading-bar.interceptor';\r\n\r\n// Services\r\nexport * from './lib/services/api.service';\r\nexport * from './lib/services/app-config.service';\r\nexport * from './lib/services/app-initialize.service';\r\nexport * from './lib/services/breakpoint.service';\r\nexport * from './lib/services/cache.service';\r\nexport * from './lib/services/cookie.service';\r\nexport * from './lib/services/document.service';\r\nexport * from './lib/services/file.service';\r\nexport * from './lib/services/file-gcs.service';\r\nexport * from './lib/services/file-aia-gcs.service';\r\nexport * from './lib/services/file-wap-gcs.service';\r\nexport * from './lib/services/loader.service';\r\nexport * from './lib/services/loading.service';\r\nexport * from './lib/services/loading-spinner.service';\r\nexport * from './lib/services/local-storage.service';\r\nexport * from './lib/services/notification.service';\r\nexport * from './lib/services/overlay.service';\r\nexport * from './lib/services/platform.service';\r\nexport * from './lib/services/request-cache.service';\r\nexport * from './lib/services/responsive.service';\r\nexport * from './lib/services/search-event-bridge.service';\r\nexport * from './lib/services/seo.service';\r\nexport * from './lib/services/session-storage.service';\r\nexport * from './lib/services/window.service';\r\n\r\n// Auth Services\r\nexport * from './lib/services/auth/auth.service';\r\nexport * from './lib/services/auth/storage.service';\r\n\r\n// Types and Tokens\r\nexport type { AppEnvironment } from './lib/services/app-config.service';\r\nexport { APP_ENVIRONMENT } from './lib/services/app-config.service';\r\nexport type { IAuthDialogService } from './lib/services/auth/auth-dialog.interface';\r\nexport { AUTH_DIALOG_SERVICE } from './lib/services/auth/auth-dialog.interface';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PLATFORM_ID","i1.StorageService","isPageReload","i1","i2.AuthService","i3.StorageService","tap","catchError","map","i1.PlatformService","filter","i2.LoaderService","i2.ApiService","i1.BreakpointService"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const LOAD_IS_RELOAD_KEY = "__LOAD_IS_RELOAD__";
2
+ export declare const HAS_NAVIGATED_KEY = "__HAS_NAVIGATED__";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-portal/core-infrastructure",
3
- "version": "0.0.9",
3
+ "version": "1.0.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0",