sensei-uaepass
Version:
🥋 Master of UAE Pass integration! Angular OAuth 2.0 (PKCE) client with sensei-level signals-based state management, multi-language support, and elegant UI components.
1 lines • 61.2 kB
Source Map (JSON)
{"version":3,"file":"sensei-uaepass.mjs","sources":["../../../projects/uae-pass/src/lib/uae-pass.config.ts","../../../projects/uae-pass/src/lib/uae-pass.enums.ts","../../../projects/uae-pass/src/lib/uae-pass.constants.ts","../../../projects/uae-pass/src/lib/uae-pass.memory.ts","../../../projects/uae-pass/src/lib/uae-pass.pkce.ts","../../../projects/uae-pass/src/lib/uae-pass.storage.ts","../../../projects/uae-pass/src/lib/uae-pass.i18n.ts","../../../projects/uae-pass/src/lib/uae-pass.oauth.service.ts","../../../projects/uae-pass/src/lib/uae-pass-login-button.component.ts","../../../projects/uae-pass/src/lib/uae-pass-callback.component.ts","../../../projects/uae-pass/src/public-api.ts","../../../projects/uae-pass/src/sensei-uaepass.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\nimport { UaePassLanguageCode, UaePassStorageMode } from './uae-pass.enums';\n\nexport type UaePassLanguage = UaePassLanguageCode | (string & {});\n\nexport interface UaePassConfig {\n clientId: string;\n redirectUri: string;\n isProduction: boolean;\n language?: UaePassLanguage;\n // Strongly recommended to keep secrets on a backend; SPA should prefer a proxy\n clientSecret?: string;\n // Optional scope override. Default: 'urn:uae:digitalid:profile:general'\n scope?: string;\n // If CORS blocks direct calls to UAE PASS, set a backend proxy endpoint here\n tokenProxyUrl?: string;\n userInfoProxyUrl?: string;\n // Request timeout in ms\n requestTimeoutMs?: number;\n // Persistence strategy for tokens/profile. Default: 'none'\n // Accepts enum for ergonomics, or legacy string values for compatibility\n storage?: UaePassStorageMode | 'none' | 'session' | 'local';\n // Display only; used to show SOP1 restriction message in apps that need it\n blockSOP1?: boolean;\n serviceProviderEnglishName?: string;\n serviceProviderArabicName?: string;\n // Optional separate logout redirect URI. If not provided, uses redirectUri\n logoutRedirectUri?: string;\n // Language-specific button logos\n buttonLogos?: {\n english?: string;\n arabic?: string;\n };\n}\n\nexport const UAE_PASS_CONFIG = new InjectionToken<UaePassConfig>('UAE_PASS_CONFIG');\n\nexport function provideUaePass(config: UaePassConfig): Provider[] {\n return [{ provide: UAE_PASS_CONFIG, useValue: config }];\n}\n","// Centralized enums for sensei-uaepass\n\nexport enum UaePassAuthStatus {\n Idle = 'idle',\n Authorizing = 'authorizing',\n ExchangingToken = 'exchangingToken',\n Authenticated = 'authenticated',\n Error = 'error',\n LoggedOut = 'loggedOut',\n}\n\nexport enum UaePassStorageMode {\n None = 'none',\n Session = 'session',\n Local = 'local',\n}\n\nexport enum UaePassAcr {\n MobileOnDevice = 'urn:digitalid:authentication:flow:mobileondevice',\n Web = 'urn:safelayer:tws:policies:authentication:level:low',\n}\n\nexport enum UaePassLanguageCode {\n En = 'en',\n Ar = 'ar',\n}\n\n// Optional convenience if consumers prefer enums over booleans for environment\nexport enum UaePassEnvironment {\n Production = 'production',\n Staging = 'staging',\n}\n\nexport enum OAuthResponseType {\n Code = 'code',\n}\n\nexport enum CodeChallengeMethod {\n S256 = 'S256',\n}\n\nexport enum OAuthGrantType {\n AuthorizationCode = 'authorization_code',\n}\n","// UAE PASS constants and endpoint helpers\n// Mirrors Flutter implementation in lib/uaepass/constant.dart\nimport { UaePassAcr } from './uae-pass.enums';\n\nexport const UAE_PASS_BASE_URL = {\n prod: 'https://id.uaepass.ae',\n stg: 'https://stg-id.uaepass.ae',\n} as const;\n\n// Backward-compatible constant mapping to enums\nexport const UAE_PASS_ACR = {\n mobileOnDevice: UaePassAcr.MobileOnDevice,\n web: UaePassAcr.Web,\n} as const;\n\nexport function baseUrl(isProduction: boolean): string {\n return isProduction ? UAE_PASS_BASE_URL.prod : UAE_PASS_BASE_URL.stg;\n}\n\nexport function authorizeUrl(isProduction: boolean): string {\n return `${baseUrl(isProduction)}/idshub/authorize`;\n}\n\nexport function tokenUrl(isProduction: boolean): string {\n return `${baseUrl(isProduction)}/idshub/token`;\n}\n\nexport function userInfoUrl(isProduction: boolean): string {\n return `${baseUrl(isProduction)}/idshub/userinfo`;\n}\n\nexport function logoutUrl(isProduction: boolean, redirectUri: string): string {\n return `${baseUrl(isProduction)}/idshub/logout?redirect_uri=${encodeURIComponent(redirectUri)}`;\n}\n","// Ephemeral storage across redirect for PKCE + state\n// Uses sessionStorage to survive full-page redirects and be cleared easily.\n\nconst PREFIX = 'uae-pass:' as const;\n\nfunction key(name: string) {\n return `${PREFIX}${name}`;\n}\n\nexport const UaePassMemory = {\n setState(state: string): void {\n if (typeof sessionStorage === 'undefined') return;\n sessionStorage.setItem(key('state'), state);\n },\n getState(): string | null {\n if (typeof sessionStorage === 'undefined') return null;\n return sessionStorage.getItem(key('state'));\n },\n setCodeVerifier(verifier: string): void {\n if (typeof sessionStorage === 'undefined') return;\n sessionStorage.setItem(key('code_verifier'), verifier);\n },\n getCodeVerifier(): string | null {\n if (typeof sessionStorage === 'undefined') return null;\n return sessionStorage.getItem(key('code_verifier'));\n },\n clear(): void {\n if (typeof sessionStorage === 'undefined') return;\n sessionStorage.removeItem(key('state'));\n sessionStorage.removeItem(key('code_verifier'));\n },\n};\n","// PKCE and state utilities for UAE PASS OAuth 2.0\n// Mirrors behavior of Flutter implementation (random state, S256 code challenge)\n\nconst PKCE_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n\nfunction randomString(length: number, charset = PKCE_CHARSET): string {\n const result: string[] = [];\n const cryptoObj = globalThis.crypto || (globalThis as unknown as { msCrypto?: Crypto }).msCrypto;\n if (!cryptoObj) {\n // Non-cryptographic fallback; consumers should polyfill crypto in SSR if needed\n for (let i = 0; i < length; i++) {\n result.push(charset[Math.floor(Math.random() * charset.length)]);\n }\n return result.join('');\n }\n\n const rnd = new Uint8Array(length);\n cryptoObj.getRandomValues(rnd);\n for (let i = 0; i < length; i++) {\n result.push(charset[rnd[i] % charset.length]);\n }\n return result.join('');\n}\n\nexport function generateState(length = 32): string {\n return randomString(length);\n}\n\nfunction base64Encode(bytes: Uint8Array): string {\n // Avoid relying on btoa (not available in Node/SSR). Encode manually with correct padding.\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n let output = '';\n let i = 0;\n while (i < bytes.length) {\n const o1 = bytes[i++];\n const o2 = i < bytes.length ? bytes[i++] : NaN;\n const o3 = i < bytes.length ? bytes[i++] : NaN;\n\n const c1 = o1 >> 2;\n const c2 = ((o1 & 0x03) << 4) | (isNaN(o2) ? 0 : ((o2 as number) >> 4));\n const c3 = isNaN(o2) ? 64 : (((o2 as number) & 0x0f) << 2) | (isNaN(o3) ? 0 : ((o3 as number) >> 6));\n const c4 = isNaN(o3) ? 64 : ((o3 as number) & 0x3f);\n\n output += chars[c1] + chars[c2] + chars[c3] + chars[c4];\n }\n return output;\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n const base64 = base64Encode(bytes);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nasync function sha256(input: string): Promise<Uint8Array> {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const cryptoObj: Crypto | undefined = (globalThis as any).crypto ?? (globalThis as any).msCrypto;\n if (!cryptoObj?.subtle) {\n throw new Error('WebCrypto SubtleCrypto is not available');\n }\n const digest = await cryptoObj.subtle.digest('SHA-256', data);\n return new Uint8Array(digest);\n}\n\nexport async function generateCodeChallengeS256(codeVerifier: string): Promise<string> {\n const hash = await sha256(codeVerifier);\n return base64UrlEncode(hash);\n}\n\nexport async function generatePkcePair(): Promise<{ codeVerifier: string; codeChallenge: string; }>{\n const codeVerifier = randomString(64);\n const codeChallenge = await generateCodeChallengeS256(codeVerifier);\n return { codeVerifier, codeChallenge };\n}\n","import { UaePassTokens, UaePassUserProfile } from './uae-pass.types';\nimport { UaePassStorageMode } from './uae-pass.enums';\n\nconst PREFIX = 'uae-pass:' as const;\nconst TOKENS_KEY = `${PREFIX}tokens` as const;\nconst PROFILE_KEY = `${PREFIX}profile` as const;\n\ntype UaePassStorageModeLike = UaePassStorageMode | 'none' | 'session' | 'local';\n\nfunction normalizeMode(mode: UaePassStorageModeLike): 'none' | 'session' | 'local' {\n // Enum values are already the exact string values\n if (mode === 'session' || mode === 'local' || mode === 'none') return mode;\n // Typescript enum runtime value is the string literal as well\n return mode as unknown as 'none' | 'session' | 'local';\n}\n\nfunction getStore(mode: UaePassStorageModeLike): Storage | null {\n const m = normalizeMode(mode);\n if (typeof window === 'undefined') return null;\n try {\n if (m === 'session') return window.sessionStorage ?? null;\n if (m === 'local') return window.localStorage ?? null;\n } catch {\n // Storage may be blocked\n }\n return null;\n}\n\nexport function saveTokens(mode: UaePassStorageModeLike, tokens: UaePassTokens | null): void {\n const store = getStore(mode);\n if (!store) return;\n if (!tokens) {\n try { store.removeItem(TOKENS_KEY); } catch {}\n return;\n }\n try { store.setItem(TOKENS_KEY, JSON.stringify(tokens)); } catch {}\n}\n\nexport function loadTokens(mode: UaePassStorageModeLike): UaePassTokens | null {\n const store = getStore(mode);\n if (!store) return null;\n try {\n const raw = store.getItem(TOKENS_KEY);\n return raw ? (JSON.parse(raw) as UaePassTokens) : null;\n } catch {\n return null;\n }\n}\n\nexport function saveProfile(mode: UaePassStorageModeLike, profile: UaePassUserProfile | null): void {\n const store = getStore(mode);\n if (!store) return;\n if (!profile) {\n try { store.removeItem(PROFILE_KEY); } catch {}\n return;\n }\n try { store.setItem(PROFILE_KEY, JSON.stringify(profile)); } catch {}\n}\n\nexport function loadProfile(mode: UaePassStorageModeLike): UaePassUserProfile | null {\n const store = getStore(mode);\n if (!store) return null;\n try {\n const raw = store.getItem(PROFILE_KEY);\n return raw ? (JSON.parse(raw) as UaePassUserProfile) : null;\n } catch {\n return null;\n }\n}\n\nexport function clearAll(mode: UaePassStorageModeLike): void {\n const store = getStore(mode);\n if (!store) return;\n try {\n store.removeItem(TOKENS_KEY);\n store.removeItem(PROFILE_KEY);\n } catch {}\n}\n","export interface UaePassTexts {\n // Login button\n signInWithUaePass: string;\n \n // Callback component\n completingSignIn: string;\n signedInSuccessfully: string;\n redirectingToHomePage: string;\n error: string;\n returnToHome: string;\n \n // Loading states\n loading: string;\n pleaseWait: string;\n \n // Error messages\n windowNotAvailable: string;\n noUrlContext: string;\n securityCheckFailed: string;\n tokenExchangeFailed: string;\n noUserProfile: string;\n userProfileFetchFailed: string;\n \n // Common\n uaePass: string;\n}\n\nexport const UAE_PASS_TEXTS_EN: UaePassTexts = {\n signInWithUaePass: 'Sign with UAE PASS',\n completingSignIn: 'Completing sign-in…',\n signedInSuccessfully: 'Signed in successfully!',\n redirectingToHomePage: 'Redirecting to home page...',\n error: 'Error',\n returnToHome: 'Return to home',\n loading: 'Loading',\n pleaseWait: 'Please wait',\n windowNotAvailable: 'Window is not available to redirect',\n noUrlContext: 'No URL context available to handle callback',\n securityCheckFailed: 'Security check failed: state mismatch',\n tokenExchangeFailed: 'Failed to obtain access token',\n noUserProfile: 'No user profile data received',\n userProfileFetchFailed: 'Failed to fetch user profile',\n uaePass: 'UAE PASS'\n};\n\nexport const UAE_PASS_TEXTS_AR: UaePassTexts = {\n signInWithUaePass: 'تسجيل الدخول بهوية الإمارات الرقمية',\n completingSignIn: 'جاري إكمال تسجيل الدخول…',\n signedInSuccessfully: 'تم تسجيل الدخول بنجاح!',\n redirectingToHomePage: 'جاري التوجيه إلى الصفحة الرئيسية...',\n error: 'خطأ',\n returnToHome: 'العودة إلى الصفحة الرئيسية',\n loading: 'جاري التحميل',\n pleaseWait: 'يرجى الانتظار',\n windowNotAvailable: 'النافذة غير متاحة للتوجيه',\n noUrlContext: 'لا يوجد سياق URL متاح للتعامل مع الاستدعاء',\n securityCheckFailed: 'فشل في الفحص الأمني: عدم تطابق الحالة',\n tokenExchangeFailed: 'فشل في الحصول على رمز الوصول',\n noUserProfile: 'لم يتم استلام بيانات الملف الشخصي للمستخدم',\n userProfileFetchFailed: 'فشل في جلب الملف الشخصي للمستخدم',\n uaePass: 'هوية الإمارات الرقمية'\n};\n\nexport function getUaePassTexts(language: 'en' | 'ar' = 'en'): UaePassTexts {\n return language === 'ar' ? UAE_PASS_TEXTS_AR : UAE_PASS_TEXTS_EN;\n}\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\nimport { timeout as rxTimeout } from 'rxjs/operators';\n\nimport { UAE_PASS_CONFIG } from './uae-pass.config';\nimport {\n authorizeUrl,\n tokenUrl,\n userInfoUrl,\n logoutUrl,\n} from './uae-pass.constants';\nimport { UaePassTokens, UaePassUserProfile } from './uae-pass.types';\nimport {\n UaePassAuthStatus,\n UaePassAcr,\n UaePassLanguageCode,\n OAuthResponseType,\n CodeChallengeMethod,\n OAuthGrantType,\n} from './uae-pass.enums';\nimport { UaePassMemory } from './uae-pass.memory';\nimport { generateState, generatePkcePair } from './uae-pass.pkce';\nimport {\n clearAll,\n loadProfile,\n loadTokens,\n saveProfile,\n saveTokens,\n} from './uae-pass.storage';\nimport { getUaePassTexts } from './uae-pass.i18n';\n\n@Injectable({ providedIn: 'root' })\nexport class UaePassAuthService {\n private readonly http = inject(HttpClient);\n private readonly cfg = inject(UAE_PASS_CONFIG);\n\n // Signals-based state\n private readonly _status = signal<UaePassAuthStatus>(UaePassAuthStatus.Idle);\n private readonly _tokens = signal<UaePassTokens | null>(null);\n private readonly _profile = signal<UaePassUserProfile | null>(null);\n private readonly _error = signal<string | null>(null);\n\n readonly status = this._status.asReadonly();\n readonly tokens = this._tokens.asReadonly();\n readonly profile = this._profile.asReadonly();\n readonly error = this._error.asReadonly();\n\n readonly isAuthenticated = computed(\n () => this._status() === UaePassAuthStatus.Authenticated && !!this._tokens()\n );\n\n // Localized texts\n private readonly texts = computed(() => {\n const lang = this.cfg.language || 'en';\n return getUaePassTexts(lang as 'en' | 'ar');\n });\n\n // Defaults\n private requestTimeoutMs(): number {\n return this.cfg.requestTimeoutMs ?? 20_000;\n }\n\n private storageMode() {\n return this.cfg.storage ?? 'none';\n }\n\n constructor() {\n // Restore from storage if configured\n const tokens = loadTokens(this.storageMode());\n if (tokens) {\n this._tokens.set(tokens);\n const profile = loadProfile(this.storageMode());\n if (profile) this._profile.set(profile);\n this._status.set(UaePassAuthStatus.Authenticated);\n }\n }\n\n // 1) Build UAE PASS authorize URL with PKCE + state; store ephemeral values in sessionStorage\n async buildAuthorizeUrl(): Promise<string> {\n const state = generateState();\n const { codeVerifier, codeChallenge } = await generatePkcePair();\n\n UaePassMemory.setState(state);\n UaePassMemory.setCodeVerifier(codeVerifier);\n\n const params = new URLSearchParams({\n response_type: OAuthResponseType.Code,\n client_id: this.cfg.clientId,\n scope: this.cfg.scope ?? 'urn:uae:digitalid:profile:general',\n state,\n redirect_uri: this.cfg.redirectUri,\n ui_locales: this.cfg.language ?? UaePassLanguageCode.En,\n acr_values: UaePassAcr.Web, // Web ACR for browser apps\n code_challenge: codeChallenge,\n code_challenge_method: CodeChallengeMethod.S256,\n });\n\n return `${authorizeUrl(this.cfg.isProduction)}?${params.toString()}`;\n }\n\n // 2) Redirect the browser to UAE PASS\n async redirectToAuthorization(): Promise<void> {\n this._status.set(UaePassAuthStatus.Authorizing);\n const url = await this.buildAuthorizeUrl();\n if (typeof window !== 'undefined' && window?.location) {\n window.location.assign(url);\n } else {\n this._status.set(UaePassAuthStatus.Error);\n this._error.set(this.texts().windowNotAvailable);\n }\n }\n\n // 3) Handle callback on your redirect route. Provide url or it will use window.location.href\n async handleRedirectCallback(currentUrl?: string): Promise<void> {\n const href =\n currentUrl ?? (typeof window !== 'undefined' ? window.location.href : '');\n if (!href) {\n this._status.set(UaePassAuthStatus.Error);\n this._error.set(this.texts().noUrlContext);\n return;\n }\n\n const url = new URL(href);\n const returnedState = url.searchParams.get('state');\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n if (!code) {\n // If provider returned an error, surface it\n if (error) {\n this._status.set(UaePassAuthStatus.Error);\n this._error.set(\n `${error}${\n errorDescription ? `: ${decodeURIComponent(errorDescription)}` : ''\n }`\n );\n UaePassMemory.clear();\n return;\n }\n // No-op if this is not the redirect URL\n return;\n }\n\n const expectedState = UaePassMemory.getState();\n if (!expectedState || returnedState !== expectedState) {\n this._status.set(UaePassAuthStatus.Error);\n this._error.set(this.texts().securityCheckFailed);\n // Clear ephemeral state to avoid reuse\n UaePassMemory.clear();\n return;\n }\n\n this._status.set(UaePassAuthStatus.ExchangingToken);\n\n try {\n const tokens = await this.exchangeToken(code);\n this._tokens.set(tokens);\n saveTokens(this.storageMode(), tokens);\n this._status.set(UaePassAuthStatus.Authenticated);\n\n // Optionally fetch user info\n try {\n const profile = await this.fetchUserInfo(tokens.access_token);\n if (profile) {\n this._profile.set(profile);\n saveProfile(this.storageMode(), profile);\n } else {\n console.warn(`UAE Pass: ${this.texts().noUserProfile}`);\n }\n } catch (e) {\n console.error(`UAE Pass: ${this.texts().userProfileFetchFailed}:`, e);\n // Non-fatal - user is still authenticated even without profile\n }\n } catch (e) {\n this._status.set(UaePassAuthStatus.Error);\n this._error.set(e instanceof Error ? e.message : String(e));\n } finally {\n UaePassMemory.clear();\n }\n }\n\n // 4) Exchange code for tokens\n async exchangeToken(code: string): Promise<UaePassTokens> {\n const verifier = UaePassMemory.getCodeVerifier() ?? '';\n\n // If a proxy is configured, prefer it (avoids exposing client_secret in the browser)\n if (this.cfg.tokenProxyUrl) {\n const body = {\n code,\n redirect_uri: this.cfg.redirectUri,\n code_verifier: verifier,\n } as const;\n\n const tokens = await firstValueFrom(\n this.http\n .post<UaePassTokens>(this.cfg.tokenProxyUrl, body)\n .pipe(rxTimeout(this.requestTimeoutMs()))\n );\n\n if (!tokens?.access_token)\n throw new Error(this.texts().tokenExchangeFailed);\n return tokens;\n }\n\n // Direct call to UAE PASS token endpoint (only safe if your tenant allows public SPA flow without secret)\n const tokenEndpoint = tokenUrl(this.cfg.isProduction);\n\n const params = new URLSearchParams();\n params.set('redirect_uri', this.cfg.redirectUri);\n params.set('client_id', this.cfg.clientId);\n params.set('grant_type', OAuthGrantType.AuthorizationCode);\n params.set('code', code);\n params.set('code_verifier', verifier);\n if (this.cfg.clientSecret) {\n params.set('client_secret', this.cfg.clientSecret);\n }\n\n const headers = new HttpHeaders({\n 'Content-Type': 'application/x-www-form-urlencoded',\n });\n\n const tokens = await firstValueFrom(\n this.http\n .post<UaePassTokens>(tokenEndpoint, params.toString(), { headers })\n .pipe(rxTimeout(this.requestTimeoutMs()))\n );\n\n if (!tokens?.access_token) throw new Error(this.texts().tokenExchangeFailed);\n return tokens;\n }\n\n // 5) Fetch user profile (optional)\n async fetchUserInfo(accessToken: string): Promise<UaePassUserProfile | null> {\n if (this.cfg.userInfoProxyUrl) {\n const profile = await firstValueFrom(\n this.http\n .post<UaePassUserProfile>(this.cfg.userInfoProxyUrl, {\n token: accessToken,\n })\n .pipe(rxTimeout(this.requestTimeoutMs()))\n );\n return profile ?? null;\n }\n\n const headers = new HttpHeaders({\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${accessToken}`,\n });\n\n const url = userInfoUrl(this.cfg.isProduction);\n const profile = await firstValueFrom(\n this.http\n .get<UaePassUserProfile>(url, { headers })\n .pipe(rxTimeout(this.requestTimeoutMs()))\n );\n return profile ?? null;\n }\n\n // 6) Logout: clear local state and logout from UAE Pass servers (official flow)\n logout(): void {\n this._status.set(UaePassAuthStatus.LoggedOut);\n this._tokens.set(null);\n this._profile.set(null);\n this._error.set(null);\n clearAll(this.storageMode());\n UaePassMemory.clear();\n\n if (typeof window !== 'undefined' && window?.location) {\n // Use logoutRedirectUri if provided, otherwise use redirectUri\n const logoutUri = this.cfg.logoutRedirectUri || this.cfg.redirectUri;\n const url = logoutUrl(this.cfg.isProduction, logoutUri);\n window.location.assign(url);\n }\n }\n\n resetError(): void {\n this._error.set(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UaePassAuthService } from './uae-pass.oauth.service';\nimport { UaePassAuthStatus, UaePassLanguageCode } from './uae-pass.enums';\nimport { UAE_PASS_CONFIG, UaePassConfig } from './uae-pass.config';\n\n@Component({\n selector: 'uae-pass-login-button',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'uaepass-login-button',\n },\n template: `\n <button\n type=\"button\"\n class=\"uae-pass-login-btn\"\n [disabled]=\"disabled()\"\n (click)=\"handleLogin()\"\n [attr.aria-label]=\"'Sign in with UAE Pass'\"\n >\n <img\n [src]=\"imageSrc()\"\n alt=\"Sign with UAE PASS\"\n class=\"uae-pass-btn-image\"\n [class.loading]=\"disabled()\"\n [style]=\"customStyles()\"\n />\n <div class=\"loading-spinner\" *ngIf=\"disabled()\"></div>\n </button>\n `,\n styles: `\n :host {\n display: block;\n width: 100%;\n }\n\n .uae-pass-login-btn {\n display: block;\n width: 100%;\n border: none;\n background: transparent;\n padding: 0;\n cursor: pointer;\n position: relative;\n transition: all 0.3s ease;\n }\n\n .uae-pass-btn-image {\n width: 100%;\n height: auto;\n display: block;\n transition: all 0.3s ease;\n }\n\n .uae-pass-login-btn:hover:not([disabled]) .uae-pass-btn-image {\n transform: translateY(-2px);\n filter: drop-shadow(0 6px 20px rgba(0, 0, 0, 0.15));\n }\n\n .uae-pass-login-btn:active:not([disabled]) .uae-pass-btn-image {\n transform: translateY(0);\n filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.1));\n }\n\n .uae-pass-login-btn[disabled] .uae-pass-btn-image {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .uae-pass-btn-image.loading {\n opacity: 0.6;\n }\n\n .loading-spinner {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 24px;\n height: 24px;\n border: 3px solid rgba(0, 0, 0, 0.1);\n border-top: 3px solid #1e40af;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: translate(-50%, -50%) rotate(0deg); }\n 100% { transform: translate(-50%, -50%) rotate(360deg); }\n }\n\n /* Mobile responsiveness */\n @media (max-width: 768px) {\n .uae-pass-btn-image {\n max-width: 280px;\n margin: 0 auto;\n }\n }\n `,\n})\nexport class UaePassLoginButtonComponent {\n private readonly auth = inject(UaePassAuthService);\n private readonly config = inject(UAE_PASS_CONFIG);\n\n // Default asset paths for UAE Pass button\n private readonly defaultAssetPaths = {\n english: 'assets/UAEPASS_Sign_with_Btn_Outline_Active@2x.svg',\n arabic: 'assets/UAEPASS_Sign_with_Btn_Outline_Active_AR@2x.svg',\n };\n\n // Inputs\n language = input<'en' | 'ar'>();\n customImageSrc = input<string | null>(null);\n customStyles = input<string>('');\n isDisabled = input<boolean>(false);\n\n // Outputs\n pressed = output<void>();\n\n // Computed properties\n readonly isBusy = computed(() => {\n const s = this.auth.status();\n return (\n s === UaePassAuthStatus.Authorizing ||\n s === UaePassAuthStatus.ExchangingToken\n );\n });\n\n readonly imageSrc = computed(() => {\n console.log('Input language:', this.language());\n console.log('Config language:', this.config.language);\n \n if (this.customImageSrc()) {\n return this.customImageSrc();\n }\n\n // Use input language first, then config language, then default to 'en'\n const configLang = this.config.language;\n const inputLang = this.language();\n \n // Handle the case where config.language might be 'ar' string or enum value\n let normalizedConfigLang: 'en' | 'ar' = 'en';\n if (configLang === 'ar' || configLang === 'Arabic' || String(configLang).toLowerCase() === 'ar') {\n normalizedConfigLang = 'ar';\n }\n \n const lang = inputLang || normalizedConfigLang;\n \n console.log('Final language used:', lang);\n console.log('Config language raw:', configLang);\n console.log('Normalized config language:', normalizedConfigLang);\n\n const configLogos = this.config.buttonLogos;\n if (configLogos) {\n console.log('Config logos:', configLogos);\n if (lang === 'ar' && configLogos.arabic) {\n console.log('Using config Arabic logo:', configLogos.arabic);\n return configLogos.arabic;\n }\n if (lang === 'en' && configLogos.english) {\n console.log('Using config English logo:', configLogos.english);\n return configLogos.english;\n }\n }\n\n // Fallback to default asset paths\n const finalImage = lang === 'ar'\n ? this.defaultAssetPaths.arabic\n : this.defaultAssetPaths.english;\n \n console.log('Using default asset path:', finalImage);\n return finalImage;\n });\n\n readonly disabled = computed(() => {\n return this.isDisabled() || this.isBusy();\n });\n\n handleLogin(): void {\n this.pressed.emit();\n this.auth.redirectToAuthorization();\n }\n}\n","import { Component, inject, input, output, effect, computed, ChangeDetectionStrategy } from '@angular/core';\nimport { UaePassAuthService } from './uae-pass.oauth.service';\nimport { UaePassAuthStatus } from './uae-pass.enums';\nimport { UAE_PASS_CONFIG } from './uae-pass.config';\nimport { getUaePassTexts } from './uae-pass.i18n';\n\n@Component({\n selector: 'uae-pass-callback',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'uaepass-callback' },\n template: `\n <div class=\"callback-container\" [attr.dir]=\"isRTL() ? 'rtl' : 'ltr'\">\n @if (status() === Status.ExchangingToken || status() === Status.Authorizing) {\n <div class=\"loading-state\">\n <div class=\"spinner-container\">\n <div class=\"spinner\"></div>\n </div>\n <h2 class=\"status-title\">{{ texts().uaePass }}</h2>\n <p class=\"status-message\" aria-live=\"polite\">{{ texts().completingSignIn }}</p>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\"></div>\n </div>\n </div>\n } @else if (status() === Status.Authenticated) {\n <div class=\"success-state\">\n <div class=\"success-icon\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#10b981\"/>\n <path d=\"m9 12 2 2 4-4\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h2 class=\"status-title success\">{{ texts().signedInSuccessfully }}</h2>\n <p class=\"status-message\" aria-live=\"polite\">{{ texts().redirectingToHomePage }}</p>\n <div class=\"countdown-dots\">\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n </div>\n </div>\n } @else if (status() === Status.Error) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#ef4444\"/>\n <path d=\"m15 9-6 6m0-6 6 6\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h2 class=\"status-title error\">{{ texts().error }}</h2>\n <p class=\"error-message\" role=\"alert\">{{ error() }}</p>\n <a href=\"/\" class=\"return-button\">{{ texts().returnToHome }}</a>\n </div>\n } @else {\n <div class=\"loading-state\">\n <div class=\"spinner-container\">\n <div class=\"spinner\"></div>\n </div>\n <h2 class=\"status-title\">{{ texts().uaePass }}</h2>\n <p class=\"status-message\">{{ texts().redirectingToHomePage }}</p>\n </div>\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n min-height: 100vh;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .callback-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 2rem;\n text-align: center;\n }\n\n .loading-state,\n .success-state,\n .error-state {\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n border-radius: 24px;\n padding: 3rem 2rem;\n max-width: 400px;\n width: 100%;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.2);\n }\n\n .spinner-container {\n margin-bottom: 2rem;\n }\n\n .spinner {\n width: 64px;\n height: 64px;\n border: 4px solid #e5e7eb;\n border-top: 4px solid #1e40af;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .status-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: #1f2937;\n margin: 0 0 1rem 0;\n line-height: 1.3;\n }\n\n .status-title.success {\n color: #059669;\n }\n\n .status-title.error {\n color: #dc2626;\n }\n\n .status-message {\n font-size: 1rem;\n color: #6b7280;\n margin: 0 0 2rem 0;\n line-height: 1.5;\n }\n\n .error-message {\n font-size: 0.95rem;\n color: #dc2626;\n margin: 0 0 2rem 0;\n padding: 1rem;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 12px;\n line-height: 1.5;\n }\n\n .progress-bar {\n width: 100%;\n height: 4px;\n background: #e5e7eb;\n border-radius: 2px;\n overflow: hidden;\n }\n\n .progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #1e40af, #3b82f6);\n border-radius: 2px;\n animation: progress 2s ease-in-out infinite;\n }\n\n @keyframes progress {\n 0% { width: 0%; }\n 50% { width: 70%; }\n 100% { width: 100%; }\n }\n\n .success-icon,\n .error-icon {\n margin-bottom: 1.5rem;\n animation: scaleIn 0.5s ease-out;\n }\n\n @keyframes scaleIn {\n 0% { transform: scale(0); }\n 100% { transform: scale(1); }\n }\n\n .countdown-dots {\n display: flex;\n justify-content: center;\n gap: 0.5rem;\n margin-top: 1rem;\n }\n\n .dot {\n width: 8px;\n height: 8px;\n background: #9ca3af;\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n .dot:nth-child(2) {\n animation-delay: 0.3s;\n }\n\n .dot:nth-child(3) {\n animation-delay: 0.6s;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 0.3; }\n 50% { opacity: 1; }\n }\n\n .return-button {\n display: inline-block;\n background: #1e40af;\n color: white;\n text-decoration: none;\n padding: 0.75rem 2rem;\n border-radius: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n border: none;\n cursor: pointer;\n }\n\n .return-button:hover {\n background: #1d4ed8;\n transform: translateY(-2px);\n box-shadow: 0 8px 20px rgba(30, 64, 175, 0.3);\n }\n\n .return-button:active {\n transform: translateY(0);\n }\n\n /* RTL Support */\n [dir=\"rtl\"] .callback-container {\n font-family: 'Noto Sans Arabic', 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n }\n\n [dir=\"rtl\"] .status-title,\n [dir=\"rtl\"] .status-message,\n [dir=\"rtl\"] .error-message {\n text-align: right;\n }\n\n /* Mobile responsiveness */\n @media (max-width: 768px) {\n .callback-container {\n padding: 1rem;\n }\n\n .loading-state,\n .success-state,\n .error-state {\n padding: 2rem 1.5rem;\n border-radius: 16px;\n }\n\n .status-title {\n font-size: 1.25rem;\n }\n\n .spinner {\n width: 48px;\n height: 48px;\n }\n }\n\n /* Dark mode support */\n @media (prefers-color-scheme: dark) {\n :host {\n background: linear-gradient(135deg, #1e293b 0%, #334155 100%);\n }\n\n .loading-state,\n .success-state,\n .error-state {\n background: rgba(15, 23, 42, 0.95);\n border: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .status-title {\n color: #f8fafc;\n }\n\n .status-message {\n color: #cbd5e1;\n }\n\n .spinner {\n border-color: #475569;\n border-top-color: #3b82f6;\n }\n\n .progress-bar {\n background: #475569;\n }\n }\n `,\n})\nexport class UaePassCallbackComponent {\n private readonly auth = inject(UaePassAuthService);\n private readonly config = inject(UAE_PASS_CONFIG);\n readonly Status = UaePassAuthStatus;\n\n // Optional current URL input (useful for SSR or router-less contexts)\n url = input<string | null>(null);\n\n // Outputs for host app to react\n success = output<void>();\n failed = output<string>();\n\n readonly status = this.auth.status;\n readonly error = this.auth.error;\n\n // Localized texts\n readonly texts = computed(() => {\n const lang = this.config.language || 'en';\n return getUaePassTexts(lang as 'en' | 'ar');\n });\n\n // RTL support\n readonly isRTL = computed(() => {\n const lang = this.config.language || 'en';\n return lang === 'ar';\n });\n\n // React to status changes\n private readonly _fx = effect(() => {\n const s = this.auth.status();\n if (s === UaePassAuthStatus.Authenticated) {\n this.success.emit();\n // Auto-redirect to home after successful authentication\n setTimeout(() => {\n if (typeof window !== 'undefined') {\n window.location.href = '/';\n }\n }, 2000);\n }\n if (s === UaePassAuthStatus.Error) {\n const msg = this.auth.error();\n if (msg) this.failed.emit(msg);\n }\n });\n\n constructor() {\n // Only handle callback if we're actually on the callback route with a code parameter\n const currentUrl = this.url() ?? (typeof window !== 'undefined' ? window.location.href : '');\n if (currentUrl && (currentUrl.includes('code=') || currentUrl.includes('error='))) {\n // No await to avoid blocking change detection; service sets signals when done\n void this.auth.handleRedirectCallback(currentUrl);\n } else {\n // If no OAuth parameters, redirect to home immediately\n if (typeof window !== 'undefined') {\n window.location.href = '/';\n }\n }\n }\n}\n","/*\n * Public API surface of sensei-uaepass\n */\n\n// Configuration and types\nexport * from './lib/uae-pass.config';\nexport * from './lib/uae-pass.constants';\nexport * from './lib/uae-pass.types';\nexport * from './lib/uae-pass.enums';\n\n// Core service\nexport * from './lib/uae-pass.oauth.service';\n\n// UI components\nexport * from './lib/uae-pass-login-button.component';\nexport * from './lib/uae-pass-callback.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PREFIX","rxTimeout"],"mappings":"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"}