@web-portal/core-infrastructure 0.0.5 → 0.0.7
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.
|
@@ -449,7 +449,7 @@ class ApiService {
|
|
|
449
449
|
if (apiResponse.status === HTTP_STATUS.OK && apiResponse.data === null) {
|
|
450
450
|
throw {
|
|
451
451
|
status: HTTP_STATUS.NO_CONTENT,
|
|
452
|
-
message:
|
|
452
|
+
message: ERROR_MESSAGES.NO_CONTENT
|
|
453
453
|
};
|
|
454
454
|
}
|
|
455
455
|
}), map((apiResponse) => apiResponse.data), catchError((error) => {
|
|
@@ -1073,6 +1073,25 @@ function generateUUID() {
|
|
|
1073
1073
|
return uuid.replace(/-/g, "");
|
|
1074
1074
|
}
|
|
1075
1075
|
|
|
1076
|
+
/**
|
|
1077
|
+
* Ensure ASP.NET's Request.IsAjaxRequest() recognizes Angular HttpClient calls,
|
|
1078
|
+
* so server can return 401 instead of 302 (redirect) for unauthorized API requests.
|
|
1079
|
+
*
|
|
1080
|
+
* ASP.NET MVC's IsAjaxRequest() checks for header:
|
|
1081
|
+
* X-Requested-With: XMLHttpRequest
|
|
1082
|
+
*/
|
|
1083
|
+
const ajaxRequestInterceptor = (req, next) => {
|
|
1084
|
+
// If caller already set it, respect existing value.
|
|
1085
|
+
if (req.headers.has("X-Requested-With")) {
|
|
1086
|
+
return next(req);
|
|
1087
|
+
}
|
|
1088
|
+
return next(req.clone({
|
|
1089
|
+
setHeaders: {
|
|
1090
|
+
"X-Requested-With": "XMLHttpRequest"
|
|
1091
|
+
}
|
|
1092
|
+
}));
|
|
1093
|
+
};
|
|
1094
|
+
|
|
1076
1095
|
// Cache để lưu trữ pending requests
|
|
1077
1096
|
const pendingRequests = new Map();
|
|
1078
1097
|
const duplicateRequestInterceptor = (request, next) => {
|
|
@@ -2681,5 +2700,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
2681
2700
|
* Generated bundle index. Do not edit.
|
|
2682
2701
|
*/
|
|
2683
2702
|
|
|
2684
|
-
export { API_SERVICE_CONFIG, APP_ENVIRONMENT, AUTH_DIALOG_SERVICE, ApiService, AppConfigService, AppInitializeService, AuthGuard, AuthService, BreakpointService, CacheService, CookieService, DocumentService, FileAIA_GCSService, FileGCSService, FileService, FileWAPGCSService, LoaderService, LoadingService, LoadingSpinnerService, LocalStorageService, NgxSeoMetaTagAttr, OverlayService, PlatformService, RequestCacheService, ResponsiveService, SearchEventBridgeService, SeoService, SessionStorageService, SessionValidationError, ShellSearchEventType, StorageService, WindowService, authInterceptor, duplicateRequestInterceptor, errorInterceptor, loadingInterceptor, provideSearchEventBridge };
|
|
2703
|
+
export { API_SERVICE_CONFIG, APP_ENVIRONMENT, AUTH_DIALOG_SERVICE, ApiService, AppConfigService, AppInitializeService, AuthGuard, AuthService, BreakpointService, CacheService, CookieService, DocumentService, FileAIA_GCSService, FileGCSService, FileService, FileWAPGCSService, LoaderService, LoadingService, LoadingSpinnerService, LocalStorageService, NgxSeoMetaTagAttr, OverlayService, PlatformService, RequestCacheService, ResponsiveService, SearchEventBridgeService, SeoService, SessionStorageService, SessionValidationError, ShellSearchEventType, StorageService, WindowService, ajaxRequestInterceptor, authInterceptor, duplicateRequestInterceptor, errorInterceptor, loadingInterceptor, provideSearchEventBridge };
|
|
2685
2704
|
//# sourceMappingURL=web-portal-core-infrastructure.mjs.map
|
|
@@ -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/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: apiResponse.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\nfunction isPageReload(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(\"__LOAD_IS_RELOAD__\") === \"1\";\r\n } catch {\r\n return false;\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 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\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__\") === \"1\";\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 }\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 // Nếu đang reload trang (F5) và backend trả 401 → luôn redirect login\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 // 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 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 {\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 } from \"rxjs\";\r\nimport { HttpClient, HttpEvent, HttpRequest } from \"@angular/common/http\";\r\nimport { LoaderService } from \"./loader.service\";\r\nimport { DOCUMENT } from \"@angular/common\";\r\nimport moment from \"moment-timezone\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileService {\r\n baseUrl = \"/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.baseUrl}/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(`${this.baseUrl}/downloadExcel?filePath=${encodedPath}`, {\r\n responseType: \"blob\"\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.baseUrl}/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 let name = fileName.replace(`.${extention}`, \"\");\r\n let downLoadFileName = `${name}_${moment(new Date()).format(\"DD-MM-YYYY\")}_.${extention ? extention : \".xlsx\"}`;\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","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/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","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/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\nfunction isPageReload(): boolean {\r\n try {\r\n return window.sessionStorage.getItem(\"__LOAD_IS_RELOAD__\") === \"1\";\r\n } catch {\r\n return false;\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 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\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__\") === \"1\";\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 }\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 // Nếu đang reload trang (F5) và backend trả 401 → luôn redirect login\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 // 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 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 } from \"rxjs\";\r\nimport { HttpClient, HttpEvent, HttpRequest } from \"@angular/common/http\";\r\nimport { LoaderService } from \"./loader.service\";\r\nimport { DOCUMENT } from \"@angular/common\";\r\nimport moment from \"moment-timezone\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class FileService {\r\n baseUrl = \"/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.baseUrl}/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(`${this.baseUrl}/downloadExcel?filePath=${encodedPath}`, {\r\n responseType: \"blob\"\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.baseUrl}/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 let name = fileName.replace(`.${extention}`, \"\");\r\n let downLoadFileName = `${name}_${moment(new Date()).format(\"DD-MM-YYYY\")}_.${extention ? extention : \".xlsx\"}`;\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","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","i2.LoaderService","i2.ApiService","i1.BreakpointService"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HttpInterceptorFn } from "@angular/common/http";
|
|
2
|
+
/**
|
|
3
|
+
* Ensure ASP.NET's Request.IsAjaxRequest() recognizes Angular HttpClient calls,
|
|
4
|
+
* so server can return 401 instead of 302 (redirect) for unauthorized API requests.
|
|
5
|
+
*
|
|
6
|
+
* ASP.NET MVC's IsAjaxRequest() checks for header:
|
|
7
|
+
* X-Requested-With: XMLHttpRequest
|
|
8
|
+
*/
|
|
9
|
+
export declare const ajaxRequestInterceptor: HttpInterceptorFn;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './lib/guards/auth.guard';
|
|
2
2
|
export * from './lib/interceptors/auth.interceptor';
|
|
3
|
+
export * from './lib/interceptors/ajax-request.interceptor';
|
|
3
4
|
export * from './lib/interceptors/duplicate-request.interceptor';
|
|
4
5
|
export * from './lib/interceptors/error.interceptor';
|
|
5
6
|
export * from './lib/interceptors/loading-bar.interceptor';
|