@progalaxyelabs/ngx-stonescriptphp-client 1.2.0 → 1.3.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progalaxyelabs-ngx-stonescriptphp-client.mjs","sources":["../../src/api-response.model.ts","../../src/token.service.ts","../../src/signin-status.service.ts","../../src/my-environment.model.ts","../../src/csrf.service.ts","../../src/api-connection.service.ts","../../src/auth.service.ts","../../src/db.service.ts","../../src/ngx-stonescriptphp-client.module.ts","../../src/lib/components/login-dialog.component.ts","../../src/lib/components/register.component.ts","../../src/index.ts","../../src/progalaxyelabs-ngx-stonescriptphp-client.ts"],"sourcesContent":["export class ApiResponse<DataType> {\n private status: string\n private data: any\n private message: string\n\n constructor(status: string, data: any = {}, message: string = '') {\n this.status = status\n this.data = data\n this.message = message\n }\n\n onOk(callback: (data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'ok') {\n callback(this.data)\n }\n return this\n }\n\n onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'not ok') {\n callback(this.message, this.data)\n }\n return this\n }\n\n onError(callback: () => void): ApiResponse<DataType> {\n if (this.status === 'error') {\n callback()\n }\n return this\n }\n\n isSuccess(): boolean {\n return this.status === 'ok'\n }\n\n isError(): boolean {\n return this.status === 'error' || this.status === 'not ok'\n }\n\n getData(): DataType | null {\n return this.data || null\n }\n\n getError(): string {\n return this.message || 'Unknown error'\n }\n\n getStatus(): string {\n return this.status\n }\n\n getMessage(): string {\n return this.message\n }\n}","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenService {\n private accessToken = ''\n private refreshToken = ''\n\n private lsAccessTokenKey = 'progalaxyapi_access_token'\n private lsRefreshTokenKey = 'progalaxyapi_refresh_token'\n\n constructor() { }\n\n setTokens(accessToken: string, refreshToken: string) {\n this.accessToken = accessToken\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n }\n\n setRefreshToken(refreshToken: string) {\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n getAccessToken() {\n if (this.accessToken) {\n return this.accessToken\n }\n\n const storedAccessToken = localStorage.getItem(this.lsAccessTokenKey)\n if (storedAccessToken) {\n return storedAccessToken\n } else {\n return ''\n }\n }\n\n getRefreshToken() {\n if (this.refreshToken) {\n return this.refreshToken\n }\n\n const storedRefreshToken = localStorage.getItem(this.lsRefreshTokenKey)\n if (storedRefreshToken) {\n return storedRefreshToken\n } else {\n return ''\n }\n }\n\n clear() {\n this.accessToken = ''\n this.refreshToken = ''\n localStorage.removeItem(this.lsAccessTokenKey)\n localStorage.removeItem(this.lsRefreshTokenKey)\n }\n\n /**\n * Check if there is a valid (non-empty) access token\n * @returns True if access token exists and is not empty\n */\n hasValidAccessToken(): boolean {\n const token = this.getAccessToken()\n return token !== null && token !== ''\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * @deprecated Use boolean directly. Kept for backward compatibility.\n */\nexport enum VerifyStatus {\n initialized = 'initialized',\n yes = 'yes',\n no = 'no'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SigninStatusService {\n public status: BehaviorSubject<boolean | VerifyStatus>\n\n constructor() {\n this.status = new BehaviorSubject<boolean>(false)\n }\n\n signedOut(): void {\n this.status.next(false)\n }\n\n signedIn(): void {\n this.status.next(true)\n }\n\n /**\n * Set signin status\n * @param isSignedIn - True if user is signed in, false otherwise\n */\n setSigninStatus(isSignedIn: boolean): void {\n this.status.next(isSignedIn)\n }\n}\n","export type AuthMode = 'cookie' | 'body' | 'none';\n\nexport interface AuthConfig {\n /**\n * Authentication mode:\n * - 'cookie': Use httpOnly cookies + CSRF tokens (recommended, matches StoneScriptPHP v2.1.x)\n * - 'body': Send tokens in request body (legacy mode)\n * - 'none': No automatic token refresh\n */\n mode: AuthMode;\n\n /**\n * Token refresh endpoint path\n * @default '/auth/refresh' for cookie mode, '/user/refresh_access' for body mode\n */\n refreshEndpoint?: string;\n\n /**\n * Enable CSRF token support (required for cookie mode)\n * @default true for cookie mode, false for body mode\n */\n useCsrf?: boolean;\n\n /**\n * Cookie name for refresh token\n * @default 'refresh_token'\n */\n refreshTokenCookieName?: string;\n\n /**\n * Cookie name for CSRF token\n * @default 'csrf_token'\n */\n csrfTokenCookieName?: string;\n\n /**\n * CSRF header name\n * @default 'X-CSRF-Token'\n */\n csrfHeaderName?: string;\n}\n\nexport class MyEnvironmentModel {\n production: boolean = true\n\n /**\n * Platform code identifier (e.g., 'progalaxy', 'hr', 'admin')\n * Used for multi-tenant authentication\n */\n platformCode: string = '';\n\n /**\n * Accounts platform URL for centralized authentication\n * @example 'https://accounts.progalaxyelabs.com'\n */\n accountsUrl: string = '';\n\n firebase: {\n projectId: string\n appId: string\n databaseURL: string\n storageBucket: string\n locationId: string\n apiKey: string\n authDomain: string\n messagingSenderId: string\n measurementId: string\n } = {\n projectId: '',\n appId: '',\n databaseURL: '',\n storageBucket: '',\n locationId: '',\n apiKey: '',\n authDomain: '',\n messagingSenderId: '',\n measurementId: ''\n }\n apiServer: {\n host: string\n } = { host: '' }\n chatServer: {\n host: string\n } = { host: '' }\n\n /**\n * Authentication configuration\n * @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }\n */\n auth?: AuthConfig = {\n mode: 'cookie',\n refreshEndpoint: '/auth/refresh',\n useCsrf: true,\n refreshTokenCookieName: 'refresh_token',\n csrfTokenCookieName: 'csrf_token',\n csrfHeaderName: 'X-CSRF-Token'\n };\n}","import { Injectable } from '@angular/core';\n\n/**\n * CSRF Token Service\n *\n * Manages CSRF tokens for cookie-based authentication.\n * Reads CSRF token from cookies and provides it for request headers.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CsrfService {\n\n /**\n * Get CSRF token from cookie\n */\n getCsrfToken(cookieName: string = 'csrf_token'): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) {\n return decodeURIComponent(value);\n }\n }\n return null;\n }\n\n /**\n * Check if CSRF token exists\n */\n hasCsrfToken(cookieName: string = 'csrf_token'): boolean {\n return this.getCsrfToken(cookieName) !== null;\n }\n\n /**\n * Clear CSRF token (for logout)\n * Note: Client-side deletion is limited for httpOnly cookies\n */\n clearCsrfToken(cookieName: string = 'csrf_token'): void {\n // Can only clear non-httpOnly cookies\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { ApiResponse } from './api-response.model';\nimport { MyEnvironmentModel, AuthConfig } from './my-environment.model';\nimport { CsrfService } from './csrf.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiConnectionService {\n\n private host = '' // contains trailing slash\n\n private accessToken = ''\n\n private authConfig: AuthConfig\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private csrf: CsrfService\n ) {\n this.host = environment.apiServer.host\n\n // Set default auth config based on mode\n this.authConfig = {\n mode: environment.auth?.mode || 'cookie',\n refreshEndpoint: environment.auth?.refreshEndpoint,\n useCsrf: environment.auth?.useCsrf,\n refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',\n csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',\n csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'\n }\n\n // Set default refresh endpoint based on mode if not specified\n if (!this.authConfig.refreshEndpoint) {\n this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'\n ? '/auth/refresh'\n : '/user/refresh_access'\n }\n\n // Set default CSRF setting based on mode if not specified\n if (this.authConfig.useCsrf === undefined) {\n this.authConfig.useCsrf = this.authConfig.mode === 'cookie'\n }\n }\n\n\n private async request<DataType>(url: string, options: any, data: any | null): Promise<ApiResponse<DataType>> {\n try {\n \n if(data !== null) {\n const body = JSON.stringify(data)\n if(body) {\n options.body = body\n } else {\n options.body = {}\n }\n }\n\n const accessTokenIncluded = this.includeAccessToken(options)\n\n let response: Response = await fetch(url, options)\n\n if ((response.status === 401) && accessTokenIncluded) {\n response = await this.refreshAccessTokenAndRetry(url, options, response)\n }\n\n if (response.ok) {\n const json = await (response.json())\n return (new ApiResponse<DataType>(json.status, json.data, json.message))\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut()\n }\n\n return this.handleError<DataType>(response)\n } catch (error) {\n return this.handleError<DataType>(error)\n }\n }\n\n private handleError<DataType>(error: any): ApiResponse<DataType> {\n console.error(\n `Backend returned code ${error.status}, ` +\n `full error: `, error);\n return new ApiResponse<DataType>('error')\n }\n\n async get<DataType>(endpoint: string, queryParamsObj?: any ): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n async post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async put<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'PUT',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async patch<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'PATCH',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async delete<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n method: 'DELETE',\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n // async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {\n // const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n // try {\n // const fetchOptions: RequestInit = {\n // method: 'POST',\n // mode: 'cors',\n // redirect: 'error',\n // body: formData\n // }\n\n // const accessTokenIncluded = this.includeAccessToken(fetchOptions)\n\n // let response: Response = await fetch(url, fetchOptions)\n\n // if ((response.status === 401) && accessTokenIncluded) {\n // response = await this.refreshAccessTokenAndRetry(url, fetchOptions, response)\n // }\n\n // if (response.ok) {\n // return ((await (response.json()) as ApiResponse))\n // }\n\n // return this.handleError(response)\n // } catch (error) {\n // return this.handleError(error)\n // }\n // }\n\n private includeAccessToken(options: any): boolean {\n this.accessToken = this.tokens.getAccessToken()\n if (!this.accessToken) {\n return false\n }\n\n if (!options.headers) {\n options.headers = {}\n }\n options.headers['Authorization'] = 'Bearer ' + this.accessToken\n return true\n }\n\n private async refreshAccessTokenAndRetry(url: string, fetchOptions: any, response: Response): Promise<Response> {\n\n const refreshStatusOk = await this.refreshAccessToken()\n if (!refreshStatusOk) {\n return response\n }\n\n fetchOptions.headers['Authorization'] = 'Bearer ' + this.accessToken\n response = await fetch(url, fetchOptions)\n return response\n }\n\n async refreshAccessToken(): Promise<boolean> {\n if (this.authConfig.mode === 'none') {\n return false\n }\n\n if (this.authConfig.mode === 'cookie') {\n return await this.refreshAccessTokenCookieMode()\n } else {\n return await this.refreshAccessTokenBodyMode()\n }\n }\n\n /**\n * Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)\n */\n private async refreshAccessTokenCookieMode(): Promise<boolean> {\n try {\n const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '')\n const headers: any = {\n 'Content-Type': 'application/json'\n }\n\n // Add CSRF token if enabled\n if (this.authConfig.useCsrf) {\n const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName!)\n if (!csrfToken) {\n console.error('CSRF token not found in cookie')\n return false\n }\n headers[this.authConfig.csrfHeaderName!] = csrfToken\n }\n\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include', // Important: send cookies\n redirect: 'error',\n headers: headers\n })\n\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData || refreshAccessData.status !== 'ok') {\n return false\n }\n\n // Extract access token from response\n const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token\n if (!newAccessToken) {\n console.error('No access token in refresh response')\n return false\n }\n\n // Store new access token (refresh token is in httpOnly cookie)\n this.tokens.setAccessToken(newAccessToken)\n this.accessToken = newAccessToken\n\n return true\n } catch (error) {\n console.error('Token refresh failed (cookie mode):', error)\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n }\n\n /**\n * Refresh access token using body-based auth (legacy mode)\n */\n private async refreshAccessTokenBodyMode(): Promise<boolean> {\n try {\n const refreshToken = this.tokens.getRefreshToken()\n if (!refreshToken) {\n return false\n }\n\n const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '')\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n access_token: this.accessToken,\n refresh_token: refreshToken\n })\n })\n\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData) {\n return false\n }\n\n const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token\n if (!newAccessToken) {\n console.error('No access token in refresh response')\n return false\n }\n\n this.tokens.setTokens(newAccessToken, refreshToken)\n this.accessToken = newAccessToken\n\n return true\n } catch (error) {\n console.error('Token refresh failed (body mode):', error)\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n }\n\n buildQueryString(options?: any): string {\n if (options === undefined) {\n return ''\n }\n\n const array = []\n for (let key in options) {\n if (options.hasOwnProperty(key) && (options[key] !== null) && (options[key] !== undefined)) {\n array.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(options[key]))\n }\n }\n const str = array.join('&')\n if (str !== '') {\n return '?' + str\n }\n\n return ''\n }\n\n /**\n * Upload a drawing (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadDrawing<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + 'upload/drawing'\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n body: formData\n }\n return this.request(url, fetchOptions, null)\n }\n\n /**\n * Upload an image (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadImage<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + 'upload/image'\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n body: formData\n }\n return this.request(url, fetchOptions, null)\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { MyEnvironmentModel } from './my-environment.model';\n\nexport type AuthProvider = 'google' | 'linkedin' | 'apple' | 'microsoft' | 'github' | 'emailPassword';\n\nexport interface User {\n user_id: number;\n email: string;\n display_name: string;\n photo_url?: string;\n is_email_verified: boolean;\n}\n\nexport interface AuthResult {\n success: boolean;\n message?: string;\n user?: User;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n // Observable user state\n private userSubject = new BehaviorSubject<User | null>(null);\n public user$: Observable<User | null> = this.userSubject.asObservable();\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n @Inject(MyEnvironmentModel) private environment: MyEnvironmentModel\n ) { }\n\n /**\n * Login with email and password\n */\n async loginWithEmail(email: string, password: string): Promise<AuthResult> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/login`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Include cookies for refresh token\n body: JSON.stringify({\n email,\n password,\n platform: this.environment.platformCode\n })\n }\n );\n\n const data = await response.json();\n\n if (data.success && data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.signinStatus.setSigninStatus(true);\n this.userSubject.next(data.user);\n\n return { success: true, user: data.user };\n }\n\n return {\n success: false,\n message: data.message || 'Invalid credentials'\n };\n } catch (error) {\n return {\n success: false,\n message: 'Network error. Please try again.'\n };\n }\n }\n\n /**\n * Login with Google OAuth (popup window)\n */\n async loginWithGoogle(): Promise<AuthResult> {\n return this.loginWithOAuth('google');\n }\n\n /**\n * Login with GitHub OAuth (popup window)\n */\n async loginWithGitHub(): Promise<AuthResult> {\n return this.loginWithOAuth('github');\n }\n\n /**\n * Login with LinkedIn OAuth (popup window)\n */\n async loginWithLinkedIn(): Promise<AuthResult> {\n return this.loginWithOAuth('linkedin');\n }\n\n /**\n * Login with Apple OAuth (popup window)\n */\n async loginWithApple(): Promise<AuthResult> {\n return this.loginWithOAuth('apple');\n }\n\n /**\n * Login with Microsoft OAuth (popup window)\n */\n async loginWithMicrosoft(): Promise<AuthResult> {\n return this.loginWithOAuth('microsoft');\n }\n\n /**\n * Generic provider-based login (supports all OAuth providers)\n * @param provider - The provider identifier\n */\n async loginWithProvider(provider: AuthProvider): Promise<AuthResult> {\n if (provider === 'emailPassword') {\n throw new Error('Use loginWithEmail() for email/password authentication');\n }\n return this.loginWithOAuth(provider);\n }\n\n /**\n * Generic OAuth login handler\n * Opens popup window and listens for postMessage\n */\n private async loginWithOAuth(provider: string): Promise<AuthResult> {\n return new Promise((resolve) => {\n const width = 500;\n const height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n const oauthUrl = `${this.environment.accountsUrl}/oauth/${provider}?` +\n `platform=${this.environment.platformCode}&` +\n `mode=popup`;\n\n const popup = window.open(\n oauthUrl,\n `${provider}_login`,\n `width=${width},height=${height},left=${left},top=${top}`\n );\n\n if (!popup) {\n resolve({\n success: false,\n message: 'Popup blocked. Please allow popups for this site.'\n });\n return;\n }\n\n // Listen for message from popup\n const messageHandler = (event: MessageEvent) => {\n // Verify origin\n if (event.origin !== new URL(this.environment.accountsUrl).origin) {\n return;\n }\n\n if (event.data.type === 'oauth_success') {\n this.tokens.setAccessToken(event.data.access_token);\n this.signinStatus.setSigninStatus(true);\n this.userSubject.next(event.data.user);\n\n window.removeEventListener('message', messageHandler);\n popup.close();\n\n resolve({\n success: true,\n user: event.data.user\n });\n } else if (event.data.type === 'oauth_error') {\n window.removeEventListener('message', messageHandler);\n popup.close();\n\n resolve({\n success: false,\n message: event.data.message || 'OAuth login failed'\n });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n // Check if popup was closed manually\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({\n success: false,\n message: 'Login cancelled'\n });\n }\n }, 500);\n });\n }\n\n /**\n * Register new user\n */\n async register(\n email: string,\n password: string,\n displayName: string\n ): Promise<AuthResult> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/register`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email,\n password,\n display_name: displayName,\n platform: this.environment.platformCode\n })\n }\n );\n\n const data = await response.json();\n\n if (data.success && data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.signinStatus.setSigninStatus(true);\n this.userSubject.next(data.user);\n\n return {\n success: true,\n user: data.user,\n message: data.needs_verification ? 'Please verify your email' : undefined\n };\n }\n\n return {\n success: false,\n message: data.message || 'Registration failed'\n };\n } catch (error) {\n return {\n success: false,\n message: 'Network error. Please try again.'\n };\n }\n }\n\n /**\n * Sign out user\n */\n async signout(): Promise<void> {\n try {\n await fetch(\n `${this.environment.accountsUrl}/api/auth/logout`,\n {\n method: 'POST',\n credentials: 'include'\n }\n );\n } catch (error) {\n console.error('Logout API call failed:', error);\n } finally {\n this.tokens.clear();\n this.signinStatus.setSigninStatus(false);\n this.userSubject.next(null);\n }\n }\n\n /**\n * Check for active session (call on app init)\n */\n async checkSession(): Promise<boolean> {\n if (this.tokens.hasValidAccessToken()) {\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n\n // Try to refresh using httpOnly cookie\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/refresh`,\n {\n method: 'POST',\n credentials: 'include'\n }\n );\n\n if (!response.ok) {\n this.signinStatus.setSigninStatus(false);\n return false;\n }\n\n const data = await response.json();\n\n if (data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.userSubject.next(data.user);\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n\n return false;\n } catch (error) {\n this.signinStatus.setSigninStatus(false);\n return false;\n }\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return this.tokens.hasValidAccessToken();\n }\n\n /**\n * Get current user (synchronous)\n */\n getCurrentUser(): User | null {\n return this.userSubject.value;\n }\n\n // ===== Backward Compatibility Methods =====\n // These methods are deprecated and maintained for backward compatibility\n // with existing platform code. New code should use the methods above.\n\n /**\n * @deprecated Use getCurrentUser()?.user_id instead\n */\n getUserId(): number {\n return this.userSubject.value?.user_id || 0;\n }\n\n /**\n * @deprecated Use getCurrentUser()?.display_name instead\n */\n getUserName(): string {\n return this.userSubject.value?.display_name || '';\n }\n\n /**\n * @deprecated Use getCurrentUser()?.photo_url instead\n */\n getPhotoUrl(): string {\n return this.userSubject.value?.photo_url || '';\n }\n\n /**\n * @deprecated Use getCurrentUser()?.display_name instead\n */\n getDisplayName(): string {\n return this.userSubject.value?.display_name || '';\n }\n\n /**\n * @deprecated Use `/profile/${getCurrentUser()?.user_id}` instead\n */\n getProfileUrl(): string {\n const userId = this.userSubject.value?.user_id;\n return userId ? `/profile/${userId}` : '';\n }\n\n /**\n * @deprecated Use isAuthenticated() instead\n */\n async signin(): Promise<boolean> {\n return this.isAuthenticated();\n }\n\n /**\n * @deprecated Use loginWithEmail() instead\n */\n async verifyCredentials(email: string, password: string): Promise<boolean> {\n const result = await this.loginWithEmail(email, password);\n return result.success;\n }\n\n /**\n * @deprecated Check user.is_email_verified from getCurrentUser() instead\n */\n isSigninEmailValid(): boolean {\n return this.userSubject.value?.is_email_verified || false;\n }\n\n /**\n * @deprecated No longer needed - dialog is managed by platform\n */\n onDialogClose(): void {\n // No-op for backward compatibility\n }\n\n /**\n * @deprecated No longer needed - dialog is managed by platform\n */\n closeSocialAuthDialog(): void {\n // No-op for backward compatibility\n }\n\n /**\n * @deprecated Check if user exists by calling /api/auth/check-email endpoint\n */\n async getUserProfile(email: string): Promise<User | null> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/check-email`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email })\n }\n );\n\n const data = await response.json();\n return data.exists ? data.user : null;\n } catch (error) {\n return null;\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService {\n\n constructor() { }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MyEnvironmentModel } from './my-environment.model';\n\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule\n ]\n})\nexport class NgxStoneScriptPhpClientModule {\n public static forRoot(environment: MyEnvironmentModel): ModuleWithProviders<NgxStoneScriptPhpClientModule> {\n return {\n ngModule: NgxStoneScriptPhpClientModule,\n providers: [\n { provide: MyEnvironmentModel, useValue: environment }\n ]\n }\n }\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\n\n@Component({\n selector: 'lib-login-dialog',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"login-dialog\">\n <h2 class=\"login-title\">Sign In</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword')) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\"\n required\n class=\"form-control\">\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : getProviderLabel('emailPassword') }}\n </button>\n </form>\n }\n\n <!-- Divider if both email and OAuth are present -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n class=\"btn btn-oauth btn-{{ provider }}\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Register Link -->\n <div class=\"register-link\">\n Don't have an account?\n <a href=\"#\" (click)=\"onRegisterClick($event)\">Sign up</a>\n </div>\n </div>\n `,\n styles: [`\n .login-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class LoginDialogComponent implements OnInit {\n /**\n * REQUIRED: Which authentication providers to show in this dialog\n * @example ['google', 'linkedin', 'emailPassword']\n */\n @Input() providers: AuthProvider[] = [];\n\n email = '';\n password = '';\n error = '';\n loading = false;\n\n oauthProviders: AuthProvider[] = [];\n\n constructor(private auth: AuthService) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified. Please pass providers to LoginDialogComponent.';\n throw new Error('LoginDialogComponent requires providers input. Example: dialogRef.componentInstance.providers = [\\'google\\', \\'emailPassword\\']');\n }\n\n // Get OAuth providers (excluding emailPassword)\n this.oauthProviders = this.providers\n .filter(p => p !== 'emailPassword');\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n const labels: Record<AuthProvider, string> = {\n google: 'Sign in with Google',\n linkedin: 'Sign in with LinkedIn',\n apple: 'Sign in with Apple',\n microsoft: 'Sign in with Microsoft',\n github: 'Sign in with GitHub',\n emailPassword: 'Sign in with Email'\n };\n return labels[provider];\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n // Platforms can customize icons via CSS classes: .btn-google, .btn-linkedin, etc.\n return undefined;\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n if (!result.success) {\n this.error = result.message || 'Login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onRegisterClick(event: Event) {\n event.preventDefault();\n // Platforms can override this or listen for a custom event\n // For now, just emit a console message\n console.log('Register clicked - platform should handle navigation');\n }\n}\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService } from '../../auth.service';\n\n@Component({\n selector: 'lib-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"register-dialog\">\n <h2 class=\"register-title\">Create Account</h2>\n\n <form (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"password\">Password</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n type=\"password\"\n required\n minlength=\"8\"\n class=\"form-control\">\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group\">\n <label for=\"confirmPassword\">Confirm Password</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n type=\"password\"\n required\n class=\"form-control\">\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating account...' : 'Sign Up' }}\n </button>\n </form>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Login Link -->\n <div class=\"login-link\">\n Already have an account?\n <a href=\"#\" (click)=\"onLoginClick($event)\">Sign in</a>\n </div>\n </div>\n `,\n styles: [`\n .register-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class RegisterComponent {\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n error = '';\n success = '';\n loading = false;\n\n constructor(private auth: AuthService) {}\n\n async onRegister() {\n // Reset messages\n this.error = '';\n this.success = '';\n\n // Validate fields\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n this.error = 'Please fill in all fields';\n return;\n }\n\n if (this.password.length < 8) {\n this.error = 'Password must be at least 8 characters';\n return;\n }\n\n if (this.password !== this.confirmPassword) {\n this.error = 'Passwords do not match';\n return;\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(this.email)) {\n this.error = 'Please enter a valid email address';\n return;\n }\n\n this.loading = true;\n\n try {\n const result = await this.auth.register(this.email, this.password, this.displayName);\n\n if (result.success) {\n this.success = result.message || 'Account created successfully!';\n // On success, parent component/dialog should close automatically via user$ subscription\n // or navigate to email verification page\n } else {\n this.error = result.message || 'Registration failed';\n }\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n // Platforms can override this or listen for a custom event\n // For now, just emit a console message\n console.log('Login clicked - platform should handle navigation');\n }\n}\n","/*\n * Public API Surface of ngx-stonescriptphp-client\n */\n\nexport * from './api-connection.service';\nexport * from './auth.service';\nexport * from './db.service';\nexport * from './signin-status.service';\nexport * from './token.service';\nexport * from './csrf.service';\nexport * from './api-response.model';\nexport * from './my-environment.model';\nexport * from './ngx-stonescriptphp-client.module';\n\n// UI Components\nexport * from './lib/components/login-dialog.component';\nexport * from './lib/components/register.component';\n\n// Re-export types for convenience\nexport type { AuthProvider, User, AuthResult } from './auth.service';\nexport { VerifyStatus } from './signin-status.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TokenService","i2.SigninStatusService","i3.MyEnvironmentModel","i4.CsrfService","i1.AuthService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"progalaxyelabs-ngx-stonescriptphp-client.mjs","sources":["../../src/api-response.model.ts","../../src/token.service.ts","../../src/signin-status.service.ts","../../src/my-environment.model.ts","../../src/csrf.service.ts","../../src/api-connection.service.ts","../../src/auth.service.ts","../../src/db.service.ts","../../src/ngx-stonescriptphp-client.module.ts","../../src/lib/components/login-dialog.component.ts","../../src/lib/components/register.component.ts","../../src/lib/components/tenant-login.component.ts","../../src/lib/components/tenant-register.component.ts","../../src/lib/components/tenant-login-dialog.component.ts","../../src/lib/components/tenant-register-dialog.component.ts","../../src/index.ts","../../src/progalaxyelabs-ngx-stonescriptphp-client.ts"],"sourcesContent":["export class ApiResponse<DataType> {\n private status: string\n private data: any\n private message: string\n\n constructor(status: string, data: any = {}, message: string = '') {\n this.status = status\n this.data = data\n this.message = message\n }\n\n onOk(callback: (data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'ok') {\n callback(this.data)\n }\n return this\n }\n\n onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'not ok') {\n callback(this.message, this.data)\n }\n return this\n }\n\n onError(callback: () => void): ApiResponse<DataType> {\n if (this.status === 'error') {\n callback()\n }\n return this\n }\n\n isSuccess(): boolean {\n return this.status === 'ok'\n }\n\n isError(): boolean {\n return this.status === 'error' || this.status === 'not ok'\n }\n\n getData(): DataType | null {\n return this.data || null\n }\n\n getError(): string {\n return this.message || 'Unknown error'\n }\n\n getStatus(): string {\n return this.status\n }\n\n getMessage(): string {\n return this.message\n }\n}","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenService {\n private accessToken = ''\n private refreshToken = ''\n\n private lsAccessTokenKey = 'progalaxyapi_access_token'\n private lsRefreshTokenKey = 'progalaxyapi_refresh_token'\n\n constructor() { }\n\n setTokens(accessToken: string, refreshToken: string) {\n this.accessToken = accessToken\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n }\n\n setRefreshToken(refreshToken: string) {\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n getAccessToken() {\n if (this.accessToken) {\n return this.accessToken\n }\n\n const storedAccessToken = localStorage.getItem(this.lsAccessTokenKey)\n if (storedAccessToken) {\n return storedAccessToken\n } else {\n return ''\n }\n }\n\n getRefreshToken() {\n if (this.refreshToken) {\n return this.refreshToken\n }\n\n const storedRefreshToken = localStorage.getItem(this.lsRefreshTokenKey)\n if (storedRefreshToken) {\n return storedRefreshToken\n } else {\n return ''\n }\n }\n\n clear() {\n this.accessToken = ''\n this.refreshToken = ''\n localStorage.removeItem(this.lsAccessTokenKey)\n localStorage.removeItem(this.lsRefreshTokenKey)\n }\n\n /**\n * Check if there is a valid (non-empty) access token\n * @returns True if access token exists and is not empty\n */\n hasValidAccessToken(): boolean {\n const token = this.getAccessToken()\n return token !== null && token !== ''\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * @deprecated Use boolean directly. Kept for backward compatibility.\n */\nexport enum VerifyStatus {\n initialized = 'initialized',\n yes = 'yes',\n no = 'no'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SigninStatusService {\n public status: BehaviorSubject<boolean | VerifyStatus>\n\n constructor() {\n this.status = new BehaviorSubject<boolean>(false)\n }\n\n signedOut(): void {\n this.status.next(false)\n }\n\n signedIn(): void {\n this.status.next(true)\n }\n\n /**\n * Set signin status\n * @param isSignedIn - True if user is signed in, false otherwise\n */\n setSigninStatus(isSignedIn: boolean): void {\n this.status.next(isSignedIn)\n }\n}\n","export type AuthMode = 'cookie' | 'body' | 'none';\n\nexport interface AuthConfig {\n /**\n * Authentication mode:\n * - 'cookie': Use httpOnly cookies + CSRF tokens (recommended, matches StoneScriptPHP v2.1.x)\n * - 'body': Send tokens in request body (legacy mode)\n * - 'none': No automatic token refresh\n */\n mode: AuthMode;\n\n /**\n * Token refresh endpoint path\n * @default '/auth/refresh' for cookie mode, '/user/refresh_access' for body mode\n */\n refreshEndpoint?: string;\n\n /**\n * Enable CSRF token support (required for cookie mode)\n * @default true for cookie mode, false for body mode\n */\n useCsrf?: boolean;\n\n /**\n * Cookie name for refresh token\n * @default 'refresh_token'\n */\n refreshTokenCookieName?: string;\n\n /**\n * Cookie name for CSRF token\n * @default 'csrf_token'\n */\n csrfTokenCookieName?: string;\n\n /**\n * CSRF header name\n * @default 'X-CSRF-Token'\n */\n csrfHeaderName?: string;\n}\n\nexport class MyEnvironmentModel {\n production: boolean = true\n\n /**\n * Platform code identifier (e.g., 'progalaxy', 'hr', 'admin')\n * Used for multi-tenant authentication\n */\n platformCode: string = '';\n\n /**\n * Accounts platform URL for centralized authentication\n * @example 'https://accounts.progalaxyelabs.com'\n */\n accountsUrl: string = '';\n\n firebase: {\n projectId: string\n appId: string\n databaseURL: string\n storageBucket: string\n locationId: string\n apiKey: string\n authDomain: string\n messagingSenderId: string\n measurementId: string\n } = {\n projectId: '',\n appId: '',\n databaseURL: '',\n storageBucket: '',\n locationId: '',\n apiKey: '',\n authDomain: '',\n messagingSenderId: '',\n measurementId: ''\n }\n apiServer: {\n host: string\n } = { host: '' }\n chatServer: {\n host: string\n } = { host: '' }\n\n /**\n * Authentication configuration\n * @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }\n */\n auth?: AuthConfig = {\n mode: 'cookie',\n refreshEndpoint: '/auth/refresh',\n useCsrf: true,\n refreshTokenCookieName: 'refresh_token',\n csrfTokenCookieName: 'csrf_token',\n csrfHeaderName: 'X-CSRF-Token'\n };\n}","import { Injectable } from '@angular/core';\n\n/**\n * CSRF Token Service\n *\n * Manages CSRF tokens for cookie-based authentication.\n * Reads CSRF token from cookies and provides it for request headers.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CsrfService {\n\n /**\n * Get CSRF token from cookie\n */\n getCsrfToken(cookieName: string = 'csrf_token'): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) {\n return decodeURIComponent(value);\n }\n }\n return null;\n }\n\n /**\n * Check if CSRF token exists\n */\n hasCsrfToken(cookieName: string = 'csrf_token'): boolean {\n return this.getCsrfToken(cookieName) !== null;\n }\n\n /**\n * Clear CSRF token (for logout)\n * Note: Client-side deletion is limited for httpOnly cookies\n */\n clearCsrfToken(cookieName: string = 'csrf_token'): void {\n // Can only clear non-httpOnly cookies\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { ApiResponse } from './api-response.model';\nimport { MyEnvironmentModel, AuthConfig } from './my-environment.model';\nimport { CsrfService } from './csrf.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiConnectionService {\n\n private host = '' // contains trailing slash\n\n private accessToken = ''\n\n private authConfig: AuthConfig\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private csrf: CsrfService\n ) {\n this.host = environment.apiServer.host\n\n // Set default auth config based on mode\n this.authConfig = {\n mode: environment.auth?.mode || 'cookie',\n refreshEndpoint: environment.auth?.refreshEndpoint,\n useCsrf: environment.auth?.useCsrf,\n refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',\n csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',\n csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'\n }\n\n // Set default refresh endpoint based on mode if not specified\n if (!this.authConfig.refreshEndpoint) {\n this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'\n ? '/auth/refresh'\n : '/user/refresh_access'\n }\n\n // Set default CSRF setting based on mode if not specified\n if (this.authConfig.useCsrf === undefined) {\n this.authConfig.useCsrf = this.authConfig.mode === 'cookie'\n }\n }\n\n\n private async request<DataType>(url: string, options: any, data: any | null): Promise<ApiResponse<DataType>> {\n try {\n \n if(data !== null) {\n const body = JSON.stringify(data)\n if(body) {\n options.body = body\n } else {\n options.body = {}\n }\n }\n\n const accessTokenIncluded = this.includeAccessToken(options)\n\n let response: Response = await fetch(url, options)\n\n if ((response.status === 401) && accessTokenIncluded) {\n response = await this.refreshAccessTokenAndRetry(url, options, response)\n }\n\n if (response.ok) {\n const json = await (response.json())\n return (new ApiResponse<DataType>(json.status, json.data, json.message))\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut()\n }\n\n return this.handleError<DataType>(response)\n } catch (error) {\n return this.handleError<DataType>(error)\n }\n }\n\n private handleError<DataType>(error: any): ApiResponse<DataType> {\n console.error(\n `Backend returned code ${error.status}, ` +\n `full error: `, error);\n return new ApiResponse<DataType>('error')\n }\n\n async get<DataType>(endpoint: string, queryParamsObj?: any ): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n async post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async put<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'PUT',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async patch<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'PATCH',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async delete<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n method: 'DELETE',\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n // async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {\n // const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n // try {\n // const fetchOptions: RequestInit = {\n // method: 'POST',\n // mode: 'cors',\n // redirect: 'error',\n // body: formData\n // }\n\n // const accessTokenIncluded = this.includeAccessToken(fetchOptions)\n\n // let response: Response = await fetch(url, fetchOptions)\n\n // if ((response.status === 401) && accessTokenIncluded) {\n // response = await this.refreshAccessTokenAndRetry(url, fetchOptions, response)\n // }\n\n // if (response.ok) {\n // return ((await (response.json()) as ApiResponse))\n // }\n\n // return this.handleError(response)\n // } catch (error) {\n // return this.handleError(error)\n // }\n // }\n\n private includeAccessToken(options: any): boolean {\n this.accessToken = this.tokens.getAccessToken()\n if (!this.accessToken) {\n return false\n }\n\n if (!options.headers) {\n options.headers = {}\n }\n options.headers['Authorization'] = 'Bearer ' + this.accessToken\n return true\n }\n\n private async refreshAccessTokenAndRetry(url: string, fetchOptions: any, response: Response): Promise<Response> {\n\n const refreshStatusOk = await this.refreshAccessToken()\n if (!refreshStatusOk) {\n return response\n }\n\n fetchOptions.headers['Authorization'] = 'Bearer ' + this.accessToken\n response = await fetch(url, fetchOptions)\n return response\n }\n\n async refreshAccessToken(): Promise<boolean> {\n if (this.authConfig.mode === 'none') {\n return false\n }\n\n if (this.authConfig.mode === 'cookie') {\n return await this.refreshAccessTokenCookieMode()\n } else {\n return await this.refreshAccessTokenBodyMode()\n }\n }\n\n /**\n * Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)\n */\n private async refreshAccessTokenCookieMode(): Promise<boolean> {\n try {\n const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '')\n const headers: any = {\n 'Content-Type': 'application/json'\n }\n\n // Add CSRF token if enabled\n if (this.authConfig.useCsrf) {\n const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName!)\n if (!csrfToken) {\n console.error('CSRF token not found in cookie')\n return false\n }\n headers[this.authConfig.csrfHeaderName!] = csrfToken\n }\n\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include', // Important: send cookies\n redirect: 'error',\n headers: headers\n })\n\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData || refreshAccessData.status !== 'ok') {\n return false\n }\n\n // Extract access token from response\n const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token\n if (!newAccessToken) {\n console.error('No access token in refresh response')\n return false\n }\n\n // Store new access token (refresh token is in httpOnly cookie)\n this.tokens.setAccessToken(newAccessToken)\n this.accessToken = newAccessToken\n\n return true\n } catch (error) {\n console.error('Token refresh failed (cookie mode):', error)\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n }\n\n /**\n * Refresh access token using body-based auth (legacy mode)\n */\n private async refreshAccessTokenBodyMode(): Promise<boolean> {\n try {\n const refreshToken = this.tokens.getRefreshToken()\n if (!refreshToken) {\n return false\n }\n\n const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '')\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n access_token: this.accessToken,\n refresh_token: refreshToken\n })\n })\n\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData) {\n return false\n }\n\n const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token\n if (!newAccessToken) {\n console.error('No access token in refresh response')\n return false\n }\n\n this.tokens.setTokens(newAccessToken, refreshToken)\n this.accessToken = newAccessToken\n\n return true\n } catch (error) {\n console.error('Token refresh failed (body mode):', error)\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n }\n\n buildQueryString(options?: any): string {\n if (options === undefined) {\n return ''\n }\n\n const array = []\n for (let key in options) {\n if (options.hasOwnProperty(key) && (options[key] !== null) && (options[key] !== undefined)) {\n array.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(options[key]))\n }\n }\n const str = array.join('&')\n if (str !== '') {\n return '?' + str\n }\n\n return ''\n }\n\n /**\n * Upload a drawing (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadDrawing<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + 'upload/drawing'\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n body: formData\n }\n return this.request(url, fetchOptions, null)\n }\n\n /**\n * Upload an image (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadImage<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + 'upload/image'\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n body: formData\n }\n return this.request(url, fetchOptions, null)\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { MyEnvironmentModel } from './my-environment.model';\n\nexport type AuthProvider = 'google' | 'linkedin' | 'apple' | 'microsoft' | 'github' | 'emailPassword';\n\nexport interface User {\n user_id: number;\n email: string;\n display_name: string;\n photo_url?: string;\n is_email_verified: boolean;\n}\n\nexport interface AuthResult {\n success: boolean;\n message?: string;\n user?: User;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n private readonly USER_STORAGE_KEY = 'progalaxyapi_user';\n\n // Observable user state\n private userSubject = new BehaviorSubject<User | null>(null);\n public user$: Observable<User | null> = this.userSubject.asObservable();\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n @Inject(MyEnvironmentModel) private environment: MyEnvironmentModel\n ) {\n // Restore user from localStorage on initialization\n this.restoreUser();\n }\n\n /**\n * Restore user from localStorage\n */\n private restoreUser(): void {\n try {\n const userJson = localStorage.getItem(this.USER_STORAGE_KEY);\n if (userJson) {\n const user = JSON.parse(userJson);\n this.updateUser(user);\n }\n } catch (error) {\n console.error('Failed to restore user from localStorage:', error);\n }\n }\n\n /**\n * Save user to localStorage\n */\n private saveUser(user: User | null): void {\n try {\n if (user) {\n localStorage.setItem(this.USER_STORAGE_KEY, JSON.stringify(user));\n } else {\n localStorage.removeItem(this.USER_STORAGE_KEY);\n }\n } catch (error) {\n console.error('Failed to save user to localStorage:', error);\n }\n }\n\n /**\n * Update user subject and persist to localStorage\n */\n private updateUser(user: User | null): void {\n this.updateUser(user);\n this.saveUser(user);\n }\n\n /**\n * Login with email and password\n */\n async loginWithEmail(email: string, password: string): Promise<AuthResult> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/login`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Include cookies for refresh token\n body: JSON.stringify({\n email,\n password,\n platform: this.environment.platformCode\n })\n }\n );\n\n const data = await response.json();\n\n if (data.success && data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.signinStatus.setSigninStatus(true);\n this.updateUser(data.user);\n\n return { success: true, user: data.user };\n }\n\n return {\n success: false,\n message: data.message || 'Invalid credentials'\n };\n } catch (error) {\n return {\n success: false,\n message: 'Network error. Please try again.'\n };\n }\n }\n\n /**\n * Login with Google OAuth (popup window)\n */\n async loginWithGoogle(): Promise<AuthResult> {\n return this.loginWithOAuth('google');\n }\n\n /**\n * Login with GitHub OAuth (popup window)\n */\n async loginWithGitHub(): Promise<AuthResult> {\n return this.loginWithOAuth('github');\n }\n\n /**\n * Login with LinkedIn OAuth (popup window)\n */\n async loginWithLinkedIn(): Promise<AuthResult> {\n return this.loginWithOAuth('linkedin');\n }\n\n /**\n * Login with Apple OAuth (popup window)\n */\n async loginWithApple(): Promise<AuthResult> {\n return this.loginWithOAuth('apple');\n }\n\n /**\n * Login with Microsoft OAuth (popup window)\n */\n async loginWithMicrosoft(): Promise<AuthResult> {\n return this.loginWithOAuth('microsoft');\n }\n\n /**\n * Generic provider-based login (supports all OAuth providers)\n * @param provider - The provider identifier\n */\n async loginWithProvider(provider: AuthProvider): Promise<AuthResult> {\n if (provider === 'emailPassword') {\n throw new Error('Use loginWithEmail() for email/password authentication');\n }\n return this.loginWithOAuth(provider);\n }\n\n /**\n * Generic OAuth login handler\n * Opens popup window and listens for postMessage\n */\n private async loginWithOAuth(provider: string): Promise<AuthResult> {\n return new Promise((resolve) => {\n const width = 500;\n const height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n const oauthUrl = `${this.environment.accountsUrl}/oauth/${provider}?` +\n `platform=${this.environment.platformCode}&` +\n `mode=popup`;\n\n const popup = window.open(\n oauthUrl,\n `${provider}_login`,\n `width=${width},height=${height},left=${left},top=${top}`\n );\n\n if (!popup) {\n resolve({\n success: false,\n message: 'Popup blocked. Please allow popups for this site.'\n });\n return;\n }\n\n // Listen for message from popup\n const messageHandler = (event: MessageEvent) => {\n // Verify origin\n if (event.origin !== new URL(this.environment.accountsUrl).origin) {\n return;\n }\n\n if (event.data.type === 'oauth_success') {\n this.tokens.setAccessToken(event.data.access_token);\n this.signinStatus.setSigninStatus(true);\n this.updateUser(event.data.user);\n\n window.removeEventListener('message', messageHandler);\n popup.close();\n\n resolve({\n success: true,\n user: event.data.user\n });\n } else if (event.data.type === 'oauth_error') {\n window.removeEventListener('message', messageHandler);\n popup.close();\n\n resolve({\n success: false,\n message: event.data.message || 'OAuth login failed'\n });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n // Check if popup was closed manually\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({\n success: false,\n message: 'Login cancelled'\n });\n }\n }, 500);\n });\n }\n\n /**\n * Register new user\n */\n async register(\n email: string,\n password: string,\n displayName: string\n ): Promise<AuthResult> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/register`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email,\n password,\n display_name: displayName,\n platform: this.environment.platformCode\n })\n }\n );\n\n const data = await response.json();\n\n if (data.success && data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.signinStatus.setSigninStatus(true);\n this.updateUser(data.user);\n\n return {\n success: true,\n user: data.user,\n message: data.needs_verification ? 'Please verify your email' : undefined\n };\n }\n\n return {\n success: false,\n message: data.message || 'Registration failed'\n };\n } catch (error) {\n return {\n success: false,\n message: 'Network error. Please try again.'\n };\n }\n }\n\n /**\n * Sign out user\n */\n async signout(): Promise<void> {\n try {\n const refreshToken = this.tokens.getRefreshToken();\n if (refreshToken) {\n await fetch(\n `${this.environment.accountsUrl}/api/auth/logout`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({\n refresh_token: refreshToken\n })\n }\n );\n }\n } catch (error) {\n console.error('Logout API call failed:', error);\n } finally {\n this.tokens.clear();\n this.signinStatus.setSigninStatus(false);\n this.updateUser(null);\n }\n }\n\n /**\n * Check for active session (call on app init)\n */\n async checkSession(): Promise<boolean> {\n if (this.tokens.hasValidAccessToken()) {\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n\n // Try to refresh using httpOnly cookie\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/refresh`,\n {\n method: 'POST',\n credentials: 'include'\n }\n );\n\n if (!response.ok) {\n this.signinStatus.setSigninStatus(false);\n return false;\n }\n\n const data = await response.json();\n\n if (data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.updateUser(data.user);\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n\n return false;\n } catch (error) {\n this.signinStatus.setSigninStatus(false);\n return false;\n }\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return this.tokens.hasValidAccessToken();\n }\n\n /**\n * Get current user (synchronous)\n */\n getCurrentUser(): User | null {\n return this.userSubject.value;\n }\n\n // ===== Multi-Tenant Methods =====\n\n /**\n * Register a new user AND create a new tenant (organization)\n * This is used when a user wants to create their own organization\n */\n async registerTenant(data: {\n tenantName: string;\n tenantSlug: string;\n displayName?: string;\n email?: string;\n password?: string;\n provider: AuthProvider;\n }): Promise<{\n success: boolean;\n message?: string;\n tenant?: { id: string; name: string; slug: string };\n user?: { id: string; email: string; name: string };\n access_token?: string;\n }> {\n try {\n // If using OAuth, initiate OAuth flow first\n if (data.provider !== 'emailPassword') {\n return await this.registerTenantWithOAuth(\n data.tenantName,\n data.tenantSlug,\n data.provider\n );\n }\n\n // Email/password registration\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/register-tenant`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n platform: this.environment.platformCode,\n tenant_name: data.tenantName,\n tenant_slug: data.tenantSlug,\n display_name: data.displayName,\n email: data.email,\n password: data.password,\n provider: 'emailPassword'\n })\n }\n );\n\n const result = await response.json();\n\n if (result.success && result.access_token) {\n this.tokens.setAccessToken(result.access_token);\n this.signinStatus.setSigninStatus(true);\n if (result.user) {\n this.updateUser(result.user);\n }\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n message: 'Network error. Please try again.'\n };\n }\n }\n\n /**\n * Register tenant with OAuth provider\n * Opens popup window for OAuth flow\n */\n private async registerTenantWithOAuth(\n tenantName: string,\n tenantSlug: string,\n provider: AuthProvider\n ): Promise<{\n success: boolean;\n message?: string;\n tenant?: { id: string; name: string; slug: string };\n user?: { id: string; email: string; name: string };\n }> {\n return new Promise((resolve) => {\n const width = 500;\n const height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n // Build OAuth URL with tenant registration params\n const oauthUrl = `${this.environment.accountsUrl}/oauth/${provider}?` +\n `platform=${this.environment.platformCode}&` +\n `mode=popup&` +\n `action=register_tenant&` +\n `tenant_name=${encodeURIComponent(tenantName)}&` +\n `tenant_slug=${encodeURIComponent(tenantSlug)}`;\n\n const popup = window.open(\n oauthUrl,\n `${provider}_register_tenant`,\n `width=${width},height=${height},left=${left},top=${top}`\n );\n\n if (!popup) {\n resolve({\n success: false,\n message: 'Popup blocked. Please allow popups for this site.'\n });\n return;\n }\n\n // Listen for message from popup\n const messageHandler = (event: MessageEvent) => {\n // Verify origin\n if (event.origin !== new URL(this.environment.accountsUrl).origin) {\n return;\n }\n\n if (event.data.type === 'tenant_register_success') {\n // Set tokens and user\n if (event.data.access_token) {\n this.tokens.setAccessToken(event.data.access_token);\n this.signinStatus.setSigninStatus(true);\n }\n if (event.data.user) {\n this.updateUser(event.data.user);\n }\n\n window.removeEventListener('message', messageHandler);\n popup.close();\n\n resolve({\n success: true,\n tenant: event.data.tenant,\n user: event.data.user\n });\n } else if (event.data.type === 'tenant_register_error') {\n window.removeEventListener('message', messageHandler);\n popup.close();\n\n resolve({\n success: false,\n message: event.data.message || 'Tenant registration failed'\n });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n // Check if popup was closed manually\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({\n success: false,\n message: 'Registration cancelled'\n });\n }\n }, 500);\n });\n }\n\n /**\n * Get all tenant memberships for the authenticated user\n */\n async getTenantMemberships(): Promise<{\n memberships: Array<{\n tenant_id: string;\n slug: string;\n name: string;\n role: string;\n status: string;\n last_accessed?: string;\n }>;\n }> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/memberships`,\n {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.tokens.getAccessToken()}`,\n 'Content-Type': 'application/json'\n },\n credentials: 'include'\n }\n );\n\n const data = await response.json();\n return {\n memberships: data.memberships || []\n };\n } catch (error) {\n return { memberships: [] };\n }\n }\n\n /**\n * Select a tenant for the current session\n * Updates the JWT token with tenant context\n */\n async selectTenant(tenantId: string): Promise<{\n success: boolean;\n message?: string;\n access_token?: string;\n }> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/select-tenant`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.tokens.getAccessToken()}`,\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({ tenant_id: tenantId })\n }\n );\n\n const data = await response.json();\n\n if (data.success && data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n return {\n success: true,\n access_token: data.access_token\n };\n }\n\n return {\n success: false,\n message: data.message || 'Failed to select tenant'\n };\n } catch (error) {\n return {\n success: false,\n message: 'Network error. Please try again.'\n };\n }\n }\n\n /**\n * Check if a tenant slug is available\n */\n async checkTenantSlugAvailable(slug: string): Promise<{\n available: boolean;\n suggestion?: string;\n }> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/check-tenant-slug/${slug}`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }\n );\n\n const data = await response.json();\n return {\n available: data.available || false,\n suggestion: data.suggestion\n };\n } catch (error) {\n // On error, assume available (don't block registration)\n return { available: true };\n }\n }\n\n // ===== Backward Compatibility Methods =====\n // These methods are deprecated and maintained for backward compatibility\n // with existing platform code. New code should use the methods above.\n\n /**\n * @deprecated Use getCurrentUser()?.user_id instead\n */\n getUserId(): number {\n return this.userSubject.value?.user_id || 0;\n }\n\n /**\n * @deprecated Use getCurrentUser()?.display_name instead\n */\n getUserName(): string {\n return this.userSubject.value?.display_name || '';\n }\n\n /**\n * @deprecated Use getCurrentUser()?.photo_url instead\n */\n getPhotoUrl(): string {\n return this.userSubject.value?.photo_url || '';\n }\n\n /**\n * @deprecated Use getCurrentUser()?.display_name instead\n */\n getDisplayName(): string {\n return this.userSubject.value?.display_name || '';\n }\n\n /**\n * @deprecated Use `/profile/${getCurrentUser()?.user_id}` instead\n */\n getProfileUrl(): string {\n const userId = this.userSubject.value?.user_id;\n return userId ? `/profile/${userId}` : '';\n }\n\n /**\n * @deprecated Use isAuthenticated() instead\n */\n async signin(): Promise<boolean> {\n return this.isAuthenticated();\n }\n\n /**\n * @deprecated Use loginWithEmail() instead\n */\n async verifyCredentials(email: string, password: string): Promise<boolean> {\n const result = await this.loginWithEmail(email, password);\n return result.success;\n }\n\n /**\n * @deprecated Check user.is_email_verified from getCurrentUser() instead\n */\n isSigninEmailValid(): boolean {\n return this.userSubject.value?.is_email_verified || false;\n }\n\n /**\n * @deprecated No longer needed - dialog is managed by platform\n */\n onDialogClose(): void {\n // No-op for backward compatibility\n }\n\n /**\n * @deprecated No longer needed - dialog is managed by platform\n */\n closeSocialAuthDialog(): void {\n // No-op for backward compatibility\n }\n\n /**\n * @deprecated Check if user exists by calling /api/auth/check-email endpoint\n */\n async getUserProfile(email: string): Promise<User | null> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/check-email`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email })\n }\n );\n\n const data = await response.json();\n return data.exists ? data.user : null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Check if user has completed onboarding (has a tenant)\n */\n async checkOnboardingStatus(identityId: string): Promise<{\n onboarded: boolean;\n tenant_slug?: string;\n tenant_name?: string;\n role?: string;\n }> {\n try {\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/onboarding/status?platform_code=${this.environment.platformCode}&identity_id=${identityId}`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include'\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to check onboarding status');\n }\n\n return await response.json();\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Complete tenant onboarding (create tenant with country + org name)\n */\n async completeTenantOnboarding(countryCode: string, tenantName: string): Promise<{\n tenant: {\n id: string;\n slug: string;\n name: string;\n };\n access_token: string;\n refresh_token: string;\n }> {\n try {\n const accessToken = this.tokens.getAccessToken();\n if (!accessToken) {\n throw new Error('Not authenticated');\n }\n\n const response = await fetch(\n `${this.environment.accountsUrl}/api/auth/register-tenant`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`\n },\n credentials: 'include',\n body: JSON.stringify({\n platform: this.environment.platformCode,\n tenant_name: tenantName,\n country_code: countryCode,\n provider: 'google', // Assuming OAuth\n oauth_token: accessToken\n })\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.message || 'Failed to create tenant');\n }\n\n const data = await response.json();\n\n // Update tokens with new tenant-scoped tokens\n if (data.access_token) {\n this.tokens.setAccessToken(data.access_token);\n this.signinStatus.setSigninStatus(true);\n }\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService {\n\n constructor() { }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MyEnvironmentModel } from './my-environment.model';\n\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule\n ]\n})\nexport class NgxStoneScriptPhpClientModule {\n public static forRoot(environment: MyEnvironmentModel): ModuleWithProviders<NgxStoneScriptPhpClientModule> {\n return {\n ngModule: NgxStoneScriptPhpClientModule,\n providers: [\n { provide: MyEnvironmentModel, useValue: environment }\n ]\n }\n }\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\n\n@Component({\n selector: 'lib-login-dialog',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"login-dialog\">\n <h2 class=\"login-title\">Sign In</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword')) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\"\n required\n class=\"form-control\">\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : getProviderLabel('emailPassword') }}\n </button>\n </form>\n }\n\n <!-- Divider if both email and OAuth are present -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n class=\"btn btn-oauth btn-{{ provider }}\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Register Link -->\n <div class=\"register-link\">\n Don't have an account?\n <a href=\"#\" (click)=\"onRegisterClick($event)\">Sign up</a>\n </div>\n </div>\n `,\n styles: [`\n .login-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class LoginDialogComponent implements OnInit {\n /**\n * REQUIRED: Which authentication providers to show in this dialog\n * @example ['google', 'linkedin', 'emailPassword']\n */\n @Input() providers: AuthProvider[] = [];\n\n email = '';\n password = '';\n error = '';\n loading = false;\n\n oauthProviders: AuthProvider[] = [];\n\n constructor(private auth: AuthService) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified. Please pass providers to LoginDialogComponent.';\n throw new Error('LoginDialogComponent requires providers input. Example: dialogRef.componentInstance.providers = [\\'google\\', \\'emailPassword\\']');\n }\n\n // Get OAuth providers (excluding emailPassword)\n this.oauthProviders = this.providers\n .filter(p => p !== 'emailPassword');\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n const labels: Record<AuthProvider, string> = {\n google: 'Sign in with Google',\n linkedin: 'Sign in with LinkedIn',\n apple: 'Sign in with Apple',\n microsoft: 'Sign in with Microsoft',\n github: 'Sign in with GitHub',\n emailPassword: 'Sign in with Email'\n };\n return labels[provider];\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n // Platforms can customize icons via CSS classes: .btn-google, .btn-linkedin, etc.\n return undefined;\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n if (!result.success) {\n this.error = result.message || 'Login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onRegisterClick(event: Event) {\n event.preventDefault();\n // Platforms can override this or listen for a custom event\n // For now, just emit a console message\n console.log('Register clicked - platform should handle navigation');\n }\n}\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService } from '../../auth.service';\n\n@Component({\n selector: 'lib-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"register-dialog\">\n <h2 class=\"register-title\">Create Account</h2>\n\n <form (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"password\">Password</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n type=\"password\"\n required\n minlength=\"8\"\n class=\"form-control\">\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group\">\n <label for=\"confirmPassword\">Confirm Password</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n type=\"password\"\n required\n class=\"form-control\">\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating account...' : 'Sign Up' }}\n </button>\n </form>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Login Link -->\n <div class=\"login-link\">\n Already have an account?\n <a href=\"#\" (click)=\"onLoginClick($event)\">Sign in</a>\n </div>\n </div>\n `,\n styles: [`\n .register-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class RegisterComponent {\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n error = '';\n success = '';\n loading = false;\n\n constructor(private auth: AuthService) {}\n\n async onRegister() {\n // Reset messages\n this.error = '';\n this.success = '';\n\n // Validate fields\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n this.error = 'Please fill in all fields';\n return;\n }\n\n if (this.password.length < 8) {\n this.error = 'Password must be at least 8 characters';\n return;\n }\n\n if (this.password !== this.confirmPassword) {\n this.error = 'Passwords do not match';\n return;\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(this.email)) {\n this.error = 'Please enter a valid email address';\n return;\n }\n\n this.loading = true;\n\n try {\n const result = await this.auth.register(this.email, this.password, this.displayName);\n\n if (result.success) {\n this.success = result.message || 'Account created successfully!';\n // On success, parent component/dialog should close automatically via user$ subscription\n // or navigate to email verification page\n } else {\n this.error = result.message || 'Registration failed';\n }\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n // Platforms can override this or listen for a custom event\n // For now, just emit a console message\n console.log('Login clicked - platform should handle navigation');\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\n\nexport interface TenantMembership {\n tenant_id: string;\n slug: string;\n name: string;\n role: string;\n status: string;\n last_accessed?: string;\n}\n\nexport interface TenantSelectedEvent {\n tenantId: string;\n tenantSlug: string;\n role: string;\n}\n\n@Component({\n selector: 'lib-tenant-login',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"tenant-login-dialog\">\n @if (!showingTenantSelector) {\n <!-- Step 1: Authentication -->\n <h2 class=\"login-title\">{{ title }}</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword') && !useOAuth) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\"\n required\n class=\"form-control\">\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : 'Sign in with Email' }}\n </button>\n </form>\n\n <!-- Divider -->\n @if (oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0 && (useOAuth || !isProviderEnabled('emailPassword'))) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n type=\"button\"\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n class=\"btn btn-oauth btn-{{ provider }}\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n\n <!-- Switch to Email/Password -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n {{ useOAuth ? 'Use email/password instead' : 'Use OAuth instead' }}\n </a>\n </div>\n }\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Register Link -->\n @if (allowTenantCreation) {\n <div class=\"register-link\">\n {{ registerLinkText }}\n <a href=\"#\" (click)=\"onCreateTenantClick($event)\">{{ registerLinkAction }}</a>\n </div>\n }\n } @else {\n <!-- Step 2: Tenant Selection -->\n <h2 class=\"login-title\">{{ tenantSelectorTitle }}</h2>\n\n @if (userName) {\n <div class=\"welcome-message\">\n Welcome back, <strong>{{ userName }}</strong>!\n </div>\n }\n\n <p class=\"selector-description\">{{ tenantSelectorDescription }}</p>\n\n <div class=\"tenant-list\">\n @for (membership of memberships; track membership.tenant_id) {\n <div\n class=\"tenant-item\"\n [class.selected]=\"selectedTenantId === membership.tenant_id\"\n (click)=\"selectTenantItem(membership.tenant_id)\">\n <div class=\"tenant-radio\">\n <input\n type=\"radio\"\n [checked]=\"selectedTenantId === membership.tenant_id\"\n [name]=\"'tenant-' + membership.tenant_id\"\n [id]=\"'tenant-' + membership.tenant_id\">\n </div>\n <div class=\"tenant-info\">\n <div class=\"tenant-name\">{{ membership.name }}</div>\n <div class=\"tenant-meta\">\n <span class=\"tenant-role\">{{ formatRole(membership.role) }}</span>\n @if (membership.last_accessed) {\n <span class=\"tenant-separator\">·</span>\n <span class=\"tenant-last-accessed\">\n Last accessed {{ formatLastAccessed(membership.last_accessed) }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <button\n type=\"button\"\n (click)=\"onContinueWithTenant()\"\n [disabled]=\"!selectedTenantId || loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Loading...' : continueButtonText }}\n </button>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Create New Tenant Link -->\n @if (allowTenantCreation) {\n <div class=\"create-tenant-link\">\n {{ createTenantLinkText }}\n <a href=\"#\" (click)=\"onCreateTenantClick($event)\">{{ createTenantLinkAction }}</a>\n </div>\n }\n }\n\n <!-- Loading Overlay -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n </div>\n `,\n styles: [`\n .tenant-login-dialog {\n padding: 24px;\n max-width: 450px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .welcome-message {\n margin-bottom: 16px;\n padding: 12px;\n background: #e8f5e9;\n border-radius: 4px;\n text-align: center;\n font-size: 14px;\n color: #2e7d32;\n }\n\n .selector-description {\n margin-bottom: 20px;\n font-size: 14px;\n color: #666;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .switch-method {\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n }\n\n .switch-method a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .switch-method a:hover {\n text-decoration: underline;\n }\n\n .tenant-list {\n margin-bottom: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .tenant-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border: 2px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .tenant-item:hover {\n border-color: #4285f4;\n background: #f8f9ff;\n }\n\n .tenant-item.selected {\n border-color: #4285f4;\n background: #e8f0fe;\n }\n\n .tenant-radio {\n flex-shrink: 0;\n padding-top: 2px;\n }\n\n .tenant-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .tenant-info {\n flex: 1;\n }\n\n .tenant-name {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 4px;\n }\n\n .tenant-meta {\n font-size: 13px;\n color: #666;\n }\n\n .tenant-role {\n font-weight: 500;\n color: #4285f4;\n }\n\n .tenant-separator {\n margin: 0 6px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n\n .create-tenant-link {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e0e0e0;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .create-tenant-link a {\n color: #4285f4;\n text-decoration: none;\n font-weight: 500;\n }\n\n .create-tenant-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class TenantLoginComponent implements OnInit {\n // Component Configuration\n @Input() title: string = 'Sign In';\n @Input() providers: AuthProvider[] = ['google'];\n @Input() showTenantSelector: boolean = true;\n @Input() autoSelectSingleTenant: boolean = true;\n @Input() allowTenantCreation: boolean = true;\n\n // Tenant Selector Labels\n @Input() tenantSelectorTitle: string = 'Select Organization';\n @Input() tenantSelectorDescription: string = 'Choose which organization you want to access:';\n @Input() continueButtonText: string = 'Continue';\n\n // Link Labels\n @Input() registerLinkText: string = \"Don't have an account?\";\n @Input() registerLinkAction: string = 'Sign up';\n @Input() createTenantLinkText: string = \"Don't see your organization?\";\n @Input() createTenantLinkAction: string = 'Create New Organization';\n\n // Outputs\n @Output() tenantSelected = new EventEmitter<TenantSelectedEvent>();\n @Output() createTenant = new EventEmitter<void>();\n\n // Form Fields\n email = '';\n password = '';\n\n // State\n error = '';\n loading = false;\n useOAuth = true;\n oauthProviders: AuthProvider[] = [];\n\n // Tenant Selection State\n showingTenantSelector = false;\n memberships: TenantMembership[] = [];\n selectedTenantId: string | null = null;\n userName: string = '';\n\n constructor(private auth: AuthService) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified.';\n throw new Error('TenantLoginComponent requires providers input.');\n }\n\n this.oauthProviders = this.providers.filter(p => p !== 'emailPassword');\n\n // If only emailPassword is available, use it by default\n if (this.oauthProviders.length === 0 && this.isProviderEnabled('emailPassword')) {\n this.useOAuth = false;\n }\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n const labels: Record<AuthProvider, string> = {\n google: 'Sign in with Google',\n linkedin: 'Sign in with LinkedIn',\n apple: 'Sign in with Apple',\n microsoft: 'Sign in with Microsoft',\n github: 'Sign in with GitHub',\n emailPassword: 'Sign in with Email'\n };\n return labels[provider];\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return undefined;\n }\n\n toggleAuthMethod(event: Event) {\n event.preventDefault();\n this.useOAuth = !this.useOAuth;\n this.error = '';\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n\n if (!result.success) {\n this.error = result.message || 'Login failed';\n return;\n }\n\n // Authentication successful, now handle tenant selection\n await this.handlePostAuthFlow();\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n return;\n }\n\n // Authentication successful, now handle tenant selection\n await this.handlePostAuthFlow();\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async handlePostAuthFlow() {\n if (!this.showTenantSelector) {\n // Tenant selection is disabled, emit event immediately\n this.tenantSelected.emit({\n tenantId: '',\n tenantSlug: '',\n role: ''\n });\n return;\n }\n\n // Fetch user's tenant memberships\n this.loading = true;\n\n try {\n const result = await this.auth.getTenantMemberships();\n\n if (!result.memberships || result.memberships.length === 0) {\n // User has no tenants, prompt to create one\n this.error = 'You are not a member of any organization. Please create one.';\n if (this.allowTenantCreation) {\n setTimeout(() => this.createTenant.emit(), 2000);\n }\n return;\n }\n\n this.memberships = result.memberships;\n\n // Get user name if available\n const currentUser = this.auth.getCurrentUser();\n if (currentUser) {\n this.userName = currentUser.display_name || currentUser.email;\n }\n\n // Auto-select if user has only one tenant\n if (this.memberships.length === 1 && this.autoSelectSingleTenant) {\n await this.selectAndContinue(this.memberships[0]);\n } else {\n // Show tenant selector\n this.showingTenantSelector = true;\n }\n } catch (err: any) {\n this.error = err.message || 'Failed to load organizations';\n } finally {\n this.loading = false;\n }\n }\n\n selectTenantItem(tenantId: string) {\n this.selectedTenantId = tenantId;\n }\n\n async onContinueWithTenant() {\n if (!this.selectedTenantId) {\n this.error = 'Please select an organization';\n return;\n }\n\n const membership = this.memberships.find(m => m.tenant_id === this.selectedTenantId);\n if (!membership) {\n this.error = 'Selected organization not found';\n return;\n }\n\n await this.selectAndContinue(membership);\n }\n\n async selectAndContinue(membership: TenantMembership) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.selectTenant(membership.tenant_id);\n\n if (!result.success) {\n this.error = result.message || 'Failed to select organization';\n return;\n }\n\n // Emit tenant selected event\n this.tenantSelected.emit({\n tenantId: membership.tenant_id,\n tenantSlug: membership.slug,\n role: membership.role\n });\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1);\n }\n\n formatLastAccessed(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return `${Math.floor(diffDays / 30)} months ago`;\n } catch {\n return dateStr;\n }\n }\n\n onCreateTenantClick(event: Event) {\n event.preventDefault();\n this.createTenant.emit();\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\n\nexport interface TenantCreatedEvent {\n tenant: { id: string; name: string; slug: string };\n user: { id: string; email: string; name: string };\n}\n\n@Component({\n selector: 'lib-tenant-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"tenant-register-dialog\">\n <h2 class=\"register-title\">{{ title }}</h2>\n\n <!-- Ownership Warning Message -->\n <div class=\"warning-box\">\n <div class=\"warning-icon\">⚠️</div>\n <div class=\"warning-content\">\n <strong>{{ ownershipTitle }}</strong>\n <p>{{ ownershipMessage }}</p>\n </div>\n </div>\n\n <form (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <!-- Tenant Information Section -->\n <div class=\"section-header\">{{ tenantSectionTitle }}</div>\n\n <div class=\"form-group\">\n <label for=\"tenantName\">{{ tenantNameLabel }} *</label>\n <input\n id=\"tenantName\"\n [(ngModel)]=\"tenantName\"\n name=\"tenantName\"\n [placeholder]=\"tenantNamePlaceholder\"\n type=\"text\"\n required\n (input)=\"onTenantNameChange()\"\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"tenantSlug\">{{ tenantSlugLabel }} *</label>\n <input\n id=\"tenantSlug\"\n [(ngModel)]=\"tenantSlug\"\n name=\"tenantSlug\"\n [placeholder]=\"tenantSlugPlaceholder\"\n type=\"text\"\n required\n pattern=\"[a-z0-9-]+\"\n (blur)=\"checkSlugAvailability()\"\n class=\"form-control\"\n [class.input-error]=\"slugError\"\n [class.input-success]=\"slugAvailable && tenantSlug\">\n @if (tenantSlug && urlPreviewEnabled) {\n <small class=\"form-hint\">\n {{ urlPreviewPrefix }}{{ tenantSlug }}\n @if (checkingSlug) {\n <span class=\"checking\">Checking...</span>\n }\n @if (slugAvailable && !checkingSlug) {\n <span class=\"available\">✓ Available</span>\n }\n @if (slugError) {\n <span class=\"error-text\">{{ slugError }}</span>\n }\n </small>\n }\n </div>\n\n <!-- User Information Section -->\n <div class=\"section-header\">{{ userSectionTitle }}</div>\n\n <!-- OAuth Providers (Primary Option) -->\n @if (oauthProviders.length > 0 && !useEmailPassword) {\n <div class=\"oauth-section\">\n <p class=\"oauth-description\">{{ oauthDescription }}</p>\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n type=\"button\"\n (click)=\"onOAuthRegister(provider)\"\n [disabled]=\"loading || !isFormValid()\"\n class=\"btn btn-oauth btn-{{ provider }}\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n </div>\n\n <!-- Switch to Email/Password -->\n @if (isProviderEnabled('emailPassword')) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n {{ useEmailPassword ? 'Use OAuth instead' : 'Use email/password instead' }}\n </a>\n </div>\n }\n }\n\n <!-- Email/Password Form (Fallback or Manual Entry) -->\n @if (useEmailPassword || oauthProviders.length === 0) {\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name *</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email *</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"password\">Password *</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n type=\"password\"\n required\n minlength=\"8\"\n class=\"form-control\">\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group\">\n <label for=\"confirmPassword\">Confirm Password *</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n type=\"password\"\n required\n class=\"form-control\">\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading || !isFormValid()\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating...' : submitButtonText }}\n </button>\n\n <!-- Switch to OAuth -->\n @if (oauthProviders.length > 0) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n Use OAuth instead\n </a>\n </div>\n }\n }\n </form>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading Overlay -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n <p class=\"loading-text\">{{ loadingText }}</p>\n </div>\n }\n\n <!-- Login Link -->\n <div class=\"login-link\">\n {{ loginLinkText }}\n <a href=\"#\" (click)=\"onLoginClick($event)\">{{ loginLinkAction }}</a>\n </div>\n </div>\n `,\n styles: [`\n .tenant-register-dialog {\n padding: 24px;\n max-width: 500px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 20px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .warning-box {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 6px;\n margin-bottom: 24px;\n }\n\n .warning-icon {\n font-size: 24px;\n line-height: 1;\n }\n\n .warning-content {\n flex: 1;\n }\n\n .warning-content strong {\n display: block;\n margin-bottom: 4px;\n color: #856404;\n font-size: 14px;\n }\n\n .warning-content p {\n margin: 0;\n color: #856404;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .section-header {\n font-size: 16px;\n font-weight: 600;\n margin: 20px 0 12px 0;\n padding-bottom: 8px;\n border-bottom: 2px solid #e0e0e0;\n color: #333;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-control.input-error {\n border-color: #dc3545;\n }\n\n .form-control.input-success {\n border-color: #28a745;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .form-hint .checking {\n color: #666;\n }\n\n .form-hint .available {\n color: #28a745;\n font-weight: 500;\n }\n\n .form-hint .error-text {\n color: #dc3545;\n }\n\n .oauth-section {\n margin: 16px 0;\n }\n\n .oauth-description {\n margin-bottom: 12px;\n font-size: 14px;\n color: #666;\n text-align: center;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s, opacity 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .switch-method {\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n }\n\n .switch-method a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .switch-method a:hover {\n text-decoration: underline;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .loading-text {\n margin: 0;\n font-size: 14px;\n color: #666;\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class TenantRegisterComponent implements OnInit {\n // Component Configuration\n @Input() title: string = 'Create New Organization';\n @Input() providers: AuthProvider[] = ['google'];\n @Input() requireTenantName: boolean = true;\n\n // Tenant Labels\n @Input() tenantSectionTitle: string = 'Organization Information';\n @Input() tenantNameLabel: string = 'Organization Name';\n @Input() tenantNamePlaceholder: string = 'Enter your organization name';\n @Input() tenantSlugLabel: string = 'Organization URL';\n @Input() tenantSlugPlaceholder: string = 'organization-name';\n @Input() urlPreviewEnabled: boolean = true;\n @Input() urlPreviewPrefix: string = 'medstoreapp.in/';\n\n // User Labels\n @Input() userSectionTitle: string = 'Your Information';\n @Input() oauthDescription: string = 'Recommended: Sign up with your Google account';\n\n // Warning Message\n @Input() ownershipTitle: string = 'CREATING A NEW ORGANIZATION';\n @Input() ownershipMessage: string = 'You are registering as an organization owner. This will create a new organization that you will manage. If you are an employee, DO NOT use this form. Ask your organization owner to invite you, then use the Login page.';\n\n // Buttons and Links\n @Input() submitButtonText: string = 'Create Organization';\n @Input() loginLinkText: string = 'Already have an account?';\n @Input() loginLinkAction: string = 'Sign in';\n\n // Outputs\n @Output() tenantCreated = new EventEmitter<TenantCreatedEvent>();\n @Output() navigateToLogin = new EventEmitter<void>();\n\n // Form Fields\n tenantName = '';\n tenantSlug = '';\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n\n // State\n error = '';\n success = '';\n loading = false;\n loadingText = 'Creating your organization...';\n checkingSlug = false;\n slugAvailable = false;\n slugError = '';\n useEmailPassword = false;\n oauthProviders: AuthProvider[] = [];\n\n constructor(private auth: AuthService) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified.';\n throw new Error('TenantRegisterComponent requires providers input.');\n }\n\n this.oauthProviders = this.providers.filter(p => p !== 'emailPassword');\n\n // If only emailPassword is available, show it by default\n if (this.oauthProviders.length === 0 && this.isProviderEnabled('emailPassword')) {\n this.useEmailPassword = true;\n }\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n const labels: Record<AuthProvider, string> = {\n google: 'Sign up with Google',\n linkedin: 'Sign up with LinkedIn',\n apple: 'Sign up with Apple',\n microsoft: 'Sign up with Microsoft',\n github: 'Sign up with GitHub',\n emailPassword: 'Sign up with Email'\n };\n return labels[provider];\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return undefined;\n }\n\n onTenantNameChange() {\n // Auto-generate slug from tenant name\n if (this.tenantName) {\n const slug = this.tenantName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n this.tenantSlug = slug;\n this.slugError = '';\n this.slugAvailable = false;\n }\n }\n\n async checkSlugAvailability() {\n if (!this.tenantSlug || this.tenantSlug.length < 3) {\n this.slugError = 'Slug must be at least 3 characters';\n return;\n }\n\n if (!/^[a-z0-9-]+$/.test(this.tenantSlug)) {\n this.slugError = 'Only lowercase letters, numbers, and hyphens allowed';\n return;\n }\n\n this.checkingSlug = true;\n this.slugError = '';\n\n try {\n const result = await this.auth.checkTenantSlugAvailable(this.tenantSlug);\n\n if (result.available) {\n this.slugAvailable = true;\n } else {\n this.slugError = 'This URL is already taken';\n if (result.suggestion) {\n this.slugError += `. Try: ${result.suggestion}`;\n }\n }\n } catch (err) {\n // Slug check failed, but don't block registration\n console.warn('Slug availability check failed:', err);\n } finally {\n this.checkingSlug = false;\n }\n }\n\n toggleAuthMethod(event: Event) {\n event.preventDefault();\n this.useEmailPassword = !this.useEmailPassword;\n this.error = '';\n }\n\n isFormValid(): boolean {\n // Tenant information must be valid\n if (!this.tenantName || !this.tenantSlug) {\n return false;\n }\n\n if (this.slugError) {\n return false;\n }\n\n // If using email/password, check those fields\n if (this.useEmailPassword) {\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n return false;\n }\n\n if (this.password.length < 8) {\n return false;\n }\n\n if (this.password !== this.confirmPassword) {\n return false;\n }\n }\n\n return true;\n }\n\n async onOAuthRegister(provider: AuthProvider) {\n if (!this.isFormValid()) {\n this.error = 'Please complete the organization information';\n return;\n }\n\n this.loading = true;\n this.loadingText = `Signing up with ${provider}...`;\n this.error = '';\n\n try {\n const result = await this.auth.registerTenant({\n tenantName: this.tenantName,\n tenantSlug: this.tenantSlug,\n provider: provider\n });\n\n if (result.success && result.tenant && result.user) {\n this.success = 'Organization created successfully!';\n this.tenantCreated.emit({\n tenant: result.tenant,\n user: result.user\n });\n } else {\n this.error = result.message || 'Registration failed';\n }\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onRegister() {\n if (!this.isFormValid()) {\n this.error = 'Please fill in all required fields correctly';\n return;\n }\n\n this.loading = true;\n this.loadingText = 'Creating your organization...';\n this.error = '';\n this.success = '';\n\n try {\n const result = await this.auth.registerTenant({\n tenantName: this.tenantName,\n tenantSlug: this.tenantSlug,\n displayName: this.displayName,\n email: this.email,\n password: this.password,\n provider: 'emailPassword'\n });\n\n if (result.success && result.tenant && result.user) {\n this.success = 'Organization created successfully!';\n this.tenantCreated.emit({\n tenant: result.tenant,\n user: result.user\n });\n } else {\n this.error = result.message || 'Registration failed';\n }\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n this.navigateToLogin.emit();\n }\n}\n","import { Component, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantLoginComponent, TenantSelectedEvent } from './tenant-login.component';\nimport { AuthProvider } from '../../auth.service';\n\n/**\n * Dialog wrapper for TenantLoginComponent\n *\n * Usage with Angular Material Dialog:\n * ```typescript\n * const dialogRef = this.dialog.open(TenantLoginDialogComponent, {\n * width: '450px',\n * data: {\n * providers: ['google'],\n * showTenantSelector: true\n * }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * if (result && result.tenantId) {\n * console.log('Logged in to tenant:', result.tenantSlug);\n * // Redirect to dashboard\n * }\n * });\n * ```\n *\n * Usage with custom dialog service:\n * ```typescript\n * const dialog = this.dialogService.open(TenantLoginDialogComponent, {\n * providers: ['google', 'emailPassword'],\n * autoSelectSingleTenant: true\n * });\n * ```\n */\n@Component({\n selector: 'lib-tenant-login-dialog',\n standalone: true,\n imports: [CommonModule, TenantLoginComponent],\n template: `\n <div class=\"dialog-wrapper\">\n <lib-tenant-login\n [title]=\"data?.title || 'Sign In'\"\n [providers]=\"data?.providers || ['google']\"\n [showTenantSelector]=\"data?.showTenantSelector !== false\"\n [autoSelectSingleTenant]=\"data?.autoSelectSingleTenant !== false\"\n [allowTenantCreation]=\"data?.allowTenantCreation !== false\"\n [tenantSelectorTitle]=\"data?.tenantSelectorTitle || 'Select Organization'\"\n [tenantSelectorDescription]=\"data?.tenantSelectorDescription || 'Choose which organization you want to access:'\"\n [continueButtonText]=\"data?.continueButtonText || 'Continue'\"\n [registerLinkText]=\"data?.registerLinkText || 'Don\\\\'t have an account?'\"\n [registerLinkAction]=\"data?.registerLinkAction || 'Sign up'\"\n [createTenantLinkText]=\"data?.createTenantLinkText || 'Don\\\\'t see your organization?'\"\n [createTenantLinkAction]=\"data?.createTenantLinkAction || 'Create New Organization'\"\n (tenantSelected)=\"onTenantSelected($event)\"\n (createTenant)=\"onCreateTenant()\">\n </lib-tenant-login>\n </div>\n `,\n styles: [`\n .dialog-wrapper {\n padding: 0;\n }\n `]\n})\nexport class TenantLoginDialogComponent {\n data: any;\n dialogRef: any;\n\n constructor(\n @Optional() @Inject('DIALOG_DATA') injectedData?: any,\n @Optional() @Inject('DIALOG_REF') injectedDialogRef?: any\n ) {\n // Support both Angular Material Dialog and custom dialog implementations\n this.data = injectedData || {};\n this.dialogRef = injectedDialogRef;\n }\n\n onTenantSelected(event: TenantSelectedEvent) {\n // Close dialog and return the selected tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close(event);\n }\n }\n\n onCreateTenant() {\n // Close dialog and signal that user wants to create a tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close({ action: 'create_tenant' });\n }\n }\n}\n","import { Component, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantRegisterComponent, TenantCreatedEvent } from './tenant-register.component';\nimport { AuthProvider } from '../../auth.service';\n\n/**\n * Dialog wrapper for TenantRegisterComponent\n *\n * Usage with Angular Material Dialog:\n * ```typescript\n * const dialogRef = this.dialog.open(TenantRegisterDialogComponent, {\n * width: '500px',\n * data: {\n * providers: ['google'],\n * tenantNameLabel: 'Store Name'\n * }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * if (result && result.tenant) {\n * console.log('Tenant created:', result.tenant);\n * }\n * });\n * ```\n *\n * Usage with custom dialog service:\n * ```typescript\n * const dialog = this.dialogService.open(TenantRegisterDialogComponent, {\n * providers: ['google', 'emailPassword']\n * });\n * ```\n */\n@Component({\n selector: 'lib-tenant-register-dialog',\n standalone: true,\n imports: [CommonModule, TenantRegisterComponent],\n template: `\n <div class=\"dialog-wrapper\">\n <lib-tenant-register\n [title]=\"data?.title || 'Create New Organization'\"\n [providers]=\"data?.providers || ['google']\"\n [requireTenantName]=\"data?.requireTenantName !== false\"\n [tenantSectionTitle]=\"data?.tenantSectionTitle || 'Organization Information'\"\n [tenantNameLabel]=\"data?.tenantNameLabel || 'Organization Name'\"\n [tenantNamePlaceholder]=\"data?.tenantNamePlaceholder || 'Enter your organization name'\"\n [tenantSlugLabel]=\"data?.tenantSlugLabel || 'Organization URL'\"\n [tenantSlugPlaceholder]=\"data?.tenantSlugPlaceholder || 'organization-name'\"\n [urlPreviewEnabled]=\"data?.urlPreviewEnabled !== false\"\n [urlPreviewPrefix]=\"data?.urlPreviewPrefix || 'app.example.com/'\"\n [userSectionTitle]=\"data?.userSectionTitle || 'Your Information'\"\n [oauthDescription]=\"data?.oauthDescription || 'Recommended: Sign up with your Google account'\"\n [ownershipTitle]=\"data?.ownershipTitle || 'CREATING A NEW ORGANIZATION'\"\n [ownershipMessage]=\"data?.ownershipMessage || 'You are registering as an organization owner. If you are an employee, use Login instead.'\"\n [submitButtonText]=\"data?.submitButtonText || 'Create Organization'\"\n [loginLinkText]=\"data?.loginLinkText || 'Already have an account?'\"\n [loginLinkAction]=\"data?.loginLinkAction || 'Sign in'\"\n (tenantCreated)=\"onTenantCreated($event)\"\n (navigateToLogin)=\"onNavigateToLogin()\">\n </lib-tenant-register>\n </div>\n `,\n styles: [`\n .dialog-wrapper {\n padding: 0;\n }\n `]\n})\nexport class TenantRegisterDialogComponent {\n data: any;\n dialogRef: any;\n\n constructor(\n @Optional() @Inject('DIALOG_DATA') injectedData?: any,\n @Optional() @Inject('DIALOG_REF') injectedDialogRef?: any\n ) {\n // Support both Angular Material Dialog and custom dialog implementations\n this.data = injectedData || {};\n this.dialogRef = injectedDialogRef;\n }\n\n onTenantCreated(event: TenantCreatedEvent) {\n // Close dialog and return the created tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close(event);\n }\n }\n\n onNavigateToLogin() {\n // Close dialog without result (user wants to login instead)\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close({ action: 'navigate_to_login' });\n }\n }\n}\n","/*\n * Public API Surface of ngx-stonescriptphp-client\n */\n\nexport * from './api-connection.service';\nexport * from './auth.service';\nexport * from './db.service';\nexport * from './signin-status.service';\nexport * from './token.service';\nexport * from './csrf.service';\nexport * from './api-response.model';\nexport * from './my-environment.model';\nexport * from './ngx-stonescriptphp-client.module';\n\n// UI Components - Embeddable (standalone components)\nexport * from './lib/components/login-dialog.component';\nexport * from './lib/components/register.component';\nexport * from './lib/components/tenant-login.component';\nexport * from './lib/components/tenant-register.component';\n\n// UI Components - Dialog/Modal wrappers\nexport * from './lib/components/tenant-login-dialog.component';\nexport * from './lib/components/tenant-register-dialog.component';\n\n// Re-export types for convenience\nexport type { AuthProvider, User, AuthResult } from './auth.service';\nexport { VerifyStatus } from './signin-status.service';\n\n// Multi-tenant types\nexport type { TenantMembership, TenantSelectedEvent } from './lib/components/tenant-login.component';\nexport type { TenantCreatedEvent } from './lib/components/tenant-register.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TokenService","i2.SigninStatusService","i3.MyEnvironmentModel","i4.CsrfService","i1.AuthService"],"mappings":"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"}
|