@thetechfossil/auth2 1.2.14 → 1.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.components.d.mts +247 -0
- package/dist/index.components.d.ts +1 -1
- package/dist/index.components.js +46 -88
- package/dist/index.components.js.map +1 -1
- package/dist/index.components.mjs +46 -88
- package/dist/index.components.mjs.map +1 -1
- package/dist/index.d.mts +558 -0
- package/dist/index.d.ts +3 -33
- package/dist/index.js +51 -93
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -88
- package/dist/index.mjs.map +1 -1
- package/dist/index.next.d.mts +530 -0
- package/dist/index.next.d.ts +1 -1
- package/dist/index.next.js +46 -88
- package/dist/index.next.js.map +1 -1
- package/dist/index.next.mjs +47 -89
- package/dist/index.next.mjs.map +1 -1
- package/dist/index.next.server.d.mts +272 -0
- package/dist/index.next.server.d.ts +1 -1
- package/dist/index.next.server.js +7 -11
- package/dist/index.next.server.js.map +1 -1
- package/dist/index.next.server.mjs +7 -11
- package/dist/index.next.server.mjs.map +1 -1
- package/dist/index.node.d.mts +227 -0
- package/dist/index.node.d.ts +1 -1
- package/dist/index.node.js +3 -5
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +3 -5
- package/dist/index.node.mjs.map +1 -1
- package/package.json +101 -102
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/http-client.ts","../src/core/auth-service.ts","../src/react/AuthProvider.tsx","../src/react/ThemeContext.tsx","../src/react/components/LoginForm.tsx","../src/react/use-auth.ts","../src/react/hooks/useThemeColors.ts","../src/react/components/PhoneInput.tsx","../src/react/components/RegisterForm.tsx","../src/react/components/OtpForm.tsx","../src/react/components/AuthFlow.tsx","../src/react/components/EmailVerificationPage.tsx","../src/react/components/SignIn.tsx","../src/react/components/ThemeWrapper.tsx","../src/react/components/SignUp.tsx","../src/react/components/SignOut.tsx","../src/react/components/UserButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/PublicRoute.tsx","../src/react/components/VerifyEmail.tsx","../src/react/components/ForgotPassword.tsx","../src/react/components/ResetPassword.tsx","../src/react/components/ChangePassword.tsx","../src/react/components/UserProfile.tsx","../src/react/components/AvatarUploader.tsx","../src/react/components/AvatarManager.tsx","../src/index.ts","../src/react/index.ts","../src/node/index.ts","../src/node/auth-client.ts"],"names":["createContext","useContext","useState","useEffect","jsx","useCallback","useAuth","React","jsxs","email","colors","Fragment","error","ImageManager","UpfilesClient"],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/$/, '');\r\n\r\n this.axiosInstance = axios.create({\r\n baseURL: this.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n async (config) => {\r\n // Fetch CSRF token lazily on first mutating request (only on client side)\r\n const isMutatingRequest = ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '');\r\n if (isMutatingRequest && !this.csrfToken && typeof window !== 'undefined') {\r\n try {\r\n await this.refreshCsrfToken();\r\n } catch (error) {\r\n console.warn('Failed to fetch CSRF token:', error);\r\n }\r\n }\r\n\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && isMutatingRequest) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n\r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n\r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\nimport { UpfilesClient } from '@thetechfossil/upfiles';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n private upfilesClient: UpfilesClient | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize upfiles client if config is provided\r\n if (this.config.upfilesConfig) {\r\n this.upfilesClient = new UpfilesClient({\r\n baseUrl: this.config.upfilesConfig.baseUrl,\r\n apiKey: this.config.upfilesConfig.apiKey,\r\n apiKeyHeader: this.config.upfilesConfig.apiKeyHeader,\r\n presignUrl: this.config.upfilesConfig.presignUrl,\r\n presignPath: this.config.upfilesConfig.presignPath,\r\n });\r\n }\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // CSRF token will be fetched lazily on first mutating request\r\n // This prevents SSR issues and ensures proper initialization\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async uploadAndUpdateAvatar(file: File): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n if (!this.upfilesClient) {\r\n throw new Error('Upfiles configuration is required. Please provide upfilesConfig in AuthConfig.');\r\n }\r\n\r\n try {\r\n // Upload file using upfiles SDK\r\n const folderPath = this.config.upfilesConfig?.folderPath || 'avatars/';\r\n const uploadResult = await this.upfilesClient.upload(file, {\r\n folderPath,\r\n fetchThumbnails: true,\r\n });\r\n\r\n // Update user avatar with the uploaded file URL\r\n const response = await this.updateAvatar(uploadResult.publicUrl);\r\n \r\n return response;\r\n } catch (error: any) {\r\n throw new Error(`Failed to upload avatar: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n public getUpfilesClient(): UpfilesClient | null {\r\n return this.upfilesClient;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { User, AuthConfig, AuthResponse, LoginData, RegisterData, VerifyData, UpdateUserData, OAuthProvider } from '../types';\r\nimport { AuthThemeProvider } from './ThemeContext';\r\n\r\ninterface AuthContextValue {\r\n user: User | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n loading: boolean;\r\n signIn: (data: LoginData) => Promise<AuthResponse>;\r\n signUp: (data: RegisterData) => Promise<AuthResponse>;\r\n signOut: () => Promise<void>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n signInWithOAuth: (provider: OAuthProvider) => void;\r\n linkOAuthProvider: (provider: OAuthProvider) => void;\r\n unlinkOAuthProvider: (provider: OAuthProvider) => Promise<AuthResponse>;\r\n forgotPassword: (email: string) => Promise<AuthResponse>;\r\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\r\n changePassword: (oldPassword: string, newPassword: string) => Promise<AuthResponse>;\r\n updateAvatar: (avatar: string) => Promise<AuthResponse>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n requestEmailChange: (newEmail: string) => Promise<AuthResponse>;\r\n verifyEmailChange: (token: string) => Promise<AuthResponse>;\r\n generate2FA: () => Promise<any>;\r\n enable2FA: (token: string) => Promise<AuthResponse>;\r\n disable2FA: (token: string) => Promise<AuthResponse>;\r\n validate2FA: (token: string) => Promise<AuthResponse>;\r\n getSessions: () => Promise<any>;\r\n revokeSession: (sessionId: string) => Promise<AuthResponse>;\r\n revokeAllSessions: () => Promise<AuthResponse>;\r\n authService: AuthService;\r\n}\r\n\r\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n config?: Partial<AuthConfig>;\r\n}\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({ children, config }) => {\r\n // Get configuration from environment variables or props\r\n const authConfig: AuthConfig = {\r\n baseUrl: config?.baseUrl || \r\n (typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || process.env.REACT_APP_AUTH_API_URL || 'http://localhost:7000')\r\n : 'http://localhost:7000'),\r\n localStorageKey: config?.localStorageKey || 'auth_token',\r\n csrfEnabled: config?.csrfEnabled !== undefined ? config.csrfEnabled : true,\r\n upfilesConfig: config?.upfilesConfig,\r\n };\r\n\r\n const [authService] = useState(() => new AuthService(authConfig));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const checkAuthStatus = useCallback(async () => {\r\n const authenticated = authService.isAuthenticated();\r\n \r\n if (authenticated) {\r\n try {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } catch (error) {\r\n console.error('Failed to get current user:', error);\r\n setUser(null);\r\n }\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setIsLoaded(true);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const signIn = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signUp = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signOut = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signInWithOAuth = useCallback((provider: OAuthProvider) => {\r\n authService.loginWithOAuth(provider);\r\n }, [authService]);\r\n\r\n const linkOAuthProvider = useCallback((provider: OAuthProvider) => {\r\n authService.linkOAuthProvider(provider);\r\n }, [authService]);\r\n\r\n const unlinkOAuthProvider = useCallback(async (provider: OAuthProvider): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.unlinkOAuthProvider(provider);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.forgotPassword(email);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.resetPassword(token, password);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const changePassword = useCallback(async (oldPassword: string, newPassword: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.changePassword(oldPassword, newPassword);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateAvatar = useCallback(async (avatar: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateAvatar(avatar);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const requestEmailChange = useCallback(async (newEmail: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.requestEmailChange(newEmail);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailChange = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailChange(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const generate2FA = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.generate2FA();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const enable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.enable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const disable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.disable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const validate2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.validate2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getSessions = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.getSessions();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeSession = useCallback(async (sessionId: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.revokeSession(sessionId);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeAllSessions = useCallback(async (): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.revokeAllSessions();\r\n setUser(null);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const value: AuthContextValue = {\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n loading,\r\n signIn,\r\n signUp,\r\n signOut,\r\n verify,\r\n verifyEmailToken,\r\n updateProfile,\r\n getProfile,\r\n signInWithOAuth,\r\n linkOAuthProvider,\r\n unlinkOAuthProvider,\r\n forgotPassword,\r\n resetPassword,\r\n changePassword,\r\n updateAvatar,\r\n uploadAndUpdateAvatar,\r\n requestEmailChange,\r\n verifyEmailChange,\r\n generate2FA,\r\n enable2FA,\r\n disable2FA,\r\n validate2FA,\r\n getSessions,\r\n revokeSession,\r\n revokeAllSessions,\r\n authService,\r\n };\r\n\r\n return (\r\n <AuthContext.Provider value={value}>\r\n <AuthThemeProvider>\r\n {children}\r\n </AuthThemeProvider>\r\n </AuthContext.Provider>\r\n );\r\n};\r\n\r\nexport const useAuth = (): AuthContextValue => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n return context;\r\n};\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useEffect, useState, ReactNode } from 'react';\r\n\r\ntype Theme = 'light' | 'dark';\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mounted: boolean;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({ theme: 'light', mounted: false });\r\n\r\nexport function AuthThemeProvider({ children }: { children: ReactNode }) {\r\n const [theme, setTheme] = useState<Theme>('light');\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n // Detect theme from parent app\r\n const detectTheme = () => {\r\n // Check if parent has theme class on html/body\r\n const htmlElement = document.documentElement;\r\n const bodyElement = document.body;\r\n \r\n if (htmlElement.classList.contains('dark') || bodyElement.classList.contains('dark')) {\r\n return 'dark';\r\n }\r\n \r\n if (htmlElement.classList.contains('light') || bodyElement.classList.contains('light')) {\r\n return 'light';\r\n }\r\n \r\n // Check data-theme attribute\r\n const dataTheme = htmlElement.getAttribute('data-theme') || bodyElement.getAttribute('data-theme');\r\n if (dataTheme === 'dark' || dataTheme === 'light') {\r\n return dataTheme as Theme;\r\n }\r\n \r\n // Check prefers-color-scheme\r\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n \r\n return 'light';\r\n };\r\n\r\n const updateTheme = () => {\r\n const detectedTheme = detectTheme();\r\n setTheme(detectedTheme);\r\n };\r\n\r\n // Initial detection\r\n updateTheme();\r\n setMounted(true);\r\n\r\n // Watch for theme changes using MutationObserver\r\n const observer = new MutationObserver(updateTheme);\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n\r\n // Watch for prefers-color-scheme changes\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handleMediaChange = () => updateTheme();\r\n mediaQuery.addEventListener('change', handleMediaChange);\r\n\r\n return () => {\r\n observer.disconnect();\r\n mediaQuery.removeEventListener('change', handleMediaChange);\r\n };\r\n }, []);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, mounted }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAuthTheme() {\r\n return useContext(ThemeContext);\r\n}\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface LoginFormProps {\r\n onSuccess?: (response: { message: string; email?: string; token?: string; success: boolean; user?: any }) => void;\r\n onLoginSuccess?: (email: string, needsOtpVerification: boolean) => void; // For backward compatibility\r\n onRegisterClick?: () => void;\r\n showRegisterLink?: boolean;\r\n config?: {\r\n baseUrl?: string;\r\n };\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n}\r\n\r\nexport const LoginForm: React.FC<LoginFormProps> = ({\r\n onSuccess,\r\n onLoginSuccess,\r\n onRegisterClick,\r\n showRegisterLink = true,\r\n config,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true\r\n}) => {\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [password, setPassword] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rememberMe, setRememberMe] = useState(false);\r\n\r\n const { login } = useAuth({\r\n baseUrl: config?.baseUrl || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n let response;\r\n const loginData: any = {};\r\n \r\n // Add email or phone number\r\n if (usePhone && phoneNumber) {\r\n loginData.phoneNumber = phoneNumber;\r\n } else if (email) {\r\n loginData.email = email;\r\n }\r\n \r\n if (usePassword) {\r\n // Traditional email/password or phone/password login\r\n loginData.password = password;\r\n response = await login(loginData);\r\n } else {\r\n // OTP-based login\r\n response = await login(loginData);\r\n }\r\n\r\n if (response.success) {\r\n // Call the new callback if provided\r\n onSuccess?.(response);\r\n\r\n // For backward compatibility, call the old callback if provided\r\n if (onLoginSuccess) {\r\n const identifier = usePhone ? phoneNumber : email;\r\n // Check if this is an OTP sent response or a successful login\r\n if (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.') {\r\n // OTP was sent, need to verify\r\n onLoginSuccess(identifier, true);\r\n } else if (response.token) {\r\n // Direct login successful (email/password)\r\n onLoginSuccess(identifier, false);\r\n } else {\r\n // Default to needing OTP verification for safety\r\n onLoginSuccess(identifier, true);\r\n }\r\n }\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setError(null); // Clear error when switching methods\r\n };\r\n\r\n const togglePasswordVisibility = () => {\r\n setShowPassword(!showPassword);\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>{usePassword ? 'Login with Password' : 'Login with OTP'}</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor={usePhone ? \"phone\" : \"email\"} style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>{usePhone ? 'Phone Number:' : 'Email:'}</label>\r\n {usePhone ? (\r\n <PhoneInput\r\n id=\"phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n required\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n ) : (\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={() => setUsePhone(!usePhone)}\r\n disabled={isLoading}\r\n style={{\r\n marginTop: '8px',\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone number instead'}\r\n </button>\r\n </div>\r\n\r\n {usePassword && (\r\n <div style={{\r\n marginBottom: '16px',\r\n position: 'relative'\r\n }}>\r\n <label htmlFor=\"login-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"login-password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n disabled={isLoading}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {usePassword && (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginBottom: '12px',\r\n marginTop: '4px'\r\n }}>\r\n <input\r\n type=\"checkbox\"\r\n id=\"remember-me\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n disabled={isLoading}\r\n style={{\r\n marginRight: '8px',\r\n cursor: 'pointer',\r\n width: '16px',\r\n height: '16px'\r\n }}\r\n />\r\n <label\r\n htmlFor=\"remember-me\"\r\n style={{\r\n fontSize: '14px',\r\n color: colors.textSecondary,\r\n cursor: 'pointer',\r\n userSelect: 'none'\r\n }}\r\n >\r\n Remember me\r\n </label>\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? (usePassword ? 'Logging in...' : 'Sending OTP...') : (usePassword ? 'Login' : 'Send OTP')}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePassword ? 'Login with OTP instead' : 'Login with password instead'}\r\n </button>\r\n </div>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showRegisterLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Don't have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onRegisterClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Register\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","import { useState, useEffect, useCallback } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\ninterface UseAuthReturnBase {\r\n user: User | null;\r\n isAuthenticated: boolean;\r\n loading: boolean;\r\n register: (data: RegisterData) => Promise<AuthResponse>;\r\n login: (data: LoginData) => Promise<AuthResponse>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n logout: () => Promise<void>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n getAllUsers: () => Promise<User[]>;\r\n getUserById: (id: string) => Promise<User>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n}\r\n\r\nexport const useAuth = (config: AuthConfig): UseAuthReturnBase => {\r\n const [authService] = useState<AuthService>(() => new AuthService(config));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const checkAuthStatus = useCallback(() => {\r\n const authenticated = authService.isAuthenticated();\r\n setIsAuthenticated(authenticated);\r\n \r\n if (authenticated) {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setLoading(false);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n // Update user state if login was successful and we have a user\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n setIsAuthenticated(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getAllUsers = useCallback(async (): Promise<User[]> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getAllUsers();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getUserById = useCallback(async (id: string): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getUserById(id);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n return {\r\n user,\r\n isAuthenticated,\r\n loading,\r\n register,\r\n login,\r\n verify,\r\n verifyEmailToken,\r\n logout,\r\n updateProfile,\r\n getProfile,\r\n getAllUsers,\r\n getUserById,\r\n uploadAndUpdateAvatar\r\n };\r\n};","'use client';\r\n\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeColors {\r\n bgPrimary: string;\r\n bgSecondary: string;\r\n bgHover: string;\r\n textPrimary: string;\r\n textSecondary: string;\r\n textTertiary: string;\r\n borderPrimary: string;\r\n borderSecondary: string;\r\n buttonPrimary: string;\r\n buttonPrimaryHover: string;\r\n errorBg: string;\r\n errorText: string;\r\n errorBorder: string;\r\n successBg: string;\r\n successText: string;\r\n successBorder: string;\r\n}\r\n\r\nconst lightTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #ffffff)',\r\n bgSecondary: 'var(--auth-bg-secondary, #f8fafc)',\r\n bgHover: 'var(--auth-bg-hover, #f1f5f9)',\r\n textPrimary: 'var(--auth-text-primary, #0f172a)',\r\n textSecondary: 'var(--auth-text-secondary, #475569)',\r\n textTertiary: 'var(--auth-text-tertiary, #94a3b8)',\r\n borderPrimary: 'var(--auth-border-primary, #e2e8f0)',\r\n borderSecondary: 'var(--auth-border-secondary, #cbd5e1)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #fef2f2)',\r\n errorText: 'var(--auth-error-text, #dc2626)',\r\n errorBorder: 'var(--auth-error-border, #fecaca)',\r\n successBg: 'var(--auth-success-bg, #f0fdf4)',\r\n successText: 'var(--auth-success-text, #16a34a)',\r\n successBorder: 'var(--auth-success-border, #bbf7d0)',\r\n};\r\n\r\nconst darkTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #1f2937)',\r\n bgSecondary: 'var(--auth-bg-secondary, #111827)',\r\n bgHover: 'var(--auth-bg-hover, #374151)',\r\n textPrimary: 'var(--auth-text-primary, #f9fafb)',\r\n textSecondary: 'var(--auth-text-secondary, #e5e7eb)',\r\n textTertiary: 'var(--auth-text-tertiary, #d1d5db)',\r\n borderPrimary: 'var(--auth-border-primary, #374151)',\r\n borderSecondary: 'var(--auth-border-secondary, #4b5563)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #7f1d1d)',\r\n errorText: 'var(--auth-error-text, #fecaca)',\r\n errorBorder: 'var(--auth-error-border, #991b1b)',\r\n successBg: 'var(--auth-success-bg, #14532d)',\r\n successText: 'var(--auth-success-text, #bbf7d0)',\r\n successBorder: 'var(--auth-success-border, #166534)',\r\n};\r\n\r\nexport function useThemeColors(): ThemeColors {\r\n const { theme } = useAuthTheme();\r\n return theme === 'dark' ? darkTheme : lightTheme;\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n\r\n// Lazy load react-phone-number-input to avoid React 19 compatibility issues\r\nlet PhoneInputWithCountry: any = null;\r\ntry {\r\n const module = require('react-phone-number-input');\r\n PhoneInputWithCountry = module.default || module;\r\n require('react-phone-number-input/style.css');\r\n} catch (error) {\r\n console.warn('react-phone-number-input not available, using fallback');\r\n}\r\n\r\ninterface PhoneInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n disabled?: boolean;\r\n required?: boolean;\r\n placeholder?: string;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n// Create the input component outside to prevent recreation on every render\r\nconst CustomPhoneInput = React.forwardRef<HTMLInputElement, any>((props, ref) => (\r\n <input\r\n {...props}\r\n ref={ref}\r\n className=\"PhoneInputInput\"\r\n />\r\n));\r\nCustomPhoneInput.displayName = 'CustomPhoneInput';\r\n\r\nexport const PhoneInput: React.FC<PhoneInputProps> = ({\r\n value,\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n placeholder = 'Enter phone number',\r\n id = 'phone',\r\n style = {}\r\n}) => {\r\n const colors = useThemeColors();\r\n const [defaultCountry, setDefaultCountry] = useState<string>('US');\r\n \r\n // Memoize the styles to prevent recreation on every render\r\n const styleContent = useMemo(() => `\r\n .PhoneInput {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n \r\n .PhoneInputCountry {\r\n position: relative;\r\n align-self: stretch;\r\n display: flex;\r\n align-items: center;\r\n padding: 0 8px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n background-color: ${colors.bgSecondary};\r\n transition: all 0.2s ease;\r\n }\r\n \r\n .PhoneInputCountry:focus-within {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputCountryIcon {\r\n width: 24px;\r\n height: 24px;\r\n margin-right: 4px;\r\n }\r\n \r\n .PhoneInputCountryIcon--border {\r\n box-shadow: none;\r\n }\r\n \r\n .PhoneInputCountrySelect {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n width: 100%;\r\n z-index: 1;\r\n border: 0;\r\n opacity: 0;\r\n cursor: pointer;\r\n color: ${colors.textPrimary};\r\n background-color: ${colors.bgSecondary};\r\n }\r\n \r\n .PhoneInputCountrySelect:disabled {\r\n cursor: not-allowed;\r\n }\r\n \r\n /* Dropdown menu styling */\r\n .PhoneInputCountrySelect option {\r\n background-color: ${colors.bgPrimary};\r\n color: ${colors.textPrimary};\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n }\r\n \r\n .PhoneInputCountrySelect option:hover,\r\n .PhoneInputCountrySelect option:focus,\r\n .PhoneInputCountrySelect option:checked {\r\n background-color: ${colors.buttonPrimary};\r\n color: white;\r\n }\r\n \r\n .PhoneInputCountrySelectArrow {\r\n display: block;\r\n content: '';\r\n width: 0.3em;\r\n height: 0.3em;\r\n margin-left: 0.35em;\r\n border-style: solid;\r\n border-color: ${colors.textPrimary};\r\n border-top-width: 0;\r\n border-bottom-width: 1px;\r\n border-left-width: 0;\r\n border-right-width: 1px;\r\n transform: rotate(45deg);\r\n opacity: 0.7;\r\n }\r\n \r\n .PhoneInputInput {\r\n flex: 1;\r\n min-width: 0;\r\n padding: 12px 16px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n font-size: 16px;\r\n background-color: ${colors.bgSecondary};\r\n color: ${colors.textPrimary};\r\n transition: all 0.2s ease;\r\n -webkit-text-fill-color: ${colors.textPrimary};\r\n -webkit-box-shadow: 0 0 0 1000px ${colors.bgSecondary} inset;\r\n }\r\n \r\n .PhoneInputInput:focus {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputInput:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n \r\n .PhoneInputInput::placeholder {\r\n color: ${colors.textTertiary};\r\n opacity: 0.6;\r\n }\r\n `, [colors]);\r\n\r\n useEffect(() => {\r\n // Detect user's country based on timezone or IP\r\n const detectCountry = async () => {\r\n try {\r\n // Try to get country from timezone first\r\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const timezoneToCountry: Record<string, string> = {\r\n 'America/New_York': 'US',\r\n 'America/Chicago': 'US',\r\n 'America/Denver': 'US',\r\n 'America/Los_Angeles': 'US',\r\n 'America/Phoenix': 'US',\r\n 'America/Anchorage': 'US',\r\n 'Pacific/Honolulu': 'US',\r\n 'Europe/London': 'GB',\r\n 'Europe/Paris': 'FR',\r\n 'Europe/Berlin': 'DE',\r\n 'Europe/Rome': 'IT',\r\n 'Europe/Madrid': 'ES',\r\n 'Asia/Dubai': 'AE',\r\n 'Asia/Kolkata': 'IN',\r\n 'Asia/Shanghai': 'CN',\r\n 'Asia/Tokyo': 'JP',\r\n 'Asia/Seoul': 'KR',\r\n 'Asia/Singapore': 'SG',\r\n 'Asia/Hong_Kong': 'HK',\r\n 'Australia/Sydney': 'AU',\r\n 'Pacific/Auckland': 'NZ',\r\n 'America/Toronto': 'CA',\r\n 'America/Vancouver': 'CA',\r\n 'America/Mexico_City': 'MX',\r\n 'America/Sao_Paulo': 'BR',\r\n 'America/Buenos_Aires': 'AR',\r\n 'Africa/Cairo': 'EG',\r\n 'Africa/Johannesburg': 'ZA',\r\n 'Africa/Lagos': 'NG',\r\n 'Africa/Nairobi': 'KE',\r\n };\r\n\r\n const detectedCountry = timezoneToCountry[timezone];\r\n if (detectedCountry) {\r\n setDefaultCountry(detectedCountry);\r\n return;\r\n }\r\n\r\n // Fallback: Try to get country from IP using a free API\r\n const response = await fetch('https://ipapi.co/json/', {\r\n signal: AbortSignal.timeout(3000) // 3 second timeout\r\n });\r\n \r\n if (response.ok) {\r\n const data = await response.json();\r\n if (data.country_code) {\r\n setDefaultCountry(data.country_code);\r\n }\r\n }\r\n } catch (error) {\r\n // If detection fails, keep default US\r\n console.log('Country detection failed, using default US');\r\n }\r\n };\r\n\r\n detectCountry();\r\n }, []);\r\n\r\n // Memoize the onChange handler to prevent recreation\r\n const handleChange = useMemo(() => (val: string | undefined) => {\r\n onChange(val || '');\r\n }, [onChange]);\r\n\r\n // Fallback to simple input if react-phone-number-input is not available\r\n if (!PhoneInputWithCountry) {\r\n return (\r\n <input\r\n id={id}\r\n type=\"tel\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={required}\r\n placeholder={placeholder}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n ...style\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n width: '100%',\r\n ...style\r\n }}\r\n >\r\n <style>{styleContent}</style>\r\n \r\n <PhoneInputWithCountry\r\n key={id}\r\n id={id}\r\n international\r\n defaultCountry={defaultCountry as any}\r\n value={value || ''}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n placeholder={placeholder}\r\n inputComponent={CustomPhoneInput}\r\n />\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { AuthConfig } from '../../types';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\nexport interface RegisterFormProps {\r\n onRegisterSuccess?: () => void;\r\n onLoginClick?: () => void;\r\n showLoginLink?: boolean;\r\n authConfig?: AuthConfig;\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n invitationToken?: string | null;\r\n}\r\n\r\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\r\n onRegisterSuccess,\r\n onLoginClick,\r\n showLoginLink = true,\r\n authConfig,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true,\r\n invitationToken\r\n}) => {\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; score: number; label: string } => {\r\n if (!pwd) return { strength: 'weak', score: 0, label: '' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', score, label: 'Weak' };\r\n if (score <= 3) return { strength: 'medium', score, label: 'Medium' };\r\n return { strength: 'strong', score, label: 'Strong' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n // Use the provided authConfig or a default one\r\n const config = authConfig || {\r\n baseUrl: 'http://localhost:7000'\r\n };\r\n\r\n const { register } = useAuth(config);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate password confirmation\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Validate password strength\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters long');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n // If invitation token is present, use the signup-with-invitation endpoint\r\n if (invitationToken) {\r\n const response = await fetch(`${config.baseUrl}/api/v1/auth/signup-with-invitation`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n name,\r\n email,\r\n password,\r\n phoneNumber: phoneNumber || undefined,\r\n invitationToken,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (response.ok && data.success) {\r\n // Store the token\r\n if (typeof window !== 'undefined' && data.token) {\r\n localStorage.setItem('auth_token', data.token);\r\n }\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(data.error || data.message || 'Registration failed');\r\n }\r\n } else {\r\n // Regular registration flow\r\n const registerData: any = {\r\n name,\r\n password,\r\n frontendBaseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || window.location.origin)\r\n : undefined\r\n };\r\n\r\n // Add email or phone number\r\n if (email) registerData.email = email;\r\n if (phoneNumber) registerData.phoneNumber = phoneNumber;\r\n\r\n const response = await register(registerData);\r\n if (response.success) {\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Register</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Name:</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email:</label>\r\n <input\r\n id=\"register-email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-phone\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional):</label>\r\n <PhoneInput\r\n id=\"register-phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n minLength={6}\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"confirm-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm Password:</label>\r\n <input\r\n id=\"confirm-password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? 'Registering...' : 'Register'}\r\n </button>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showLoginLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Already have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onLoginClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Login\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface OtpFormProps {\r\n email: string;\r\n onVerifySuccess?: () => void;\r\n onBackToLogin?: () => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const OtpForm: React.FC<OtpFormProps> = ({\r\n email,\r\n onVerifySuccess,\r\n onBackToLogin,\r\n baseUrl\r\n}) => {\r\n const colors = useThemeColors();\r\n const [otp, setOtp] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [resendCooldown, setResendCooldown] = useState(0);\r\n const [resendLoading, setResendLoading] = useState(false);\r\n\r\n const { verify, login } = useAuth({\r\n baseUrl: baseUrl || process.env.NEXT_PUBLIC_AUTH_API_URL || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate OTP format\r\n if (!/^\\d{6}$/.test(otp)) {\r\n setError('Please enter a valid 6-digit OTP');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verify({ email, otp });\r\n if (response.success) {\r\n onVerifySuccess?.();\r\n } else {\r\n setError(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleOtpChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n // Allow only digits and limit to 6 characters\r\n if (/^\\d{0,6}$/.test(value)) {\r\n setOtp(value);\r\n }\r\n };\r\n\r\n const handleResendOtp = async () => {\r\n if (resendCooldown > 0 || resendLoading) return;\r\n\r\n setResendLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await login({ email });\r\n if (response.success) {\r\n // Start 60 second cooldown\r\n setResendCooldown(60);\r\n const interval = setInterval(() => {\r\n setResendCooldown((prev) => {\r\n if (prev <= 1) {\r\n clearInterval(interval);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n } else {\r\n setError(response.message || 'Failed to resend OTP');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to resend OTP');\r\n } finally {\r\n setResendLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Verify OTP</h2>\r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Enter the 6-digit code sent to <strong style={{ color: colors.textPrimary }}>{email}</strong></p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>OTP Code:</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={handleOtpChange}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '20px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary,\r\n textAlign: 'center',\r\n letterSpacing: '5px'\r\n }}\r\n maxLength={6}\r\n placeholder=\"123456\"\r\n autoFocus\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading || otp.length !== 6}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Verifying...' : 'Verify OTP'}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleResendOtp}\r\n disabled={isLoading || resendLoading || resendCooldown > 0}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: resendCooldown > 0 ? colors.textTertiary : colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: resendCooldown > 0 ? 'not-allowed' : 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n marginBottom: '12px',\r\n transition: 'color 0.2s ease',\r\n display: 'block',\r\n width: '100%'\r\n }}\r\n >\r\n {resendLoading ? 'Sending...' : resendCooldown > 0 ? `Resend OTP in ${resendCooldown}s` : 'Resend OTP'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onBackToLogin}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Back to Login\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { LoginForm } from './LoginForm';\r\nimport { RegisterForm } from './RegisterForm';\r\nimport { OtpForm } from './OtpForm';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ntype AuthStep = 'login' | 'register' | 'otp';\r\n\r\ninterface AuthFlowProps {\r\n onAuthComplete?: () => void;\r\n initialStep?: AuthStep;\r\n showTitle?: boolean;\r\n}\r\n\r\nexport const AuthFlow: React.FC<AuthFlowProps> = ({ \r\n onAuthComplete,\r\n initialStep = 'login',\r\n showTitle = true\r\n}) => {\r\n const [step, setStep] = useState<AuthStep>(initialStep);\r\n const [email, setEmail] = useState('');\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n const handleLoginSuccess = (email: string, needsOtpVerification: boolean) => {\r\n // Set email\r\n setEmail(email);\r\n \r\n if (needsOtpVerification) {\r\n // Move to OTP verification step\r\n setStep('otp');\r\n setMessage(null);\r\n } else {\r\n // Login is complete, notify parent\r\n setMessage(null);\r\n onAuthComplete?.();\r\n }\r\n };\r\n\r\n const handleRegisterSuccess = () => {\r\n // Registration successful, show message and redirect to login\r\n setMessage('Registration successful! Please check your email for verification.');\r\n // Automatically switch to login after a short delay\r\n setTimeout(() => {\r\n setStep('login');\r\n setMessage(null);\r\n }, 3000);\r\n };\r\n\r\n const handleVerifySuccess = () => {\r\n // Authentication complete\r\n setMessage(null);\r\n onAuthComplete?.();\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n setStep('login');\r\n setMessage(null);\r\n };\r\n\r\n const renderCurrentStep = () => {\r\n switch (step) {\r\n case 'login':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'register':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Create Account</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <RegisterForm\r\n onRegisterSuccess={handleRegisterSuccess}\r\n onLoginClick={() => setStep('login')}\r\n showLoginLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'otp':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Verify Your Email</h1>}\r\n <OtpForm\r\n email={email}\r\n onVerifySuccess={handleVerifySuccess}\r\n onBackToLogin={handleBackToLogin}\r\n />\r\n </>\r\n );\r\n \r\n default:\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n minHeight: '300px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n {renderCurrentStep()}\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface EmailVerificationPageProps {\r\n token: string;\r\n onVerificationSuccess?: () => void;\r\n onVerificationError?: (error: string) => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const EmailVerificationPage: React.FC<EmailVerificationPageProps> = ({\r\n token,\r\n onVerificationSuccess,\r\n onVerificationError,\r\n baseUrl\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [message, setMessage] = useState('');\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n \r\n const { verifyEmailToken } = useAuth({\r\n baseUrl: baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\r\n });\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setIsLoading(false);\r\n setMessage('Invalid verification token');\r\n setIsSuccess(false);\r\n onVerificationError?.('Invalid verification token');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(token);\r\n \r\n if (response.success) {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verified successfully!');\r\n setIsSuccess(true);\r\n onVerificationSuccess?.();\r\n } else {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verification failed');\r\n setIsSuccess(false);\r\n onVerificationError?.(response.message || 'Email verification failed');\r\n }\r\n } catch (err) {\r\n setIsLoading(false);\r\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';\r\n setMessage(errorMessage);\r\n setIsSuccess(false);\r\n onVerificationError?.(errorMessage);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token, verifyEmailToken, onVerificationSuccess, onVerificationError]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Verifying your email...</h2>\r\n <div style={{\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n width: '40px',\r\n height: '40px',\r\n animation: 'spin 2s linear infinite',\r\n margin: '20px auto'\r\n }}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Email Verification</h2>\r\n <div style={{\r\n padding: '16px 20px',\r\n margin: '24px 0',\r\n borderRadius: '8px',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n backgroundColor: isSuccess ? '#d4edda' : '#f8d7da',\r\n color: isSuccess ? '#155724' : '#721c24',\r\n border: isSuccess ? '1px solid #c3e6cb' : '1px solid #f5c6cb'\r\n }}>\r\n {message}\r\n </div>\r\n {isSuccess && (\r\n <div style={{\r\n marginTop: '24px'\r\n }}>\r\n <p style={{ color: 'black' }}>Your email has been successfully verified!</p>\r\n <button \r\n onClick={() => window.location.href = '/login'}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface SignInProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n routing?: 'path' | 'virtual';\r\n path?: string;\r\n}\r\n\r\nexport const SignIn: React.FC<SignInProps> = ({ redirectUrl, appearance }) => {\r\n const { signIn, isSignedIn, loading: authLoading } = useAuth();\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [needsOtp, setNeedsOtp] = useState(false);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const loginData = usePhone ? { phoneNumber } : { email };\r\n \r\n if (needsOtp) {\r\n // Submit OTP\r\n const response = await signIn({ ...loginData, otp });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'OTP verification failed');\r\n }\r\n } else if (usePassword) {\r\n // Password login\r\n const response = await signIn({ ...loginData, password });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } else {\r\n // Request OTP\r\n const response = await signIn(loginData);\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n setNeedsOtp(true);\r\n setSuccess(usePhone ? 'OTP sent to your phone. Please check your messages.' : 'OTP sent to your email. Please check your inbox.');\r\n } else {\r\n setError(response.message || 'Failed to send OTP');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n };\r\n\r\n const toggleLoginMethod = () => {\r\n setUsePhone(!usePhone);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n setEmail('');\r\n setPhoneNumber('');\r\n };\r\n\r\n if (authLoading) {\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ThemeWrapper\r\n style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}\r\n >\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n {needsOtp ? 'Enter OTP' : usePassword ? 'Sign in with password' : 'Sign in'}\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {!needsOtp && !usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n )}\r\n\r\n {!needsOtp && usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <input\r\n id=\"phoneNumber\"\r\n type=\"tel\"\r\n value={phoneNumber}\r\n onChange={(e) => setPhoneNumber(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your phone number\"\r\n />\r\n </div>\r\n )}\r\n\r\n {usePassword && !needsOtp && (\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>One-Time Password</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={(e) => setOtp(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n maxLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n letterSpacing: '0.5em',\r\n textAlign: 'center',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"000000\"\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Please wait...' : needsOtp ? 'Verify OTP' : usePassword ? 'Sign in' : usePhone ? 'Continue with phone' : 'Continue with email'}\r\n </button>\r\n\r\n {!needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n marginRight: '16px'\r\n }}\r\n >\r\n {usePassword ? 'Use OTP code instead' : 'Use password instead'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={toggleLoginMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone instead'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setNeedsOtp(false);\r\n setOtp('');\r\n setError(null);\r\n setSuccess(null);\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n )}\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, forwardRef } from 'react';\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeWrapperProps {\r\n children: ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const ThemeWrapper = forwardRef<HTMLDivElement, ThemeWrapperProps>(\r\n ({ children, className = '', style }, ref) => {\r\n const { theme, mounted } = useAuthTheme();\r\n\r\n if (!mounted) {\r\n return <div ref={ref} className={className} style={style}>{children}</div>;\r\n }\r\n\r\n return (\r\n <div ref={ref} className={`${theme} ${className}`} style={style}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nThemeWrapper.displayName = 'ThemeWrapper';\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface SignUpProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const SignUp: React.FC<SignUpProps> = ({ redirectUrl, appearance }) => {\r\n const { signUp, isSignedIn } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl ||\r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_REGISTER ||\r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_REGISTER ||\r\n '/dashboard';\r\n\r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const getPasswordStrength = (pwd: string, colors: any): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: colors.borderSecondary };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: colors.errorText };\r\n if (score <= 3) return { strength: 'medium', color: colors.warningText || '#fa4' };\r\n return { strength: 'strong', color: colors.successText };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password, colors);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const signUpData: any = { name, password };\r\n if (email) signUpData.email = email;\r\n if (phoneNumber) signUpData.phoneNumber = phoneNumber;\r\n \r\n const response = await signUp(signUpData);\r\n if (response.success) {\r\n setSuccess('Registration successful! Please check your email to verify your account.');\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Create your account\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your full name\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional)</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n style={appearance?.elements?.formFieldInput}\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Create a password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: colors.borderSecondary,\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Creating account...' : 'Sign up'}\r\n </button>\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignOutProps {\r\n redirectUrl?: string;\r\n}\r\n\r\nexport const SignOut: React.FC<SignOutProps> = ({ redirectUrl }) => {\r\n const { signOut } = useAuth();\r\n\r\n useEffect(() => {\r\n const performSignOut = async () => {\r\n await signOut();\r\n \r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n performSignOut();\r\n }, [signOut, redirectUrl]);\r\n\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Signing out...</div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface UserButtonProps {\r\n showName?: boolean;\r\n appearance?: {\r\n elements?: {\r\n userButtonBox?: React.CSSProperties;\r\n userButtonTrigger?: React.CSSProperties;\r\n userButtonPopoverCard?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const UserButton: React.FC<UserButtonProps> = ({ showName = false, appearance }) => {\r\n const { user, signOut } = useAuth();\r\n const colors = useThemeColors();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n if (!user) return null;\r\n\r\n const getInitials = (name: string) => {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const handleSignOut = async () => {\r\n await signOut();\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{ position: 'relative', ...appearance?.elements?.userButtonBox }} ref={dropdownRef}>\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '6px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'background-color 0.2s',\r\n ...appearance?.elements?.userButtonTrigger\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n <div style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n {showName && (\r\n <span style={{ fontSize: '14px', fontWeight: 500, color: colors.textPrimary }}>\r\n {user.name}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n marginTop: '8px',\r\n width: '240px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\r\n border: `1px solid ${colors.borderPrimary}`,\r\n zIndex: 1000,\r\n ...appearance?.elements?.userButtonPopoverCard\r\n }}>\r\n <div style={{\r\n padding: '16px',\r\n borderBottom: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px'\r\n }}>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '18px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: colors.textPrimary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.name}\r\n </div>\r\n <div style={{\r\n fontSize: '12px',\r\n color: colors.textTertiary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.email}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{ padding: '8px' }}>\r\n <button\r\n onClick={handleSignOut}\r\n style={{\r\n width: '100%',\r\n padding: '10px 16px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: colors.textPrimary,\r\n fontWeight: 500,\r\n transition: 'background-color 0.2s'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </ThemeWrapper>\r\n );\r\n};\r\n\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ProtectedRouteProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n fallback,\r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return fallback || (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface PublicRouteProps {\r\n children: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const PublicRoute: React.FC<PublicRouteProps> = ({ \r\n children, \r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && isSignedIn) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${dashboardPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (isSignedIn) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface VerifyEmailProps {\r\n token?: string;\r\n onSuccess?: () => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport const VerifyEmail: React.FC<VerifyEmailProps> = ({ token, onSuccess, onError }) => {\r\n const { verifyEmailToken } = useAuth();\r\n const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading');\r\n const [message, setMessage] = useState('');\r\n\r\n useEffect(() => {\r\n const verify = async () => {\r\n // Get token from URL if not provided\r\n const verifyToken = token || (typeof window !== 'undefined' \r\n ? new URLSearchParams(window.location.search).get('token') \r\n : null);\r\n\r\n if (!verifyToken) {\r\n setStatus('error');\r\n setMessage('No verification token provided');\r\n onError?.('No verification token provided');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(verifyToken);\r\n if (response.success) {\r\n setStatus('success');\r\n setMessage('Email verified successfully! Redirecting...');\r\n onSuccess?.();\r\n \r\n // Redirect after success\r\n setTimeout(() => {\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_VERIFY || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_VERIFY || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }, 2000);\r\n } else {\r\n setStatus('error');\r\n setMessage(response.message || 'Verification failed');\r\n onError?.(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setStatus('error');\r\n const errorMsg = err instanceof Error ? err.message : 'An error occurred';\r\n setMessage(errorMsg);\r\n onError?.(errorMsg);\r\n }\r\n };\r\n\r\n verify();\r\n }, [token, verifyEmailToken, onSuccess, onError]);\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n {status === 'loading' && (\r\n <>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n margin: '0 auto 20px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verifying your email...\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Please wait while we verify your email address.\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'success' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Email Verified!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n {message}\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'error' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#f44336',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verification Failed\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666', marginBottom: '20px' }}>\r\n {message}\r\n </p>\r\n <button\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ForgotPasswordProps {\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ForgotPassword: React.FC<ForgotPasswordProps> = ({ appearance }) => {\r\n const { forgotPassword } = useAuth();\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await forgotPassword(email);\r\n if (response.success) {\r\n setSuccess('Password reset link sent! Please check your email.');\r\n setEmail('');\r\n } else {\r\n setError(response.message || 'Failed to send reset link');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Forgot password?\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginBottom: '16px',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Send reset link'}\r\n </button>\r\n\r\n <div style={{ textAlign: 'center' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ResetPasswordProps {\r\n token?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ResetPassword: React.FC<ResetPasswordProps> = ({ token, appearance }) => {\r\n const { resetPassword } = useAuth();\r\n const [resetToken, setResetToken] = useState(token || '');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n // Get token from URL if not provided as prop\r\n if (!resetToken && typeof window !== 'undefined') {\r\n const urlToken = new URLSearchParams(window.location.search).get('token');\r\n if (urlToken) {\r\n setResetToken(urlToken);\r\n }\r\n }\r\n }, [resetToken]);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (!resetToken) {\r\n setError('Invalid reset token');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await resetPassword(resetToken, password);\r\n if (response.success) {\r\n setSuccess(true);\r\n setTimeout(() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }, 2000);\r\n } else {\r\n setError(response.message || 'Failed to reset password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Password Reset Successful!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Your password has been reset. Redirecting to login...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Reset your password\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your new password below.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Resetting...' : 'Reset password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ChangePasswordProps {\r\n onSuccess?: () => void;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ChangePassword: React.FC<ChangePasswordProps> = ({ onSuccess, appearance }) => {\r\n const { changePassword } = useAuth();\r\n const [oldPassword, setOldPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPasswords, setShowPasswords] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(newPassword);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(false);\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('New passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (newPassword.length < 6) {\r\n setError('New password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await changePassword(oldPassword, newPassword);\r\n if (response.success) {\r\n setSuccess(true);\r\n setOldPassword('');\r\n setNewPassword('');\r\n setConfirmPassword('');\r\n onSuccess?.();\r\n } else {\r\n setError(response.message || 'Failed to change password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Change Password\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n Password changed successfully!\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"oldPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Current password</label>\r\n <input\r\n id=\"oldPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={oldPassword}\r\n onChange={(e) => setOldPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter current password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"newPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"newPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n {newPassword && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm new password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={showPasswords}\r\n onChange={(e) => setShowPasswords(e.target.checked)}\r\n style={{ marginRight: '8px' }}\r\n />\r\n <span style={{ fontSize: '14px', color: '#666' }}>Show passwords</span>\r\n </label>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Changing password...' : 'Change password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\nimport { AvatarUploader } from './AvatarUploader';\r\n\r\ninterface UserProfileProps {\r\n showAvatar?: boolean;\r\n showEmailChange?: boolean;\r\n showPasswordChange?: boolean;\r\n upfilesConfig?: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n}\r\n\r\nexport const UserProfile: React.FC<UserProfileProps> = ({\r\n showAvatar = true,\r\n showEmailChange = true,\r\n showPasswordChange = true,\r\n upfilesConfig,\r\n}) => {\r\n const { user, updateProfile, requestEmailChange } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState(user?.name || '');\r\n const [phoneNumber, setPhoneNumber] = useState(user?.phoneNumber || '');\r\n const [newEmail, setNewEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleUpdateProfile = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updates: { name?: string; phoneNumber?: string } = {};\r\n \r\n if (name !== user?.name) {\r\n updates.name = name;\r\n }\r\n\r\n if (phoneNumber !== user?.phoneNumber) {\r\n updates.phoneNumber = phoneNumber;\r\n }\r\n\r\n if (Object.keys(updates).length === 0) {\r\n setError('No changes to save');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n const response = await updateProfile(updates);\r\n if (response.success) {\r\n setSuccess('Profile updated successfully!');\r\n } else {\r\n setError(response.message || 'Failed to update profile');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleAvatarUploadComplete = async (avatarUrl: string) => {\r\n setSuccess('Avatar updated successfully!');\r\n // Force a refresh of user data to show the new avatar\r\n window.location.reload();\r\n };\r\n\r\n const handleAvatarUploadError = (error: Error) => {\r\n setError(error.message || 'Failed to upload avatar');\r\n };\r\n\r\n const handleRequestEmailChange = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await requestEmailChange(newEmail);\r\n if (response.success) {\r\n setSuccess('Verification email sent! Please check your inbox.');\r\n setNewEmail('');\r\n } else {\r\n setError(response.message || 'Failed to request email change');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (!user) return null;\r\n\r\n return (\r\n <div style={{ maxWidth: '700px', margin: '0 auto', padding: '20px' }}>\r\n <h2 style={{ marginBottom: '24px', fontSize: '24px', fontWeight: 600, color: colors.textPrimary }}>Profile Settings</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Profile Information Form */}\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '24px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Profile Information</h3>\r\n <form onSubmit={handleUpdateProfile}>\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full Name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"Manish Batra\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n {showAvatar && upfilesConfig && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Avatar</label>\r\n {user?.avatar && (\r\n <div style={{ marginBottom: '12px' }}>\r\n <img \r\n src={user.avatar} \r\n alt=\"Current avatar\" \r\n style={{\r\n width: '80px',\r\n height: '80px',\r\n borderRadius: '50%',\r\n objectFit: 'cover',\r\n border: `2px solid ${colors.borderSecondary}`\r\n }}\r\n />\r\n </div>\r\n )}\r\n <AvatarUploader\r\n upfilesConfig={upfilesConfig}\r\n onUploadComplete={handleAvatarUploadComplete}\r\n onError={handleAvatarUploadError}\r\n maxFileSize={5 * 1024 * 1024}\r\n accept={['image/*']}\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Saving...' : 'Save Changes'}\r\n </button>\r\n </form>\r\n </div>\r\n\r\n {/* Change Email Form */}\r\n {showEmailChange && (\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Change Email</h3>\r\n <p style={{ fontSize: '14px', color: colors.textSecondary, marginBottom: '16px' }}>\r\n Current email: <strong>{user.email}</strong>\r\n </p>\r\n <form onSubmit={handleRequestEmailChange}>\r\n <div style={{ marginBottom: '16px' }}>\r\n <label htmlFor=\"newEmail\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>New Email Address</label>\r\n <input\r\n id=\"newEmail\"\r\n type=\"email\"\r\n value={newEmail}\r\n onChange={(e) => setNewEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"newemail@example.com\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Request Email Change'}\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarUploaderProps {\r\n onUploadComplete?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n className?: string;\r\n buttonClassName?: string;\r\n dropzoneClassName?: string;\r\n maxFileSize?: number;\r\n accept?: string[];\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n buttonText?: string;\r\n}\r\n\r\n/**\r\n * AvatarUploader Component\r\n * \r\n * A ready-to-use component for uploading user avatars using the upfiles SDK.\r\n * Opens an ImageManager dialog for uploading and selecting images.\r\n * Automatically updates the user's avatar in the auth system after selection.\r\n * \r\n * @example\r\n * ```tsx\r\n * <AvatarUploader\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/',\r\n * projectId: 'proj_123'\r\n * }}\r\n * onUploadComplete={(url) => console.log('Avatar uploaded:', url)}\r\n * onError={(err) => console.error('Upload failed:', err)}\r\n * buttonText=\"Upload Avatar\"\r\n * />\r\n * ```\r\n */\r\nexport const AvatarUploader: React.FC<AvatarUploaderProps> = ({\r\n onUploadComplete,\r\n onError,\r\n className,\r\n buttonClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n upfilesConfig,\r\n buttonText = 'Upload Avatar',\r\n}) => {\r\n const { uploadAndUpdateAvatar } = useAuth();\r\n const [open, setOpen] = useState(false);\r\n const [uploading, setUploading] = useState(false);\r\n\r\n const handleSelect = async (image: {\r\n url: string;\r\n key: string;\r\n originalName: string;\r\n size: number;\r\n contentType: string;\r\n }) => {\r\n setUploading(true);\r\n try {\r\n // Use the upfiles baseUrl as a proxy to avoid CORS issues with direct S3 access\r\n const proxyUrl = `${upfilesConfig.baseUrl}/api/download?fileKey=${encodeURIComponent(image.key)}`;\r\n \r\n // Fetch the image through the proxy\r\n const response = await fetch(proxyUrl, {\r\n headers: upfilesConfig.apiKey ? {\r\n [upfilesConfig.apiKeyHeader || 'authorization']: upfilesConfig.apiKey.startsWith('upk_') \r\n ? `Bearer ${upfilesConfig.apiKey}` \r\n : upfilesConfig.apiKey\r\n } : {}\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error('Failed to fetch image');\r\n }\r\n \r\n const blob = await response.blob();\r\n const file = new File([blob], image.originalName, { type: image.contentType });\r\n \r\n const result = await uploadAndUpdateAvatar(file);\r\n \r\n if (result.success && result.user?.avatar) {\r\n onUploadComplete?.(result.user.avatar);\r\n setOpen(false);\r\n } else {\r\n throw new Error(result.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Upload failed');\r\n onError?.(err);\r\n } finally {\r\n setUploading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpen(true)}\r\n disabled={uploading}\r\n className={buttonClassName || 'px-4 py-2 text-sm rounded border bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50'}\r\n >\r\n {uploading ? 'Uploading...' : buttonText}\r\n </button>\r\n\r\n <ImageManager\r\n open={open}\r\n onOpenChange={setOpen}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n projectId={upfilesConfig.projectId}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title=\"Select Avatar\"\r\n description=\"Upload a new avatar or select from existing images.\"\r\n mode=\"full\"\r\n maxFileSize={maxFileSize}\r\n maxFiles={1}\r\n autoRecordToDb={true}\r\n fetchThumbnails={true}\r\n onSelect={handleSelect}\r\n />\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarManagerProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onAvatarUpdated?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n title?: string;\r\n description?: string;\r\n className?: string;\r\n gridClassName?: string;\r\n maxFileSize?: number;\r\n mode?: 'full' | 'browse' | 'upload';\r\n showDelete?: boolean;\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n };\r\n}\r\n\r\n/**\r\n * AvatarManager Component\r\n * \r\n * A comprehensive avatar management component that allows users to:\r\n * - Browse existing uploaded images\r\n * - Upload new avatar images\r\n * - Select and set an avatar\r\n * \r\n * Uses the ImageManager from @thetechfossil/upfiles for a complete image management experience.\r\n * \r\n * @example\r\n * ```tsx\r\n * const [open, setOpen] = useState(false);\r\n * \r\n * <button onClick={() => setOpen(true)}>Change Avatar</button>\r\n * \r\n * <AvatarManager\r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/'\r\n * }}\r\n * onAvatarUpdated={(url) => console.log('Avatar updated:', url)}\r\n * onError={(err) => console.error('Error:', err)}\r\n * />\r\n * ```\r\n */\r\nexport const AvatarManager: React.FC<AvatarManagerProps> = ({\r\n open,\r\n onOpenChange,\r\n onAvatarUpdated,\r\n onError,\r\n title = 'Select Avatar',\r\n description = 'Choose an existing image or upload a new one',\r\n className,\r\n gridClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n mode = 'full',\r\n showDelete = false,\r\n upfilesConfig,\r\n}) => {\r\n const { updateProfile } = useAuth();\r\n const [updating, setUpdating] = useState(false);\r\n\r\n const handleSelect = async (image: any) => {\r\n setUpdating(true);\r\n try {\r\n const response = await updateProfile({ avatar: image.url });\r\n \r\n if (response.success && response.user?.avatar) {\r\n onAvatarUpdated?.(response.user.avatar);\r\n onOpenChange(false);\r\n } else {\r\n throw new Error(response.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Failed to update avatar');\r\n onError?.(err);\r\n } finally {\r\n setUpdating(false);\r\n }\r\n };\r\n\r\n return (\r\n <ImageManager\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title={title}\r\n description={description}\r\n className={className}\r\n gridClassName={gridClassName}\r\n onSelect={handleSelect}\r\n maxFileSize={maxFileSize}\r\n mode={mode}\r\n showDelete={showDelete}\r\n fetchThumbnails={true}\r\n />\r\n );\r\n};\r\n","/**\r\n * @auth/sdk - Authentication SDK\r\n * \r\n * Complete documentation: https://ttf-auth-docs.netlify.app/\r\n * \r\n * This SDK provides authentication functionality for React, Next.js, and Node.js applications.\r\n * It supports multiple authentication methods including email/password and email/OTP.\r\n */\r\n\r\n// Core exports\r\nexport * from './types';\r\nexport * from './core/auth-service';\r\nexport * from './core/http-client';\r\n\r\n// React exports (Clerk-like API)\r\nexport { AuthProvider, useAuth } from './react/AuthProvider';\r\nexport {\r\n SignIn,\r\n SignUp,\r\n SignOut,\r\n UserButton,\r\n ProtectedRoute,\r\n PublicRoute,\r\n VerifyEmail,\r\n ForgotPassword,\r\n ResetPassword,\r\n ChangePassword,\r\n UserProfile,\r\n // Avatar components\r\n AvatarUploader,\r\n AvatarManager,\r\n // Legacy components\r\n LoginForm,\r\n RegisterForm,\r\n OtpForm,\r\n AuthFlow,\r\n EmailVerificationPage,\r\n} from './react/components';\r\n\r\n// Re-export upfiles components for convenience\r\nexport {\r\n Uploader,\r\n ImageManager,\r\n ProjectFilesWidget,\r\n ConnectProjectDialog,\r\n UpfilesClient,\r\n} from '@thetechfossil/upfiles';\r\n\r\n// Platform-specific exports\r\nexport * as react from './react';\r\nexport * as node from './node';","// Legacy hook (backward compatibility)\r\nexport { useAuth as useAuthLegacy } from './use-auth';\r\n\r\n// New Clerk-like exports\r\nexport { AuthProvider, useAuth } from './AuthProvider';\r\nexport { AuthThemeProvider, useAuthTheme } from './ThemeContext';\r\nexport * from './components';","export * from './auth-client';","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // For Node.js server-side usage, set frontend base URL from environment\r\n const frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n \r\n if (frontendBaseUrl) {\r\n this['httpClient'].setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n \r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', data);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/http-client.ts","../src/core/auth-service.ts","../src/react/ThemeContext.tsx","../src/react/AuthProvider.tsx","../src/react/use-auth.ts","../src/react/hooks/useThemeColors.ts","../src/react/components/PhoneInput.tsx","../src/react/components/LoginForm.tsx","../src/react/components/RegisterForm.tsx","../src/react/components/OtpForm.tsx","../src/react/components/AuthFlow.tsx","../src/react/components/EmailVerificationPage.tsx","../src/react/components/ThemeWrapper.tsx","../src/react/components/SignIn.tsx","../src/react/components/SignUp.tsx","../src/react/components/SignOut.tsx","../src/react/components/UserButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/PublicRoute.tsx","../src/react/components/VerifyEmail.tsx","../src/react/components/ForgotPassword.tsx","../src/react/components/ResetPassword.tsx","../src/react/components/ChangePassword.tsx","../src/react/components/AvatarUploader.tsx","../src/react/components/UserProfile.tsx","../src/react/components/AvatarManager.tsx","../src/react/index.ts","../src/node/index.ts","../src/node/auth-client.ts"],"names":["axios","UpfilesClient","createContext","useState","useEffect","jsx","useContext","useCallback","useAuth","React","useMemo","jsxs","email","Fragment","forwardRef","colors","useRef","ImageManager","error"],"mappings":"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","file":"index.js","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/$/, '');\r\n\r\n this.axiosInstance = axios.create({\r\n baseURL: this.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n async (config) => {\r\n // Fetch CSRF token lazily on first mutating request (only on client side)\r\n const isMutatingRequest = ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '');\r\n if (isMutatingRequest && !this.csrfToken && typeof window !== 'undefined') {\r\n try {\r\n await this.refreshCsrfToken();\r\n } catch (error) {\r\n console.warn('Failed to fetch CSRF token:', error);\r\n }\r\n }\r\n\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && isMutatingRequest) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n\r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n\r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\nimport { UpfilesClient } from '@thetechfossil/upfiles';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n private upfilesClient: UpfilesClient | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize upfiles client if config is provided\r\n if (this.config.upfilesConfig) {\r\n this.upfilesClient = new UpfilesClient({\r\n baseUrl: this.config.upfilesConfig.baseUrl,\r\n apiKey: this.config.upfilesConfig.apiKey,\r\n apiKeyHeader: this.config.upfilesConfig.apiKeyHeader,\r\n presignUrl: this.config.upfilesConfig.presignUrl,\r\n presignPath: this.config.upfilesConfig.presignPath,\r\n });\r\n }\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // CSRF token will be fetched lazily on first mutating request\r\n // This prevents SSR issues and ensures proper initialization\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async uploadAndUpdateAvatar(file: File): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n if (!this.upfilesClient) {\r\n throw new Error('Upfiles configuration is required. Please provide upfilesConfig in AuthConfig.');\r\n }\r\n\r\n try {\r\n // Upload file using upfiles SDK\r\n const folderPath = this.config.upfilesConfig?.folderPath || 'avatars/';\r\n const uploadResult = await this.upfilesClient.upload(file, {\r\n folderPath,\r\n fetchThumbnails: true,\r\n });\r\n\r\n // Update user avatar with the uploaded file URL\r\n const response = await this.updateAvatar(uploadResult.publicUrl);\r\n \r\n return response;\r\n } catch (error: any) {\r\n throw new Error(`Failed to upload avatar: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n public getUpfilesClient(): UpfilesClient | null {\r\n return this.upfilesClient;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","'use client';\r\n\r\nimport React, { createContext, useContext, useEffect, useState, ReactNode } from 'react';\r\n\r\ntype Theme = 'light' | 'dark';\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mounted: boolean;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({ theme: 'light', mounted: false });\r\n\r\nexport function AuthThemeProvider({ children }: { children: ReactNode }) {\r\n const [theme, setTheme] = useState<Theme>('light');\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n // Detect theme from parent app\r\n const detectTheme = () => {\r\n // Check if parent has theme class on html/body\r\n const htmlElement = document.documentElement;\r\n const bodyElement = document.body;\r\n \r\n if (htmlElement.classList.contains('dark') || bodyElement.classList.contains('dark')) {\r\n return 'dark';\r\n }\r\n \r\n if (htmlElement.classList.contains('light') || bodyElement.classList.contains('light')) {\r\n return 'light';\r\n }\r\n \r\n // Check data-theme attribute\r\n const dataTheme = htmlElement.getAttribute('data-theme') || bodyElement.getAttribute('data-theme');\r\n if (dataTheme === 'dark' || dataTheme === 'light') {\r\n return dataTheme as Theme;\r\n }\r\n \r\n // Check prefers-color-scheme\r\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n \r\n return 'light';\r\n };\r\n\r\n const updateTheme = () => {\r\n const detectedTheme = detectTheme();\r\n setTheme(detectedTheme);\r\n };\r\n\r\n // Initial detection\r\n updateTheme();\r\n setMounted(true);\r\n\r\n // Watch for theme changes using MutationObserver\r\n const observer = new MutationObserver(updateTheme);\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n\r\n // Watch for prefers-color-scheme changes\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handleMediaChange = () => updateTheme();\r\n mediaQuery.addEventListener('change', handleMediaChange);\r\n\r\n return () => {\r\n observer.disconnect();\r\n mediaQuery.removeEventListener('change', handleMediaChange);\r\n };\r\n }, []);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, mounted }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAuthTheme() {\r\n return useContext(ThemeContext);\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { User, AuthConfig, AuthResponse, LoginData, RegisterData, VerifyData, UpdateUserData, OAuthProvider } from '../types';\r\nimport { AuthThemeProvider } from './ThemeContext';\r\n\r\ninterface AuthContextValue {\r\n user: User | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n loading: boolean;\r\n signIn: (data: LoginData) => Promise<AuthResponse>;\r\n signUp: (data: RegisterData) => Promise<AuthResponse>;\r\n signOut: () => Promise<void>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n signInWithOAuth: (provider: OAuthProvider) => void;\r\n linkOAuthProvider: (provider: OAuthProvider) => void;\r\n unlinkOAuthProvider: (provider: OAuthProvider) => Promise<AuthResponse>;\r\n forgotPassword: (email: string) => Promise<AuthResponse>;\r\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\r\n changePassword: (oldPassword: string, newPassword: string) => Promise<AuthResponse>;\r\n updateAvatar: (avatar: string) => Promise<AuthResponse>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n requestEmailChange: (newEmail: string) => Promise<AuthResponse>;\r\n verifyEmailChange: (token: string) => Promise<AuthResponse>;\r\n generate2FA: () => Promise<any>;\r\n enable2FA: (token: string) => Promise<AuthResponse>;\r\n disable2FA: (token: string) => Promise<AuthResponse>;\r\n validate2FA: (token: string) => Promise<AuthResponse>;\r\n getSessions: () => Promise<any>;\r\n revokeSession: (sessionId: string) => Promise<AuthResponse>;\r\n revokeAllSessions: () => Promise<AuthResponse>;\r\n authService: AuthService;\r\n}\r\n\r\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n config?: Partial<AuthConfig>;\r\n}\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({ children, config }) => {\r\n // Get configuration from environment variables or props\r\n const authConfig: AuthConfig = {\r\n baseUrl: config?.baseUrl || \r\n (typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || process.env.REACT_APP_AUTH_API_URL || 'http://localhost:7000')\r\n : 'http://localhost:7000'),\r\n localStorageKey: config?.localStorageKey || 'auth_token',\r\n csrfEnabled: config?.csrfEnabled !== undefined ? config.csrfEnabled : true,\r\n upfilesConfig: config?.upfilesConfig,\r\n };\r\n\r\n const [authService] = useState(() => new AuthService(authConfig));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const checkAuthStatus = useCallback(async () => {\r\n const authenticated = authService.isAuthenticated();\r\n \r\n if (authenticated) {\r\n try {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } catch (error) {\r\n console.error('Failed to get current user:', error);\r\n setUser(null);\r\n }\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setIsLoaded(true);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const signIn = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signUp = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signOut = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signInWithOAuth = useCallback((provider: OAuthProvider) => {\r\n authService.loginWithOAuth(provider);\r\n }, [authService]);\r\n\r\n const linkOAuthProvider = useCallback((provider: OAuthProvider) => {\r\n authService.linkOAuthProvider(provider);\r\n }, [authService]);\r\n\r\n const unlinkOAuthProvider = useCallback(async (provider: OAuthProvider): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.unlinkOAuthProvider(provider);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.forgotPassword(email);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.resetPassword(token, password);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const changePassword = useCallback(async (oldPassword: string, newPassword: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.changePassword(oldPassword, newPassword);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateAvatar = useCallback(async (avatar: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateAvatar(avatar);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const requestEmailChange = useCallback(async (newEmail: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.requestEmailChange(newEmail);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailChange = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailChange(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const generate2FA = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.generate2FA();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const enable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.enable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const disable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.disable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const validate2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.validate2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getSessions = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.getSessions();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeSession = useCallback(async (sessionId: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.revokeSession(sessionId);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeAllSessions = useCallback(async (): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.revokeAllSessions();\r\n setUser(null);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const value: AuthContextValue = {\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n loading,\r\n signIn,\r\n signUp,\r\n signOut,\r\n verify,\r\n verifyEmailToken,\r\n updateProfile,\r\n getProfile,\r\n signInWithOAuth,\r\n linkOAuthProvider,\r\n unlinkOAuthProvider,\r\n forgotPassword,\r\n resetPassword,\r\n changePassword,\r\n updateAvatar,\r\n uploadAndUpdateAvatar,\r\n requestEmailChange,\r\n verifyEmailChange,\r\n generate2FA,\r\n enable2FA,\r\n disable2FA,\r\n validate2FA,\r\n getSessions,\r\n revokeSession,\r\n revokeAllSessions,\r\n authService,\r\n };\r\n\r\n return (\r\n <AuthContext.Provider value={value}>\r\n <AuthThemeProvider>\r\n {children}\r\n </AuthThemeProvider>\r\n </AuthContext.Provider>\r\n );\r\n};\r\n\r\nexport const useAuth = (): AuthContextValue => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n return context;\r\n};\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\ninterface UseAuthReturnBase {\r\n user: User | null;\r\n isAuthenticated: boolean;\r\n loading: boolean;\r\n register: (data: RegisterData) => Promise<AuthResponse>;\r\n login: (data: LoginData) => Promise<AuthResponse>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n logout: () => Promise<void>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n getAllUsers: () => Promise<User[]>;\r\n getUserById: (id: string) => Promise<User>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n}\r\n\r\nexport const useAuth = (config: AuthConfig): UseAuthReturnBase => {\r\n const [authService] = useState<AuthService>(() => new AuthService(config));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const checkAuthStatus = useCallback(() => {\r\n const authenticated = authService.isAuthenticated();\r\n setIsAuthenticated(authenticated);\r\n \r\n if (authenticated) {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setLoading(false);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n // Update user state if login was successful and we have a user\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n setIsAuthenticated(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getAllUsers = useCallback(async (): Promise<User[]> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getAllUsers();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getUserById = useCallback(async (id: string): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getUserById(id);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n return {\r\n user,\r\n isAuthenticated,\r\n loading,\r\n register,\r\n login,\r\n verify,\r\n verifyEmailToken,\r\n logout,\r\n updateProfile,\r\n getProfile,\r\n getAllUsers,\r\n getUserById,\r\n uploadAndUpdateAvatar\r\n };\r\n};","'use client';\r\n\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeColors {\r\n bgPrimary: string;\r\n bgSecondary: string;\r\n bgHover: string;\r\n textPrimary: string;\r\n textSecondary: string;\r\n textTertiary: string;\r\n borderPrimary: string;\r\n borderSecondary: string;\r\n buttonPrimary: string;\r\n buttonPrimaryHover: string;\r\n errorBg: string;\r\n errorText: string;\r\n errorBorder: string;\r\n successBg: string;\r\n successText: string;\r\n successBorder: string;\r\n}\r\n\r\nconst lightTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #ffffff)',\r\n bgSecondary: 'var(--auth-bg-secondary, #f8fafc)',\r\n bgHover: 'var(--auth-bg-hover, #f1f5f9)',\r\n textPrimary: 'var(--auth-text-primary, #0f172a)',\r\n textSecondary: 'var(--auth-text-secondary, #475569)',\r\n textTertiary: 'var(--auth-text-tertiary, #94a3b8)',\r\n borderPrimary: 'var(--auth-border-primary, #e2e8f0)',\r\n borderSecondary: 'var(--auth-border-secondary, #cbd5e1)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #fef2f2)',\r\n errorText: 'var(--auth-error-text, #dc2626)',\r\n errorBorder: 'var(--auth-error-border, #fecaca)',\r\n successBg: 'var(--auth-success-bg, #f0fdf4)',\r\n successText: 'var(--auth-success-text, #16a34a)',\r\n successBorder: 'var(--auth-success-border, #bbf7d0)',\r\n};\r\n\r\nconst darkTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #1f2937)',\r\n bgSecondary: 'var(--auth-bg-secondary, #111827)',\r\n bgHover: 'var(--auth-bg-hover, #374151)',\r\n textPrimary: 'var(--auth-text-primary, #f9fafb)',\r\n textSecondary: 'var(--auth-text-secondary, #e5e7eb)',\r\n textTertiary: 'var(--auth-text-tertiary, #d1d5db)',\r\n borderPrimary: 'var(--auth-border-primary, #374151)',\r\n borderSecondary: 'var(--auth-border-secondary, #4b5563)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #7f1d1d)',\r\n errorText: 'var(--auth-error-text, #fecaca)',\r\n errorBorder: 'var(--auth-error-border, #991b1b)',\r\n successBg: 'var(--auth-success-bg, #14532d)',\r\n successText: 'var(--auth-success-text, #bbf7d0)',\r\n successBorder: 'var(--auth-success-border, #166534)',\r\n};\r\n\r\nexport function useThemeColors(): ThemeColors {\r\n const { theme } = useAuthTheme();\r\n return theme === 'dark' ? darkTheme : lightTheme;\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n\r\n// Lazy load react-phone-number-input to avoid React 19 compatibility issues\r\nlet PhoneInputWithCountry: any = null;\r\ntry {\r\n const module = require('react-phone-number-input');\r\n PhoneInputWithCountry = module.default || module;\r\n require('react-phone-number-input/style.css');\r\n} catch (error) {\r\n console.warn('react-phone-number-input not available, using fallback');\r\n}\r\n\r\ninterface PhoneInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n disabled?: boolean;\r\n required?: boolean;\r\n placeholder?: string;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n// Create the input component outside to prevent recreation on every render\r\nconst CustomPhoneInput = React.forwardRef<HTMLInputElement, any>((props, ref) => (\r\n <input\r\n {...props}\r\n ref={ref}\r\n className=\"PhoneInputInput\"\r\n />\r\n));\r\nCustomPhoneInput.displayName = 'CustomPhoneInput';\r\n\r\nexport const PhoneInput: React.FC<PhoneInputProps> = ({\r\n value,\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n placeholder = 'Enter phone number',\r\n id = 'phone',\r\n style = {}\r\n}) => {\r\n const colors = useThemeColors();\r\n const [defaultCountry, setDefaultCountry] = useState<string>('US');\r\n \r\n // Memoize the styles to prevent recreation on every render\r\n const styleContent = useMemo(() => `\r\n .PhoneInput {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n \r\n .PhoneInputCountry {\r\n position: relative;\r\n align-self: stretch;\r\n display: flex;\r\n align-items: center;\r\n padding: 0 8px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n background-color: ${colors.bgSecondary};\r\n transition: all 0.2s ease;\r\n }\r\n \r\n .PhoneInputCountry:focus-within {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputCountryIcon {\r\n width: 24px;\r\n height: 24px;\r\n margin-right: 4px;\r\n }\r\n \r\n .PhoneInputCountryIcon--border {\r\n box-shadow: none;\r\n }\r\n \r\n .PhoneInputCountrySelect {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n width: 100%;\r\n z-index: 1;\r\n border: 0;\r\n opacity: 0;\r\n cursor: pointer;\r\n color: ${colors.textPrimary};\r\n background-color: ${colors.bgSecondary};\r\n }\r\n \r\n .PhoneInputCountrySelect:disabled {\r\n cursor: not-allowed;\r\n }\r\n \r\n /* Dropdown menu styling */\r\n .PhoneInputCountrySelect option {\r\n background-color: ${colors.bgPrimary};\r\n color: ${colors.textPrimary};\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n }\r\n \r\n .PhoneInputCountrySelect option:hover,\r\n .PhoneInputCountrySelect option:focus,\r\n .PhoneInputCountrySelect option:checked {\r\n background-color: ${colors.buttonPrimary};\r\n color: white;\r\n }\r\n \r\n .PhoneInputCountrySelectArrow {\r\n display: block;\r\n content: '';\r\n width: 0.3em;\r\n height: 0.3em;\r\n margin-left: 0.35em;\r\n border-style: solid;\r\n border-color: ${colors.textPrimary};\r\n border-top-width: 0;\r\n border-bottom-width: 1px;\r\n border-left-width: 0;\r\n border-right-width: 1px;\r\n transform: rotate(45deg);\r\n opacity: 0.7;\r\n }\r\n \r\n .PhoneInputInput {\r\n flex: 1;\r\n min-width: 0;\r\n padding: 12px 16px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n font-size: 16px;\r\n background-color: ${colors.bgSecondary};\r\n color: ${colors.textPrimary};\r\n transition: all 0.2s ease;\r\n -webkit-text-fill-color: ${colors.textPrimary};\r\n -webkit-box-shadow: 0 0 0 1000px ${colors.bgSecondary} inset;\r\n }\r\n \r\n .PhoneInputInput:focus {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputInput:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n \r\n .PhoneInputInput::placeholder {\r\n color: ${colors.textTertiary};\r\n opacity: 0.6;\r\n }\r\n `, [colors]);\r\n\r\n useEffect(() => {\r\n // Detect user's country based on timezone or IP\r\n const detectCountry = async () => {\r\n try {\r\n // Try to get country from timezone first\r\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const timezoneToCountry: Record<string, string> = {\r\n 'America/New_York': 'US',\r\n 'America/Chicago': 'US',\r\n 'America/Denver': 'US',\r\n 'America/Los_Angeles': 'US',\r\n 'America/Phoenix': 'US',\r\n 'America/Anchorage': 'US',\r\n 'Pacific/Honolulu': 'US',\r\n 'Europe/London': 'GB',\r\n 'Europe/Paris': 'FR',\r\n 'Europe/Berlin': 'DE',\r\n 'Europe/Rome': 'IT',\r\n 'Europe/Madrid': 'ES',\r\n 'Asia/Dubai': 'AE',\r\n 'Asia/Kolkata': 'IN',\r\n 'Asia/Shanghai': 'CN',\r\n 'Asia/Tokyo': 'JP',\r\n 'Asia/Seoul': 'KR',\r\n 'Asia/Singapore': 'SG',\r\n 'Asia/Hong_Kong': 'HK',\r\n 'Australia/Sydney': 'AU',\r\n 'Pacific/Auckland': 'NZ',\r\n 'America/Toronto': 'CA',\r\n 'America/Vancouver': 'CA',\r\n 'America/Mexico_City': 'MX',\r\n 'America/Sao_Paulo': 'BR',\r\n 'America/Buenos_Aires': 'AR',\r\n 'Africa/Cairo': 'EG',\r\n 'Africa/Johannesburg': 'ZA',\r\n 'Africa/Lagos': 'NG',\r\n 'Africa/Nairobi': 'KE',\r\n };\r\n\r\n const detectedCountry = timezoneToCountry[timezone];\r\n if (detectedCountry) {\r\n setDefaultCountry(detectedCountry);\r\n return;\r\n }\r\n\r\n // Fallback: Try to get country from IP using a free API\r\n const response = await fetch('https://ipapi.co/json/', {\r\n signal: AbortSignal.timeout(3000) // 3 second timeout\r\n });\r\n \r\n if (response.ok) {\r\n const data = await response.json();\r\n if (data.country_code) {\r\n setDefaultCountry(data.country_code);\r\n }\r\n }\r\n } catch (error) {\r\n // If detection fails, keep default US\r\n console.log('Country detection failed, using default US');\r\n }\r\n };\r\n\r\n detectCountry();\r\n }, []);\r\n\r\n // Memoize the onChange handler to prevent recreation\r\n const handleChange = useMemo(() => (val: string | undefined) => {\r\n onChange(val || '');\r\n }, [onChange]);\r\n\r\n // Fallback to simple input if react-phone-number-input is not available\r\n if (!PhoneInputWithCountry) {\r\n return (\r\n <input\r\n id={id}\r\n type=\"tel\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={required}\r\n placeholder={placeholder}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n ...style\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n width: '100%',\r\n ...style\r\n }}\r\n >\r\n <style>{styleContent}</style>\r\n \r\n <PhoneInputWithCountry\r\n key={id}\r\n id={id}\r\n international\r\n defaultCountry={defaultCountry as any}\r\n value={value || ''}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n placeholder={placeholder}\r\n inputComponent={CustomPhoneInput}\r\n />\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface LoginFormProps {\r\n onSuccess?: (response: { message: string; email?: string; token?: string; success: boolean; user?: any }) => void;\r\n onLoginSuccess?: (email: string, needsOtpVerification: boolean) => void; // For backward compatibility\r\n onRegisterClick?: () => void;\r\n showRegisterLink?: boolean;\r\n config?: {\r\n baseUrl?: string;\r\n };\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n}\r\n\r\nexport const LoginForm: React.FC<LoginFormProps> = ({\r\n onSuccess,\r\n onLoginSuccess,\r\n onRegisterClick,\r\n showRegisterLink = true,\r\n config,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true\r\n}) => {\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [password, setPassword] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rememberMe, setRememberMe] = useState(false);\r\n\r\n const { login } = useAuth({\r\n baseUrl: config?.baseUrl || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n let response;\r\n const loginData: any = {};\r\n \r\n // Add email or phone number\r\n if (usePhone && phoneNumber) {\r\n loginData.phoneNumber = phoneNumber;\r\n } else if (email) {\r\n loginData.email = email;\r\n }\r\n \r\n if (usePassword) {\r\n // Traditional email/password or phone/password login\r\n loginData.password = password;\r\n response = await login(loginData);\r\n } else {\r\n // OTP-based login\r\n response = await login(loginData);\r\n }\r\n\r\n if (response.success) {\r\n // Call the new callback if provided\r\n onSuccess?.(response);\r\n\r\n // For backward compatibility, call the old callback if provided\r\n if (onLoginSuccess) {\r\n const identifier = usePhone ? phoneNumber : email;\r\n // Check if this is an OTP sent response or a successful login\r\n if (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.') {\r\n // OTP was sent, need to verify\r\n onLoginSuccess(identifier, true);\r\n } else if (response.token) {\r\n // Direct login successful (email/password)\r\n onLoginSuccess(identifier, false);\r\n } else {\r\n // Default to needing OTP verification for safety\r\n onLoginSuccess(identifier, true);\r\n }\r\n }\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setError(null); // Clear error when switching methods\r\n };\r\n\r\n const togglePasswordVisibility = () => {\r\n setShowPassword(!showPassword);\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>{usePassword ? 'Login with Password' : 'Login with OTP'}</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor={usePhone ? \"phone\" : \"email\"} style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>{usePhone ? 'Phone Number:' : 'Email:'}</label>\r\n {usePhone ? (\r\n <PhoneInput\r\n id=\"phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n required\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n ) : (\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={() => setUsePhone(!usePhone)}\r\n disabled={isLoading}\r\n style={{\r\n marginTop: '8px',\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone number instead'}\r\n </button>\r\n </div>\r\n\r\n {usePassword && (\r\n <div style={{\r\n marginBottom: '16px',\r\n position: 'relative'\r\n }}>\r\n <label htmlFor=\"login-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"login-password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n disabled={isLoading}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {usePassword && (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginBottom: '12px',\r\n marginTop: '4px'\r\n }}>\r\n <input\r\n type=\"checkbox\"\r\n id=\"remember-me\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n disabled={isLoading}\r\n style={{\r\n marginRight: '8px',\r\n cursor: 'pointer',\r\n width: '16px',\r\n height: '16px'\r\n }}\r\n />\r\n <label\r\n htmlFor=\"remember-me\"\r\n style={{\r\n fontSize: '14px',\r\n color: colors.textSecondary,\r\n cursor: 'pointer',\r\n userSelect: 'none'\r\n }}\r\n >\r\n Remember me\r\n </label>\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? (usePassword ? 'Logging in...' : 'Sending OTP...') : (usePassword ? 'Login' : 'Send OTP')}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePassword ? 'Login with OTP instead' : 'Login with password instead'}\r\n </button>\r\n </div>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showRegisterLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Don't have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onRegisterClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Register\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { AuthConfig } from '../../types';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\nexport interface RegisterFormProps {\r\n onRegisterSuccess?: () => void;\r\n onLoginClick?: () => void;\r\n showLoginLink?: boolean;\r\n authConfig?: AuthConfig;\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n invitationToken?: string | null;\r\n}\r\n\r\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\r\n onRegisterSuccess,\r\n onLoginClick,\r\n showLoginLink = true,\r\n authConfig,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true,\r\n invitationToken\r\n}) => {\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; score: number; label: string } => {\r\n if (!pwd) return { strength: 'weak', score: 0, label: '' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', score, label: 'Weak' };\r\n if (score <= 3) return { strength: 'medium', score, label: 'Medium' };\r\n return { strength: 'strong', score, label: 'Strong' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n // Use the provided authConfig or a default one\r\n const config = authConfig || {\r\n baseUrl: 'http://localhost:7000'\r\n };\r\n\r\n const { register } = useAuth(config);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate password confirmation\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Validate password strength\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters long');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n // If invitation token is present, use the signup-with-invitation endpoint\r\n if (invitationToken) {\r\n const response = await fetch(`${config.baseUrl}/api/v1/auth/signup-with-invitation`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n name,\r\n email,\r\n password,\r\n phoneNumber: phoneNumber || undefined,\r\n invitationToken,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (response.ok && data.success) {\r\n // Store the token\r\n if (typeof window !== 'undefined' && data.token) {\r\n localStorage.setItem('auth_token', data.token);\r\n }\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(data.error || data.message || 'Registration failed');\r\n }\r\n } else {\r\n // Regular registration flow\r\n const registerData: any = {\r\n name,\r\n password,\r\n frontendBaseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || window.location.origin)\r\n : undefined\r\n };\r\n\r\n // Add email or phone number\r\n if (email) registerData.email = email;\r\n if (phoneNumber) registerData.phoneNumber = phoneNumber;\r\n\r\n const response = await register(registerData);\r\n if (response.success) {\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Register</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Name:</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email:</label>\r\n <input\r\n id=\"register-email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-phone\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional):</label>\r\n <PhoneInput\r\n id=\"register-phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n minLength={6}\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"confirm-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm Password:</label>\r\n <input\r\n id=\"confirm-password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? 'Registering...' : 'Register'}\r\n </button>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showLoginLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Already have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onLoginClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Login\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface OtpFormProps {\r\n email: string;\r\n onVerifySuccess?: () => void;\r\n onBackToLogin?: () => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const OtpForm: React.FC<OtpFormProps> = ({\r\n email,\r\n onVerifySuccess,\r\n onBackToLogin,\r\n baseUrl\r\n}) => {\r\n const colors = useThemeColors();\r\n const [otp, setOtp] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [resendCooldown, setResendCooldown] = useState(0);\r\n const [resendLoading, setResendLoading] = useState(false);\r\n\r\n const { verify, login } = useAuth({\r\n baseUrl: baseUrl || process.env.NEXT_PUBLIC_AUTH_API_URL || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate OTP format\r\n if (!/^\\d{6}$/.test(otp)) {\r\n setError('Please enter a valid 6-digit OTP');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verify({ email, otp });\r\n if (response.success) {\r\n onVerifySuccess?.();\r\n } else {\r\n setError(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleOtpChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n // Allow only digits and limit to 6 characters\r\n if (/^\\d{0,6}$/.test(value)) {\r\n setOtp(value);\r\n }\r\n };\r\n\r\n const handleResendOtp = async () => {\r\n if (resendCooldown > 0 || resendLoading) return;\r\n\r\n setResendLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await login({ email });\r\n if (response.success) {\r\n // Start 60 second cooldown\r\n setResendCooldown(60);\r\n const interval = setInterval(() => {\r\n setResendCooldown((prev) => {\r\n if (prev <= 1) {\r\n clearInterval(interval);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n } else {\r\n setError(response.message || 'Failed to resend OTP');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to resend OTP');\r\n } finally {\r\n setResendLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Verify OTP</h2>\r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Enter the 6-digit code sent to <strong style={{ color: colors.textPrimary }}>{email}</strong></p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>OTP Code:</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={handleOtpChange}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '20px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary,\r\n textAlign: 'center',\r\n letterSpacing: '5px'\r\n }}\r\n maxLength={6}\r\n placeholder=\"123456\"\r\n autoFocus\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading || otp.length !== 6}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Verifying...' : 'Verify OTP'}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleResendOtp}\r\n disabled={isLoading || resendLoading || resendCooldown > 0}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: resendCooldown > 0 ? colors.textTertiary : colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: resendCooldown > 0 ? 'not-allowed' : 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n marginBottom: '12px',\r\n transition: 'color 0.2s ease',\r\n display: 'block',\r\n width: '100%'\r\n }}\r\n >\r\n {resendLoading ? 'Sending...' : resendCooldown > 0 ? `Resend OTP in ${resendCooldown}s` : 'Resend OTP'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onBackToLogin}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Back to Login\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { LoginForm } from './LoginForm';\r\nimport { RegisterForm } from './RegisterForm';\r\nimport { OtpForm } from './OtpForm';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ntype AuthStep = 'login' | 'register' | 'otp';\r\n\r\ninterface AuthFlowProps {\r\n onAuthComplete?: () => void;\r\n initialStep?: AuthStep;\r\n showTitle?: boolean;\r\n}\r\n\r\nexport const AuthFlow: React.FC<AuthFlowProps> = ({ \r\n onAuthComplete,\r\n initialStep = 'login',\r\n showTitle = true\r\n}) => {\r\n const [step, setStep] = useState<AuthStep>(initialStep);\r\n const [email, setEmail] = useState('');\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n const handleLoginSuccess = (email: string, needsOtpVerification: boolean) => {\r\n // Set email\r\n setEmail(email);\r\n \r\n if (needsOtpVerification) {\r\n // Move to OTP verification step\r\n setStep('otp');\r\n setMessage(null);\r\n } else {\r\n // Login is complete, notify parent\r\n setMessage(null);\r\n onAuthComplete?.();\r\n }\r\n };\r\n\r\n const handleRegisterSuccess = () => {\r\n // Registration successful, show message and redirect to login\r\n setMessage('Registration successful! Please check your email for verification.');\r\n // Automatically switch to login after a short delay\r\n setTimeout(() => {\r\n setStep('login');\r\n setMessage(null);\r\n }, 3000);\r\n };\r\n\r\n const handleVerifySuccess = () => {\r\n // Authentication complete\r\n setMessage(null);\r\n onAuthComplete?.();\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n setStep('login');\r\n setMessage(null);\r\n };\r\n\r\n const renderCurrentStep = () => {\r\n switch (step) {\r\n case 'login':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'register':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Create Account</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <RegisterForm\r\n onRegisterSuccess={handleRegisterSuccess}\r\n onLoginClick={() => setStep('login')}\r\n showLoginLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'otp':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Verify Your Email</h1>}\r\n <OtpForm\r\n email={email}\r\n onVerifySuccess={handleVerifySuccess}\r\n onBackToLogin={handleBackToLogin}\r\n />\r\n </>\r\n );\r\n \r\n default:\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n minHeight: '300px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n {renderCurrentStep()}\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface EmailVerificationPageProps {\r\n token: string;\r\n onVerificationSuccess?: () => void;\r\n onVerificationError?: (error: string) => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const EmailVerificationPage: React.FC<EmailVerificationPageProps> = ({\r\n token,\r\n onVerificationSuccess,\r\n onVerificationError,\r\n baseUrl\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [message, setMessage] = useState('');\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n \r\n const { verifyEmailToken } = useAuth({\r\n baseUrl: baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\r\n });\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setIsLoading(false);\r\n setMessage('Invalid verification token');\r\n setIsSuccess(false);\r\n onVerificationError?.('Invalid verification token');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(token);\r\n \r\n if (response.success) {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verified successfully!');\r\n setIsSuccess(true);\r\n onVerificationSuccess?.();\r\n } else {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verification failed');\r\n setIsSuccess(false);\r\n onVerificationError?.(response.message || 'Email verification failed');\r\n }\r\n } catch (err) {\r\n setIsLoading(false);\r\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';\r\n setMessage(errorMessage);\r\n setIsSuccess(false);\r\n onVerificationError?.(errorMessage);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token, verifyEmailToken, onVerificationSuccess, onVerificationError]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Verifying your email...</h2>\r\n <div style={{\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n width: '40px',\r\n height: '40px',\r\n animation: 'spin 2s linear infinite',\r\n margin: '20px auto'\r\n }}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Email Verification</h2>\r\n <div style={{\r\n padding: '16px 20px',\r\n margin: '24px 0',\r\n borderRadius: '8px',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n backgroundColor: isSuccess ? '#d4edda' : '#f8d7da',\r\n color: isSuccess ? '#155724' : '#721c24',\r\n border: isSuccess ? '1px solid #c3e6cb' : '1px solid #f5c6cb'\r\n }}>\r\n {message}\r\n </div>\r\n {isSuccess && (\r\n <div style={{\r\n marginTop: '24px'\r\n }}>\r\n <p style={{ color: 'black' }}>Your email has been successfully verified!</p>\r\n <button \r\n onClick={() => window.location.href = '/login'}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { ReactNode, forwardRef } from 'react';\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeWrapperProps {\r\n children: ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const ThemeWrapper = forwardRef<HTMLDivElement, ThemeWrapperProps>(\r\n ({ children, className = '', style }, ref) => {\r\n const { theme, mounted } = useAuthTheme();\r\n\r\n if (!mounted) {\r\n return <div ref={ref} className={className} style={style}>{children}</div>;\r\n }\r\n\r\n return (\r\n <div ref={ref} className={`${theme} ${className}`} style={style}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nThemeWrapper.displayName = 'ThemeWrapper';\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface SignInProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n routing?: 'path' | 'virtual';\r\n path?: string;\r\n}\r\n\r\nexport const SignIn: React.FC<SignInProps> = ({ redirectUrl, appearance }) => {\r\n const { signIn, isSignedIn, loading: authLoading } = useAuth();\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [needsOtp, setNeedsOtp] = useState(false);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const loginData = usePhone ? { phoneNumber } : { email };\r\n \r\n if (needsOtp) {\r\n // Submit OTP\r\n const response = await signIn({ ...loginData, otp });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'OTP verification failed');\r\n }\r\n } else if (usePassword) {\r\n // Password login\r\n const response = await signIn({ ...loginData, password });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } else {\r\n // Request OTP\r\n const response = await signIn(loginData);\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n setNeedsOtp(true);\r\n setSuccess(usePhone ? 'OTP sent to your phone. Please check your messages.' : 'OTP sent to your email. Please check your inbox.');\r\n } else {\r\n setError(response.message || 'Failed to send OTP');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n };\r\n\r\n const toggleLoginMethod = () => {\r\n setUsePhone(!usePhone);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n setEmail('');\r\n setPhoneNumber('');\r\n };\r\n\r\n if (authLoading) {\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ThemeWrapper\r\n style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}\r\n >\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n {needsOtp ? 'Enter OTP' : usePassword ? 'Sign in with password' : 'Sign in'}\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {!needsOtp && !usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n )}\r\n\r\n {!needsOtp && usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <input\r\n id=\"phoneNumber\"\r\n type=\"tel\"\r\n value={phoneNumber}\r\n onChange={(e) => setPhoneNumber(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your phone number\"\r\n />\r\n </div>\r\n )}\r\n\r\n {usePassword && !needsOtp && (\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>One-Time Password</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={(e) => setOtp(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n maxLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n letterSpacing: '0.5em',\r\n textAlign: 'center',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"000000\"\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Please wait...' : needsOtp ? 'Verify OTP' : usePassword ? 'Sign in' : usePhone ? 'Continue with phone' : 'Continue with email'}\r\n </button>\r\n\r\n {!needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n marginRight: '16px'\r\n }}\r\n >\r\n {usePassword ? 'Use OTP code instead' : 'Use password instead'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={toggleLoginMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone instead'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setNeedsOtp(false);\r\n setOtp('');\r\n setError(null);\r\n setSuccess(null);\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n )}\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface SignUpProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const SignUp: React.FC<SignUpProps> = ({ redirectUrl, appearance }) => {\r\n const { signUp, isSignedIn } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl ||\r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_REGISTER ||\r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_REGISTER ||\r\n '/dashboard';\r\n\r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const getPasswordStrength = (pwd: string, colors: any): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: colors.borderSecondary };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: colors.errorText };\r\n if (score <= 3) return { strength: 'medium', color: colors.warningText || '#fa4' };\r\n return { strength: 'strong', color: colors.successText };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password, colors);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const signUpData: any = { name, password };\r\n if (email) signUpData.email = email;\r\n if (phoneNumber) signUpData.phoneNumber = phoneNumber;\r\n \r\n const response = await signUp(signUpData);\r\n if (response.success) {\r\n setSuccess('Registration successful! Please check your email to verify your account.');\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Create your account\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your full name\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional)</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n style={appearance?.elements?.formFieldInput}\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Create a password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: colors.borderSecondary,\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Creating account...' : 'Sign up'}\r\n </button>\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignOutProps {\r\n redirectUrl?: string;\r\n}\r\n\r\nexport const SignOut: React.FC<SignOutProps> = ({ redirectUrl }) => {\r\n const { signOut } = useAuth();\r\n\r\n useEffect(() => {\r\n const performSignOut = async () => {\r\n await signOut();\r\n \r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n performSignOut();\r\n }, [signOut, redirectUrl]);\r\n\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Signing out...</div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface UserButtonProps {\r\n showName?: boolean;\r\n appearance?: {\r\n elements?: {\r\n userButtonBox?: React.CSSProperties;\r\n userButtonTrigger?: React.CSSProperties;\r\n userButtonPopoverCard?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const UserButton: React.FC<UserButtonProps> = ({ showName = false, appearance }) => {\r\n const { user, signOut } = useAuth();\r\n const colors = useThemeColors();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n if (!user) return null;\r\n\r\n const getInitials = (name: string) => {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const handleSignOut = async () => {\r\n await signOut();\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{ position: 'relative', ...appearance?.elements?.userButtonBox }} ref={dropdownRef}>\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '6px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'background-color 0.2s',\r\n ...appearance?.elements?.userButtonTrigger\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n <div style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n {showName && (\r\n <span style={{ fontSize: '14px', fontWeight: 500, color: colors.textPrimary }}>\r\n {user.name}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n marginTop: '8px',\r\n width: '240px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\r\n border: `1px solid ${colors.borderPrimary}`,\r\n zIndex: 1000,\r\n ...appearance?.elements?.userButtonPopoverCard\r\n }}>\r\n <div style={{\r\n padding: '16px',\r\n borderBottom: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px'\r\n }}>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '18px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: colors.textPrimary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.name}\r\n </div>\r\n <div style={{\r\n fontSize: '12px',\r\n color: colors.textTertiary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.email}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{ padding: '8px' }}>\r\n <button\r\n onClick={handleSignOut}\r\n style={{\r\n width: '100%',\r\n padding: '10px 16px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: colors.textPrimary,\r\n fontWeight: 500,\r\n transition: 'background-color 0.2s'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </ThemeWrapper>\r\n );\r\n};\r\n\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ProtectedRouteProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n fallback,\r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return fallback || (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface PublicRouteProps {\r\n children: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const PublicRoute: React.FC<PublicRouteProps> = ({ \r\n children, \r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && isSignedIn) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${dashboardPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (isSignedIn) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface VerifyEmailProps {\r\n token?: string;\r\n onSuccess?: () => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport const VerifyEmail: React.FC<VerifyEmailProps> = ({ token, onSuccess, onError }) => {\r\n const { verifyEmailToken } = useAuth();\r\n const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading');\r\n const [message, setMessage] = useState('');\r\n\r\n useEffect(() => {\r\n const verify = async () => {\r\n // Get token from URL if not provided\r\n const verifyToken = token || (typeof window !== 'undefined' \r\n ? new URLSearchParams(window.location.search).get('token') \r\n : null);\r\n\r\n if (!verifyToken) {\r\n setStatus('error');\r\n setMessage('No verification token provided');\r\n onError?.('No verification token provided');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(verifyToken);\r\n if (response.success) {\r\n setStatus('success');\r\n setMessage('Email verified successfully! Redirecting...');\r\n onSuccess?.();\r\n \r\n // Redirect after success\r\n setTimeout(() => {\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_VERIFY || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_VERIFY || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }, 2000);\r\n } else {\r\n setStatus('error');\r\n setMessage(response.message || 'Verification failed');\r\n onError?.(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setStatus('error');\r\n const errorMsg = err instanceof Error ? err.message : 'An error occurred';\r\n setMessage(errorMsg);\r\n onError?.(errorMsg);\r\n }\r\n };\r\n\r\n verify();\r\n }, [token, verifyEmailToken, onSuccess, onError]);\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n {status === 'loading' && (\r\n <>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n margin: '0 auto 20px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verifying your email...\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Please wait while we verify your email address.\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'success' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Email Verified!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n {message}\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'error' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#f44336',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verification Failed\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666', marginBottom: '20px' }}>\r\n {message}\r\n </p>\r\n <button\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ForgotPasswordProps {\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ForgotPassword: React.FC<ForgotPasswordProps> = ({ appearance }) => {\r\n const { forgotPassword } = useAuth();\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await forgotPassword(email);\r\n if (response.success) {\r\n setSuccess('Password reset link sent! Please check your email.');\r\n setEmail('');\r\n } else {\r\n setError(response.message || 'Failed to send reset link');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Forgot password?\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginBottom: '16px',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Send reset link'}\r\n </button>\r\n\r\n <div style={{ textAlign: 'center' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ResetPasswordProps {\r\n token?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ResetPassword: React.FC<ResetPasswordProps> = ({ token, appearance }) => {\r\n const { resetPassword } = useAuth();\r\n const [resetToken, setResetToken] = useState(token || '');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n // Get token from URL if not provided as prop\r\n if (!resetToken && typeof window !== 'undefined') {\r\n const urlToken = new URLSearchParams(window.location.search).get('token');\r\n if (urlToken) {\r\n setResetToken(urlToken);\r\n }\r\n }\r\n }, [resetToken]);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (!resetToken) {\r\n setError('Invalid reset token');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await resetPassword(resetToken, password);\r\n if (response.success) {\r\n setSuccess(true);\r\n setTimeout(() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }, 2000);\r\n } else {\r\n setError(response.message || 'Failed to reset password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Password Reset Successful!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Your password has been reset. Redirecting to login...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Reset your password\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your new password below.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Resetting...' : 'Reset password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ChangePasswordProps {\r\n onSuccess?: () => void;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ChangePassword: React.FC<ChangePasswordProps> = ({ onSuccess, appearance }) => {\r\n const { changePassword } = useAuth();\r\n const [oldPassword, setOldPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPasswords, setShowPasswords] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(newPassword);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(false);\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('New passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (newPassword.length < 6) {\r\n setError('New password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await changePassword(oldPassword, newPassword);\r\n if (response.success) {\r\n setSuccess(true);\r\n setOldPassword('');\r\n setNewPassword('');\r\n setConfirmPassword('');\r\n onSuccess?.();\r\n } else {\r\n setError(response.message || 'Failed to change password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Change Password\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n Password changed successfully!\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"oldPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Current password</label>\r\n <input\r\n id=\"oldPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={oldPassword}\r\n onChange={(e) => setOldPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter current password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"newPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"newPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n {newPassword && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm new password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={showPasswords}\r\n onChange={(e) => setShowPasswords(e.target.checked)}\r\n style={{ marginRight: '8px' }}\r\n />\r\n <span style={{ fontSize: '14px', color: '#666' }}>Show passwords</span>\r\n </label>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Changing password...' : 'Change password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarUploaderProps {\r\n onUploadComplete?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n className?: string;\r\n buttonClassName?: string;\r\n dropzoneClassName?: string;\r\n maxFileSize?: number;\r\n accept?: string[];\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n buttonText?: string;\r\n}\r\n\r\n/**\r\n * AvatarUploader Component\r\n * \r\n * A ready-to-use component for uploading user avatars using the upfiles SDK.\r\n * Opens an ImageManager dialog for uploading and selecting images.\r\n * Automatically updates the user's avatar in the auth system after selection.\r\n * \r\n * @example\r\n * ```tsx\r\n * <AvatarUploader\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/',\r\n * projectId: 'proj_123'\r\n * }}\r\n * onUploadComplete={(url) => console.log('Avatar uploaded:', url)}\r\n * onError={(err) => console.error('Upload failed:', err)}\r\n * buttonText=\"Upload Avatar\"\r\n * />\r\n * ```\r\n */\r\nexport const AvatarUploader: React.FC<AvatarUploaderProps> = ({\r\n onUploadComplete,\r\n onError,\r\n className,\r\n buttonClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n upfilesConfig,\r\n buttonText = 'Upload Avatar',\r\n}) => {\r\n const { uploadAndUpdateAvatar } = useAuth();\r\n const [open, setOpen] = useState(false);\r\n const [uploading, setUploading] = useState(false);\r\n\r\n const handleSelect = async (image: {\r\n url: string;\r\n key: string;\r\n originalName: string;\r\n size: number;\r\n contentType: string;\r\n }) => {\r\n setUploading(true);\r\n try {\r\n // Use the upfiles baseUrl as a proxy to avoid CORS issues with direct S3 access\r\n const proxyUrl = `${upfilesConfig.baseUrl}/api/download?fileKey=${encodeURIComponent(image.key)}`;\r\n \r\n // Fetch the image through the proxy\r\n const response = await fetch(proxyUrl, {\r\n headers: upfilesConfig.apiKey ? {\r\n [upfilesConfig.apiKeyHeader || 'authorization']: upfilesConfig.apiKey.startsWith('upk_') \r\n ? `Bearer ${upfilesConfig.apiKey}` \r\n : upfilesConfig.apiKey\r\n } : {}\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error('Failed to fetch image');\r\n }\r\n \r\n const blob = await response.blob();\r\n const file = new File([blob], image.originalName, { type: image.contentType });\r\n \r\n const result = await uploadAndUpdateAvatar(file);\r\n \r\n if (result.success && result.user?.avatar) {\r\n onUploadComplete?.(result.user.avatar);\r\n setOpen(false);\r\n } else {\r\n throw new Error(result.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Upload failed');\r\n onError?.(err);\r\n } finally {\r\n setUploading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpen(true)}\r\n disabled={uploading}\r\n className={buttonClassName || 'px-4 py-2 text-sm rounded border bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50'}\r\n >\r\n {uploading ? 'Uploading...' : buttonText}\r\n </button>\r\n\r\n <ImageManager\r\n open={open}\r\n onOpenChange={setOpen}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n projectId={upfilesConfig.projectId}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title=\"Select Avatar\"\r\n description=\"Upload a new avatar or select from existing images.\"\r\n mode=\"full\"\r\n maxFileSize={maxFileSize}\r\n maxFiles={1}\r\n autoRecordToDb={true}\r\n fetchThumbnails={true}\r\n onSelect={handleSelect}\r\n />\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\nimport { AvatarUploader } from './AvatarUploader';\r\n\r\ninterface UserProfileProps {\r\n showAvatar?: boolean;\r\n showEmailChange?: boolean;\r\n showPasswordChange?: boolean;\r\n upfilesConfig?: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n}\r\n\r\nexport const UserProfile: React.FC<UserProfileProps> = ({\r\n showAvatar = true,\r\n showEmailChange = true,\r\n showPasswordChange = true,\r\n upfilesConfig,\r\n}) => {\r\n const { user, updateProfile, requestEmailChange } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState(user?.name || '');\r\n const [phoneNumber, setPhoneNumber] = useState(user?.phoneNumber || '');\r\n const [newEmail, setNewEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleUpdateProfile = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updates: { name?: string; phoneNumber?: string } = {};\r\n \r\n if (name !== user?.name) {\r\n updates.name = name;\r\n }\r\n\r\n if (phoneNumber !== user?.phoneNumber) {\r\n updates.phoneNumber = phoneNumber;\r\n }\r\n\r\n if (Object.keys(updates).length === 0) {\r\n setError('No changes to save');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n const response = await updateProfile(updates);\r\n if (response.success) {\r\n setSuccess('Profile updated successfully!');\r\n } else {\r\n setError(response.message || 'Failed to update profile');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleAvatarUploadComplete = async (avatarUrl: string) => {\r\n setSuccess('Avatar updated successfully!');\r\n // Force a refresh of user data to show the new avatar\r\n window.location.reload();\r\n };\r\n\r\n const handleAvatarUploadError = (error: Error) => {\r\n setError(error.message || 'Failed to upload avatar');\r\n };\r\n\r\n const handleRequestEmailChange = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await requestEmailChange(newEmail);\r\n if (response.success) {\r\n setSuccess('Verification email sent! Please check your inbox.');\r\n setNewEmail('');\r\n } else {\r\n setError(response.message || 'Failed to request email change');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (!user) return null;\r\n\r\n return (\r\n <div style={{ maxWidth: '700px', margin: '0 auto', padding: '20px' }}>\r\n <h2 style={{ marginBottom: '24px', fontSize: '24px', fontWeight: 600, color: colors.textPrimary }}>Profile Settings</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Profile Information Form */}\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '24px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Profile Information</h3>\r\n <form onSubmit={handleUpdateProfile}>\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full Name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"Manish Batra\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n {showAvatar && upfilesConfig && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Avatar</label>\r\n {user?.avatar && (\r\n <div style={{ marginBottom: '12px' }}>\r\n <img \r\n src={user.avatar} \r\n alt=\"Current avatar\" \r\n style={{\r\n width: '80px',\r\n height: '80px',\r\n borderRadius: '50%',\r\n objectFit: 'cover',\r\n border: `2px solid ${colors.borderSecondary}`\r\n }}\r\n />\r\n </div>\r\n )}\r\n <AvatarUploader\r\n upfilesConfig={upfilesConfig}\r\n onUploadComplete={handleAvatarUploadComplete}\r\n onError={handleAvatarUploadError}\r\n maxFileSize={5 * 1024 * 1024}\r\n accept={['image/*']}\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Saving...' : 'Save Changes'}\r\n </button>\r\n </form>\r\n </div>\r\n\r\n {/* Change Email Form */}\r\n {showEmailChange && (\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Change Email</h3>\r\n <p style={{ fontSize: '14px', color: colors.textSecondary, marginBottom: '16px' }}>\r\n Current email: <strong>{user.email}</strong>\r\n </p>\r\n <form onSubmit={handleRequestEmailChange}>\r\n <div style={{ marginBottom: '16px' }}>\r\n <label htmlFor=\"newEmail\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>New Email Address</label>\r\n <input\r\n id=\"newEmail\"\r\n type=\"email\"\r\n value={newEmail}\r\n onChange={(e) => setNewEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"newemail@example.com\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Request Email Change'}\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarManagerProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onAvatarUpdated?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n title?: string;\r\n description?: string;\r\n className?: string;\r\n gridClassName?: string;\r\n maxFileSize?: number;\r\n mode?: 'full' | 'browse' | 'upload';\r\n showDelete?: boolean;\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n };\r\n}\r\n\r\n/**\r\n * AvatarManager Component\r\n * \r\n * A comprehensive avatar management component that allows users to:\r\n * - Browse existing uploaded images\r\n * - Upload new avatar images\r\n * - Select and set an avatar\r\n * \r\n * Uses the ImageManager from @thetechfossil/upfiles for a complete image management experience.\r\n * \r\n * @example\r\n * ```tsx\r\n * const [open, setOpen] = useState(false);\r\n * \r\n * <button onClick={() => setOpen(true)}>Change Avatar</button>\r\n * \r\n * <AvatarManager\r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/'\r\n * }}\r\n * onAvatarUpdated={(url) => console.log('Avatar updated:', url)}\r\n * onError={(err) => console.error('Error:', err)}\r\n * />\r\n * ```\r\n */\r\nexport const AvatarManager: React.FC<AvatarManagerProps> = ({\r\n open,\r\n onOpenChange,\r\n onAvatarUpdated,\r\n onError,\r\n title = 'Select Avatar',\r\n description = 'Choose an existing image or upload a new one',\r\n className,\r\n gridClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n mode = 'full',\r\n showDelete = false,\r\n upfilesConfig,\r\n}) => {\r\n const { updateProfile } = useAuth();\r\n const [updating, setUpdating] = useState(false);\r\n\r\n const handleSelect = async (image: any) => {\r\n setUpdating(true);\r\n try {\r\n const response = await updateProfile({ avatar: image.url });\r\n \r\n if (response.success && response.user?.avatar) {\r\n onAvatarUpdated?.(response.user.avatar);\r\n onOpenChange(false);\r\n } else {\r\n throw new Error(response.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Failed to update avatar');\r\n onError?.(err);\r\n } finally {\r\n setUpdating(false);\r\n }\r\n };\r\n\r\n return (\r\n <ImageManager\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title={title}\r\n description={description}\r\n className={className}\r\n gridClassName={gridClassName}\r\n onSelect={handleSelect}\r\n maxFileSize={maxFileSize}\r\n mode={mode}\r\n showDelete={showDelete}\r\n fetchThumbnails={true}\r\n />\r\n );\r\n};\r\n","// Legacy hook (backward compatibility)\r\nexport { useAuth as useAuthLegacy } from './use-auth';\r\n\r\n// New Clerk-like exports\r\nexport { AuthProvider, useAuth } from './AuthProvider';\r\nexport { AuthThemeProvider, useAuthTheme } from './ThemeContext';\r\nexport * from './components';","export * from './auth-client';","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // For Node.js server-side usage, set frontend base URL from environment\r\n const frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n \r\n if (frontendBaseUrl) {\r\n this['httpClient'].setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n \r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', data);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}"]}
|