@traiyani/chatsdk-react 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"chatsdk-react.mjs","sources":["../../../sdk-distributions/react/v1.0.0/src/managers/AuthManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/ChatUserManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/UserManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/ConversationManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/MessageManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/MediaManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/EventManager.ts","../../../sdk-distributions/react/v1.0.0/src/utils/ParseUtils.ts","../../../sdk-distributions/react/v1.0.0/src/managers/SocketManager.ts","../../../sdk-distributions/react/v1.0.0/src/ChatSDK.ts","../../../node_modules/goober/dist/goober.modern.js","../../../node_modules/react-hot-toast/dist/index.mjs","../../../sdk-distributions/react/v1.0.0/src/i18n/locales/en.ts","../../../sdk-distributions/react/v1.0.0/src/i18n/locales/ar.ts","../../../sdk-distributions/react/v1.0.0/src/i18n/index.ts","../../../sdk-distributions/react/v1.0.0/src/components/ChatWindow.tsx","../../../sdk-distributions/react/v1.0.0/src/components/ConversationList.tsx","../../../sdk-distributions/react/v1.0.0/src/hooks/useTheme.tsx","../../../sdk-distributions/react/v1.0.0/src/components/ThemeToggle.tsx","../../../sdk-distributions/react/v1.0.0/src/styles/index.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser } from '../types';\n\nexport interface AuthResponse {\n success: boolean;\n message: string;\n data: {\n token: string;\n user: ChatSDKUser;\n auth: {\n accessToken: string;\n tokenType: string;\n expiresIn: string;\n userId: string;\n externalUserId: string;\n };\n };\n}\n\nexport interface LoginResponse {\n message: string;\n token: string;\n user: ChatSDKUser;\n}\n\nexport interface RegisterResponse {\n message: string;\n token: string;\n user: ChatSDKUser;\n}\n\n/**\n * AuthManager handles all authentication operations for Chat SDK\n * ✅ Updated to match server chat user authentication endpoints\n */\nexport class AuthManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize AuthManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = this.getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Add response interceptor for error handling\n this.api.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response?.status === 401) {\n const requestUrl = error.config?.url || '';\n const isSessionRestore = requestUrl.includes('/api/auth/me');\n \n // Clear invalid token\n this.clearToken();\n \n // Only emit logout event for actual API calls, not session restore attempts\n // Session restore failures should be handled silently to prevent logout loops\n if (!isSessionRestore) {\n this.chatSDK.events?.emit('auth.logout', { reason: 'unauthorized' });\n }\n }\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * ✅ NEW: Authenticate chat user (unified login/register)\n * This is the primary method for chat user authentication\n * @param externalUserId - External user ID from your app\n * @param appId - Application ID\n * @param name - Display name\n * @param email - Email address\n */\n public async authenticate(\n externalUserId: string,\n appId: string,\n name: string,\n email: string\n ): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<AuthResponse>('/api/chat-users/authenticate', {\n externalUserId,\n appId,\n name,\n email,\n });\n\n const user = this.parseAuthResponse(response.data);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Authentication successful', { \n userId: user.id, \n externalUserId: user.externalUserId, \n name: user.name \n });\n }\n\n // Emit authentication event\n this.chatSDK.events?.emit('auth.login', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Authentication failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Authentication failed');\n }\n }\n\n /**\n * ✅ UPDATED: Login user with email and password (backward compatibility)\n * @param email - User email \n * @param password - User password\n */\n public async login(email: string, password: string): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<LoginResponse>('/api/auth/signin', {\n email,\n password,\n });\n\n const { token, user } = response.data;\n \n // Store token\n this.setToken(token);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Login successful', { userId: user.id, email: user.email });\n }\n\n // Emit login event\n this.chatSDK.events?.emit('auth.login', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Login failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Login failed');\n }\n }\n\n /**\n * ✅ NEW: Chat user login (backward compatibility)\n * @param externalUserId - External user ID\n * @param appId - Application ID\n */\n public async chatUserLogin(externalUserId: string, appId: string): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<AuthResponse>('/api/chat-users/login', {\n externalUserId,\n appId,\n });\n\n const user = this.parseAuthResponse(response.data);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Chat user login successful', { \n userId: user.id, \n externalUserId: user.externalUserId \n });\n }\n\n // Emit login event\n this.chatSDK.events?.emit('auth.login', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Chat user login failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user login failed');\n }\n }\n\n /**\n * Register new user\n * @param email - User email\n * @param password - User password\n * @param name - User name\n * @param metadata - Additional user data\n */\n public async register(\n email: string, \n password: string, \n name: string, \n metadata: any = {}\n ): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<RegisterResponse>('/api/auth/signup', {\n email,\n password,\n name,\n ...metadata,\n });\n\n const { token, user } = response.data;\n \n // Store token\n this.setToken(token);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Registration successful', { userId: user.id, email: user.email });\n }\n\n // Emit registration event\n this.chatSDK.events?.emit('auth.register', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Registration failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Registration failed');\n }\n }\n\n /**\n * ✅ NEW: Chat user register (backward compatibility)\n * @param externalUserId - External user ID\n * @param appId - Application ID\n * @param name - Display name\n * @param email - Email address\n */\n public async chatUserRegister(\n externalUserId: string,\n appId: string,\n name: string,\n email: string\n ): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<AuthResponse>('/api/chat-users/register', {\n externalUserId,\n appId,\n name,\n email,\n });\n\n const user = this.parseAuthResponse(response.data);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Chat user registration successful', { \n userId: user.id, \n externalUserId: user.externalUserId,\n name: user.name \n });\n }\n\n // Emit registration event\n this.chatSDK.events?.emit('auth.register', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Chat user registration failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user registration failed');\n }\n }\n\n /**\n * ✅ NEW: Parse authentication response from server\n * Handles our server's response format:\n * {\n * \"success\": true,\n * \"data\": {\n * \"token\": \"jwt_token\",\n * \"user\": { user_data },\n * \"auth\": { auth_info }\n * }\n * }\n */\n private parseAuthResponse(response: AuthResponse): ChatSDKUser {\n if (!response.success) {\n throw new Error(response.message || 'Authentication failed');\n }\n\n if (!response.data) {\n throw new Error('Invalid response format: missing data');\n }\n\n const { token, user, auth } = response.data;\n\n // Store token (try both locations)\n const authToken = token || auth?.accessToken;\n if (authToken) {\n this.setToken(authToken);\n }\n\n // Handle user data mapping\n const parsedUser: ChatSDKUser = {\n id: user.id,\n externalUserId: user.externalUserId,\n appId: user.appId || process.env.REACT_APP_APP_ID || '',\n name: user.name,\n email: user.email,\n avatarUrl: user.avatarUrl,\n status: user.status || 'offline',\n isOnline: user.isOnline || false,\n lastSeen: user.lastSeen,\n isRegistered: true,\n createdAt: user.createdAt || new Date().toISOString(),\n updatedAt: user.updatedAt || new Date().toISOString()\n };\n\n return parsedUser;\n }\n\n /**\n * Logout current user\n */\n public async logout(): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/signout');\n } catch (error) {\n // Continue with logout even if API call fails\n if (this.config?.enableLogging) {\n console.warn('⚠️ AuthManager: Logout API call failed, continuing with local logout');\n }\n }\n\n // Clear token locally\n this.clearToken();\n\n // Log success\n if (this.config?.enableLogging) {\n console.log('👋 AuthManager: Logout successful');\n }\n\n // Emit logout event\n this.chatSDK.events?.emit('auth.logout', { reason: 'user_initiated' });\n }\n\n /**\n * Get current user information\n */\n public async getCurrentUser(): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n if (!this.hasValidToken()) {\n throw new Error('No valid token found. Please login first.');\n }\n\n try {\n const response = await this.api.get('/api/auth/me');\n \n // Parse the response using the same parser as login/register\n return this.parseAuthResponse(response.data);\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Get current user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get current user');\n }\n }\n\n /**\n * Verify email with token\n */\n public async verifyEmail(token: string): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/verify-email', { token });\n \n if (this.config?.enableLogging) {\n console.log('✅ AuthManager: Email verified successfully');\n }\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Email verification failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Email verification failed');\n }\n }\n\n /**\n * Request password reset\n */\n public async forgotPassword(email: string): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/forgot-password', { email });\n \n if (this.config?.enableLogging) {\n console.log('📧 AuthManager: Password reset email sent');\n }\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Forgot password failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to send password reset email');\n }\n }\n\n /**\n * Reset password with token\n */\n public async resetPassword(token: string, newPassword: string): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/reset-password', { token, password: newPassword });\n \n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Password reset successful');\n }\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Password reset failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Password reset failed');\n }\n }\n\n /**\n * Check if user has valid token\n */\n public hasValidToken(): boolean {\n const token = this.getToken();\n return !!token;\n }\n\n /**\n * Get stored token\n */\n private getToken(): string | null {\n return localStorage.getItem('chatSDKToken');\n }\n\n /**\n * Store token\n */\n private setToken(token: string): void {\n localStorage.setItem('chatSDKToken', token);\n }\n\n /**\n * Clear stored token\n */\n private clearToken(): void {\n localStorage.removeItem('chatSDKToken');\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser } from '../types';\n\nexport interface ChatUserLoginResponse {\n success: boolean;\n message: string;\n data: {\n token: string;\n user: ChatSDKUser;\n };\n}\n\nexport interface ChatUserRegisterResponse {\n success: boolean;\n message: string;\n data: {\n token: string;\n user: ChatSDKUser;\n };\n}\n\nexport interface ChatUserData {\n externalUserId: string;\n appId: string;\n name: string;\n email: string;\n}\n\n/**\n * ChatUserManager handles chat user operations\n * Provides methods for chat user login, registration, and management\n */\nexport class ChatUserManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize ChatUserManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = this.getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Add response interceptor for error handling\n this.api.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response?.status === 401) {\n this.clearToken();\n // Emit logout event\n this.chatSDK.events?.emit('chatUser.logout', { reason: 'unauthorized' });\n }\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Login chat user with external user ID\n * @param externalUserId - External user ID\n * @param appId - Application ID\n * @param saveToken - Whether to save the token (default: true)\n */\n public async login(externalUserId: string, appId: string, saveToken: boolean = true): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.post<ChatUserLoginResponse>('/api/chat-users/login', {\n externalUserId,\n appId,\n });\n\n // Handle server response format: { success: true, data: { token, user } }\n const { token, user } = response.data.data;\n \n // Store token only if saveToken is true\n if (saveToken) {\n this.setToken(token);\n \n // Log success with token storage\n if (this.config?.enableLogging) {\n console.log('🔐 ChatUserManager: Chat user login successful with token saved', { userId: user.id, email: user.email });\n }\n\n // Emit login event\n this.chatSDK.events?.emit('chatUser.login', { user });\n } else {\n // Log success without token storage\n if (this.config?.enableLogging) {\n console.log('👤 ChatUserManager: Chat user verified (no token saved)', { userId: user.id, email: user.email });\n }\n }\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Chat user login failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user login failed');\n }\n }\n\n /**\n * Register new chat user\n * @param userData - User data for registration\n * @param saveToken - Whether to save the token (default: true)\n */\n public async register(userData: ChatUserData, saveToken: boolean = true): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.post<ChatUserRegisterResponse>('/api/chat-users/register', userData);\n\n // Handle server response format: { success: true, data: { token, user } }\n const { token, user } = response.data.data;\n \n // Store token only if saveToken is true\n if (saveToken) {\n this.setToken(token);\n\n // Log success with token storage\n if (this.config?.enableLogging) {\n console.log('📝 ChatUserManager: Chat user registration successful with token saved', { userId: user.id, email: user.email });\n }\n\n // Emit register event\n this.chatSDK.events?.emit('chatUser.register', { user });\n } else {\n // Log success without token storage\n if (this.config?.enableLogging) {\n console.log('👤 ChatUserManager: Chat user registered (no token saved)', { userId: user.id, email: user.email });\n }\n }\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Chat user registration failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user registration failed');\n }\n }\n\n /**\n * Login or register chat user (try login first, register if fails)\n * @param externalUserId - External user ID\n * @param appId - Application ID\n * @param name - User display name\n * @param email - User email\n * @param isLoggedinUser - Whether to save token (true for login, false for user existence check)\n */\n public async authenticate(externalUserId: string, appId: string, name: string, email: string, isLoggedinUser: boolean = true): Promise<ChatSDKUser> {\n try {\n // Try login first - pass saveToken flag\n return await this.login(externalUserId, appId, isLoggedinUser);\n } catch (loginError) {\n // If login fails, try registration - pass saveToken flag\n try {\n return await this.register({\n externalUserId,\n appId,\n name,\n email\n }, isLoggedinUser);\n } catch (registerError) {\n throw new Error('Failed to authenticate chat user: ' + registerError);\n }\n }\n }\n\n /**\n * Logout current chat user\n */\n public async logout(): Promise<void> {\n // Clear token locally\n this.clearToken();\n\n // Log success\n if (this.config?.enableLogging) {\n console.log('👋 ChatUserManager: Chat user logout successful');\n }\n\n // Emit logout event\n this.chatSDK.events?.emit('chatUser.logout', { reason: 'manual' });\n }\n\n /**\n * Get current chat user token\n */\n public getToken(): string | null {\n return localStorage.getItem('chatSDKToken');\n }\n\n /**\n * Set chat user token\n */\n private setToken(token: string): void {\n localStorage.setItem('chatSDKToken', token);\n }\n\n /**\n * Clear chat user token\n */\n private clearToken(): void {\n localStorage.removeItem('chatSDKToken');\n }\n\n /**\n * Check if chat user is authenticated\n */\n public isAuthenticated(): boolean {\n return !!this.getToken();\n }\n\n /**\n * Register FCM token with ChatSDK server\n * @param fcmToken - FCM token from Firebase\n * @param platform - Platform (android/ios)\n */\n public async registerFcmToken(fcmToken: string, platform: 'android' | 'ios' = 'android'): Promise<void> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!this.isAuthenticated()) {\n throw new Error('User must be authenticated to register FCM token');\n }\n\n try {\n const response = await this.api.post('/api/chat-users/fcm-token', {\n fcmToken,\n platform\n });\n\n if (this.config?.enableLogging) {\n console.log('📱 ChatUserManager: FCM token registered successfully', { fcmToken, platform });\n }\n\n // Emit FCM token registered event\n this.chatSDK.events?.emit('chatUser.fcmTokenRegistered', { fcmToken, platform });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Failed to register FCM token', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to register FCM token');\n }\n }\n\n /**\n * Unregister FCM token from ChatSDK server\n * @param fcmToken - FCM token to remove\n */\n public async unregisterFcmToken(fcmToken: string): Promise<void> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!this.isAuthenticated()) {\n throw new Error('User must be authenticated to unregister FCM token');\n }\n\n try {\n const response = await this.api.delete('/api/chat-users/fcm-token', {\n data: { fcmToken }\n });\n\n if (this.config?.enableLogging) {\n console.log('🗑️ ChatUserManager: FCM token unregistered successfully', { fcmToken });\n }\n\n // Emit FCM token unregistered event\n this.chatSDK.events?.emit('chatUser.fcmTokenUnregistered', { fcmToken });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Failed to unregister FCM token', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to unregister FCM token');\n }\n }\n\n /**\n * Get current FCM tokens for user\n */\n public async getFcmTokens(): Promise<string[]> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!this.isAuthenticated()) {\n throw new Error('User must be authenticated to get FCM tokens');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/fcm-tokens');\n\n const tokens = response.data?.data?.fcmTokens || [];\n\n if (this.config?.enableLogging) {\n console.log('📱 ChatUserManager: Retrieved FCM tokens', { tokenCount: tokens.length });\n }\n\n return tokens;\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Failed to get FCM tokens', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get FCM tokens');\n }\n }\n\n // ===================================\n // 📊 CONVERSATION METHODS\n // ===================================\n\n /**\n * Get conversations for current chat user\n * @param options - List options\n */\n public async getConversations(options: any = {}): Promise<any[]> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.type) params.append('type', options.type);\n if (options.unreadOnly) params.append('unreadOnly', 'true');\n\n const response = await this.api.get(`/api/chat-users/chats?${params.toString()}`);\n\n const conversations = response.data.data || response.data.conversations || response.data || [];\n\n if (this.config?.enableLogging) {\n console.log('📋 ChatUserManager: Conversations fetched successfully', { \n count: conversations.length \n });\n }\n\n return conversations;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get conversations failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get conversations');\n }\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with external group ID\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n */\n public async startChat(externalGroupId: string, userId: string): Promise<any> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const response = await this.api.post('/api/chat-users/chats', {\n type: 'direct',\n participants: [userId],\n externalGroupId\n });\n\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ChatUserManager: Direct chat started successfully', { \n conversationId: conversation.id,\n userId,\n externalGroupId\n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Start chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start chat');\n }\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with product context\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n * @param productContext - Product information to associate with the conversation (camelCase format)\n * @param chatMetadata - Optional chat-specific metadata\n */\n public async startChatWithProduct(\n externalGroupId: string,\n userId: string, \n productContext: {\n productId: string;\n productName: string;\n productImage: string;\n price?: number;\n currency?: string;\n category?: string;\n productMetadata?: Record<string, any>;\n },\n chatMetadata?: Record<string, any>\n ): Promise<any> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const requestBody: any = {\n type: 'direct',\n participants: [userId],\n externalGroupId,\n metadata: {\n productContext: {\n productId: productContext.productId,\n productName: productContext.productName,\n productImage: productContext.productImage,\n price: productContext.price,\n currency: productContext.currency,\n category: productContext.category,\n productMetadata: productContext.productMetadata\n }\n }\n };\n\n // Add chatMetadata if provided\n if (chatMetadata && Object.keys(chatMetadata).length > 0) {\n requestBody.chatMetadata = chatMetadata;\n }\n\n const response = await this.api.post('/api/chat-users/chats', requestBody);\n\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ChatUserManager: Product chat started successfully', { \n conversationId: conversation.id,\n userId,\n productId: productContext.productId,\n productName: productContext.productName\n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Start product chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start product chat');\n }\n }\n\n // ===================================\n // 📊 UNREAD MESSAGES METHODS\n // ===================================\n\n /**\n * Get count of conversations with unread messages\n */\n public async getUnreadConversationsCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/conversations-count');\n const count = response.data.data.unreadConversationsCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ChatUserManager: Unread conversations count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get unread conversations count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread conversations count');\n }\n }\n\n /**\n * Get total count of unread messages across all conversations\n */\n public async getTotalUnreadCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/total-count');\n const count = response.data.data.totalUnreadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ChatUserManager: Total unread count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get total unread count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get total unread count');\n }\n }\n\n /**\n * Get detailed unread messages summary\n */\n public async getUnreadSummary(): Promise<{\n unreadSummary: Array<{\n room_id: string;\n room_name: string;\n room_type: string;\n unread_count: number;\n last_unread_message_time: string;\n last_unread_message_content: string;\n last_unread_sender_name: string;\n }>;\n totalConversationsWithUnread: number;\n totalUnreadMessages: number;\n }> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/summary');\n const summary = response.data.data;\n\n if (this.config?.enableLogging) {\n console.log('📊 ChatUserManager: Unread summary fetched', { \n conversations: summary.totalConversationsWithUnread,\n totalMessages: summary.totalUnreadMessages \n });\n }\n\n return summary;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get unread summary failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread summary');\n }\n }\n\n /**\n * Mark all messages in a room as read\n * Uses socket (fast) with API fallback (reliable)\n * @param conversationId - Conversation ID\n */\n public async markRoomMessagesRead(conversationId: string): Promise<number> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n if (this.config?.enableLogging) {\n console.log('📖 ChatUserManager: Marking room as read', { conversationId });\n }\n\n // Socket-primary: faster, server handles DB + notifies other participants\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_room_read', { roomId: conversationId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: mark_room_read sent via socket', { roomId: conversationId });\n }\n\n // Emit local event for immediate UI update\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount: 0 });\n return 0;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: Socket not connected, falling back to API');\n }\n\n const response = await this.api.post(`/api/chat-users/chats/${conversationId}/mark-read`);\n const markedCount = response.data.data.markedAsReadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('✅ ChatUserManager: Room messages marked as read via API', { conversationId, markedCount });\n }\n\n // Emit conversation read event (local UI update)\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount });\n\n return markedCount;\n } catch (error: any) {\n console.error('❌ ChatUserManager: Mark room messages as read failed', {\n conversationId,\n error: error.response?.data || error.message,\n status: error.response?.status,\n });\n throw new Error(error.response?.data?.message || error.message || 'Failed to mark room messages as read');\n }\n }\n\n /**\n * Mark specific message as read\n * Uses socket (fast) with API fallback (reliable)\n * @param messageId - Message ID\n */\n public async markMessageRead(messageId: string): Promise<boolean> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n // Socket-primary: faster, server handles DB + notifies sender\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_message_read', { messageId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: mark_message_read sent via socket', { messageId });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread: true });\n return true;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: Socket not connected, falling back to API for mark-message-read');\n }\n\n const response = await this.api.post(`/api/chat-users/messages/${messageId}/mark-read`);\n const wasUnread = response.data.data.wasUnread || false;\n\n if (this.config?.enableLogging) {\n console.log('✅ ChatUserManager: Message marked as read via API', { messageId, wasUnread });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread });\n return wasUnread;\n } catch (error: any) {\n console.error('❌ ChatUserManager: Mark message as read failed', {\n messageId,\n error: error.response?.data || error.message,\n status: error.response?.status,\n });\n throw new Error(error.response?.data?.message || error.message || 'Failed to mark message as read');\n }\n }\n\n /**\n * Start viewing a conversation (auto-marks messages as read)\n * @param conversationId - Conversation ID\n */\n public startViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: true \n });\n \n if (this.config?.enableLogging) {\n console.log('👀 ChatUserManager: Started viewing conversation', { conversationId });\n }\n }\n }\n\n /**\n * Stop viewing a conversation\n * @param conversationId - Conversation ID\n */\n public stopViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: false \n });\n \n if (this.config?.enableLogging) {\n console.log('👁️ ChatUserManager: Stopped viewing conversation', { conversationId });\n }\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser } from '../types';\n\nexport interface UserSearchOptions {\n query?: string;\n limit?: number;\n offset?: number;\n role?: string;\n status?: 'online' | 'offline' | 'away' | 'busy';\n}\n\nexport interface UserUpdateData {\n name?: string;\n avatar?: string;\n status?: 'online' | 'offline' | 'away' | 'busy';\n metadata?: Record<string, any>;\n}\n\n/**\n * UserManager handles all user-related operations\n * Provides methods for user search, update, blocking, etc.\n */\nexport class UserManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize UserManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Get user by ID\n * @param userId - User ID to fetch\n */\n public async getUser(userId: string): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/users/${userId}`);\n \n if (this.config?.enableLogging) {\n console.log('👤 UserManager: User fetched successfully', { userId });\n }\n\n return response.data.user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get user');\n }\n }\n\n /**\n * Search for users\n * @param options - Search options\n */\n public async searchUsers(options: UserSearchOptions = {}): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.query) params.append('q', options.query);\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.role) params.append('role', options.role);\n if (options.status) params.append('status', options.status);\n\n const response = await this.api.get(`/api/users/search?${params.toString()}`);\n \n if (this.config?.enableLogging) {\n console.log('🔍 UserManager: Users searched successfully', { \n query: options.query, \n count: response.data.users?.length || 0 \n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Search users failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to search users');\n }\n }\n\n /**\n * Get all users (paginated)\n * @param limit - Number of users to fetch\n * @param offset - Offset for pagination\n */\n public async getAllUsers(limit: number = 20, offset: number = 0): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/users?limit=${limit}&offset=${offset}`);\n \n if (this.config?.enableLogging) {\n console.log('👥 UserManager: All users fetched successfully', { \n count: response.data.users?.length || 0,\n limit,\n offset\n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get all users failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get users');\n }\n }\n\n /**\n * Update current user's profile\n * @param updateData - Data to update\n */\n public async updateCurrentUser(updateData: UserUpdateData): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.put('/api/users/me', updateData);\n \n if (this.config?.enableLogging) {\n console.log('✏️ UserManager: User profile updated successfully');\n }\n\n // Emit user update event\n this.chatSDK.events?.emit('user.updated', { user: response.data.user });\n\n return response.data.user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Update user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update user');\n }\n }\n\n /**\n * Update user status (online, offline, away, busy)\n * @param status - New status\n */\n public async updateStatus(status: 'online' | 'offline' | 'away' | 'busy'): Promise<void> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n await this.api.put('/api/users/me/status', { status });\n \n if (this.config?.enableLogging) {\n console.log('📊 UserManager: User status updated successfully', { status });\n }\n\n // Emit status update event\n this.chatSDK.events?.emit('user.status.updated', { status });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Update status failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update status');\n }\n }\n\n /**\n * Block a user\n * @param userId - User ID to block\n */\n public async blockUser(userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n await this.api.post(`/api/users/${userId}/block`);\n \n if (this.config?.enableLogging) {\n console.log('🚫 UserManager: User blocked successfully', { userId });\n }\n\n // Emit user blocked event\n this.chatSDK.events?.emit('user.blocked', { userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Block user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to block user');\n }\n }\n\n /**\n * Unblock a user\n * @param userId - User ID to unblock\n */\n public async unblockUser(userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/users/${userId}/block`);\n \n if (this.config?.enableLogging) {\n console.log('✅ UserManager: User unblocked successfully', { userId });\n }\n\n // Emit user unblocked event\n this.chatSDK.events?.emit('user.unblocked', { userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Unblock user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to unblock user');\n }\n }\n\n /**\n * Get blocked users list\n */\n public async getBlockedUsers(): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/users/me/blocked');\n \n if (this.config?.enableLogging) {\n console.log('📋 UserManager: Blocked users fetched successfully', { \n count: response.data.users?.length || 0 \n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get blocked users failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get blocked users');\n }\n }\n\n /**\n * Get user's online status\n * @param userId - User ID to check\n */\n public async getUserStatus(userId: string): Promise<'online' | 'offline' | 'away' | 'busy'> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/users/${userId}/status`);\n \n return response.data.status;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get user status failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get user status');\n }\n }\n\n /**\n * Get multiple users by IDs\n * @param userIds - Array of user IDs\n */\n public async getUsersByIds(userIds: string[]): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.post('/api/users/batch', { userIds });\n \n if (this.config?.enableLogging) {\n console.log('👥 UserManager: Users fetched by IDs successfully', { \n requestedCount: userIds.length,\n receivedCount: response.data.users?.length || 0 \n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get users by IDs failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get users by IDs');\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser, ChatSDKConversation, ChatSDKMessage, ProductContext } from '../types';\n\n// Re-export types for external use\nexport type { ChatSDKConversation, ChatSDKMessage } from '../types';\n\nexport interface CreateConversationOptions {\n type: 'direct' | 'group';\n participantIds: string[];\n name?: string;\n description?: string;\n avatar?: string;\n metadata?: Record<string, any>;\n productContext?: ProductContext;\n}\n\nexport interface ConversationListOptions {\n limit?: number;\n offset?: number;\n type?: 'direct' | 'group';\n unreadOnly?: boolean;\n}\n\n/**\n * ConversationManager handles all conversation operations\n * Provides methods for creating chats, getting conversation lists, etc.\n */\nexport class ConversationManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize ConversationManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with external group ID\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n */\n public async startChat(externalGroupId: string, userId: string): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const response = await this.api.post('/api/chat-users/chats', {\n type: 'direct',\n participants: [userId],\n externalGroupId\n });\n\n if (this.config?.enableLogging) {\n console.log('⚡ Using externalGroupId:', externalGroupId);\n }\n\n console.log('📡 Server response:', response.data);\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ConversationManager: Direct chat started successfully', { \n conversationId: conversation.id,\n userId \n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Start chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start chat');\n }\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with product context\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n * @param productContext - Product information to associate with the conversation (camelCase format)\n * @param chatMetadata - Optional chat-specific metadata\n */\n public async startChatWithProduct(\n externalGroupId: string,\n userId: string, \n productContext: {\n productId: string;\n productName: string;\n productImage: string;\n price?: number;\n currency?: string;\n category?: string;\n productMetadata?: Record<string, any>;\n },\n chatMetadata?: Record<string, any>\n ): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const requestBody: any = {\n type: 'direct',\n participants: [userId],\n externalGroupId,\n metadata: {\n productContext: {\n productId: productContext.productId,\n productName: productContext.productName,\n productImage: productContext.productImage,\n price: productContext.price,\n currency: productContext.currency,\n category: productContext.category,\n productMetadata: productContext.productMetadata\n }\n }\n };\n\n // Add chatMetadata if provided\n if (chatMetadata && Object.keys(chatMetadata).length > 0) {\n requestBody.chatMetadata = chatMetadata;\n }\n\n if (this.config?.enableLogging) {\n console.log('⚡ Using externalGroupId:', externalGroupId);\n }\n\n const response = await this.api.post('/api/chat-users/chats', requestBody);\n\n console.log('📡 Server response:', response.data);\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ConversationManager: Product chat started successfully', { \n conversationId: conversation.id,\n userId,\n productId: productContext.productId,\n productName: productContext.productName\n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Start product chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start product chat');\n }\n }\n\n /**\n * Create a group conversation\n * @param options - Group creation options\n */\n public async createGroup(options: CreateConversationOptions): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post('/api/conversations', options);\n\n console.log('📡 Group creation response:', response.data);\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('👥 ConversationManager: Group created successfully', { \n conversationId: conversation.id,\n participantCount: options.participantIds.length \n });\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Create group failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to create group');\n }\n }\n\n /**\n * Get conversation list\n * @param options - List options\n */\n public async getConversations(options: ConversationListOptions = {}): Promise<ChatSDKConversation[]> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.type) params.append('type', options.type);\n if (options.unreadOnly) params.append('unreadOnly', 'true');\n\n const response = await this.api.get(`/api/chat-users/chats?${params.toString()}`);\n\n console.log('📡 Conversations response:', response.data);\n const conversations = response.data.data || response.data.conversations || response.data || [];\n\n if (this.config?.enableLogging) {\n console.log('📋 ConversationManager: Conversations fetched successfully', { \n count: conversations.length \n });\n }\n\n return conversations;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get conversations failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get conversations');\n }\n }\n\n /**\n * Get conversation by ID\n * @param conversationId - Conversation ID\n */\n public async getConversation(conversationId: string): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/chat-users/chats/${conversationId}`);\n\n if (this.config?.enableLogging) {\n console.log('💬 ConversationManager: Conversation fetched successfully', { conversationId });\n }\n\n return response.data.conversation || response.data;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get conversation');\n }\n }\n\n /**\n * Update conversation (name, description, etc.)\n * @param conversationId - Conversation ID\n * @param updateData - Data to update\n */\n public async updateConversation(\n conversationId: string, \n updateData: Partial<Pick<ChatSDKConversation, 'name' | 'description' | 'avatar' | 'metadata'>>\n ): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.put(`/api/conversations/${conversationId}`, updateData);\n\n const conversation = response.data.conversation;\n\n if (this.config?.enableLogging) {\n console.log('✏️ ConversationManager: Conversation updated successfully', { conversationId });\n }\n\n // Emit conversation updated event\n this.chatSDK.events?.emit('conversation.updated', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Update conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update conversation');\n }\n }\n\n /**\n * Add participants to group conversation\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to add\n */\n public async addParticipants(conversationId: string, userIds: string[]): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/conversations/${conversationId}/participants`, {\n userIds\n });\n\n const conversation = response.data.conversation;\n\n if (this.config?.enableLogging) {\n console.log('➕ ConversationManager: Participants added successfully', { \n conversationId,\n addedCount: userIds.length \n });\n }\n\n // Emit participants added event\n this.chatSDK.events?.emit('conversation.participants.added', { \n conversation, \n addedUserIds: userIds \n });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Add participants failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to add participants');\n }\n }\n\n /**\n * Remove participants from group conversation\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to remove\n */\n public async removeParticipants(conversationId: string, userIds: string[]): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.delete(`/api/conversations/${conversationId}/participants`, {\n data: { userIds }\n });\n\n const conversation = response.data.conversation;\n\n if (this.config?.enableLogging) {\n console.log('➖ ConversationManager: Participants removed successfully', { \n conversationId,\n removedCount: userIds.length \n });\n }\n\n // Emit participants removed event\n this.chatSDK.events?.emit('conversation.participants.removed', { \n conversation, \n removedUserIds: userIds \n });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Remove participants failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to remove participants');\n }\n }\n\n /**\n * Leave conversation\n * @param conversationId - Conversation ID\n */\n public async leaveConversation(conversationId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n await this.api.post(`/api/conversations/${conversationId}/leave`);\n\n if (this.config?.enableLogging) {\n console.log('🚪 ConversationManager: Left conversation successfully', { conversationId });\n }\n\n // Emit conversation left event\n this.chatSDK.events?.emit('conversation.left', { conversationId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Leave conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to leave conversation');\n }\n }\n\n /**\n * Delete conversation\n * @param conversationId - Conversation ID\n */\n public async deleteConversation(conversationId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/conversations/${conversationId}`);\n\n if (this.config?.enableLogging) {\n console.log('🗑️ ConversationManager: Conversation deleted successfully', { conversationId });\n }\n\n // Emit conversation deleted event\n this.chatSDK.events?.emit('conversation.deleted', { conversationId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Delete conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to delete conversation');\n }\n }\n\n /**\n * Mark conversation as read\n * @param conversationId - Conversation ID\n */\n public async markAsRead(conversationId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n await this.api.post(`/api/chat-users/chats/${conversationId}/mark-read`);\n\n if (this.config?.enableLogging) {\n console.log('👁️ ConversationManager: Conversation marked as read', { conversationId });\n }\n\n // Emit conversation read event\n this.chatSDK.events?.emit('conversation.read', { conversationId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Mark as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark conversation as read');\n }\n }\n\n // ===================================\n // 📊 UNREAD MESSAGES METHODS\n // ===================================\n\n /**\n * Get count of conversations with unread messages\n */\n public async getUnreadConversationsCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/conversations-count');\n const count = response.data.data.unreadConversationsCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Unread conversations count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get unread conversations count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread conversations count');\n }\n }\n\n /**\n * Get total count of unread messages across all conversations\n */\n public async getTotalUnreadCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/total-count');\n const count = response.data.data.totalUnreadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Total unread count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get total unread count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get total unread count');\n }\n }\n\n /**\n * Get detailed unread messages summary\n */\n public async getUnreadSummary(): Promise<{\n unreadSummary: Array<{\n room_id: string;\n room_name: string;\n room_type: string;\n unread_count: number;\n last_unread_message_time: string;\n last_unread_message_content: string;\n last_unread_sender_name: string;\n }>;\n totalConversationsWithUnread: number;\n totalUnreadMessages: number;\n }> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/summary');\n const summary = response.data.data;\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Unread summary fetched', { \n conversations: summary.totalConversationsWithUnread,\n totalMessages: summary.totalUnreadMessages \n });\n }\n\n return summary;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get unread summary failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread summary');\n }\n }\n\n /**\n * Mark all messages in a room as read\n * Uses socket (fast) with API fallback (reliable)\n * @param conversationId - Conversation ID\n */\n public async markRoomMessagesRead(conversationId: string): Promise<number> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n // Socket-primary: faster, server handles DB + notifies other participants\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_room_read', { roomId: conversationId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: mark_room_read sent via socket', { roomId: conversationId });\n }\n\n // Emit local event for immediate UI update\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount: 0 });\n return 0;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: Socket not connected, falling back to API');\n }\n\n const response = await this.api.post(`/api/chat-users/chats/${conversationId}/mark-read`);\n const markedCount = response.data.data.markedAsReadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('✅ ConversationManager: Room messages marked as read via API', { conversationId, markedCount });\n }\n\n // Emit conversation read event (local UI update)\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount });\n\n return markedCount;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Mark room messages as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark room messages as read');\n }\n }\n\n /**\n * Mark specific message as read\n * Uses socket (fast) with API fallback (reliable)\n * @param messageId - Message ID\n */\n public async markMessageRead(messageId: string): Promise<boolean> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n // Socket-primary: faster, server handles DB + notifies sender\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_message_read', { messageId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: mark_message_read sent via socket', { messageId });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread: true });\n return true;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: Socket not connected, falling back to API for mark-message-read');\n }\n\n const response = await this.api.post(`/api/chat-users/messages/${messageId}/mark-read`);\n const wasUnread = response.data.data.wasUnread || false;\n\n if (this.config?.enableLogging) {\n console.log('✅ ConversationManager: Message marked as read via API', { messageId, wasUnread });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread });\n return wasUnread;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Mark message as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark message as read');\n }\n }\n\n /**\n * Start viewing a conversation (auto-marks messages as read)\n * @param conversationId - Conversation ID\n */\n public startViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: true \n });\n \n if (this.config?.enableLogging) {\n console.log('👀 ConversationManager: Started viewing conversation', { conversationId });\n }\n }\n }\n\n /**\n * Stop viewing a conversation\n * @param conversationId - Conversation ID\n */\n public stopViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: false \n });\n \n if (this.config?.enableLogging) {\n console.log('👁️ ConversationManager: Stopped viewing conversation', { conversationId });\n }\n }\n }\n\n // ===================================\n // 🚫 USER BLOCKING METHODS (Chat-Specific)\n // ===================================\n\n /**\n * Block a user in a specific chat\n * @param chatId - Chat/Conversation ID\n * @param userId - User ID to block\n */\n public async blockUserInChat(chatId: string, userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/chat-users/chats/${chatId}/block-user`, {\n userId\n });\n\n if (this.config?.enableLogging) {\n console.log('🚫 ConversationManager: User blocked in chat', { chatId, userId });\n }\n\n // Emit user blocked event\n this.chatSDK.events?.emit('user.blocked', { chatId, userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Block user in chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to block user in chat');\n }\n }\n\n /**\n * Unblock a user in a specific chat\n * @param chatId - Chat/Conversation ID\n * @param userId - User ID to unblock\n */\n public async unblockUserInChat(chatId: string, userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/chat-users/chats/${chatId}/unblock-user`, {\n userId\n });\n\n if (this.config?.enableLogging) {\n console.log('✅ ConversationManager: User unblocked in chat', { chatId, userId });\n }\n\n // Emit user unblocked event\n this.chatSDK.events?.emit('user.unblocked', { chatId, userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Unblock user in chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to unblock user in chat');\n }\n }\n\n /**\n * Get block status for a chat\n * @param chatId - Chat/Conversation ID\n * @returns Block status information\n */\n public async getBlockStatus(chatId: string): Promise<{\n chatId: string;\n currentUserId: string;\n isBlockedByOther: boolean;\n blockedByInfo: {\n blockedBy: string;\n blockedAt: string;\n } | null;\n usersBlockedByMe: string[];\n blockedUsers: Record<string, any>;\n }> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/chat-users/chats/${chatId}/block-status`);\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Block status fetched', { chatId });\n }\n\n return response.data.data;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get block status failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get block status');\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKMessage } from '../types';\n\nexport interface SendMessageOptions {\n conversationId: string;\n content: string;\n type?: 'text' | 'image' | 'video' | 'audio' | 'file' | 'location';\n metadata?: Record<string, any>;\n replyToMessageId?: string;\n}\n\nexport interface MessageListOptions {\n conversationId: string;\n limit?: number;\n offset?: number;\n before?: string; // Message ID - get messages before this\n after?: string; // Message ID - get messages after this\n}\n\nexport interface MessageSearchOptions {\n conversationId?: string;\n query: string;\n limit?: number;\n offset?: number;\n messageType?: 'text' | 'image' | 'video' | 'audio' | 'file' | 'location';\n}\n\n/**\n * MessageManager handles all message operations\n * Provides methods for sending, receiving, and managing messages\n */\nexport class MessageManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize MessageManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Send a text message\n * @param conversationId - Conversation ID\n * @param content - Message content\n * @param metadata - Optional metadata\n */\n public async sendMessage(\n conversationId: string, \n content: string, \n metadata?: Record<string, any>\n ): Promise<ChatSDKMessage> {\n return this.sendMessageWithOptions({\n conversationId,\n content,\n type: 'text',\n metadata\n });\n }\n\n /**\n * Send a message with full options\n * @param options - Send message options\n */\n public async sendMessageWithOptions(options: SendMessageOptions): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n // Try socket first if available\n if (this.chatSDK.socket && this.chatSDK.socket.isConnected()) {\n try {\n return await this.sendMessageViaSocket(options);\n } catch (socketError) {\n if (this.config?.enableLogging) {\n console.warn('⚠️ Socket send failed, falling back to HTTP:', socketError);\n }\n // Fall through to HTTP fallback\n }\n }\n\n // HTTP fallback\n return this.sendMessageViaHttp(options);\n }\n\n /**\n * Send message via socket\n */\n private async sendMessageViaSocket(options: SendMessageOptions): Promise<ChatSDKMessage> {\n return new Promise((resolve, reject) => {\n if (!this.chatSDK.socket || !this.chatSDK.socket.isConnected()) {\n reject(new Error('Socket not connected'));\n return;\n }\n\n // Get current user for sender info\n const currentUser = this.chatSDK.getCurrentUser();\n if (!currentUser) {\n reject(new Error('User not authenticated'));\n return;\n }\n\n // Prepare socket message data\n const messageData = {\n conversationId: options.conversationId,\n content: options.content,\n messageType: options.type || 'text',\n metadata: options.metadata,\n senderId: currentUser.id,\n senderName: currentUser.name,\n senderEmail: currentUser.email\n };\n\n // Set up one-time listeners\n const onSuccess = (message: ChatSDKMessage) => {\n this.chatSDK.socket.off('message-sent', onSuccess);\n this.chatSDK.socket.off('message-error', onError);\n resolve(message);\n };\n\n const onError = (error: any) => {\n this.chatSDK.socket.off('message-sent', onSuccess);\n this.chatSDK.socket.off('message-error', onError);\n reject(new Error(error.message || 'Socket send failed'));\n };\n\n // Listen for response\n this.chatSDK.socket.on('message-sent', onSuccess);\n this.chatSDK.socket.on('message-error', onError);\n\n // Send via socket\n this.chatSDK.socket.emit('send_message', messageData);\n\n if (this.config?.enableLogging) {\n console.log('📤 MessageManager: Message sent via socket', {\n conversationId: options.conversationId,\n content: options.content?.substring(0, 50) + (options.content?.length > 50 ? '...' : ''),\n type: options.type || 'text'\n });\n }\n\n // Timeout after 10 seconds\n setTimeout(() => {\n this.chatSDK.socket.off('message-sent', onSuccess);\n this.chatSDK.socket.off('message-error', onError);\n reject(new Error('Socket send timeout'));\n }, 10000);\n });\n }\n\n /**\n * Send message via HTTP (fallback)\n */\n private async sendMessageViaHttp(options: SendMessageOptions): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n try {\n const response = await this.api.post('/api/chat-users/messages', {\n roomId: options.conversationId,\n content: options.content,\n messageType: options.type || 'text',\n metadata: options.metadata,\n replyToMessageId: options.replyToMessageId\n });\n\n const message = response.data.data || response.data.message || response.data;\n \n if (this.config?.enableLogging) {\n console.log('📡 Message sent via HTTP:', {\n id: message.id,\n content: message.content?.substring(0, 50) + (message.content?.length > 50 ? '...' : ''),\n type: message.type || 'text'\n });\n }\n\n // Emit message sent event\n this.chatSDK.events?.emit('message.sent', { message });\n\n return message;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: HTTP send failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to send message');\n }\n }\n\n /**\n * Get message history for a conversation\n * @param options - Message list options\n */\n public async getMessages(options: MessageListOptions): Promise<ChatSDKMessage[]> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.before) params.append('before', options.before);\n if (options.after) params.append('after', options.after);\n\n const response = await this.api.get(\n `/api/chat-users/messages/${options.conversationId}?${params.toString()}`\n );\n\n console.log('📡 Get messages response:', response.data);\n console.log('📡 Raw server messages:', JSON.stringify(response.data, null, 2));\n \n const messages = response.data.data || response.data.messages || response.data || [];\n\n if (this.config?.enableLogging) {\n console.log('📥 MessageManager: Messages fetched successfully', { \n conversationId: options.conversationId,\n count: messages.length \n });\n }\n\n // Map server response format to SDK format\n const mappedMessages = messages.map((msg: any) => ({\n ...msg,\n type: msg.messageType || msg.type || 'text', // ✅ Map messageType to type\n conversationId: msg.roomId || msg.conversationId, // ✅ Map roomId to conversationId\n timestamp: msg.createdAt || msg.timestamp || new Date().toISOString() // ✅ Ensure timestamp\n }));\n\n console.log('📥 Final processed messages:', mappedMessages);\n return mappedMessages;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Get messages failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get messages');\n }\n }\n\n /**\n * Get a specific message by ID\n * @param messageId - Message ID\n */\n public async getMessage(messageId: string): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/messages/${messageId}`);\n\n if (this.config?.enableLogging) {\n console.log('📄 MessageManager: Message fetched successfully', { messageId });\n }\n\n return response.data.message;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Get message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get message');\n }\n }\n\n /**\n * Update a message (edit)\n * @param messageId - Message ID to update\n * @param content - New content\n * @param metadata - Updated metadata\n */\n public async updateMessage(\n messageId: string, \n content: string, \n metadata?: Record<string, any>\n ): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const response = await this.api.put(`/api/messages/${messageId}`, {\n content,\n metadata\n });\n\n const message = response.data.message;\n\n if (this.config?.enableLogging) {\n console.log('✏️ MessageManager: Message updated successfully', { messageId });\n }\n\n // Emit message updated event\n this.chatSDK.events?.emit('message.updated', { message });\n\n return message;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Update message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update message');\n }\n }\n\n /**\n * Delete a message\n * @param messageId - Message ID to delete\n * @param deleteForEveryone - Whether to delete for all participants\n */\n public async deleteMessage(messageId: string, deleteForEveryone: boolean = false): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/messages/${messageId}`, {\n data: { deleteForEveryone }\n });\n\n if (this.config?.enableLogging) {\n console.log('🗑️ MessageManager: Message deleted successfully', { \n messageId,\n deleteForEveryone \n });\n }\n\n // Emit message deleted event\n this.chatSDK.events?.emit('message.deleted', { messageId, deleteForEveryone });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Delete message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to delete message');\n }\n }\n\n /**\n * Mark messages as read\n * @param conversationId - Conversation ID\n * @param messageIds - Message IDs to mark as read (optional, marks all if not provided)\n */\n public async markAsRead(conversationId: string, messageIds?: string[]): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.put(`/api/conversations/${conversationId}/messages/read`, {\n messageIds\n });\n\n if (this.config?.enableLogging) {\n console.log('👁️ MessageManager: Messages marked as read', { \n conversationId,\n messageCount: messageIds?.length || 'all'\n });\n }\n\n // Emit messages read event\n this.chatSDK.events?.emit('messages.read', { conversationId, messageIds });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Mark as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark messages as read');\n }\n }\n\n /**\n * Search messages\n * @param options - Search options\n */\n public async searchMessages(options: MessageSearchOptions): Promise<ChatSDKMessage[]> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n params.append('q', options.query);\n if (options.conversationId) params.append('conversationId', options.conversationId);\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.messageType) params.append('type', options.messageType);\n\n const response = await this.api.get(`/api/messages/search?${params.toString()}`);\n\n const messages = response.data.messages || [];\n\n if (this.config?.enableLogging) {\n console.log('🔍 MessageManager: Messages searched successfully', { \n query: options.query,\n count: messages.length \n });\n }\n\n return messages;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Search messages failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to search messages');\n }\n }\n\n /**\n * Send typing indicator\n * @param conversationId - Conversation ID\n * @param isTyping - Whether user is typing\n */\n public async sendTypingIndicator(conversationId: string, isTyping: boolean): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.post(`/api/conversations/${conversationId}/typing`, {\n isTyping\n });\n\n if (this.config?.enableLogging && isTyping) {\n console.log('⌨️ MessageManager: Typing indicator sent', { conversationId });\n }\n\n // Emit typing event\n this.chatSDK.events?.emit('typing.indicator', { conversationId, isTyping });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Send typing indicator failed', error.response?.data || error.message);\n }\n // Don't throw error for typing indicator failures\n }\n }\n\n /**\n * React to a message (like, heart, etc.)\n * @param messageId - Message ID\n * @param reaction - Reaction type\n */\n public async reactToMessage(messageId: string, reaction: string): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.post(`/api/messages/${messageId}/reactions`, {\n reaction\n });\n\n if (this.config?.enableLogging) {\n console.log('😊 MessageManager: Message reaction sent', { messageId, reaction });\n }\n\n // Emit reaction event\n this.chatSDK.events?.emit('message.reaction', { messageId, reaction });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: React to message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to react to message');\n }\n }\n\n /**\n * Remove reaction from a message\n * @param messageId - Message ID\n * @param reaction - Reaction type to remove\n */\n public async removeReaction(messageId: string, reaction: string): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/messages/${messageId}/reactions/${reaction}`);\n\n if (this.config?.enableLogging) {\n console.log('🗑️ MessageManager: Message reaction removed', { messageId, reaction });\n }\n\n // Emit reaction removed event\n this.chatSDK.events?.emit('message.reaction.removed', { messageId, reaction });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Remove reaction failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to remove reaction');\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\n\nexport interface MediaUploadOptions {\n file: File;\n type: 'image' | 'video' | 'audio' | 'document';\n conversationId?: string;\n caption?: string;\n metadata?: Record<string, any>;\n onProgress?: (progress: number) => void;\n}\n\nexport interface MediaUploadResult {\n fileUrl: string;\n fileName: string;\n fileSize: number;\n mimeType: string;\n thumbnailUrl?: string;\n}\n\nexport interface MediaDownloadOptions {\n mediaId: string;\n quality?: 'original' | 'high' | 'medium' | 'low';\n}\n\n/**\n * MediaManager handles all media and file operations\n * Provides methods for uploading, downloading, and managing media files\n */\nexport class MediaManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n private maxFileSize: number = 50 * 1024 * 1024; // 50MB default\n private allowedTypes: string[] = [\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp',\n 'video/mp4', 'video/webm', 'video/quicktime',\n 'audio/mpeg', 'audio/wav', 'audio/ogg',\n 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'text/plain'\n ];\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize MediaManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance for regular API calls\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Upload a file/media\n * @param options - Upload options\n */\n public async uploadMedia(options: MediaUploadOptions): Promise<MediaUploadResult> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n // Validate file\n this.validateFile(options.file);\n\n try {\n const formData = new FormData();\n formData.append('file', options.file);\n formData.append('type', options.type);\n \n if (options.conversationId) {\n formData.append('chatId', options.conversationId);\n }\n if (options.caption) {\n formData.append('caption', options.caption);\n }\n if (options.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata));\n }\n\n const response = await this.api.post('/api/chat-users/upload', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress: (progressEvent) => {\n if (options.onProgress && progressEvent.total) {\n const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total);\n options.onProgress(progress);\n }\n },\n timeout: 5 * 60 * 1000, // 5 minutes for file upload\n });\n\n const result = response.data.data;\n\n if (this.config?.enableLogging) {\n console.log('📎 MediaManager: File uploaded successfully', {\n url: result.fileUrl,\n fileName: result.fileName,\n fileSize: result.fileSize,\n mimeType: result.mimeType,\n type: options.type\n });\n }\n\n // Emit media uploaded event\n this.chatSDK.events?.emit('media.uploaded', { media: result });\n\n return result;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Upload failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to upload file');\n }\n }\n\n /**\n * Upload image and send as message\n * @param conversationId - Conversation ID\n * @param file - Image file\n * @param caption - Optional caption\n */\n public async sendImage(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'image',\n conversationId,\n caption\n });\n }\n\n /**\n * Upload video and send as message\n * @param conversationId - Conversation ID\n * @param file - Video file\n * @param caption - Optional caption\n */\n public async sendVideo(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'video',\n conversationId,\n caption\n });\n }\n\n /**\n * Upload audio and send as message\n * @param conversationId - Conversation ID\n * @param file - Audio file\n * @param caption - Optional caption\n */\n public async sendAudio(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'audio',\n conversationId,\n caption\n });\n }\n\n /**\n * Upload document and send as message\n * @param conversationId - Conversation ID\n * @param file - Document file\n * @param caption - Optional caption\n */\n public async sendDocument(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'document',\n conversationId,\n caption\n });\n }\n\n /**\n * Get media information\n * @param mediaId - Media ID\n */\n public async getMedia(mediaId: string): Promise<MediaUploadResult> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/media/${mediaId}`);\n\n if (this.config?.enableLogging) {\n console.log('📄 MediaManager: Media info fetched successfully', { mediaId });\n }\n\n return response.data.media;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Get media failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get media');\n }\n }\n\n /**\n * Get download URL for media\n * @param options - Download options\n */\n public async getDownloadUrl(options: MediaDownloadOptions): Promise<string> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n if (options.quality) {\n params.append('quality', options.quality);\n }\n\n const response = await this.api.get(\n `/api/media/${options.mediaId}/download?${params.toString()}`\n );\n\n const downloadUrl = response.data.url;\n\n if (this.config?.enableLogging) {\n console.log('🔗 MediaManager: Download URL generated', { \n mediaId: options.mediaId,\n quality: options.quality \n });\n }\n\n return downloadUrl;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Get download URL failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get download URL');\n }\n }\n\n /**\n * Delete media\n * @param mediaId - Media ID to delete\n */\n public async deleteMedia(mediaId: string): Promise<void> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/media/${mediaId}`);\n\n if (this.config?.enableLogging) {\n console.log('🗑️ MediaManager: Media deleted successfully', { mediaId });\n }\n\n // Emit media deleted event\n this.chatSDK.events?.emit('media.deleted', { mediaId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Delete media failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to delete media');\n }\n }\n\n /**\n * Generate thumbnail for media\n * @param mediaId - Media ID\n * @param size - Thumbnail size\n */\n public async generateThumbnail(mediaId: string, size: 'small' | 'medium' | 'large' = 'medium'): Promise<string> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/media/${mediaId}/thumbnail`, { size });\n\n const thumbnailUrl = response.data.thumbnailUrl;\n\n if (this.config?.enableLogging) {\n console.log('🖼️ MediaManager: Thumbnail generated', { mediaId, size });\n }\n\n return thumbnailUrl;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Generate thumbnail failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to generate thumbnail');\n }\n }\n\n /**\n * Set maximum file size\n * @param sizeInBytes - Maximum file size in bytes\n */\n public setMaxFileSize(sizeInBytes: number): void {\n this.maxFileSize = sizeInBytes;\n \n if (this.config?.enableLogging) {\n console.log('📏 MediaManager: Max file size updated', { \n sizeInMB: Math.round(sizeInBytes / (1024 * 1024)) \n });\n }\n }\n\n /**\n * Set allowed file types\n * @param mimeTypes - Array of allowed MIME types\n */\n public setAllowedTypes(mimeTypes: string[]): void {\n this.allowedTypes = mimeTypes;\n \n if (this.config?.enableLogging) {\n console.log('📋 MediaManager: Allowed types updated', { types: mimeTypes });\n }\n }\n\n /**\n * Validate file before upload\n * @param file - File to validate\n */\n private validateFile(file: File): void {\n // Check file size\n if (file.size > this.maxFileSize) {\n throw new Error(`File size exceeds maximum allowed size of ${Math.round(this.maxFileSize / (1024 * 1024))}MB`);\n }\n\n // Check file type\n if (!this.allowedTypes.includes(file.type)) {\n throw new Error(`File type ${file.type} is not allowed`);\n }\n\n // Check file name\n if (!file.name || file.name.trim().length === 0) {\n throw new Error('File must have a valid name');\n }\n }\n\n /**\n * Check if file type is supported\n * @param mimeType - MIME type to check\n */\n public isTypeSupported(mimeType: string): boolean {\n return this.allowedTypes.includes(mimeType);\n }\n\n /**\n * Get file type category from MIME type\n * @param mimeType - MIME type\n */\n public getFileTypeCategory(mimeType: string): 'image' | 'video' | 'audio' | 'document' {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n return 'document';\n }\n\n /**\n * Format file size in human readable format\n * @param bytes - File size in bytes\n */\n public formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n} ","import { ChatSDKConfig } from '../ChatSDK';\r\n\r\nexport type EventCallback = (data: any) => void;\r\n\r\nexport interface ChatSDKEvent {\r\n type: string;\r\n data: any;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * EventManager handles all real-time events and WebSocket connections\r\n * Provides event emission, listening, and real-time communication\r\n */\r\nexport class EventManager {\r\n private chatSDK: any;\r\n private config: ChatSDKConfig | null = null;\r\n private socket: WebSocket | null = null;\r\n private eventListeners: Map<string, EventCallback[]> = new Map();\r\n private isConnected: boolean = false;\r\n private reconnectAttempts: number = 0;\r\n private maxReconnectAttempts: number = 5;\r\n private reconnectDelay: number = 1000; // Start with 1 second\r\n private heartbeatInterval: NodeJS.Timeout | null = null;\r\n private connectionTimeout: NodeJS.Timeout | null = null;\r\n\r\n constructor(chatSDK: any) {\r\n this.chatSDK = chatSDK;\r\n }\r\n\r\n /**\r\n * Initialize EventManager with configuration\r\n */\r\n public async init(config: ChatSDKConfig): Promise<void> {\r\n this.config = config;\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('📡 EventManager: Initialized');\r\n }\r\n }\r\n\r\n /**\r\n * Connect to WebSocket for real-time events\r\n * NOTE: Disabled - using Socket.io SocketManager instead\r\n */\r\n public async connect(): Promise<void> {\r\n if (!this.config) {\r\n throw new Error('EventManager not initialized');\r\n }\r\n\r\n // Skip WebSocket connection - using Socket.io SocketManager instead\r\n if (this.config?.enableLogging) {\r\n console.log('📡 EventManager: Skipping native WebSocket connection (using Socket.io instead)');\r\n }\r\n \r\n this.isConnected = true;\r\n return Promise.resolve();\r\n\r\n /* DISABLED - Using Socket.io SocketManager instead\r\n if (this.isConnected || this.socket?.readyState === WebSocket.CONNECTING) {\r\n return;\r\n }\r\n\r\n try {\r\n const wsUrl = this.config.wsUrl || this.config.apiBaseUrl.replace('http', 'ws') + '/ws';\r\n const token = localStorage.getItem('chatSDKToken');\r\n \r\n if (!token) {\r\n throw new Error('No authentication token found');\r\n }\r\n\r\n const socketUrl = `${wsUrl}?token=${encodeURIComponent(token)}`;\r\n \r\n if (this.config.enableLogging) {\r\n console.log('🔌 EventManager: Connecting to WebSocket...', { url: wsUrl });\r\n }\r\n\r\n this.socket = new WebSocket(socketUrl);\r\n \r\n this.socket.onopen = this.handleOpen.bind(this);\r\n this.socket.onmessage = this.handleMessage.bind(this);\r\n this.socket.onclose = this.handleClose.bind(this);\r\n this.socket.onerror = this.handleError.bind(this);\r\n\r\n // Set connection timeout\r\n this.connectionTimeout = setTimeout(() => {\r\n if (this.socket?.readyState === WebSocket.CONNECTING) {\r\n this.socket.close();\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Connection timeout');\r\n }\r\n }\r\n }, 10000); // 10 seconds timeout\r\n\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Connection failed', error);\r\n }\r\n throw error;\r\n }\r\n */ // End of disabled WebSocket code\r\n }\r\n\r\n /**\r\n * Disconnect from WebSocket\r\n * NOTE: Disabled - using Socket.io SocketManager instead\r\n */\r\n public async disconnect(): Promise<void> {\r\n // Skip WebSocket disconnection - using Socket.io SocketManager instead\r\n if (this.config?.enableLogging) {\r\n console.log('📡 EventManager: Skipping native WebSocket disconnection (using Socket.io instead)');\r\n }\r\n \r\n this.isConnected = false;\r\n return Promise.resolve();\r\n\r\n /* DISABLED - Using Socket.io SocketManager instead\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n \r\n if (this.heartbeatInterval) {\r\n clearInterval(this.heartbeatInterval);\r\n this.heartbeatInterval = null;\r\n }\r\n\r\n if (this.connectionTimeout) {\r\n clearTimeout(this.connectionTimeout);\r\n this.connectionTimeout = null;\r\n }\r\n */\r\n\r\n this.isConnected = false;\r\n this.reconnectAttempts = 0;\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('🔌 EventManager: Disconnected');\r\n }\r\n }\r\n\r\n /**\r\n * Add event listener\r\n * @param event - Event name\r\n * @param callback - Callback function\r\n */\r\n public on(event: string, callback: EventCallback): void {\r\n if (!this.eventListeners.has(event)) {\r\n this.eventListeners.set(event, []);\r\n }\r\n this.eventListeners.get(event)!.push(callback);\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('👂 EventManager: Event listener added', { event });\r\n }\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n * @param event - Event name\r\n * @param callback - Callback function to remove\r\n */\r\n public off(event: string, callback?: EventCallback): void {\r\n if (!callback) {\r\n // Remove all listeners for this event\r\n this.eventListeners.delete(event);\r\n return;\r\n }\r\n\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n const index = listeners.indexOf(callback);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n }\r\n \r\n if (listeners.length === 0) {\r\n this.eventListeners.delete(event);\r\n }\r\n }\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('🔇 EventManager: Event listener removed', { event });\r\n }\r\n }\r\n\r\n /**\r\n * Emit local event\r\n * @param event - Event name\r\n * @param data - Event data\r\n */\r\n public emit(event: string, data: any): void {\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n listeners.forEach(callback => {\r\n try {\r\n callback(data);\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Error in event callback', { event, error });\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('📢 EventManager: Event emitted', { event, data });\r\n }\r\n }\r\n\r\n /**\r\n * Send message through WebSocket\r\n * @param type - Message type\r\n * @param data - Message data\r\n */\r\n public send(type: string, data: any): void {\r\n if (!this.isConnected || !this.socket) {\r\n if (this.config?.enableLogging) {\r\n console.warn('⚠️ EventManager: Cannot send message - not connected');\r\n }\r\n return;\r\n }\r\n\r\n const message = {\r\n type,\r\n data,\r\n timestamp: Date.now()\r\n };\r\n\r\n try {\r\n this.socket.send(JSON.stringify(message));\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('📤 EventManager: Message sent', { type, data });\r\n }\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Failed to send message', { type, error });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if connected to WebSocket\r\n */\r\n public isSocketConnected(): boolean {\r\n return this.isConnected && this.socket?.readyState === WebSocket.OPEN;\r\n }\r\n\r\n /**\r\n * Get connection status\r\n */\r\n public getConnectionStatus(): 'connected' | 'connecting' | 'disconnected' | 'error' {\r\n if (!this.socket) return 'disconnected';\r\n \r\n switch (this.socket.readyState) {\r\n case WebSocket.CONNECTING:\r\n return 'connecting';\r\n case WebSocket.OPEN:\r\n return 'connected';\r\n case WebSocket.CLOSING:\r\n case WebSocket.CLOSED:\r\n return 'disconnected';\r\n default:\r\n return 'error';\r\n }\r\n }\r\n\r\n // Private methods for WebSocket event handling\r\n private handleOpen(event: Event): void {\r\n this.isConnected = true;\r\n this.reconnectAttempts = 0;\r\n this.reconnectDelay = 1000;\r\n\r\n if (this.connectionTimeout) {\r\n clearTimeout(this.connectionTimeout);\r\n this.connectionTimeout = null;\r\n }\r\n\r\n // Start heartbeat\r\n this.startHeartbeat();\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('✅ EventManager: WebSocket connected');\r\n }\r\n\r\n this.emit('connection.open', { timestamp: Date.now() });\r\n }\r\n\r\n private handleMessage(event: MessageEvent): void {\r\n try {\r\n const message = JSON.parse(event.data);\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('📥 EventManager: Message received', message);\r\n }\r\n\r\n // Handle special system messages\r\n if (message.type === 'heartbeat') {\r\n this.send('heartbeat', { timestamp: Date.now() });\r\n return;\r\n }\r\n\r\n // Emit the received event\r\n this.emit(message.type, message.data);\r\n \r\n // Also emit a general message event\r\n this.emit('message.received', message);\r\n\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Failed to parse message', { data: event.data, error });\r\n }\r\n }\r\n }\r\n\r\n private handleClose(event: CloseEvent): void {\r\n this.isConnected = false;\r\n \r\n if (this.heartbeatInterval) {\r\n clearInterval(this.heartbeatInterval);\r\n this.heartbeatInterval = null;\r\n }\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('🔌 EventManager: WebSocket closed', { \r\n code: event.code, \r\n reason: event.reason,\r\n wasClean: event.wasClean \r\n });\r\n }\r\n\r\n this.emit('connection.close', { \r\n code: event.code, \r\n reason: event.reason,\r\n timestamp: Date.now() \r\n });\r\n\r\n // Attempt reconnection if not a clean close\r\n if (!event.wasClean && this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.attemptReconnect();\r\n }\r\n }\r\n\r\n private handleError(event: Event): void {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: WebSocket error', event);\r\n }\r\n\r\n this.emit('connection.error', { \r\n error: event,\r\n timestamp: Date.now() \r\n });\r\n }\r\n\r\n private startHeartbeat(): void {\r\n if (this.heartbeatInterval) {\r\n clearInterval(this.heartbeatInterval);\r\n }\r\n\r\n this.heartbeatInterval = setInterval(() => {\r\n if (this.isConnected) {\r\n this.send('ping', { timestamp: Date.now() });\r\n }\r\n }, 30000); // Send ping every 30 seconds\r\n }\r\n\r\n private attemptReconnect(): void {\r\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Max reconnection attempts reached');\r\n }\r\n this.emit('connection.failed', { \r\n attempts: this.reconnectAttempts,\r\n timestamp: Date.now() \r\n });\r\n return;\r\n }\r\n\r\n this.reconnectAttempts++;\r\n \r\n if (this.config?.enableLogging) {\r\n console.log(`🔄 EventManager: Attempting reconnection ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);\r\n }\r\n\r\n setTimeout(() => {\r\n this.connect().catch(error => {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Reconnection failed', error);\r\n }\r\n this.attemptReconnect();\r\n });\r\n }, this.reconnectDelay);\r\n\r\n // Exponential backoff\r\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, 30000); // Max 30 seconds\r\n }\r\n\r\n /**\r\n * Set maximum reconnection attempts\r\n * @param attempts - Maximum number of attempts\r\n */\r\n public setMaxReconnectAttempts(attempts: number): void {\r\n this.maxReconnectAttempts = attempts;\r\n }\r\n\r\n /**\r\n * Clear all event listeners\r\n */\r\n public clearAllListeners(): void {\r\n this.eventListeners.clear();\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('🧹 EventManager: All event listeners cleared');\r\n }\r\n }\r\n\r\n /**\r\n * Get list of active event listeners\r\n */\r\n public getActiveListeners(): string[] {\r\n return Array.from(this.eventListeners.keys());\r\n }\r\n} ","import { ChatSDKUser, ChatSDKMessage, ChatSDKConversation, ProductContext } from '../types';\r\n\r\n/**\r\n * ✅ Parsing utilities for React SDK\r\n * Handles only the standard server API formats - no alternate field names\r\n * WebSocket format vs HTTP API format (minimal differences)\r\n */\r\nexport class ParseUtils {\r\n /**\r\n * Parse user data - handles standard server format only\r\n * @param data User data from server\r\n * @returns Validated ChatSDKUser object\r\n */\r\n static parseUser(data: any): ChatSDKUser {\r\n if (!data) {\r\n throw new Error('User data is required');\r\n }\r\n\r\n // Server uses standard camelCase format\r\n return {\r\n id: data.id,\r\n externalUserId: data.externalUserId,\r\n appId: data.appId,\r\n name: data.name,\r\n username: data.username,\r\n displayName: data.displayName,\r\n email: data.email,\r\n avatar: data.avatar,\r\n avatarUrl: data.avatarUrl,\r\n status: data.status || 'offline',\r\n isOnline: data.isOnline || false,\r\n isRegistered: data.isRegistered || true,\r\n lastSeen: data.lastSeen,\r\n createdAt: data.createdAt,\r\n updatedAt: data.updatedAt,\r\n metadata: data.metadata || {},\r\n \r\n // Include any other server fields as-is\r\n ...data\r\n };\r\n }\r\n\r\n /**\r\n * Parse message data - handles WebSocket and HTTP API formats only\r\n * @param data Message data from server\r\n * @returns Validated ChatSDKMessage object\r\n */\r\n static parseMessage(data: any): ChatSDKMessage {\r\n if (!data) {\r\n throw new Error('Message data is required');\r\n }\r\n\r\n // Handle the standard server format - no alternate keys, use what actually comes from API\r\n \r\n // Determine message type - use explicit type or infer from metadata\r\n let messageType = data.type || 'text';\r\n \r\n // If type is not set but we have file metadata, infer from mimeType\r\n if (messageType === 'text' && data.metadata?.fileUrl && data.metadata?.mimeType) {\r\n const mimeType = data.metadata.mimeType;\r\n if (mimeType.startsWith('image/')) {\r\n messageType = 'image';\r\n } else if (mimeType.startsWith('video/')) {\r\n messageType = 'video';\r\n } else if (mimeType.startsWith('audio/')) {\r\n messageType = 'audio';\r\n } else {\r\n messageType = 'file';\r\n }\r\n }\r\n \r\n const parsedMessage = {\r\n id: data.id,\r\n content: data.content,\r\n senderId: data.senderId,\r\n \r\n // Use standard camelCase - only the keys that actually come from server\r\n roomId: data.roomId || data.conversationId, // Keep this minimal fallback for WebSocket vs HTTP\r\n conversationId: data.conversationId || data.roomId, // Required by ChatSDKMessage type\r\n \r\n // Sender info (only standard camelCase fields)\r\n senderName: data.senderName,\r\n senderEmail: data.senderEmail,\r\n senderAvatar: data.senderAvatar,\r\n senderExternalUserId: data.senderExternalUserId,\r\n \r\n // Use the determined message type\r\n messageType: messageType,\r\n type: messageType,\r\n \r\n // Required status fields\r\n status: data.status || 'sent',\r\n isRead: data.isRead || false,\r\n isDelivered: data.isDelivered || false,\r\n \r\n // Timestamps (standard fields only)\r\n timestamp: data.timestamp,\r\n createdAt: data.createdAt,\r\n updatedAt: data.updatedAt,\r\n \r\n // Keep metadata as-is - file info stays in metadata where ChatWindow expects it\r\n metadata: data.metadata || {}\r\n };\r\n\r\n console.log('✅ ParseUtils: Parsed message:', {\r\n id: parsedMessage.id,\r\n type: parsedMessage.type,\r\n messageType: parsedMessage.messageType,\r\n roomId: parsedMessage.roomId,\r\n hasMetadata: !!parsedMessage.metadata,\r\n metadataKeys: Object.keys(parsedMessage.metadata || {}),\r\n fileUrl: parsedMessage.metadata?.fileUrl\r\n });\r\n return parsedMessage;\r\n }\r\n\r\n /**\r\n * Parse conversation data - handles standard server format only\r\n * @param data Conversation data from server\r\n * @returns Validated ChatSDKConversation object\r\n */\r\n static parseConversation(data: any): ChatSDKConversation {\r\n if (!data) {\r\n throw new Error('Conversation data is required');\r\n }\r\n\r\n // Server uses standard camelCase format\r\n return {\r\n id: data.id,\r\n conversationId: data.conversationId || data.id,\r\n name: data.name,\r\n description: data.description,\r\n type: data.type || 'direct',\r\n avatar: data.avatar,\r\n participants: Array.isArray(data.participants) ? data.participants.map((p: any) => this.parseUser(p)) : [],\r\n lastMessage: data.lastMessage ? this.parseMessage(data.lastMessage) : null,\r\n productContext: data.productContext ? this.parseProductContext(data.productContext) : undefined,\r\n metadata: data.metadata || {},\r\n createdAt: data.createdAt,\r\n updatedAt: data.updatedAt,\r\n \r\n // Include any other server fields as-is\r\n ...data\r\n };\r\n }\r\n\r\n /**\r\n * Parse product context - handles standard server format only\r\n * @param data Product context data from server\r\n * @returns Validated ProductContext object or undefined\r\n */\r\n static parseProductContext(data: any): ProductContext | undefined {\r\n if (!data) {\r\n return undefined;\r\n }\r\n\r\n // Server uses standard camelCase format\r\n return {\r\n productId: data.productId,\r\n productName: data.productName,\r\n productImage: data.productImage,\r\n price: data.price,\r\n currency: data.currency,\r\n category: data.category,\r\n productMetadata: data.productMetadata || {},\r\n \r\n // Include any other server fields as-is\r\n ...data\r\n };\r\n }\r\n\r\n /**\r\n * Simple array validation - server returns consistent data\r\n */\r\n static parseMessages(messages: any[]): ChatSDKMessage[] {\r\n return Array.isArray(messages) ? messages : [];\r\n }\r\n\r\n static parseConversations(conversations: any[]): ChatSDKConversation[] {\r\n return Array.isArray(conversations) ? conversations : [];\r\n }\r\n\r\n static parseUsers(users: any[]): ChatSDKUser[] {\r\n return Array.isArray(users) ? users : [];\r\n }\r\n} ","import { io, Socket } from 'socket.io-client';\nimport { ChatSDK, ChatSDKConfig } from '../ChatSDK';\nimport { ParseUtils } from '../utils/ParseUtils';\n\nexport interface SocketConfig {\n url: string;\n enableLogging?: boolean;\n}\n\nexport interface SocketEvents {\n 'message_received': (message: any) => void;\n 'typing_indicator': (data: any) => void;\n 'user_status_changed': (data: any) => void;\n 'conversation_updated': (data: any) => void;\n 'connection_status': (status: 'connected' | 'disconnected' | 'error') => void;\n}\n\n/**\n * SocketManager handles real-time WebSocket connections\n * Provides methods for real-time chat, user status, and notifications\n */\nexport class SocketManager {\n private chatSDK: any;\n private socket: any = null;\n private config: ChatSDKConfig | null = null;\n private currentUserId: string | null = null;\n private joinedRooms: Set<string> = new Set();\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize SocketManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Starting initialization...', {\n apiBaseUrl: config.apiBaseUrl,\n enableLogging: config.enableLogging\n });\n }\n\n try {\n // Create socket connection\n // Use wsUrl if provided, otherwise derive from apiBaseUrl\n let socketUrl = config.wsUrl;\n if (!socketUrl && config.apiBaseUrl) {\n // Remove /api suffix if present, and ensure we have a valid URL\n socketUrl = config.apiBaseUrl.replace(/\\/api\\/?$/, '');\n }\n // Fallback to localhost only in development\n if (!socketUrl) {\n socketUrl = config.environment === 'production' \n ? 'https://chatsdk-mzad-admin.onrender.com' // Default production URL\n : 'http://localhost:5001';\n }\n \n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Creating socket connection to:', socketUrl, {\n wsUrl: config.wsUrl,\n apiBaseUrl: config.apiBaseUrl,\n environment: config.environment\n });\n }\n \n this.socket = io(socketUrl, {\n transports: ['websocket', 'polling'], // Try websocket first, fallback to polling\n autoConnect: false,\n forceNew: true,\n \n // ✅ Connection & Keep-Alive Settings - Match server configuration\n timeout: 45000, // 45 seconds - initial connection timeout (matches server)\n reconnection: true, // Enable automatic reconnection\n reconnectionAttempts: 10, // Try up to 10 times\n reconnectionDelay: 2000, // 2 seconds - initial delay\n reconnectionDelayMax: 10000, // 10 seconds - max delay with exponential backoff\n \n // ✅ Additional settings for stability\n upgrade: true, // Allow upgrade from polling to websocket\n rememberUpgrade: false, // Don't remember upgrade preference (test each time)\n });\n\n this.setupEventListeners();\n \n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Initialized successfully with socket:', !!this.socket);\n }\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Initialization failed', error);\n }\n throw error;\n }\n }\n\n /**\n * Connect to WebSocket server\n */\n public async connect(userId: string): Promise<void> {\n if (!this.socket) {\n throw new Error('SocketManager not initialized');\n }\n\n this.currentUserId = userId;\n\n // Get the actual socket URL being used\n let socketUrl = this.config?.wsUrl;\n if (!socketUrl && this.config?.apiBaseUrl) {\n socketUrl = this.config.apiBaseUrl.replace(/\\/api\\/?$/, '');\n }\n if (!socketUrl) {\n socketUrl = this.config?.environment === 'production' \n ? 'https://chatsdk-mzad-admin.onrender.com'\n : 'http://localhost:5001';\n }\n \n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Attempting to connect to WebSocket server...', {\n userId,\n socketUrl,\n wsUrl: this.config?.wsUrl,\n apiBaseUrl: this.config?.apiBaseUrl,\n environment: this.config?.environment,\n hasSocket: !!this.socket\n });\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Connection timeout after 10 seconds');\n }\n reject(new Error('Connection timeout'));\n }, 10000);\n\n this.socket!.connect();\n\n this.socket!.on('connect', () => {\n clearTimeout(timeout);\n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Connected to WebSocket server successfully!');\n }\n\n // Authenticate user\n this.socket!.emit('authenticate', { userId, appId: this.config?.appId });\n if (this.config?.enableLogging) {\n console.log('🔐 SocketManager: Sent authentication for user:', userId);\n }\n resolve();\n });\n\n this.socket!.on('connect_error', (error: any) => {\n clearTimeout(timeout);\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Connection failed with error:', error);\n }\n reject(error);\n });\n\n this.socket!.on('disconnect', (reason: any) => {\n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Disconnected from server, reason:', reason);\n }\n });\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n public disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.joinedRooms.clear();\n \n if (this.config?.enableLogging) {\n console.log('�� SocketManager: Disconnected from WebSocket server');\n }\n }\n }\n\n /**\n * Join a conversation for real-time messages\n */\n public joinConversation(conversationId: string): void {\n if (!this.socket || !this.socket.connected) {\n if (this.config?.enableLogging) {\n console.warn('SocketManager: Cannot join conversation - not connected');\n }\n return;\n }\n\n if (!this.joinedRooms.has(conversationId)) {\n this.socket.emit('join_conversation', { \n conversationId,\n appId: this.config?.appId \n });\n this.joinedRooms.add(conversationId);\n \n if (this.config?.enableLogging) {\n console.log(`🏠 SocketManager: Joined conversation ${conversationId}`);\n }\n }\n }\n\n /**\n * Leave a conversation\n */\n public leaveConversation(conversationId: string): void {\n if (!this.socket || !this.socket.connected) {\n return;\n }\n\n if (this.joinedRooms.has(conversationId)) {\n this.socket.emit('leave_conversation', { conversationId });\n this.joinedRooms.delete(conversationId);\n \n if (this.config?.enableLogging) {\n console.log(`🏠 SocketManager: Left conversation ${conversationId}`);\n }\n }\n }\n\n /**\n * Send typing indicator\n */\n public sendTypingIndicator(conversationId: string, isTyping: boolean): void {\n if (!this.socket || !this.socket.connected) {\n if (this.config?.enableLogging) {\n console.warn('SocketManager: Cannot send typing indicator - not connected');\n }\n return;\n }\n\n this.socket.emit('typing_indicator', {\n conversationId,\n isTyping,\n userId: this.currentUserId\n });\n\n if (this.config?.enableLogging) {\n console.log(`⌨️ SocketManager: Typing indicator sent: ${isTyping} for conversation ${conversationId}`);\n }\n }\n\n /**\n * Send a real-time message\n */\n public sendMessage(data: {\n chatId: string;\n content: string;\n type?: string;\n senderId: string;\n senderName: string;\n metadata?: any;\n }): void {\n if (!this.socket || !this.socket.connected) {\n if (this.config?.enableLogging) {\n console.warn('SocketManager: Cannot send message - not connected');\n }\n return;\n }\n\n const messageData = {\n ...data,\n timestamp: new Date().toISOString(),\n senderId: this.currentUserId || data.senderId\n };\n\n this.socket.emit('send-message', messageData);\n \n if (this.config?.enableLogging) {\n console.log('📤 SocketManager: Message sent via WebSocket', messageData);\n }\n }\n\n /**\n * Set up event listeners for real-time events\n */\n private setupEventListeners(): void {\n if (!this.socket) return;\n\n // ✅ Handle incoming messages with proper parsing\n this.socket.on('message_received', (message: any) => {\n try {\n // Parse message with alternate field name support\n const parsedMessage = ParseUtils.parseMessage(message);\n\n // Emit parsed message to ChatSDK event system\n this.chatSDK.events?.emit('message.received', { message: parsedMessage });\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to parse received message', error);\n }\n // Fallback: emit original message\n this.chatSDK.events?.emit('message.received', { message });\n }\n });\n\n // ✅ Handle typing indicators with field mapping\n this.socket.on('typing_indicator', (data: any) => {\n try {\n // Normalize field names\n const normalizedData = {\n userId: data.userId || data.user_id,\n conversationId: data.conversationId || data.conversation_id || data.room_id,\n isTyping: data.isTyping || data.is_typing,\n timestamp: data.timestamp || data.created_at\n };\n\n if (this.config?.enableLogging) {\n console.log('⌨️ SocketManager: Typing indicator received', normalizedData);\n }\n\n this.chatSDK.events?.emit('typing.indicator', normalizedData);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process typing indicator', error);\n }\n // Fallback: emit original data\n this.chatSDK.events?.emit('typing.indicator', data);\n }\n });\n\n // ✅ Handle user status updates with field mapping\n this.socket.on('user_status_changed', (data: any) => {\n try {\n // Normalize field names\n const normalizedData = {\n userId: data.userId || data.user_id,\n status: data.status,\n timestamp: data.timestamp || data.updated_at || data.last_seen\n };\n\n if (this.config?.enableLogging) {\n console.log('👤 SocketManager: User status update', normalizedData);\n }\n\n this.chatSDK.events?.emit('user.status.changed', normalizedData);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process user status update', error);\n }\n // Fallback: emit original data\n this.chatSDK.events?.emit('user.status.changed', data);\n }\n });\n\n // ✅ Handle conversation updates with field mapping\n this.socket.on('conversation_updated', (data: any) => {\n try {\n // Normalize field names\n const normalizedData = {\n conversationId: data.conversationId || data.conversation_id || data.room_id,\n lastMessage: data.lastMessage || data.last_message,\n unreadCount: data.unreadCount || data.unread_count,\n timestamp: data.timestamp || data.updated_at\n };\n\n if (this.config?.enableLogging) {\n console.log('💬 SocketManager: Conversation update', normalizedData);\n }\n\n this.chatSDK.events?.emit('conversation.updated', normalizedData);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process conversation update', error);\n }\n // Fallback: emit original data\n this.chatSDK.events?.emit('conversation.updated', data);\n }\n });\n\n // Handle user joined room\n this.socket.on('user-joined-room', (data: any) => {\n if (this.config?.enableLogging) {\n console.log('🏠 SocketManager: User joined room', data);\n }\n\n this.chatSDK.events?.emit('room.user.joined', data);\n });\n\n // Handle user left room\n this.socket.on('user-left-room', (data: any) => {\n if (this.config?.enableLogging) {\n console.log('🚪 SocketManager: User left room', data);\n }\n\n this.chatSDK.events?.emit('room.user.left', data);\n });\n\n // Handle online users list\n this.socket.on('online-users', (users: any[]) => {\n try {\n // Parse users with alternate field support\n const parsedUsers = ParseUtils.parseUsers(users);\n \n if (this.config?.enableLogging) {\n console.log('🌐 SocketManager: Online users update', { count: parsedUsers.length });\n }\n\n this.chatSDK.events?.emit('users.online', { users: parsedUsers });\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to parse online users', error);\n }\n // Fallback: emit original users\n this.chatSDK.events?.emit('users.online', { users });\n }\n });\n\n // ✅ Handle block/unblock updates\n this.socket.on('conversation_block_status', (data: any) => {\n if (this.config?.enableLogging) {\n console.log('🚫 SocketManager: Conversation block status update', data);\n }\n\n this.chatSDK.events?.emit('conversation.block_status', data);\n });\n\n // ✅ Handle read receipt for single message\n this.socket.on('message_read_receipt', (data: {\n messageId: string;\n roomId: string;\n readBy: string;\n readAt: string;\n isRead: boolean;\n }) => {\n try {\n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Message read receipt received', data);\n }\n this.chatSDK.events?.emit('message.read.receipt', data);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process read receipt', error);\n }\n this.chatSDK.events?.emit('message.read.receipt', data);\n }\n });\n\n // ✅ Handle read receipt for multiple messages (room read)\n this.socket.on('messages_read_receipt', (data: {\n roomId: string;\n messageIds: string[];\n readBy: string;\n readAt: string;\n isRead: boolean;\n }) => {\n try {\n if (this.config?.enableLogging) {\n console.log('📥 SocketManager: messages_read_receipt received from server', {\n roomId: data.roomId,\n messageIds: data.messageIds,\n messageCount: data.messageIds?.length,\n readBy: data.readBy,\n isRead: data.isRead\n });\n }\n \n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Messages read receipt received', data);\n }\n \n if (this.config?.enableLogging) {\n console.log('📤 SocketManager: Emitting messages.read.receipt to chatSDK.events');\n }\n this.chatSDK.events?.emit('messages.read.receipt', data);\n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Successfully emitted messages.read.receipt');\n }\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process read receipts', error);\n }\n this.chatSDK.events?.emit('messages.read.receipt', data);\n }\n });\n }\n\n /**\n * Check if socket is connected\n */\n public isConnected(): boolean {\n return this.socket?.connected || false;\n }\n\n /**\n * Get socket connection status\n */\n public getStatus(): { connected: boolean; userId: string | null; rooms: string[] } {\n return {\n connected: this.isConnected(),\n userId: this.currentUserId,\n rooms: Array.from(this.joinedRooms)\n };\n }\n\n // Legacy methods for backward compatibility\n public joinRoom(roomId: string): void {\n this.joinConversation(roomId);\n }\n\n public leaveRoom(roomId: string): void {\n this.leaveConversation(roomId);\n }\n\n /**\n * Emit a socket event\n */\n public emit(event: string, data: any): void {\n if (this.socket && this.socket.connected) {\n this.socket.emit(event, data);\n if (this.config?.enableLogging) {\n console.log('📤 SocketManager: Emitted event:', event, data);\n }\n } else {\n if (this.config?.enableLogging) {\n console.warn('⚠️ SocketManager: Cannot emit event - not connected:', event);\n }\n }\n }\n\n /**\n * Listen to a socket event\n */\n public on(event: string, callback: (data: any) => void): void {\n if (this.socket) {\n this.socket.on(event, callback);\n if (this.config?.enableLogging) {\n console.log('👂 SocketManager: Listening to event:', event);\n }\n } else {\n if (this.config?.enableLogging) {\n console.warn('⚠️ SocketManager: Cannot listen to event - socket not available:', event);\n }\n }\n }\n\n /**\n * Stop listening to a socket event\n */\n public off(event: string, callback?: (data: any) => void): void {\n if (this.socket) {\n this.socket.off(event, callback);\n if (this.config?.enableLogging) {\n console.log('🔇 SocketManager: Stopped listening to event:', event);\n }\n }\n }\n} ","import { AuthManager } from './managers/AuthManager';\nimport { ChatUserManager } from './managers/ChatUserManager';\nimport { UserManager } from './managers/UserManager';\nimport { ConversationManager } from './managers/ConversationManager';\nimport { MessageManager } from './managers/MessageManager';\nimport { MediaManager } from './managers/MediaManager';\nimport { EventManager } from './managers/EventManager';\nimport { SocketManager } from './managers/SocketManager';\nimport { ChatSDKUser } from './types';\n\n// Re-export types for external use\nexport type { ChatSDKUser } from './types';\n\nexport interface ChatSDKConfig {\n apiBaseUrl: string;\n wsUrl?: string;\n appId: string;\n apiKey?: string;\n environment: 'development' | 'staging' | 'production';\n enableLogging?: boolean;\n autoConnect?: boolean;\n timeout?: number;\n}\n\nexport interface ChatSDKError {\n code: string;\n message: string;\n details?: any;\n}\n\n/**\n * Main ChatSDK class - Entry point for all chat functionality\n * Similar to CometChat SDK structure with simplified wrapper methods\n */\nexport class ChatSDK {\n private static instance: ChatSDK | null = null;\n private config: ChatSDKConfig | null = null;\n private isInitialized: boolean = false;\n public currentUser: ChatSDKUser | null = null;\n\n // Managers\n public auth: AuthManager;\n public chatUsers: ChatUserManager;\n public users: UserManager;\n public conversations: ConversationManager;\n public messages: MessageManager;\n public media: MediaManager;\n public events: EventManager;\n public socket: SocketManager;\n\n private constructor() {\n // Initialize managers\n this.auth = new AuthManager(this);\n this.chatUsers = new ChatUserManager(this);\n this.users = new UserManager(this);\n this.conversations = new ConversationManager(this);\n this.messages = new MessageManager(this);\n this.media = new MediaManager(this);\n this.events = new EventManager(this);\n this.socket = new SocketManager(this);\n }\n\n /**\n * Get singleton instance of ChatSDK\n */\n public static getInstance(): ChatSDK {\n if (!ChatSDK.instance) {\n ChatSDK.instance = new ChatSDK();\n }\n return ChatSDK.instance;\n }\n\n /**\n * Initialize ChatSDK with configuration\n * @param config - ChatSDK configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n try {\n this.config = {\n enableLogging: true,\n autoConnect: true,\n timeout: 30000,\n ...config\n };\n\n if (this.config.enableLogging) {\n console.log('🚀 ChatSDK: Initializing...', this.config);\n }\n\n // Initialize all managers\n await this.auth.init(this.config);\n await this.chatUsers.init(this.config);\n await this.users.init(this.config);\n await this.conversations.init(this.config);\n await this.messages.init(this.config);\n await this.media.init(this.config);\n await this.events.init(this.config);\n await this.socket.init(this.config);\n\n this.isInitialized = true;\n\n if (this.config.enableLogging) {\n console.log('✅ ChatSDK: Initialized successfully');\n }\n\n // Auto-connect if enabled and token exists\n if (this.config.autoConnect && this.auth.hasValidToken()) {\n await this.connect();\n }\n\n } catch (error) {\n console.error('❌ ChatSDK: Initialization failed', error);\n throw new Error(`ChatSDK initialization failed: ${error}`);\n }\n }\n\n /**\n * Connect to chat services\n */\n public async connect(userId?: string): Promise<ChatSDKUser> {\n this.ensureInitialized();\n \n try {\n let user: ChatSDKUser;\n \n // If userId is provided, use it (for chat-users authentication)\n if (userId) {\n console.log('🔌 ChatSDK: Using provided userId for connection:', userId);\n user = {\n id: userId,\n externalUserId: userId,\n appId: process.env.REACT_APP_APP_ID || '',\n name: 'Chat User',\n email: `${userId}@example.com`,\n status: 'online',\n isOnline: true,\n isRegistered: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n this.currentUser = user;\n } else {\n // Otherwise, try to get current user from auth system\n user = await this.auth.getCurrentUser();\n this.currentUser = user;\n }\n \n // Connect to real-time services\n await this.events.connect();\n \n // Connect to WebSocket for real-time chat\n try {\n console.log('🔌 ChatSDK: Attempting WebSocket connection for user:', user.id);\n await this.socket.connect(user.id);\n console.log('✅ ChatSDK: WebSocket connected successfully');\n } catch (socketError) {\n console.warn('⚠️ ChatSDK: WebSocket connection failed, continuing without real-time features:', socketError);\n // Continue without WebSocket - the app can still work with HTTP polling\n }\n \n if (this.config?.enableLogging) {\n console.log('🔗 ChatSDK: Connected successfully', user);\n }\n \n return user;\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatSDK: Connection failed', error);\n }\n \n // Clear invalid token and reset current user\n await this.auth.logout();\n this.currentUser = null;\n \n throw error;\n }\n }\n\n /**\n * Disconnect from chat services\n */\n public async disconnect(): Promise<void> {\n try {\n await this.events.disconnect();\n this.socket.disconnect();\n this.currentUser = null;\n \n if (this.config?.enableLogging) {\n console.log('🔌 ChatSDK: Disconnected');\n }\n } catch (error) {\n console.error('❌ ChatSDK: Disconnect failed', error);\n throw error;\n }\n }\n\n /**\n * Login user with email and password\n * @param email - User email\n * @param password - User password\n */\n public async login(email: string, password: string): Promise<ChatSDKUser> {\n this.ensureInitialized();\n return await this.auth.login(email, password);\n }\n\n /**\n * Register new user\n * @param email - User email \n * @param password - User password\n * @param name - User name\n * @param metadata - Additional user data\n */\n public async register(email: string, password: string, name: string, metadata?: Record<string, any>): Promise<ChatSDKUser> {\n this.ensureInitialized();\n return await this.auth.register(email, password, name, metadata);\n }\n\n /**\n * Logout current user\n */\n public async logout(): Promise<void> {\n this.ensureInitialized();\n await this.auth.logout();\n await this.disconnect();\n }\n\n /**\n * Get current logged in user\n */\n public getCurrentUser(): ChatSDKUser | null {\n return this.currentUser;\n }\n\n /**\n * Check if SDK is initialized\n */\n public isSDKInitialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Get SDK configuration\n */\n public getConfig(): ChatSDKConfig | null {\n return this.config;\n }\n\n /**\n * Enable/disable logging\n */\n public setLogging(enabled: boolean): void {\n if (this.config) {\n this.config.enableLogging = enabled;\n }\n }\n\n /**\n * Get SDK version\n */\n public getVersion(): string {\n return '1.0.0';\n }\n\n // Private helper methods\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('ChatSDK not initialized. Call ChatSDK.init() first.');\n }\n }\n}\n\n// Export singleton instance\nexport default ChatSDK.getInstance(); ","let e={data:\"\"},t=t=>\"object\"==typeof window?((t?t.querySelector(\"#_goober\"):window._goober)||Object.assign((t||document.head).appendChild(document.createElement(\"style\")),{innerHTML:\" \",id:\"_goober\"})).firstChild:t||e,r=e=>{let r=t(e),l=r.data;return r.data=\"\",l},l=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,a=/\\/\\*[^]*?\\*\\/| +/g,n=/\\n+/g,o=(e,t)=>{let r=\"\",l=\"\",a=\"\";for(let n in e){let c=e[n];\"@\"==n[0]?\"i\"==n[1]?r=n+\" \"+c+\";\":l+=\"f\"==n[1]?o(c,n):n+\"{\"+o(c,\"k\"==n[1]?\"\":t)+\"}\":\"object\"==typeof c?l+=o(c,t?t.replace(/([^,])+/g,e=>n.replace(/([^,]*:\\S+\\([^)]*\\))|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):n):null!=c&&(n=/^--/.test(n)?n:n.replace(/[A-Z]/g,\"-$&\").toLowerCase(),a+=o.p?o.p(n,c):n+\":\"+c+\";\")}return r+(t&&a?t+\"{\"+a+\"}\":a)+l},c={},s=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+s(e[r]);return t}return e},i=(e,t,r,i,p)=>{let u=s(e),d=c[u]||(c[u]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return\"go\"+r})(u));if(!c[d]){let t=u!==e?e:(e=>{let t,r,o=[{}];for(;t=l.exec(e.replace(a,\"\"));)t[4]?o.shift():t[3]?(r=t[3].replace(n,\" \").trim(),o.unshift(o[0][r]=o[0][r]||{})):o[0][t[1]]=t[2].replace(n,\" \").trim();return o[0]})(e);c[d]=o(p?{[\"@keyframes \"+d]:t}:t,r?\"\":\".\"+d)}let f=r&&c.g?c.g:null;return r&&(c.g=c[d]),((e,t,r,l)=>{l?t.data=t.data.replace(l,e):-1===t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(c[d],t,i,f),d},p=(e,t,r)=>e.reduce((e,l,a)=>{let n=t[a];if(n&&n.call){let e=n(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;n=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":o(e,\"\"):!1===e?\"\":e}return e+l+(null==n?\"\":n)},\"\");function u(e){let r=this||{},l=e.call?e(r.p):e;return i(l.unshift?l.raw?p(l,[].slice.call(arguments,1),r.p):l.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):l,t(r.target),r.g,r.o,r.k)}let d,f,g,b=u.bind({g:1}),h=u.bind({k:1});function m(e,t,r,l){o.p=t,d=e,f=r,g=l}function j(e,t){let r=this||{};return function(){let l=arguments;function a(n,o){let c=Object.assign({},n),s=c.className||a.className;r.p=Object.assign({theme:f&&f()},c),r.o=/ *go\\d+/.test(s),c.className=u.apply(r,l)+(s?\" \"+s:\"\"),t&&(c.ref=o);let i=e;return e[0]&&(i=c.as||e,delete c.as),g&&i[0]&&g(c),d(i,c)}return t?t(a):a}}export{u as css,r as extractCss,b as glob,h as keyframes,m as setup,j as styled};\n","\"use client\";\nvar W=e=>typeof e==\"function\",f=(e,t)=>W(e)?e(t):e;var F=(()=>{let e=0;return()=>(++e).toString()})(),A=(()=>{let e;return()=>{if(e===void 0&&typeof window<\"u\"){let t=matchMedia(\"(prefers-reduced-motion: reduce)\");e=!t||t.matches}return e}})();import{useEffect as H,useState as j,useRef as Q}from\"react\";var Y=20;var U=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,Y)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return U(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:s}=t;return{...e,toasts:e.toasts.map(o=>o.id===s||s===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+a}))}}},P=[],y={toasts:[],pausedAt:void 0},u=e=>{y=U(y,e),P.forEach(t=>{t(y)})},q={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},D=(e={})=>{let[t,r]=j(y),s=Q(y);H(()=>(s.current!==y&&r(y),P.push(r),()=>{let o=P.indexOf(r);o>-1&&P.splice(o,1)}),[]);let a=t.toasts.map(o=>{var n,i,p;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((n=e[o.type])==null?void 0:n.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((i=e[o.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||q[o.type],style:{...e.style,...(p=e[o.type])==null?void 0:p.style,...o.style}}});return{...t,toasts:a}};var J=(e,t=\"blank\",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:\"status\",\"aria-live\":\"polite\"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||F()}),x=e=>(t,r)=>{let s=J(t,e,r);return u({type:2,toast:s}),s.id},c=(e,t)=>x(\"blank\")(e,t);c.error=x(\"error\");c.success=x(\"success\");c.loading=x(\"loading\");c.custom=x(\"custom\");c.dismiss=e=>{u({type:3,toastId:e})};c.remove=e=>u({type:4,toastId:e});c.promise=(e,t,r)=>{let s=c.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e==\"function\"&&(e=e()),e.then(a=>{let o=t.success?f(t.success,a):void 0;return o?c.success(o,{id:s,...r,...r==null?void 0:r.success}):c.dismiss(s),a}).catch(a=>{let o=t.error?f(t.error,a):void 0;o?c.error(o,{id:s,...r,...r==null?void 0:r.error}):c.dismiss(s)}),e};import{useEffect as $,useCallback as L}from\"react\";var K=(e,t)=>{u({type:1,toast:{id:e,height:t}})},X=()=>{u({type:5,time:Date.now()})},b=new Map,Z=1e3,ee=(e,t=Z)=>{if(b.has(e))return;let r=setTimeout(()=>{b.delete(e),u({type:4,toastId:e})},t);b.set(e,r)},O=e=>{let{toasts:t,pausedAt:r}=D(e);$(()=>{if(r)return;let o=Date.now(),n=t.map(i=>{if(i.duration===1/0)return;let p=(i.duration||0)+i.pauseDuration-(o-i.createdAt);if(p<0){i.visible&&c.dismiss(i.id);return}return setTimeout(()=>c.dismiss(i.id),p)});return()=>{n.forEach(i=>i&&clearTimeout(i))}},[t,r]);let s=L(()=>{r&&u({type:6,time:Date.now()})},[r]),a=L((o,n)=>{let{reverseOrder:i=!1,gutter:p=8,defaultPosition:d}=n||{},h=t.filter(m=>(m.position||d)===(o.position||d)&&m.height),v=h.findIndex(m=>m.id===o.id),S=h.filter((m,E)=>E<v&&m.visible).length;return h.filter(m=>m.visible).slice(...i?[S+1]:[0,S]).reduce((m,E)=>m+(E.height||0)+p,0)},[t]);return $(()=>{t.forEach(o=>{if(o.dismissed)ee(o.id,o.removeDelay);else{let n=b.get(o.id);n&&(clearTimeout(n),b.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:K,startPause:X,endPause:s,calculateOffset:a}}};import*as l from\"react\";import{styled as B,keyframes as z}from\"goober\";import*as g from\"react\";import{styled as w,keyframes as me}from\"goober\";import{styled as te,keyframes as I}from\"goober\";var oe=I`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`,re=I`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`,se=I`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`,k=te(\"div\")`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${e=>e.primary||\"#ff4b4b\"};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${oe} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${re} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${e=>e.secondary||\"#fff\"};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${se} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;import{styled as ae,keyframes as ie}from\"goober\";var ne=ie`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`,V=ae(\"div\")`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${e=>e.secondary||\"#e0e0e0\"};\n border-right-color: ${e=>e.primary||\"#616161\"};\n animation: ${ne} 1s linear infinite;\n`;import{styled as ce,keyframes as N}from\"goober\";var pe=N`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`,de=N`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`,_=ce(\"div\")`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${e=>e.primary||\"#61d345\"};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${pe} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${de} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${e=>e.secondary||\"#fff\"};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;var ue=w(\"div\")`\n position: absolute;\n`,le=w(\"div\")`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`,fe=me`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`,Te=w(\"div\")`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${fe} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`,M=({toast:e})=>{let{icon:t,type:r,iconTheme:s}=e;return t!==void 0?typeof t==\"string\"?g.createElement(Te,null,t):t:r===\"blank\"?null:g.createElement(le,null,g.createElement(V,{...s}),r!==\"loading\"&&g.createElement(ue,null,r===\"error\"?g.createElement(k,{...s}):g.createElement(_,{...s})))};var ye=e=>`\n0% {transform: translate3d(0,${e*-200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`,ge=e=>`\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${e*-150}%,-1px) scale(.6); opacity:0;}\n`,he=\"0%{opacity:0;} 100%{opacity:1;}\",xe=\"0%{opacity:1;} 100%{opacity:0;}\",be=B(\"div\")`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`,Se=B(\"div\")`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`,Ae=(e,t)=>{let s=e.includes(\"top\")?1:-1,[a,o]=A()?[he,xe]:[ye(s),ge(s)];return{animation:t?`${z(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${z(o)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},C=l.memo(({toast:e,position:t,style:r,children:s})=>{let a=e.height?Ae(e.position||t||\"top-center\",e.visible):{opacity:0},o=l.createElement(M,{toast:e}),n=l.createElement(Se,{...e.ariaProps},f(e.message,e));return l.createElement(be,{className:e.className,style:{...a,...r,...e.style}},typeof s==\"function\"?s({icon:o,message:n}):l.createElement(l.Fragment,null,o,n))});import{css as Pe,setup as Re}from\"goober\";import*as T from\"react\";Re(T.createElement);var ve=({id:e,className:t,style:r,onHeightUpdate:s,children:a})=>{let o=T.useCallback(n=>{if(n){let i=()=>{let p=n.getBoundingClientRect().height;s(e,p)};i(),new MutationObserver(i).observe(n,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement(\"div\",{ref:o,className:t,style:r},a)},Ee=(e,t)=>{let r=e.includes(\"top\"),s=r?{top:0}:{bottom:0},a=e.includes(\"center\")?{justifyContent:\"center\"}:e.includes(\"right\")?{justifyContent:\"flex-end\"}:{};return{left:0,right:0,display:\"flex\",position:\"absolute\",transition:A()?void 0:\"all 230ms cubic-bezier(.21,1.02,.73,1)\",transform:`translateY(${t*(r?1:-1)}px)`,...s,...a}},De=Pe`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`,R=16,Oe=({reverseOrder:e,position:t=\"top-center\",toastOptions:r,gutter:s,children:a,containerStyle:o,containerClassName:n})=>{let{toasts:i,handlers:p}=O(r);return T.createElement(\"div\",{id:\"_rht_toaster\",style:{position:\"fixed\",zIndex:9999,top:R,left:R,right:R,bottom:R,pointerEvents:\"none\",...o},className:n,onMouseEnter:p.startPause,onMouseLeave:p.endPause},i.map(d=>{let h=d.position||t,v=p.calculateOffset(d,{reverseOrder:e,gutter:s,defaultPosition:t}),S=Ee(h,v);return T.createElement(ve,{id:d.id,key:d.id,onHeightUpdate:p.updateHeight,className:d.visible?De:\"\",style:S},d.type===\"custom\"?f(d.message,d):a?a(d):T.createElement(C,{toast:d,position:h}))}))};var Vt=c;export{_ as CheckmarkIcon,k as ErrorIcon,V as LoaderIcon,C as ToastBar,M as ToastIcon,Oe as Toaster,Vt as default,f as resolveValue,c as toast,O as useToaster,D as useToasterStore};\n//# sourceMappingURL=index.mjs.map","// English translations for ChatSDK\nexport default {\n // General\n send: 'Send',\n \n // Conversations\n conversations_title: 'Chats',\n no_conversations_title: 'No conversations yet',\n no_conversations_message: 'Start chatting with product owners to see conversations here',\n loading_conversations: 'Loading conversations...',\n error_load_conversations: 'Failed to load conversations',\n select_conversation: 'Select a conversation',\n select_conversation_message: 'Choose a conversation from the list to start chatting',\n select_conversation_tip: '💡 Tip: Click on any conversation in the sidebar to open it here',\n \n // Chat\n message_hint: 'Start typing a message',\n attach_file: 'Attach file',\n loading_messages: 'Loading messages...',\n \n // Messages\n file_sent_successfully: 'File uploaded and sent!',\n uploading: 'Uploading...',\n sent: 'Sent',\n read: 'Read',\n \n // Errors\n error_load_messages: 'Failed to load messages',\n error_send_message: 'Failed to send message',\n error_file_upload: 'Failed to upload file',\n error_unknown: 'Unknown error',\n error_user_blocked: 'Your account has been blocked by administrator',\n error_registration_failed: 'Registration failed. Please try again.',\n \n // Success messages\n login_successful: 'Login successful!',\n registration_successful: 'Registration and login successful!',\n complete_profile_info: 'Please complete your profile information.',\n \n // Block/Unblock\n block_user: 'Block User',\n unblock_user: 'Unblock',\n user_blocked: 'User blocked',\n user_unblocked: 'User unblocked',\n block_user_confirm: 'Are you sure you want to block this user?',\n unblock_user_confirm: 'Are you sure you want to unblock this user?',\n you_are_blocked: 'You have been blocked in this chat',\n you_have_blocked: 'You\\'ve blocked {{userName}}',\n you_have_blocked_submessage: 'You can\\'t message them in this chat, and you won\\'t receive their messages.',\n blocked_by_user: 'You have been blocked by {{userName}}',\n blocked_by_user_submessage: 'You can\\'t send messages in this chat.',\n user_is_blocked: 'This user is blocked in this chat',\n failed_to_block: 'Failed to block user',\n failed_to_unblock: 'Failed to unblock user',\n user_not_found: 'User not found',\n user_id_not_found: 'User ID not found',\n cannot_block_self: 'You cannot block yourself',\n \n // Additional UI strings\n loading: 'Loading...',\n unknown_user: 'Unknown User',\n image: 'Image',\n file: 'File',\n no_messages_yet: 'No messages yet',\n yesterday: 'Yesterday',\n unknown_size: 'Unknown size',\n download: 'Download',\n search: 'Search',\n back: 'Back',\n call: 'Call',\n options: 'Options',\n close: 'Close',\n no_phone_number: 'No phone number available',\n number_copied: 'Phone number copied to clipboard',\n no_search_results: 'No conversations found',\n\n // Demo app UI\n demo_title: 'ChatSDK Demo',\n welcome: 'Welcome',\n logout: 'Logout',\n products: 'Products',\n all_products: 'All Products',\n my_products: 'My Products',\n conversations: 'Conversations',\n sdk_tester: 'SDK Tester',\n sdk_tester_desc: 'SDK testing tools will be available here',\n loading_products: 'Loading products...',\n no_products_listed: \"You haven't listed any products yet.\",\n realtime_active: 'Real-time Chat Active',\n http_only: 'HTTP Only',\n failed_to_load_products: 'Failed to load products',\n failed_to_start_chat: 'Failed to start chat',\n cannot_chat_self: 'You cannot start a chat with yourself!',\n starting_chat: 'Starting chat with product owner...',\n chat_opened: 'Chat popup opened!',\n failed_init: 'Failed to initialize app',\n\n // Login / Registration\n login: 'Login',\n login_as: 'Login as',\n checking: 'Checking...',\n registering: 'Registering...',\n complete_registration: 'Complete Registration',\n back_to_login: 'Back to Login',\n quick_demo_login: 'Quick Demo Login (with sample conversations):',\n external_user_id: 'External User ID:',\n app_id_label: 'App ID:',\n full_name: 'Full Name:',\n email_label: 'Email:',\n welcome_demo: 'Welcome to the ChatSDK Demo Application',\n enter_user_id: 'Enter your user ID (e.g., user1)',\n enter_app_id: 'Enter app ID',\n enter_full_name: 'Enter your full name',\n enter_email: 'Enter your email',\n\n // Product card\n chat_with_owner: 'Chat with Owner',\n your_product: 'Your Product',\n owner_label: 'Owner:',\n};\n","// Arabic translations for ChatSDK\nexport default {\n // General\n send: 'إرسال',\n \n // Conversations\n conversations_title: 'الدردشة',\n no_conversations_title: 'لا توجد محادثات بعد',\n no_conversations_message: 'ابدأ الدردشة مع مالكي المنتجات لمشاهدة محادثاتك هنا',\n loading_conversations: 'جاري تحميل المحادثات...',\n error_load_conversations: 'فشل تحميل المحادثات',\n select_conversation: 'اختر محادثة',\n select_conversation_message: 'اختر محادثة من القائمة لبدء الدردشة',\n select_conversation_tip: '💡 نصيحة: انقر على أي محادثة في الشريط الجانبي لفتحها هنا',\n \n // Chat\n message_hint: 'اكتب رسالة هنا',\n attach_file: 'إرفاق ملف',\n loading_messages: 'جاري تحميل الرسائل...',\n \n // Messages\n file_sent_successfully: 'تم إرسال الملف بنجاح!',\n uploading: 'جاري الرفع...',\n sent: 'تم الإرسال',\n read: 'تم القراءة',\n \n // Errors\n error_load_messages: 'فشل تحميل الرسائل',\n error_send_message: 'فشل إرسال الرسالة',\n error_file_upload: 'فشل رفع الملف',\n error_unknown: 'خطأ غير معروف',\n error_user_blocked: 'تم حظر حسابك من قبل المسؤول',\n error_registration_failed: 'فشل التسجيل. يرجى المحاولة مرة أخرى.',\n \n // Success messages\n login_successful: 'تم تسجيل الدخول بنجاح!',\n registration_successful: 'تم التسجيل وتسجيل الدخول بنجاح!',\n complete_profile_info: 'يرجى إكمال معلومات ملفك الشخصي.',\n \n // Block/Unblock\n block_user: 'حظر المستخدم',\n unblock_user: 'إلغاء الحظر',\n user_blocked: 'تم حظر المستخدم',\n user_unblocked: 'تم إلغاء حظر المستخدم',\n block_user_confirm: 'هل أنت متأكد أنك تريد حظر هذا المستخدم؟',\n unblock_user_confirm: 'هل أنت متأكد أنك تريد إلغاء حظر هذا المستخدم؟',\n you_are_blocked: 'تم حظرك في هذه المحادثة',\n you_have_blocked: 'لقد قمت بحظر {{userName}}',\n you_have_blocked_submessage: 'لا يمكنك مراسلتهم في هذه المحادثة، ولن تتلقى رسائلهم.',\n blocked_by_user: 'تم حظرك من قبل {{userName}}',\n blocked_by_user_submessage: 'لا يمكنك إرسال الرسائل في هذه المحادثة.',\n user_is_blocked: 'هذا المستخدم محظور في هذه المحادثة',\n failed_to_block: 'فشل حظر المستخدم',\n failed_to_unblock: 'فشل إلغاء حظر المستخدم',\n user_not_found: 'المستخدم غير موجود',\n user_id_not_found: 'معرف المستخدم غير موجود',\n cannot_block_self: 'لا يمكنك حظر نفسك',\n \n // Additional UI strings\n loading: 'جاري التحميل...',\n unknown_user: 'مستخدم غير معروف',\n image: 'صورة',\n file: 'ملف',\n no_messages_yet: 'لا توجد رسائل بعد',\n yesterday: 'أمس',\n unknown_size: 'حجم غير معروف',\n download: 'تنزيل',\n search: 'بحث',\n back: 'رجوع',\n call: 'اتصال',\n options: 'خيارات',\n close: 'إغلاق',\n no_phone_number: 'لا يوجد رقم هاتف متاح',\n number_copied: 'تم نسخ رقم الهاتف',\n no_search_results: 'لم يتم العثور على محادثات',\n\n // Demo app UI\n demo_title: 'عرض ChatSDK',\n welcome: 'مرحبًا',\n logout: 'تسجيل الخروج',\n products: 'المنتجات',\n all_products: 'كل المنتجات',\n my_products: 'منتجاتي',\n conversations: 'المحادثات',\n sdk_tester: 'اختبار SDK',\n sdk_tester_desc: 'ستتوفر أدوات اختبار SDK هنا',\n loading_products: 'جاري تحميل المنتجات...',\n no_products_listed: 'لم تقم بنشر أي منتجات بعد.',\n realtime_active: 'الدردشة المباشرة نشطة',\n http_only: 'HTTP فقط',\n failed_to_load_products: 'فشل تحميل المنتجات',\n failed_to_start_chat: 'فشل بدء الدردشة',\n cannot_chat_self: 'لا يمكنك بدء محادثة مع نفسك!',\n starting_chat: 'جاري بدء الدردشة مع مالك المنتج...',\n chat_opened: 'تم فتح نافذة الدردشة!',\n failed_init: 'فشل تهيئة التطبيق',\n\n // Login / Registration\n login: 'تسجيل الدخول',\n login_as: 'تسجيل الدخول كـ',\n checking: 'جاري التحقق...',\n registering: 'جاري التسجيل...',\n complete_registration: 'إكمال التسجيل',\n back_to_login: 'العودة لتسجيل الدخول',\n quick_demo_login: 'تسجيل دخول سريع (مع محادثات تجريبية):',\n external_user_id: 'معرف المستخدم الخارجي:',\n app_id_label: 'معرف التطبيق:',\n full_name: 'الاسم الكامل:',\n email_label: 'البريد الإلكتروني:',\n welcome_demo: 'مرحبًا بك في تطبيق عرض ChatSDK',\n enter_user_id: 'أدخل معرف المستخدم (مثل user1)',\n enter_app_id: 'أدخل معرف التطبيق',\n enter_full_name: 'أدخل اسمك الكامل',\n enter_email: 'أدخل بريدك الإلكتروني',\n\n // Product card\n chat_with_owner: 'الدردشة مع المالك',\n your_product: 'منتجك',\n owner_label: 'المالك:',\n};\n","// i18n utility for ChatSDK\nimport en from './locales/en';\nimport ar from './locales/ar';\n\nconst locales = {\n en,\n ar,\n};\n\ntype Locale = keyof typeof locales;\ntype TranslationKey = keyof typeof en;\n\nlet currentLocale: Locale = 'en';\n\n/**\n * Set the current language for the SDK\n * @param locale - Language code ('en' or 'ar')\n */\nexport const changeLanguage = (locale: string) => {\n if (locales[locale as Locale]) {\n currentLocale = locale as Locale;\n document.documentElement.lang = locale;\n document.documentElement.dir = isRTL() ? 'rtl' : 'ltr';\n // Store preference in localStorage\n localStorage.setItem('chatSDK_language', locale);\n } else {\n console.warn(`Locale \"${locale}\" not found, falling back to \"en\".`);\n currentLocale = 'en';\n document.documentElement.lang = 'en';\n document.documentElement.dir = 'ltr';\n }\n};\n\n/**\n * Get the current language code\n * @returns Current language code ('en' or 'ar')\n */\nexport const getCurrentLanguage = (): string => currentLocale;\n\n/**\n * Check if current language is RTL\n * @returns true if RTL language (Arabic), false otherwise\n */\nexport const isRTL = (): boolean => currentLocale === 'ar';\n\n/**\n * Translate a key to the current language\n * @param key - Translation key\n * @param replacements - Optional placeholder replacements\n * @returns Translated string\n */\nexport const t = (key: TranslationKey, replacements?: Record<string, string | number>): string => {\n let translation = locales[currentLocale][key] || locales['en'][key] || key;\n\n if (replacements) {\n for (const placeholder in replacements) {\n translation = translation.replace(\n new RegExp(`{{${placeholder}}}`, 'g'),\n String(replacements[placeholder])\n );\n }\n }\n return translation;\n};\n\n// Initialize with stored language or default\nconst storedLanguage = localStorage.getItem('chatSDK_language');\nif (storedLanguage) {\n changeLanguage(storedLanguage);\n} else {\n changeLanguage('en');\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { Message, Conversation, User } from '../types';\nimport { ChatSDK } from '../ChatSDK';\nimport toast from 'react-hot-toast';\nimport { t } from '../i18n';\n\nexport interface ChatWindowProps {\n conversation: Conversation | null;\n currentUser: User;\n onClose?: () => void;\n onBack?: () => void;\n}\n\nconst ChatWindow: React.FC<ChatWindowProps> = ({ conversation, currentUser, onClose, onBack }) => {\n const [messages, setMessages] = useState<Message[]>([]);\n const [newMessage, setNewMessage] = useState('');\n const [loading, setLoading] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState<{ [key: string]: number }>({});\n const [loadingMore, setLoadingMore] = useState(false);\n const [hasMoreMessages, setHasMoreMessages] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [blockStatus, setBlockStatus] = useState<any>(null);\n const [isBlocked, setIsBlocked] = useState(false);\n const [hasBlockedOther, setHasBlockedOther] = useState(false);\n const [showOptionsMenu, setShowOptionsMenu] = useState(false);\n const [stickyDate, setStickyDate] = useState<string | null>(null);\n const [stickyDateVisible, setStickyDateVisible] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const chatMessagesRef = useRef<HTMLDivElement>(null);\n const stickyDateTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n \n const MESSAGES_PER_PAGE = 20;\n\n // Get other participant\n const getOtherParticipant = useCallback(() => {\n if (!conversation || !currentUser) return null;\n \n const participants = conversation.participants || [];\n if (participants.length === 0) return null;\n \n const currentUserId = currentUser.id || (currentUser as any).userId;\n const currentUserExternalId = currentUser.externalUserId || (currentUser as any).external_user_id;\n \n return participants.find((p: any) => {\n const pId = p.id || p.userId;\n const pExternalId = p.externalUserId || p.external_user_id;\n const isSameById = currentUserId && pId && pId === currentUserId;\n const isSameByExternalId = currentUserExternalId && pExternalId && pExternalId === currentUserExternalId;\n return !(isSameById || isSameByExternalId) && (pId || pExternalId);\n }) || null;\n }, [conversation, currentUser]);\n\n const otherParticipant = getOtherParticipant();\n\n // Header info\n const getChatHeaderInfo = useCallback(() => {\n if (!conversation) return { userName: t('conversations_title'), productName: null, productImage: null, productMetadata: null };\n \n const userName = otherParticipant \n ? ((otherParticipant as any).name || \n (otherParticipant as any).userName || \n (otherParticipant as any).displayName ||\n (otherParticipant as any).externalUserId ||\n t('unknown_user'))\n : t('unknown_user');\n \n const productContext = conversation.productContext || (conversation as any).product_context;\n if (productContext) {\n return {\n userName,\n productName: productContext.productName || productContext.product_name,\n productImage: productContext.productImage || productContext.product_image,\n productId: productContext.productId || productContext.product_id,\n productMetadata: productContext.productMetadata || productContext.product_metadata\n };\n }\n \n return { userName, productName: null, productImage: null, productMetadata: null };\n }, [conversation, otherParticipant]);\n\n const headerInfo = getChatHeaderInfo();\n\n // Conversation lifecycle\n useEffect(() => {\n if (conversation) {\n setShowOptionsMenu(false);\n loadMessages(1, false);\n joinChatRoom();\n \n const sdk = ChatSDK.getInstance();\n sdk.chatUsers.startViewingConversation(conversation.id);\n }\n\n return () => {\n if (conversation) {\n leaveChatRoom();\n const sdk = ChatSDK.getInstance();\n sdk.chatUsers.stopViewingConversation(conversation.id);\n }\n };\n }, [conversation]);\n\n // Real-time message listening\n useEffect(() => {\n const sdk = ChatSDK.getInstance();\n \n const handleNewMessage = (data: { message: any }) => {\n const message = data.message;\n \n if (message.roomId === conversation?.id) {\n setMessages(prev => {\n const messageExists = prev.some(m => m.id === message.id);\n if (!messageExists) {\n if (message.senderId !== currentUser.id) {\n sdk.chatUsers.markMessageRead(message.id).catch(error => {\n console.warn('ChatWindow: Failed to mark message as read:', error);\n });\n }\n \n return [...prev, {\n id: message.id,\n content: message.content,\n senderId: message.senderId,\n senderName: message.senderName,\n timestamp: message.createdAt || message.timestamp,\n conversationId: message.roomId,\n type: message.messageType || message.type || 'text',\n metadata: message.metadata || undefined,\n isRead: message.isRead !== undefined ? message.isRead : (message.senderId === currentUser.id ? false : true),\n isDelivered: message.isDelivered !== undefined ? message.isDelivered : true,\n status: message.status || 'sent'\n }];\n }\n return prev;\n });\n }\n };\n\n const handleReadReceipt = (data: { messageId: string; roomId: string; isRead: boolean }) => {\n if (!data.messageId || data.roomId !== conversation?.id) return;\n setMessages(prev => prev.map(msg => \n msg.id === data.messageId && msg.senderId === currentUser.id\n ? { ...msg, isRead: data.isRead }\n : msg\n ));\n };\n\n const handleReadReceipts = (data: { roomId: string; messageIds: string[]; isRead: boolean }) => {\n if (data.roomId !== conversation?.id) return;\n const currentUserId = currentUser?.id;\n \n if (!data.messageIds || data.messageIds.length === 0) {\n setMessages(prev => prev.map(msg => {\n if (msg.senderId === currentUserId && !msg.isRead) {\n return { ...msg, isRead: data.isRead };\n }\n return msg;\n }));\n return;\n }\n \n const messageIdSet = new Set(data.messageIds);\n setMessages(prev => prev.map(msg => {\n if (messageIdSet.has(msg.id) && msg.senderId === currentUserId) {\n return { ...msg, isRead: data.isRead };\n }\n return msg;\n }));\n };\n\n const handleRealtimeBlockStatus = (payload: any) => {\n if (!conversation) return;\n const payloadConversationId = payload?.conversationId || payload?.chatId || payload?.roomId;\n if (payloadConversationId !== conversation.id) return;\n\n const blockedUsers = payload?.blockedUsers || {};\n conversation.metadata = {\n ...(conversation.metadata || {}),\n blockedUsers\n };\n\n const currentUserId = currentUser.id || (currentUser as any).userId;\n const other = getOtherParticipant();\n const otherUserId = other\n ? ((other as any).id || (other as any).userId || (other as any).externalUserId || (other as any).external_user_id)\n : null;\n\n setIsBlocked(blockedUsers[currentUserId] === 1);\n setHasBlockedOther(otherUserId ? blockedUsers[otherUserId] === 1 : false);\n };\n\n sdk.events.on('message.received', handleNewMessage);\n sdk.events.on('message.read.receipt', handleReadReceipt);\n sdk.events.on('messages.read.receipt', handleReadReceipts);\n sdk.events.on('conversation.block_status', handleRealtimeBlockStatus);\n \n return () => {\n sdk.events.off('message.received', handleNewMessage);\n sdk.events.off('message.read.receipt', handleReadReceipt);\n sdk.events.off('messages.read.receipt', handleReadReceipts);\n sdk.events.off('conversation.block_status', handleRealtimeBlockStatus);\n };\n }, [conversation?.id, currentUser?.id]);\n\n // Block status from conversation metadata\n useEffect(() => {\n if (!conversation || !currentUser) {\n setIsBlocked(false);\n setHasBlockedOther(false);\n setBlockStatus(null);\n return;\n }\n \n const metadata = conversation.metadata || {};\n const blockedUsers = metadata.blockedUsers || {};\n const currentUserId = currentUser.id || (currentUser as any).userId;\n const other = getOtherParticipant();\n const otherUserId = other ? ((other as any).id || (other as any).userId || (other as any).externalUserId || (other as any).external_user_id) : null;\n \n setIsBlocked(blockedUsers[currentUserId] === 1);\n setHasBlockedOther(otherUserId ? (blockedUsers[otherUserId] === 1) : false);\n setBlockStatus({\n chatId: conversation.id,\n currentUserId,\n isBlockedByOther: blockedUsers[currentUserId] === 1,\n usersBlockedByMe: Object.keys(blockedUsers).filter((userId: string) => blockedUsers[userId] === 1),\n blockedUsers\n });\n }, [conversation?.id, JSON.stringify(conversation?.metadata), currentUser?.id]);\n\n // Scroll to bottom on new messages\n useEffect(() => {\n scrollToBottom();\n }, [messages]);\n\n // Close options menu on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.chat-options-wrapper')) {\n setShowOptionsMenu(false);\n }\n };\n document.addEventListener('click', handleClick);\n return () => {\n document.removeEventListener('click', handleClick);\n if (stickyDateTimeoutRef.current) clearTimeout(stickyDateTimeoutRef.current);\n };\n }, []);\n\n const joinChatRoom = () => {\n if (conversation) {\n const sdk = ChatSDK.getInstance();\n sdk.socket.joinRoom(conversation.id);\n }\n };\n\n const leaveChatRoom = () => {\n if (conversation) {\n const sdk = ChatSDK.getInstance();\n sdk.socket.leaveRoom(conversation.id);\n }\n };\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n const formatTime = (timestamp: string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n };\n\n const formatDateDivider = (timestamp: string) => {\n const date = new Date(timestamp);\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const msgDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const diffDays = Math.floor((today.getTime() - msgDate.getTime()) / (1000 * 60 * 60 * 24));\n \n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n \n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n \n if (diffDays < 7) return `${days[date.getDay()]}, ${day}/${month}`;\n return `${day}/${month}/${date.getFullYear()}`;\n };\n\n const shouldShowDateDivider = (message: Message, index: number): boolean => {\n if (index === 0) return true;\n const prevMessage = messages[index - 1];\n const prevDate = new Date(prevMessage.timestamp).toDateString();\n const currDate = new Date(message.timestamp).toDateString();\n return prevDate !== currDate;\n };\n\n const getFileIcon = (mimeType?: string) => {\n if (!mimeType) return '📎';\n if (mimeType.includes('pdf')) return '📄';\n if (mimeType.includes('word')) return '📝';\n if (mimeType.includes('excel')) return '📊';\n if (mimeType.includes('audio')) return '🎵';\n if (mimeType.includes('video')) return '🎥';\n return '📎';\n };\n\n // Sticky date header on scroll\n const handleMessagesScroll = () => {\n if (!chatMessagesRef.current) return;\n\n const container = chatMessagesRef.current;\n const dividers = container.querySelectorAll('.date-divider[data-date]');\n \n if (dividers.length === 0) return;\n\n let currentDate: string | null = null;\n const containerTop = container.getBoundingClientRect().top;\n\n for (let i = dividers.length - 1; i >= 0; i--) {\n const divider = dividers[i] as HTMLElement;\n const dividerTop = divider.getBoundingClientRect().top;\n \n if (dividerTop <= containerTop + 50) {\n currentDate = divider.getAttribute('data-date');\n break;\n }\n }\n\n if (!currentDate && messages.length > 0) {\n currentDate = formatDateDivider(messages[0].timestamp);\n }\n\n if (currentDate) {\n setStickyDate(currentDate);\n setStickyDateVisible(true);\n\n if (stickyDateTimeoutRef.current) clearTimeout(stickyDateTimeoutRef.current);\n stickyDateTimeoutRef.current = setTimeout(() => {\n setStickyDateVisible(false);\n }, 2000);\n }\n };\n\n // Call user - web copies number, mobile opens dialer\n const handleCallUser = () => {\n if (!otherParticipant) return;\n \n const other = otherParticipant as any;\n const phoneNumber = other.phone || other.phoneNumber || other.mobile || other.externalUserId || '';\n \n if (!phoneNumber) {\n toast.error(t('no_phone_number') || 'No phone number available');\n return;\n }\n \n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n \n if (isMobile) {\n window.location.href = `tel:${phoneNumber}`;\n } else {\n navigator.clipboard.writeText(phoneNumber).then(() => {\n toast.success(t('number_copied') || `Phone number copied: ${phoneNumber}`);\n }).catch(() => {\n const textArea = document.createElement('textarea');\n textArea.value = phoneNumber;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n toast.success(t('number_copied') || `Phone number copied: ${phoneNumber}`);\n });\n }\n };\n\n const loadMessages = async (page: number = 1, append: boolean = false) => {\n if (!conversation) return;\n \n if (page === 1) {\n setLoading(true);\n setMessages([]);\n setCurrentPage(1);\n setHasMoreMessages(true);\n } else {\n setLoadingMore(true);\n }\n \n try {\n const sdk = ChatSDK.getInstance();\n const fetchedMessages = await sdk.messages.getMessages({\n conversationId: conversation.id,\n limit: MESSAGES_PER_PAGE,\n offset: (page - 1) * MESSAGES_PER_PAGE\n });\n \n const sortedMessages = fetchedMessages.sort((a: Message, b: Message) => \n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n \n if (append && page > 1) {\n setMessages(prev => [...sortedMessages, ...prev]);\n } else {\n setMessages(sortedMessages);\n }\n \n setHasMoreMessages(fetchedMessages.length === MESSAGES_PER_PAGE);\n setCurrentPage(page);\n \n } catch (error) {\n toast.error(t('error_load_messages'));\n } finally {\n setLoading(false);\n setLoadingMore(false);\n }\n };\n\n const sendMessage = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!conversation || !newMessage.trim() || isBlocked) {\n if (isBlocked) {\n toast.error(t('you_are_blocked'));\n }\n return;\n }\n\n const messageContent = newMessage.trim();\n setNewMessage('');\n\n try {\n const sdk = ChatSDK.getInstance();\n await sdk.messages.sendMessage(conversation.id, messageContent);\n } catch (error) {\n setNewMessage(messageContent);\n toast.error(t('error_send_message'));\n }\n };\n\n const handleFileUpload = async (file: File) => {\n if (!conversation) return;\n\n const tempMessageId = `temp_${Date.now()}`;\n \n const placeholderMessage: Message = {\n id: tempMessageId,\n conversationId: conversation.id,\n senderId: currentUser.id,\n senderName: currentUser.name,\n content: `${file.name}`,\n type: file.type.startsWith('image/') ? 'image' : 'file',\n timestamp: new Date().toISOString(),\n status: 'sending',\n isRead: false,\n isDelivered: false,\n isUploading: true,\n uploadProgress: 0,\n localFileUri: URL.createObjectURL(file),\n metadata: {\n fileName: file.name,\n fileSize: file.size,\n mimeType: file.type\n }\n };\n\n setMessages(prev => [...prev, placeholderMessage]);\n setUploadProgress(prev => ({ ...prev, [tempMessageId]: 0 }));\n\n try {\n setUploading(true);\n \n const sdk = ChatSDK.getInstance();\n const mediaType = sdk.media.getFileTypeCategory(file.type);\n \n const uploadResult = await sdk.media.uploadMedia({\n file,\n type: mediaType,\n conversationId: conversation.id,\n onProgress: (progress) => {\n setUploadProgress(prev => ({ ...prev, [tempMessageId]: progress }));\n setMessages(prev => prev.map(msg => \n msg.id === tempMessageId \n ? { ...msg, uploadProgress: progress }\n : msg\n ));\n }\n });\n\n setUploadProgress(prev => ({ ...prev, [tempMessageId]: 100 }));\n \n const messageType = mediaType === 'document' ? 'file' : (mediaType === 'image' ? 'image' : 'file');\n const attachmentMetadata = {\n fileUrl: uploadResult.fileUrl,\n fileName: uploadResult.fileName,\n fileSize: uploadResult.fileSize,\n mimeType: uploadResult.mimeType || file.type\n };\n \n await sdk.messages.sendMessageWithOptions({\n conversationId: conversation.id,\n content: `${file.name}`,\n type: messageType,\n metadata: attachmentMetadata\n });\n\n setTimeout(() => {\n setMessages(prev => prev.filter(msg => msg.id !== tempMessageId));\n setUploadProgress(prev => {\n const newProgress = { ...prev };\n delete newProgress[tempMessageId];\n return newProgress;\n });\n }, 200);\n\n toast.success(t('file_sent_successfully'));\n\n } catch (error: any) {\n setMessages(prev => prev.filter(msg => msg.id !== tempMessageId));\n setUploadProgress(prev => {\n const newProgress = { ...prev };\n delete newProgress[tempMessageId];\n return newProgress;\n });\n toast.error(t('error_file_upload') + ': ' + (error.message || t('error_unknown')));\n } finally {\n setUploading(false);\n }\n };\n\n const handleBlockUser = async () => {\n setShowOptionsMenu(false);\n if (!conversation || !currentUser) return;\n \n if (!window.confirm(t('block_user_confirm'))) return;\n \n try {\n const sdk = ChatSDK.getInstance();\n if (!otherParticipant) {\n toast.error(t('user_not_found'));\n return;\n }\n \n const currentUserId = currentUser.id || (currentUser as any).userId;\n const userIdToBlock = (otherParticipant as any).id || (otherParticipant as any).userId || \n (otherParticipant as any).externalUserId || (otherParticipant as any).external_user_id;\n if (!userIdToBlock) {\n toast.error(t('user_id_not_found'));\n return;\n }\n \n if (userIdToBlock === currentUserId) {\n toast.error(t('cannot_block_self'));\n return;\n }\n \n await sdk.conversations.blockUserInChat(conversation.id, userIdToBlock);\n \n const metadata = conversation.metadata || {};\n const blockedUsers = metadata.blockedUsers || {};\n blockedUsers[userIdToBlock] = 1;\n \n if (conversation) {\n conversation.metadata = { ...metadata, blockedUsers };\n }\n \n setHasBlockedOther(true);\n toast.success(t('user_blocked'));\n } catch (error) {\n toast.error(t('failed_to_block'));\n }\n };\n\n const handleUnblockUser = async () => {\n setShowOptionsMenu(false);\n if (!conversation || !currentUser) return;\n \n if (!window.confirm(t('unblock_user_confirm'))) return;\n \n try {\n const sdk = ChatSDK.getInstance();\n if (!otherParticipant) {\n toast.error(t('user_not_found'));\n return;\n }\n \n const userIdToUnblock = (otherParticipant as any).id || (otherParticipant as any).userId || \n (otherParticipant as any).externalUserId || (otherParticipant as any).external_user_id;\n if (!userIdToUnblock) {\n toast.error(t('user_id_not_found'));\n return;\n }\n \n await sdk.conversations.unblockUserInChat(conversation.id, userIdToUnblock);\n \n const metadata = conversation.metadata || {};\n const blockedUsers = metadata.blockedUsers || {};\n delete blockedUsers[userIdToUnblock];\n \n if (conversation) {\n conversation.metadata = { ...metadata, blockedUsers };\n }\n \n setHasBlockedOther(false);\n toast.success(t('user_unblocked'));\n } catch (error) {\n toast.error(t('failed_to_unblock'));\n }\n };\n\n // Loading state\n if (loading && messages.length === 0) {\n return (\n <div className=\"chat-window\">\n <div className=\"chat-header\">\n <div className=\"chat-header-left\">\n <h3 style={{ margin: 0 }}>{t('loading')}</h3>\n </div>\n <div className=\"chat-header-actions\">\n {onClose && <button onClick={onClose} className=\"close-button\">&times;</button>}\n </div>\n </div>\n <div className=\"loading-messages\">{t('loading_messages')}</div>\n </div>\n );\n }\n\n return (\n <div className=\"chat-window\">\n {/* Chat Header */}\n <div className=\"chat-header\">\n <div className=\"chat-header-left\">\n {/* Back button (visible on mobile) */}\n {onBack && (\n <button className=\"chat-back-btn\" onClick={onBack} title={t('back') || 'Back'}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"/>\n </svg>\n </button>\n )}\n\n <div className=\"chat-header-avatar\">\n <div className=\"avatar-placeholder\">\n {headerInfo.userName ? headerInfo.userName.charAt(0).toUpperCase() : '?'}\n </div>\n </div>\n <div className=\"chat-header-info\">\n <h3 className=\"chat-participant-name\">{headerInfo.userName}</h3>\n </div>\n </div>\n\n <div className=\"chat-header-actions\">\n {/* Call Button */}\n {otherParticipant && (\n <button onClick={handleCallUser} className=\"chat-action-btn\" title={t('call') || 'Call'}>\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/>\n </svg>\n </button>\n )}\n\n {/* Close/Minimize button */}\n {onClose && (\n <button onClick={onClose} className=\"chat-action-btn\" title={t('close') || 'Close'}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7\"/>\n </svg>\n </button>\n )}\n\n {/* Options Menu */}\n {conversation && otherParticipant && (\n <div className=\"chat-options-wrapper\">\n <button onClick={() => setShowOptionsMenu(!showOptionsMenu)} className=\"chat-action-btn\" title={t('options') || 'Options'}>\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"5\" r=\"2\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2\"/>\n <circle cx=\"12\" cy=\"19\" r=\"2\"/>\n </svg>\n </button>\n {showOptionsMenu && (\n <div className=\"chat-options-menu\">\n {!isBlocked && !hasBlockedOther && (\n <button onClick={handleBlockUser} className=\"danger\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\"/></svg>\n {t('block_user')}\n </button>\n )}\n {hasBlockedOther && (\n <button onClick={handleUnblockUser}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M2 12h20\"/></svg>\n {t('unblock_user')}\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Product Context Bar */}\n {headerInfo.productName && (\n <div className=\"chat-product-bar\">\n {headerInfo.productImage && (\n <img src={headerInfo.productImage} alt={headerInfo.productName} />\n )}\n <div className=\"chat-product-bar-info\">\n <p className=\"chat-product-bar-name\">{headerInfo.productName}</p>\n {headerInfo.productMetadata?.price && (\n <p className=\"chat-product-bar-price\">\n {headerInfo.productMetadata.price} {headerInfo.productMetadata.currency || 'QAR'}\n </p>\n )}\n </div>\n </div>\n )}\n\n {/* Messages Area */}\n <div className=\"chat-messages\" ref={chatMessagesRef} onScroll={handleMessagesScroll} onClick={() => setShowOptionsMenu(false)}>\n {/* Sticky Date Header */}\n {stickyDate && !loading && messages.length > 0 && (\n <div className={`sticky-date-header ${stickyDateVisible ? 'sticky-date-visible' : ''}`}>\n <span className=\"sticky-date-pill\">{stickyDate}</span>\n </div>\n )}\n\n {loading ? (\n <div className=\"loading-messages\">{t('loading_messages')}</div>\n ) : (\n <>\n {messages.map((message, index) => (\n <React.Fragment key={message.id}>\n {/* Date Divider */}\n {shouldShowDateDivider(message, index) && (\n <div className=\"date-divider\" data-date={formatDateDivider(message.timestamp)}>\n <div className=\"date-divider-line\"></div>\n <span className=\"date-divider-text\">{formatDateDivider(message.timestamp)}</span>\n <div className=\"date-divider-line\"></div>\n </div>\n )}\n\n {/* Message Bubble */}\n <div className={`message ${message.senderId === currentUser.id ? 'sent' : 'received'}`}>\n <div className=\"message-content\">\n {/* Upload Progress Bar */}\n {message.isUploading && message.uploadProgress !== undefined && (\n <div className=\"upload-progress-bar\">\n <div className=\"upload-progress-fill\" style={{ width: `${message.uploadProgress}%` }} />\n </div>\n )}\n \n {/* Image Message */}\n {message.type === 'image' && (message.metadata?.fileUrl || message.localFileUri) ? (\n <div className=\"message-attachment image-attachment\">\n <img \n src={message.isUploading ? message.localFileUri : message.metadata?.fileUrl} \n alt={message.metadata?.fileName || t('image')}\n className={message.isUploading ? 'uploading-image' : ''}\n onClick={() => !message.isUploading && message.metadata?.fileUrl && window.open(message.metadata.fileUrl, '_blank')}\n />\n <div className=\"attachment-info\">\n {message.metadata?.fileName || t('image')}\n {message.metadata?.fileSize && (\n <span> &bull; {Math.round(message.metadata.fileSize / 1024)} KB</span>\n )}\n </div>\n </div>\n ) : message.type === 'file' && message.metadata?.fileUrl ? (\n /* File Message */\n <div className=\"message-attachment file-attachment\">\n <div className=\"file-info\">\n <div className=\"file-icon\">\n {getFileIcon(message.metadata?.mimeType)}\n </div>\n <div className=\"file-details\">\n <div className=\"file-name\">\n {message.metadata?.fileName || t('file')}\n </div>\n <div className=\"file-size\">\n {message.metadata?.fileSize ? \n `${Math.round(message.metadata.fileSize / 1024)} KB` : \n t('unknown_size')\n }\n </div>\n </div>\n </div>\n <a \n href={message.metadata?.fileUrl || '#'} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n className=\"download-btn\"\n >\n {t('download')}\n </a>\n </div>\n ) : (\n /* Text Message */\n message.content\n )}\n\n {/* Time & Read Status (inside bubble) */}\n <div className=\"message-footer\">\n <span className=\"message-time\">{formatTime(message.timestamp)}</span>\n {message.senderId === currentUser.id && (\n <span className=\"message-status\">\n <span className=\"read-status\">\n {message.isRead ? (\n <svg className=\"read-check is-read\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" width=\"20\" height=\"20\">\n <polyline points=\"1 13 5 17 11 9\"/>\n <polyline points=\"7 13 11 17 17 9\"/>\n </svg>\n ) : (\n <svg className=\"read-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" width=\"20\" height=\"20\">\n <polyline points=\"4 13 8 17 16 9\"/>\n </svg>\n )}\n </span>\n </span>\n )}\n </div>\n </div>\n </div>\n </React.Fragment>\n ))}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Blocking UI - User has blocked other */}\n {hasBlockedOther && (\n <div className=\"blocked-ui blocked-by-me\">\n <div className=\"blocked-title\">\n {t('you_have_blocked', { userName: headerInfo.userName || t('unknown_user') })}\n </div>\n <div className=\"blocked-message\">\n {t('you_have_blocked_submessage')}\n </div>\n <button onClick={handleUnblockUser} className=\"unblock-btn\">\n {t('unblock_user')}\n </button>\n </div>\n )}\n\n {/* Blocked UI - User is blocked */}\n {isBlocked && !hasBlockedOther && (\n <div className=\"blocked-ui blocked-by-other\">\n <div className=\"blocked-title\">\n {t('blocked_by_user', { userName: headerInfo.userName || t('unknown_user') })}\n </div>\n <div className=\"blocked-message\">\n {t('blocked_by_user_submessage')}\n </div>\n </div>\n )}\n\n {/* Message Input Form */}\n {!hasBlockedOther && !isBlocked && (\n <form onSubmit={sendMessage} className=\"chat-input\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || uploading || isBlocked}\n className=\"attachment-btn\"\n title={t('attach_file')}\n >\n {uploading ? (\n <span>&#8987;</span>\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/>\n </svg>\n )}\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n style={{ display: 'none' }}\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n handleFileUpload(file);\n e.target.value = '';\n }\n }}\n />\n <input\n type=\"text\"\n value={newMessage}\n onChange={(e) => setNewMessage(e.target.value)}\n placeholder={isBlocked ? t('you_are_blocked') : (uploading ? t('uploading') : t('message_hint'))}\n disabled={loading || uploading || isBlocked}\n />\n <button type=\"submit\" disabled={!newMessage.trim() || loading || uploading || isBlocked} className=\"send-btn\">\n {uploading ? t('uploading') : t('send')}\n </button>\n </form>\n )}\n </div>\n );\n};\n\nexport default ChatWindow;\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Conversation, User } from '../types';\nimport { ChatSDK } from '../ChatSDK';\nimport toast from 'react-hot-toast';\nimport { t } from '../i18n';\n\nexport interface ConversationListProps {\n currentUser: User;\n onSelectConversation: (conversation: Conversation) => void;\n selectedConversationId?: string;\n}\n\nconst ConversationList: React.FC<ConversationListProps> = ({ \n currentUser, \n onSelectConversation, \n selectedConversationId \n}) => {\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [loading, setLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const selectedConversationIdRef = useRef<string | undefined>(selectedConversationId);\n const currentUserIdRef = useRef<string>(currentUser.id);\n\n useEffect(() => {\n selectedConversationIdRef.current = selectedConversationId;\n }, [selectedConversationId]);\n\n useEffect(() => {\n currentUserIdRef.current = currentUser.id;\n }, [currentUser.id]);\n\n useEffect(() => {\n loadConversations();\n }, []);\n\n useEffect(() => {\n if (currentUser) {\n setConversations([]);\n loadConversations();\n }\n }, [currentUser.id]);\n\n useEffect(() => {\n const sdk = ChatSDK.getInstance();\n \n const handleNewMessage = (data: { message: any }) => {\n const message = data.message;\n const conversationId = message.roomId || message.conversationId;\n \n setConversations(prev => \n prev.map(conv => {\n if (conv.id === conversationId) {\n const isNotSender = message.senderId !== currentUserIdRef.current;\n const isNotCurrentlyViewing = selectedConversationIdRef.current !== conversationId;\n const shouldIncreaseUnread = isNotSender && isNotCurrentlyViewing;\n \n return {\n ...conv,\n lastMessage: message,\n unreadCount: shouldIncreaseUnread ? conv.unreadCount + 1 : conv.unreadCount\n };\n }\n return conv;\n }).sort((a, b) => {\n const aTime = a.lastMessage?.timestamp || a.createdAt;\n const bTime = b.lastMessage?.timestamp || b.createdAt;\n return new Date(bTime).getTime() - new Date(aTime).getTime();\n })\n );\n \n if (message.senderId !== currentUserIdRef.current && selectedConversationIdRef.current === conversationId) {\n const sdk = ChatSDK.getInstance();\n sdk.chatUsers.markMessageRead(message.id).then(() => {\n setConversations(prev => \n prev.map(conv => \n conv.id === conversationId ? { ...conv, unreadCount: 0 } : conv\n )\n );\n }).catch(error => {\n console.warn('Failed to auto-mark message as read:', error);\n });\n }\n };\n\n const handleConversationUpdate = (data: { conversationId?: string; conversation?: any; lastMessage?: any }) => {\n const updatedConversationId = data.conversationId || data.conversation?.id || data.conversation?.conversationId;\n if (!updatedConversationId) return;\n\n const payloadLastMessage = data.lastMessage || data.conversation?.lastMessage;\n const payloadUnreadCount = data.conversation?.unreadCount;\n\n setConversations(prev => {\n const conversationExists = prev.some(c => c.id === updatedConversationId);\n \n if (!conversationExists) {\n loadConversations();\n return prev;\n }\n \n return prev\n .map(conv => {\n if (conv.id !== updatedConversationId) return conv;\n\n const isOpen = selectedConversationIdRef.current === updatedConversationId;\n const myUserId = currentUserIdRef.current;\n\n if (typeof payloadUnreadCount === 'number') {\n return {\n ...conv,\n lastMessage: payloadLastMessage || conv.lastMessage,\n unreadCount: isOpen ? 0 : payloadUnreadCount,\n } as Conversation;\n }\n\n const fromOtherUser = payloadLastMessage?.senderId && payloadLastMessage.senderId !== myUserId;\n const shouldIncrease = Boolean(payloadLastMessage) && fromOtherUser && !isOpen;\n\n return {\n ...conv,\n lastMessage: payloadLastMessage || conv.lastMessage,\n unreadCount: isOpen ? 0 : (shouldIncrease ? conv.unreadCount + 1 : conv.unreadCount),\n } as Conversation;\n })\n .sort((a, b) => {\n const aTime = a.lastMessage?.timestamp || a.createdAt;\n const bTime = b.lastMessage?.timestamp || b.createdAt;\n return new Date(bTime).getTime() - new Date(aTime).getTime();\n });\n });\n };\n\n const handleConversationRead = (data: { conversationId?: string; roomId?: string; markedCount?: number }) => {\n const id = data.conversationId || data.roomId;\n if (!id) return;\n setConversations(prev => \n prev.map(conv => \n conv.id === id ? { ...conv, unreadCount: 0 } : conv\n )\n );\n };\n\n const handleAutoMarkedRead = (data: { roomId?: string; conversationId?: string; markedAsReadCount?: number }) => {\n const id = data.roomId || data.conversationId;\n if (!id) return;\n setConversations(prev => \n prev.map(conv => \n conv.id === id ? { ...conv, unreadCount: 0 } : conv\n )\n );\n };\n\n sdk.events.on('message.received', handleNewMessage);\n sdk.events.on('conversation.updated', handleConversationUpdate);\n sdk.events.on('conversation.read', handleConversationRead);\n \n if (sdk.socket?.isConnected()) {\n sdk.socket.on('auto_marked_read', handleAutoMarkedRead);\n sdk.socket.on('room_marked_read', handleConversationRead);\n }\n \n return () => {\n sdk.events.off('message.received', handleNewMessage);\n sdk.events.off('conversation.updated', handleConversationUpdate);\n sdk.events.off('conversation.read', handleConversationRead);\n \n if (sdk.socket?.isConnected()) {\n sdk.socket.off('auto_marked_read', handleAutoMarkedRead);\n sdk.socket.off('room_marked_read', handleConversationRead);\n }\n };\n }, []);\n\n const handleSelectConversation = async (conversation: Conversation) => {\n try {\n if (conversation.unreadCount > 0) {\n const sdk = ChatSDK.getInstance();\n await sdk.chatUsers.markRoomMessagesRead(conversation.id);\n sdk.chatUsers.startViewingConversation(conversation.id);\n }\n onSelectConversation(conversation);\n } catch (error) {\n console.error('Failed to mark conversation as read:', error);\n onSelectConversation(conversation);\n }\n };\n\n const loadConversations = async () => {\n setLoading(true);\n try {\n const sdk = ChatSDK.getInstance();\n const result = await sdk.chatUsers.getConversations();\n let fetchedConversations = result;\n \n if (result && typeof result === 'object' && !Array.isArray(result)) {\n fetchedConversations = (result as any).conversations || (result as any).data || [];\n }\n \n setConversations(Array.isArray(fetchedConversations) ? fetchedConversations : []);\n } catch (error) {\n toast.error(t('error_load_conversations'));\n } finally {\n setLoading(false);\n }\n };\n\n const getOtherParticipant = (conversation: Conversation) => {\n return conversation.participants.find((p: User) => p.id !== currentUser.id);\n };\n\n const getOtherParticipantName = (conversation: Conversation) => {\n const otherParticipant = getOtherParticipant(conversation);\n return otherParticipant?.name || t('unknown_user');\n };\n\n const getLastMessageText = (conversation: Conversation) => {\n return conversation.lastMessage?.content || t('no_messages_yet');\n };\n\n const formatTime = (timestamp: string) => {\n const date = new Date(timestamp);\n const now = new Date();\n const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60);\n const diffInDays = diffInHours / 24;\n \n if (diffInHours < 24) {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n } else if (diffInDays < 7) {\n const dayNum = Math.floor(diffInDays);\n return `${dayNum}d ago`;\n } else {\n const day = date.getDate();\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${day} ${months[date.getMonth()]}`;\n }\n };\n\n // Filtered conversations based on search query\n const filteredConversations = searchQuery.trim()\n ? conversations.filter(conv => {\n const query = searchQuery.toLowerCase().trim();\n const name = getOtherParticipantName(conv).toLowerCase();\n const product = conv.productContext?.productName?.toLowerCase() || '';\n const lastMsg = getLastMessageText(conv).toLowerCase();\n return name.includes(query) || product.includes(query) || lastMsg.includes(query);\n })\n : conversations;\n\n if (loading) {\n return (\n <div className=\"conversation-list loading\">\n <div className=\"loading-spinner\">{t('loading_conversations')}</div>\n </div>\n );\n }\n\n return (\n <div className=\"conversation-list\">\n <div className=\"conversation-list-header\">\n <h3>{t('conversations_title')}</h3>\n </div>\n\n {/* Search Bar */}\n <div className=\"conversation-search\">\n <div className=\"conversation-search-input\">\n <span className=\"search-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n </svg>\n </span>\n <input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n type=\"text\"\n placeholder={t('search') || 'Search'}\n />\n </div>\n </div>\n \n <div className=\"conversations\">\n {filteredConversations.length === 0 ? (\n <div className=\"empty-conversations\">\n <p>{searchQuery ? (t('no_search_results') || 'No results found') : t('no_conversations_title')}</p>\n {!searchQuery && <p>{t('no_conversations_message')}</p>}\n </div>\n ) : (\n filteredConversations.map((conversation) => {\n const isSelected = selectedConversationId === conversation.id;\n \n return (\n <div\n key={conversation.id}\n className={`conversation-item ${isSelected ? 'selected' : ''} ${conversation.unreadCount > 0 ? 'has-unread' : ''}`}\n onClick={() => handleSelectConversation(conversation)}\n >\n <div className=\"conversation-avatar\">\n {conversation.productContext?.productImage ? (\n <img \n src={conversation.productContext.productImage} \n alt={conversation.productContext.productName}\n className=\"product-image\"\n />\n ) : (\n <div className=\"avatar-placeholder\">\n {getOtherParticipantName(conversation).charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n \n <div className=\"conversation-content\">\n <div className=\"conversation-header\">\n <div className=\"conversation-title-wrapper\">\n <h4 className=\"conversation-participant-name\">\n {getOtherParticipantName(conversation)}\n </h4>\n </div>\n {conversation.lastMessage && (\n <span className=\"conversation-time\">\n {formatTime(conversation.lastMessage.timestamp)}\n </span>\n )}\n </div>\n \n <div className=\"conversation-details\">\n <p className=\"conversation-last-message\">\n {getLastMessageText(conversation)}\n </p>\n \n {conversation.unreadCount > 0 && (\n <span className=\"unread-badge\">\n {conversation.unreadCount}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n};\n\nexport default ConversationList;\n","import React, { useState, useEffect, createContext, useContext, ReactNode } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\ninterface UseThemeReturn {\n theme: Theme;\n actualTheme: 'light' | 'dark';\n setTheme: (theme: Theme) => void;\n toggleTheme: () => void;\n}\n\n/**\n * Custom hook for theme management\n * Supports light, dark, and auto (system preference) themes\n */\nexport const useTheme = (): UseThemeReturn => {\n // Get initial theme from localStorage or default to 'auto'\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window !== 'undefined') {\n return (localStorage.getItem('chatSDK-theme') as Theme) || 'auto';\n }\n return 'auto';\n });\n\n // Get system preference\n const [systemPreference, setSystemPreference] = useState<'light' | 'dark'>(() => {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n });\n\n // Calculate actual theme based on theme setting and system preference\n const actualTheme: 'light' | 'dark' = theme === 'auto' ? systemPreference : theme;\n\n // Listen for system preference changes\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n \n const handleChange = (e: MediaQueryListEvent) => {\n setSystemPreference(e.matches ? 'dark' : 'light');\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, []);\n\n // Apply theme to document\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const root = document.documentElement;\n \n // Remove existing theme classes\n root.classList.remove('theme-light', 'theme-dark');\n root.removeAttribute('data-theme');\n \n // Apply new theme\n root.classList.add(`theme-${actualTheme}`);\n root.setAttribute('data-theme', actualTheme);\n }, [actualTheme]);\n\n // Set theme and persist to localStorage\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n if (typeof window !== 'undefined') {\n localStorage.setItem('chatSDK-theme', newTheme);\n }\n };\n\n // Toggle between light and dark (skips auto)\n const toggleTheme = () => {\n if (theme === 'auto') {\n setTheme(systemPreference === 'light' ? 'dark' : 'light');\n } else {\n setTheme(actualTheme === 'light' ? 'dark' : 'light');\n }\n };\n\n return {\n theme,\n actualTheme,\n setTheme,\n toggleTheme,\n };\n};\n\n/**\n * Theme Context for React components\n */\ninterface ThemeContextType extends UseThemeReturn {}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ children }) => {\n const themeValues = useTheme();\n\n return (\n <ThemeContext.Provider value={themeValues}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useThemeContext = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useThemeContext must be used within a ThemeProvider');\n }\n return context;\n};\n","import React from 'react';\r\nimport { useThemeContext } from '../hooks/useTheme';\r\n\r\ninterface ThemeToggleProps {\r\n className?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\n/**\r\n * Theme toggle button component\r\n * Allows users to switch between light, dark, and auto themes\r\n */\r\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ \r\n className = '', \r\n showLabel = false \r\n}) => {\r\n const { theme, actualTheme, setTheme } = useThemeContext();\r\n\r\n const getThemeIcon = () => {\r\n switch (theme) {\r\n case 'light':\r\n return (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 2.25a.75.75 0 01.75.75v2.25a.75.75 0 01-1.5 0V3a.75.75 0 01.75-.75zM7.5 12a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM18.894 6.166a.75.75 0 00-1.06-1.06l-1.591 1.59a.75.75 0 101.06 1.061l1.591-1.59zM21.75 12a.75.75 0 01-.75.75h-2.25a.75.75 0 010-1.5H21a.75.75 0 01.75.75zM17.834 18.894a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 10-1.061 1.06l1.59 1.591zM12 18a.75.75 0 01.75.75V21a.75.75 0 01-1.5 0v-2.25A.75.75 0 0112 18zM7.758 17.303a.75.75 0 00-1.061-1.06l-1.591 1.59a.75.75 0 001.06 1.061l1.591-1.59zM6 12a.75.75 0 01-.75.75H3a.75.75 0 010-1.5h2.25A.75.75 0 016 12zM6.697 7.757a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 00-1.061 1.06l1.59 1.591z\" />\r\n </svg>\r\n );\r\n case 'dark':\r\n return (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path fillRule=\"evenodd\" d=\"M9.528 1.718a.75.75 0 01.162.819A8.97 8.97 0 009 6a9 9 0 009 9 8.97 8.97 0 003.463-.69.75.75 0 01.981.98 10.503 10.503 0 01-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 01.818.162z\" clipRule=\"evenodd\" />\r\n </svg>\r\n );\r\n case 'auto':\r\n return (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path fillRule=\"evenodd\" d=\"M2.25 6a3 3 0 013-3h13.5a3 3 0 013 3v12a3 3 0 01-3 3H5.25a3 3 0 01-3-3V6zm3.97.97a.75.75 0 011.06 0l2.25 2.25a.75.75 0 010 1.06l-2.25 2.25a.75.75 0 01-1.06-1.06l1.72-1.72-1.72-1.72a.75.75 0 010-1.06zm4.28 4.28a.75.75 0 000 1.5h3a.75.75 0 000-1.5h-3z\" clipRule=\"evenodd\" />\r\n </svg>\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const getThemeLabel = () => {\r\n switch (theme) {\r\n case 'light':\r\n return 'Light';\r\n case 'dark':\r\n return 'Dark';\r\n case 'auto':\r\n return `Auto (${actualTheme})`;\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n const cycleTheme = () => {\r\n switch (theme) {\r\n case 'light':\r\n setTheme('dark');\r\n break;\r\n case 'dark':\r\n setTheme('auto');\r\n break;\r\n case 'auto':\r\n setTheme('light');\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={cycleTheme}\r\n className={`\r\n inline-flex items-center gap-2 px-3 py-2 rounded-md\r\n text-on-surface bg-surface-variant hover:bg-primary hover:text-on-primary\r\n border border-figma-separator transition-colors duration-200\r\n focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\r\n ${className}\r\n `}\r\n title={`Current theme: ${getThemeLabel()}. Click to cycle.`}\r\n aria-label={`Switch theme. Current: ${getThemeLabel()}`}\r\n >\r\n {getThemeIcon()}\r\n {showLabel && (\r\n <span className=\"text-sm font-medium\">\r\n {getThemeLabel()}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n};\r\n\r\nexport default ThemeToggle;","/**\r\n * ChatSDK React - Theme System\r\n * Material Design 3 + Figma Colors matching Android implementation\r\n */\r\n\r\n// Import all theme CSS files\r\nimport './figma-colors.css';\r\nimport './theme-dark.css';\r\nimport './theme-utils.css';\r\n\r\n// Export theme-related hooks and components\r\nexport { useTheme, useThemeContext, ThemeProvider } from '../hooks/useTheme';\r\nexport { ThemeToggle } from '../components/ThemeToggle';\r\n\r\n// Theme types\r\nexport type { Theme } from '../hooks/useTheme';\r\n\r\n/**\r\n * Initialize theme system\r\n * Call this once in your app's entry point\r\n */\r\nexport const initializeTheme = () => {\r\n // Set initial theme based on saved preference or system\r\n const savedTheme = localStorage.getItem('chatSDK-theme') as 'light' | 'dark' | 'auto' | null;\r\n const systemPrefersDark = window.matchMedia?.('(prefers-color-scheme: dark)').matches;\r\n \r\n const initialTheme = savedTheme || 'auto';\r\n const actualTheme = initialTheme === 'auto' \r\n ? (systemPrefersDark ? 'dark' : 'light') \r\n : initialTheme;\r\n\r\n // Apply theme to document\r\n document.documentElement.classList.add(`theme-${actualTheme}`);\r\n document.documentElement.setAttribute('data-theme', actualTheme);\r\n};\r\n\r\n/**\r\n * Theme configuration object\r\n * Matches Android Material Design 3 color scheme\r\n */\r\nexport const themeConfig = {\r\n // Material Design 3 Primary Colors\r\n primary: {\r\n main: '#2196F3',\r\n onPrimary: '#FFFFFF',\r\n container: '#BBDEFB',\r\n onContainer: '#0D47A1',\r\n dark: '#1976D2',\r\n },\r\n \r\n // Material Design 3 Secondary Colors\r\n secondary: {\r\n main: '#FF4081',\r\n onSecondary: '#FFFFFF',\r\n container: '#FCE4EC',\r\n onContainer: '#880E4F',\r\n },\r\n \r\n // Surface Colors\r\n surface: {\r\n main: '#FFFFFF',\r\n onSurface: '#212121',\r\n variant: '#F5F5F5',\r\n onVariant: '#757575',\r\n },\r\n \r\n // Background Colors\r\n background: {\r\n main: '#FFFFFF',\r\n onBackground: '#212121',\r\n },\r\n \r\n // Error Colors\r\n error: {\r\n main: '#F44336',\r\n onError: '#FFFFFF',\r\n container: '#FFEBEE',\r\n onContainer: '#B71C1C',\r\n },\r\n \r\n // Status Colors\r\n status: {\r\n success: '#4CAF50',\r\n warning: '#FF9800',\r\n error: '#F44336',\r\n info: '#2196F3',\r\n },\r\n \r\n // Figma Design Colors\r\n figma: {\r\n background: '#F0F0F0',\r\n textPrimary: '#1E1E1E',\r\n textProduct: '#95265B',\r\n textTimestamp: '#878787',\r\n separator: '#C4C4C4',\r\n onlineIndicator: '#4CAF50',\r\n },\r\n \r\n // Chat Colors\r\n chat: {\r\n background: '#F4F4F4',\r\n productText: '#923060',\r\n messageReceived: '#FFFFFF',\r\n messageSent: '#C4C4C4',\r\n inputBackground: '#FBFBFB',\r\n inputPlaceholder: '#C4C4C4',\r\n timestamp: '#878787',\r\n primaryText: '#1E1E1E',\r\n },\r\n \r\n // Component Colors\r\n message: {\r\n sentBackground: '#2196F3',\r\n receivedBackground: '#F5F5F5',\r\n },\r\n \r\n avatar: {\r\n background: '#E0E0E0',\r\n border: '#BDBDBD',\r\n },\r\n \r\n input: {\r\n background: '#FAFAFA',\r\n border: '#E0E0E0',\r\n },\r\n \r\n badge: {\r\n unreadBackground: '#F44336',\r\n },\r\n \r\n // Common Colors\r\n common: {\r\n white: '#FFFFFF',\r\n black: '#000000',\r\n transparent: 'transparent',\r\n },\r\n};\r\n\r\n/**\r\n * Dark theme configuration\r\n */\r\nexport const darkThemeConfig = {\r\n primary: {\r\n main: '#90CAF9',\r\n onPrimary: '#0D47A1',\r\n container: '#1565C0',\r\n onContainer: '#E3F2FD',\r\n dark: '#42A5F5',\r\n },\r\n \r\n secondary: {\r\n main: '#F8BBD9',\r\n onSecondary: '#4A148C',\r\n container: '#7B1FA2',\r\n onContainer: '#FCE4EC',\r\n },\r\n \r\n surface: {\r\n main: '#121212',\r\n onSurface: '#FFFFFF',\r\n variant: '#1E1E1E',\r\n onVariant: '#BDBDBD',\r\n },\r\n \r\n background: {\r\n main: '#121212',\r\n onBackground: '#FFFFFF',\r\n },\r\n \r\n error: {\r\n main: '#CF6679',\r\n onError: '#000000',\r\n container: '#B00020',\r\n onContainer: '#FECDD3',\r\n },\r\n \r\n figma: {\r\n background: '#1E1E1E',\r\n textPrimary: '#FFFFFF',\r\n textProduct: '#F8BBD9',\r\n textTimestamp: '#BDBDBD',\r\n separator: '#424242',\r\n onlineIndicator: '#4CAF50',\r\n },\r\n \r\n chat: {\r\n background: '#121212',\r\n productText: '#F8BBD9',\r\n messageReceived: '#2C2C2C',\r\n messageSent: '#424242',\r\n inputBackground: '#1E1E1E',\r\n inputPlaceholder: '#757575',\r\n timestamp: '#BDBDBD',\r\n primaryText: '#FFFFFF',\r\n },\r\n};\r\n\r\nexport default {\r\n initializeTheme,\r\n themeConfig,\r\n darkThemeConfig,\r\n};","// ============================================================\n// @traiyani/chatsdk-react - Pre-built React ChatSDK Package\n// ============================================================\n\n// Import all CSS so it gets bundled into a single chatsdk.css\nimport '@source/styles/figma-colors.css';\nimport '@source/styles/theme-dark.css';\nimport '@source/styles/theme-utils.css';\nimport '@source/conversation/conversation.css';\n\n// ---- Core SDK class ----\nexport { ChatSDK } from '@source/ChatSDK';\nexport type { ChatSDKConfig, ChatSDKError } from '@source/ChatSDK';\n\n// ---- React Components ----\nexport { default as ChatWindow } from '@source/components/ChatWindow';\nexport { default as ConversationList } from '@source/components/ConversationList';\nexport { ThemeToggle } from '@source/components/ThemeToggle';\n\n// ---- Component Prop Types ----\nexport type { ChatWindowProps } from '@source/components/ChatWindow';\nexport type { ConversationListProps } from '@source/components/ConversationList';\n\n// ---- React Hooks ----\nexport { useTheme, useThemeContext, ThemeProvider } from '@source/hooks/useTheme';\nexport type { Theme } from '@source/hooks/useTheme';\n\n// ---- Theme System ----\nexport { initializeTheme, themeConfig, darkThemeConfig } from '@source/styles/index';\n\n// ---- Manager classes (for advanced usage) ----\nexport { AuthManager } from '@source/managers/AuthManager';\nexport { UserManager } from '@source/managers/UserManager';\nexport { ConversationManager } from '@source/managers/ConversationManager';\nexport { MessageManager } from '@source/managers/MessageManager';\nexport { MediaManager } from '@source/managers/MediaManager';\nexport { EventManager } from '@source/managers/EventManager';\nexport { SocketManager } from '@source/managers/SocketManager';\n\n// ---- Utility classes ----\nexport { ParseUtils } from '@source/utils/ParseUtils';\n\n// ---- i18n utilities ----\nexport { changeLanguage, getCurrentLanguage, isRTL, t } from '@source/i18n';\n\n// ---- Types ----\nexport type {\n ChatSDKUser,\n ChatSDKMessage,\n ChatSDKConversation,\n ProductContext,\n Product,\n ChatState,\n User,\n Message,\n Conversation,\n} from '@source/types';\n\nexport type { UserSearchOptions, UserUpdateData } from '@source/managers/UserManager';\nexport type { SendMessageOptions, MessageListOptions, MessageSearchOptions } from '@source/managers/MessageManager';\nexport type { MediaUploadOptions, MediaUploadResult, MediaDownloadOptions } from '@source/managers/MediaManager';\nexport type { EventCallback, ChatSDKEvent } from '@source/managers/EventManager';\nexport type { CreateConversationOptions, ConversationListOptions } from '@source/managers/ConversationManager';\n\n// ---- Helper utilities ----\nexport const ChatSDKHelpers = {\n async init(config: import('@source/ChatSDK').ChatSDKConfig) {\n const { ChatSDK } = await import('@source/ChatSDK');\n return ChatSDK.getInstance().init(config);\n },\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n formatTimeAgo(timestamp: string | Date): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return 'now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n },\n};\n"],"names":["AuthManager","chatSDK","config","axios","token","error","response","_a","isSessionRestore","_b","_c","externalUserId","appId","name","email","user","_d","_f","_e","password","metadata","auth","authToken","newPassword","ChatUserManager","saveToken","_g","userData","isLoggedinUser","registerError","fcmToken","platform","tokens","options","params","conversations","externalGroupId","userId","conversation","productContext","chatMetadata","requestBody","count","summary","conversationId","markedCount","_h","_i","_k","_j","messageId","wasUnread","UserManager","limit","offset","updateData","status","userIds","ConversationManager","chatId","MessageManager","content","socketError","resolve","reject","currentUser","messageData","onSuccess","message","onError","messages","mappedMessages","msg","deleteForEveryone","messageIds","isTyping","reaction","MediaManager","formData","result","progressEvent","progress","file","caption","mediaId","downloadUrl","size","thumbnailUrl","sizeInBytes","mimeTypes","mimeType","bytes","k","sizes","i","EventManager","event","callback","listeners","index","data","type","attempts","ParseUtils","messageType","parsedMessage","p","users","SocketManager","socketUrl","io","timeout","reason","normalizedData","parsedUsers","roomId","_ChatSDK","enabled","ChatSDK","e","t","l","a","n","o","r","c","s","u","d","f","g","h","m","j","W","F","A","Y","U","P","y","J","x","oe","I","re","se","te","ne","ie","V","ae","pe","N","de","_","ce","ue","w","le","fe","me","Te","M","ye","ge","he","xe","be","B","Se","Ae","z","Re","T","Pe","Vt","en","ar","locales","currentLocale","changeLanguage","locale","isRTL","getCurrentLanguage","key","replacements","translation","placeholder","storedLanguage","ChatWindow","onClose","onBack","setMessages","useState","newMessage","setNewMessage","loading","setLoading","uploading","setUploading","uploadProgress","setUploadProgress","loadingMore","setLoadingMore","hasMoreMessages","setHasMoreMessages","currentPage","setCurrentPage","blockStatus","setBlockStatus","isBlocked","setIsBlocked","hasBlockedOther","setHasBlockedOther","showOptionsMenu","setShowOptionsMenu","stickyDate","setStickyDate","stickyDateVisible","setStickyDateVisible","messagesEndRef","useRef","fileInputRef","chatMessagesRef","stickyDateTimeoutRef","MESSAGES_PER_PAGE","getOtherParticipant","useCallback","participants","currentUserId","currentUserExternalId","pId","pExternalId","otherParticipant","headerInfo","userName","useEffect","loadMessages","joinChatRoom","leaveChatRoom","sdk","handleNewMessage","prev","handleReadReceipt","handleReadReceipts","messageIdSet","handleRealtimeBlockStatus","payload","blockedUsers","other","otherUserId","scrollToBottom","handleClick","formatTime","timestamp","formatDateDivider","date","now","today","msgDate","diffDays","days","day","month","shouldShowDateDivider","prevMessage","prevDate","currDate","getFileIcon","handleMessagesScroll","container","dividers","currentDate","containerTop","divider","handleCallUser","phoneNumber","toast","textArea","page","append","fetchedMessages","sortedMessages","b","sendMessage","messageContent","handleFileUpload","tempMessageId","placeholderMessage","mediaType","uploadResult","attachmentMetadata","newProgress","handleBlockUser","userIdToBlock","handleUnblockUser","userIdToUnblock","jsxs","jsx","Fragment","React","ConversationList","onSelectConversation","selectedConversationId","setConversations","searchQuery","setSearchQuery","selectedConversationIdRef","currentUserIdRef","loadConversations","conv","isNotSender","isNotCurrentlyViewing","aTime","bTime","handleConversationUpdate","updatedConversationId","payloadLastMessage","payloadUnreadCount","isOpen","myUserId","fromOtherUser","shouldIncrease","handleConversationRead","id","handleAutoMarkedRead","handleSelectConversation","fetchedConversations","getOtherParticipantName","getLastMessageText","diffInHours","diffInDays","filteredConversations","query","product","lastMsg","isSelected","useTheme","theme","setThemeState","systemPreference","setSystemPreference","actualTheme","mediaQuery","handleChange","root","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","themeValues","useThemeContext","context","useContext","ThemeToggle","className","showLabel","getThemeIcon","getThemeLabel","initializeTheme","savedTheme","systemPrefersDark","initialTheme","themeConfig","darkThemeConfig","ChatSDKHelpers","ChatSDK$1","diffMs","diffMins","diffHours"],"mappings":"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","x_google_ignoreList":[10,11]}
1
+ {"version":3,"file":"chatsdk-react.mjs","sources":["../../../sdk-distributions/react/v1.0.0/src/managers/AuthManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/ChatUserManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/UserManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/ConversationManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/MessageManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/MediaManager.ts","../../../sdk-distributions/react/v1.0.0/src/managers/EventManager.ts","../../../sdk-distributions/react/v1.0.0/src/utils/ParseUtils.ts","../../../sdk-distributions/react/v1.0.0/src/managers/SocketManager.ts","../../../sdk-distributions/react/v1.0.0/src/ChatSDK.ts","../../../node_modules/goober/dist/goober.modern.js","../../../node_modules/react-hot-toast/dist/index.mjs","../../../sdk-distributions/react/v1.0.0/src/i18n/locales/en.ts","../../../sdk-distributions/react/v1.0.0/src/i18n/locales/ar.ts","../../../sdk-distributions/react/v1.0.0/src/i18n/index.ts","../../../sdk-distributions/react/v1.0.0/src/components/ChatWindow.tsx","../src/components/ChatWindow.tsx","../../../sdk-distributions/react/v1.0.0/src/components/ConversationList.tsx","../src/components/ConversationList.tsx","../../../sdk-distributions/react/v1.0.0/src/hooks/useTheme.tsx","../../../sdk-distributions/react/v1.0.0/src/components/ThemeToggle.tsx","../../../sdk-distributions/react/v1.0.0/src/styles/index.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser } from '../types';\n\nexport interface AuthResponse {\n success: boolean;\n message: string;\n data: {\n token: string;\n user: ChatSDKUser;\n auth: {\n accessToken: string;\n tokenType: string;\n expiresIn: string;\n userId: string;\n externalUserId: string;\n };\n };\n}\n\nexport interface LoginResponse {\n message: string;\n token: string;\n user: ChatSDKUser;\n}\n\nexport interface RegisterResponse {\n message: string;\n token: string;\n user: ChatSDKUser;\n}\n\n/**\n * AuthManager handles all authentication operations for Chat SDK\n * ✅ Updated to match server chat user authentication endpoints\n */\nexport class AuthManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize AuthManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = this.getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Add response interceptor for error handling\n this.api.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response?.status === 401) {\n const requestUrl = error.config?.url || '';\n const isSessionRestore = requestUrl.includes('/api/auth/me');\n \n // Clear invalid token\n this.clearToken();\n \n // Only emit logout event for actual API calls, not session restore attempts\n // Session restore failures should be handled silently to prevent logout loops\n if (!isSessionRestore) {\n this.chatSDK.events?.emit('auth.logout', { reason: 'unauthorized' });\n }\n }\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * ✅ NEW: Authenticate chat user (unified login/register)\n * This is the primary method for chat user authentication\n * @param externalUserId - External user ID from your app\n * @param appId - Application ID\n * @param name - Display name\n * @param email - Email address\n */\n public async authenticate(\n externalUserId: string,\n appId: string,\n name: string,\n email: string\n ): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<AuthResponse>('/api/chat-users/authenticate', {\n externalUserId,\n appId,\n name,\n email,\n });\n\n const user = this.parseAuthResponse(response.data);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Authentication successful', { \n userId: user.id, \n externalUserId: user.externalUserId, \n name: user.name \n });\n }\n\n // Emit authentication event\n this.chatSDK.events?.emit('auth.login', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Authentication failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Authentication failed');\n }\n }\n\n /**\n * ✅ UPDATED: Login user with email and password (backward compatibility)\n * @param email - User email \n * @param password - User password\n */\n public async login(email: string, password: string): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<LoginResponse>('/api/auth/signin', {\n email,\n password,\n });\n\n const { token, user } = response.data;\n \n // Store token\n this.setToken(token);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Login successful', { userId: user.id, email: user.email });\n }\n\n // Emit login event\n this.chatSDK.events?.emit('auth.login', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Login failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Login failed');\n }\n }\n\n /**\n * ✅ NEW: Chat user login (backward compatibility)\n * @param externalUserId - External user ID\n * @param appId - Application ID\n */\n public async chatUserLogin(externalUserId: string, appId: string): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<AuthResponse>('/api/chat-users/login', {\n externalUserId,\n appId,\n });\n\n const user = this.parseAuthResponse(response.data);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Chat user login successful', { \n userId: user.id, \n externalUserId: user.externalUserId \n });\n }\n\n // Emit login event\n this.chatSDK.events?.emit('auth.login', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Chat user login failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user login failed');\n }\n }\n\n /**\n * Register new user\n * @param email - User email\n * @param password - User password\n * @param name - User name\n * @param metadata - Additional user data\n */\n public async register(\n email: string, \n password: string, \n name: string, \n metadata: any = {}\n ): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<RegisterResponse>('/api/auth/signup', {\n email,\n password,\n name,\n ...metadata,\n });\n\n const { token, user } = response.data;\n \n // Store token\n this.setToken(token);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Registration successful', { userId: user.id, email: user.email });\n }\n\n // Emit registration event\n this.chatSDK.events?.emit('auth.register', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Registration failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Registration failed');\n }\n }\n\n /**\n * ✅ NEW: Chat user register (backward compatibility)\n * @param externalUserId - External user ID\n * @param appId - Application ID\n * @param name - Display name\n * @param email - Email address\n */\n public async chatUserRegister(\n externalUserId: string,\n appId: string,\n name: string,\n email: string\n ): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n const response = await this.api.post<AuthResponse>('/api/chat-users/register', {\n externalUserId,\n appId,\n name,\n email,\n });\n\n const user = this.parseAuthResponse(response.data);\n \n // Log success\n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Chat user registration successful', { \n userId: user.id, \n externalUserId: user.externalUserId,\n name: user.name \n });\n }\n\n // Emit registration event\n this.chatSDK.events?.emit('auth.register', { user });\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Chat user registration failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user registration failed');\n }\n }\n\n /**\n * ✅ NEW: Parse authentication response from server\n * Handles our server's response format:\n * {\n * \"success\": true,\n * \"data\": {\n * \"token\": \"jwt_token\",\n * \"user\": { user_data },\n * \"auth\": { auth_info }\n * }\n * }\n */\n private parseAuthResponse(response: AuthResponse): ChatSDKUser {\n if (!response.success) {\n throw new Error(response.message || 'Authentication failed');\n }\n\n if (!response.data) {\n throw new Error('Invalid response format: missing data');\n }\n\n const { token, user, auth } = response.data;\n\n // Store token (try both locations)\n const authToken = token || auth?.accessToken;\n if (authToken) {\n this.setToken(authToken);\n }\n\n // Handle user data mapping\n const parsedUser: ChatSDKUser = {\n id: user.id,\n externalUserId: user.externalUserId,\n appId: user.appId || process.env.REACT_APP_APP_ID || '',\n name: user.name,\n email: user.email,\n avatarUrl: user.avatarUrl,\n status: user.status || 'offline',\n isOnline: user.isOnline || false,\n lastSeen: user.lastSeen,\n isRegistered: true,\n createdAt: user.createdAt || new Date().toISOString(),\n updatedAt: user.updatedAt || new Date().toISOString()\n };\n\n return parsedUser;\n }\n\n /**\n * Logout current user\n */\n public async logout(): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/signout');\n } catch (error) {\n // Continue with logout even if API call fails\n if (this.config?.enableLogging) {\n console.warn('⚠️ AuthManager: Logout API call failed, continuing with local logout');\n }\n }\n\n // Clear token locally\n this.clearToken();\n\n // Log success\n if (this.config?.enableLogging) {\n console.log('👋 AuthManager: Logout successful');\n }\n\n // Emit logout event\n this.chatSDK.events?.emit('auth.logout', { reason: 'user_initiated' });\n }\n\n /**\n * Get current user information\n */\n public async getCurrentUser(): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n if (!this.hasValidToken()) {\n throw new Error('No valid token found. Please login first.');\n }\n\n try {\n const response = await this.api.get('/api/auth/me');\n \n // Parse the response using the same parser as login/register\n return this.parseAuthResponse(response.data);\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Get current user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get current user');\n }\n }\n\n /**\n * Verify email with token\n */\n public async verifyEmail(token: string): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/verify-email', { token });\n \n if (this.config?.enableLogging) {\n console.log('✅ AuthManager: Email verified successfully');\n }\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Email verification failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Email verification failed');\n }\n }\n\n /**\n * Request password reset\n */\n public async forgotPassword(email: string): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/forgot-password', { email });\n \n if (this.config?.enableLogging) {\n console.log('📧 AuthManager: Password reset email sent');\n }\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Forgot password failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to send password reset email');\n }\n }\n\n /**\n * Reset password with token\n */\n public async resetPassword(token: string, newPassword: string): Promise<void> {\n if (!this.api) {\n throw new Error('AuthManager not initialized');\n }\n\n try {\n await this.api.post('/api/auth/reset-password', { token, password: newPassword });\n \n if (this.config?.enableLogging) {\n console.log('🔐 AuthManager: Password reset successful');\n }\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ AuthManager: Password reset failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Password reset failed');\n }\n }\n\n /**\n * Check if user has valid token\n */\n public hasValidToken(): boolean {\n const token = this.getToken();\n return !!token;\n }\n\n /**\n * Get stored token\n */\n private getToken(): string | null {\n return localStorage.getItem('chatSDKToken');\n }\n\n /**\n * Store token\n */\n private setToken(token: string): void {\n localStorage.setItem('chatSDKToken', token);\n }\n\n /**\n * Clear stored token\n */\n private clearToken(): void {\n localStorage.removeItem('chatSDKToken');\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser } from '../types';\n\nexport interface ChatUserLoginResponse {\n success: boolean;\n message: string;\n data: {\n token: string;\n user: ChatSDKUser;\n };\n}\n\nexport interface ChatUserRegisterResponse {\n success: boolean;\n message: string;\n data: {\n token: string;\n user: ChatSDKUser;\n };\n}\n\nexport interface ChatUserData {\n externalUserId: string;\n appId: string;\n name: string;\n email: string;\n}\n\n/**\n * ChatUserManager handles chat user operations\n * Provides methods for chat user login, registration, and management\n */\nexport class ChatUserManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize ChatUserManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = this.getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Add response interceptor for error handling\n this.api.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response?.status === 401) {\n this.clearToken();\n // Emit logout event\n this.chatSDK.events?.emit('chatUser.logout', { reason: 'unauthorized' });\n }\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Login chat user with external user ID\n * @param externalUserId - External user ID\n * @param appId - Application ID\n * @param saveToken - Whether to save the token (default: true)\n */\n public async login(externalUserId: string, appId: string, saveToken: boolean = true): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.post<ChatUserLoginResponse>('/api/chat-users/login', {\n externalUserId,\n appId,\n });\n\n // Handle server response format: { success: true, data: { token, user } }\n const { token, user } = response.data.data;\n \n // Store token only if saveToken is true\n if (saveToken) {\n this.setToken(token);\n \n // Log success with token storage\n if (this.config?.enableLogging) {\n console.log('🔐 ChatUserManager: Chat user login successful with token saved', { userId: user.id, email: user.email });\n }\n\n // Emit login event\n this.chatSDK.events?.emit('chatUser.login', { user });\n } else {\n // Log success without token storage\n if (this.config?.enableLogging) {\n console.log('👤 ChatUserManager: Chat user verified (no token saved)', { userId: user.id, email: user.email });\n }\n }\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Chat user login failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user login failed');\n }\n }\n\n /**\n * Register new chat user\n * @param userData - User data for registration\n * @param saveToken - Whether to save the token (default: true)\n */\n public async register(userData: ChatUserData, saveToken: boolean = true): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.post<ChatUserRegisterResponse>('/api/chat-users/register', userData);\n\n // Handle server response format: { success: true, data: { token, user } }\n const { token, user } = response.data.data;\n \n // Store token only if saveToken is true\n if (saveToken) {\n this.setToken(token);\n\n // Log success with token storage\n if (this.config?.enableLogging) {\n console.log('📝 ChatUserManager: Chat user registration successful with token saved', { userId: user.id, email: user.email });\n }\n\n // Emit register event\n this.chatSDK.events?.emit('chatUser.register', { user });\n } else {\n // Log success without token storage\n if (this.config?.enableLogging) {\n console.log('👤 ChatUserManager: Chat user registered (no token saved)', { userId: user.id, email: user.email });\n }\n }\n\n return user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Chat user registration failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Chat user registration failed');\n }\n }\n\n /**\n * Login or register chat user (try login first, register if fails)\n * @param externalUserId - External user ID\n * @param appId - Application ID\n * @param name - User display name\n * @param email - User email\n * @param isLoggedinUser - Whether to save token (true for login, false for user existence check)\n */\n public async authenticate(externalUserId: string, appId: string, name: string, email: string, isLoggedinUser: boolean = true): Promise<ChatSDKUser> {\n try {\n // Try login first - pass saveToken flag\n return await this.login(externalUserId, appId, isLoggedinUser);\n } catch (loginError) {\n // If login fails, try registration - pass saveToken flag\n try {\n return await this.register({\n externalUserId,\n appId,\n name,\n email\n }, isLoggedinUser);\n } catch (registerError) {\n throw new Error('Failed to authenticate chat user: ' + registerError);\n }\n }\n }\n\n /**\n * Logout current chat user\n */\n public async logout(): Promise<void> {\n // Clear token locally\n this.clearToken();\n\n // Log success\n if (this.config?.enableLogging) {\n console.log('👋 ChatUserManager: Chat user logout successful');\n }\n\n // Emit logout event\n this.chatSDK.events?.emit('chatUser.logout', { reason: 'manual' });\n }\n\n /**\n * Get current chat user token\n */\n public getToken(): string | null {\n return localStorage.getItem('chatSDKToken');\n }\n\n /**\n * Set chat user token\n */\n private setToken(token: string): void {\n localStorage.setItem('chatSDKToken', token);\n }\n\n /**\n * Clear chat user token\n */\n private clearToken(): void {\n localStorage.removeItem('chatSDKToken');\n }\n\n /**\n * Check if chat user is authenticated\n */\n public isAuthenticated(): boolean {\n return !!this.getToken();\n }\n\n /**\n * Register FCM token with ChatSDK server\n * @param fcmToken - FCM token from Firebase\n * @param platform - Platform (android/ios)\n */\n public async registerFcmToken(fcmToken: string, platform: 'android' | 'ios' = 'android'): Promise<void> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!this.isAuthenticated()) {\n throw new Error('User must be authenticated to register FCM token');\n }\n\n try {\n const response = await this.api.post('/api/chat-users/fcm-token', {\n fcmToken,\n platform\n });\n\n if (this.config?.enableLogging) {\n console.log('📱 ChatUserManager: FCM token registered successfully', { fcmToken, platform });\n }\n\n // Emit FCM token registered event\n this.chatSDK.events?.emit('chatUser.fcmTokenRegistered', { fcmToken, platform });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Failed to register FCM token', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to register FCM token');\n }\n }\n\n /**\n * Unregister FCM token from ChatSDK server\n * @param fcmToken - FCM token to remove\n */\n public async unregisterFcmToken(fcmToken: string): Promise<void> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!this.isAuthenticated()) {\n throw new Error('User must be authenticated to unregister FCM token');\n }\n\n try {\n const response = await this.api.delete('/api/chat-users/fcm-token', {\n data: { fcmToken }\n });\n\n if (this.config?.enableLogging) {\n console.log('🗑️ ChatUserManager: FCM token unregistered successfully', { fcmToken });\n }\n\n // Emit FCM token unregistered event\n this.chatSDK.events?.emit('chatUser.fcmTokenUnregistered', { fcmToken });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Failed to unregister FCM token', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to unregister FCM token');\n }\n }\n\n /**\n * Get current FCM tokens for user\n */\n public async getFcmTokens(): Promise<string[]> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!this.isAuthenticated()) {\n throw new Error('User must be authenticated to get FCM tokens');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/fcm-tokens');\n\n const tokens = response.data?.data?.fcmTokens || [];\n\n if (this.config?.enableLogging) {\n console.log('📱 ChatUserManager: Retrieved FCM tokens', { tokenCount: tokens.length });\n }\n\n return tokens;\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Failed to get FCM tokens', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get FCM tokens');\n }\n }\n\n // ===================================\n // 📊 CONVERSATION METHODS\n // ===================================\n\n /**\n * Get conversations for current chat user\n * @param options - List options\n */\n public async getConversations(options: any = {}): Promise<any[]> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.type) params.append('type', options.type);\n if (options.unreadOnly) params.append('unreadOnly', 'true');\n\n const response = await this.api.get(`/api/chat-users/chats?${params.toString()}`);\n\n const conversations = response.data.data || response.data.conversations || response.data || [];\n\n if (this.config?.enableLogging) {\n console.log('📋 ChatUserManager: Conversations fetched successfully', { \n count: conversations.length \n });\n }\n\n return conversations;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get conversations failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get conversations');\n }\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with external group ID\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n */\n public async startChat(externalGroupId: string, userId: string): Promise<any> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const response = await this.api.post('/api/chat-users/chats', {\n type: 'direct',\n participants: [userId],\n externalGroupId\n });\n\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ChatUserManager: Direct chat started successfully', { \n conversationId: conversation.id,\n userId,\n externalGroupId\n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Start chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start chat');\n }\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with product context\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n * @param productContext - Product information to associate with the conversation (camelCase format)\n * @param chatMetadata - Optional chat-specific metadata\n */\n public async startChatWithProduct(\n externalGroupId: string,\n userId: string, \n productContext: {\n productId: string;\n productName: string;\n productImage: string;\n price?: number;\n currency?: string;\n category?: string;\n productMetadata?: Record<string, any>;\n },\n chatMetadata?: Record<string, any>\n ): Promise<any> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const requestBody: any = {\n type: 'direct',\n participants: [userId],\n externalGroupId,\n metadata: {\n productContext: {\n productId: productContext.productId,\n productName: productContext.productName,\n productImage: productContext.productImage,\n price: productContext.price,\n currency: productContext.currency,\n category: productContext.category,\n productMetadata: productContext.productMetadata\n }\n }\n };\n\n // Add chatMetadata if provided\n if (chatMetadata && Object.keys(chatMetadata).length > 0) {\n requestBody.chatMetadata = chatMetadata;\n }\n\n const response = await this.api.post('/api/chat-users/chats', requestBody);\n\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ChatUserManager: Product chat started successfully', { \n conversationId: conversation.id,\n userId,\n productId: productContext.productId,\n productName: productContext.productName\n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Start product chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start product chat');\n }\n }\n\n // ===================================\n // 📊 UNREAD MESSAGES METHODS\n // ===================================\n\n /**\n * Get count of conversations with unread messages\n */\n public async getUnreadConversationsCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/conversations-count');\n const count = response.data.data.unreadConversationsCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ChatUserManager: Unread conversations count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get unread conversations count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread conversations count');\n }\n }\n\n /**\n * Get total count of unread messages across all conversations\n */\n public async getTotalUnreadCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/total-count');\n const count = response.data.data.totalUnreadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ChatUserManager: Total unread count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get total unread count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get total unread count');\n }\n }\n\n /**\n * Get detailed unread messages summary\n */\n public async getUnreadSummary(): Promise<{\n unreadSummary: Array<{\n room_id: string;\n room_name: string;\n room_type: string;\n unread_count: number;\n last_unread_message_time: string;\n last_unread_message_content: string;\n last_unread_sender_name: string;\n }>;\n totalConversationsWithUnread: number;\n totalUnreadMessages: number;\n }> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/summary');\n const summary = response.data.data;\n\n if (this.config?.enableLogging) {\n console.log('📊 ChatUserManager: Unread summary fetched', { \n conversations: summary.totalConversationsWithUnread,\n totalMessages: summary.totalUnreadMessages \n });\n }\n\n return summary;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatUserManager: Get unread summary failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread summary');\n }\n }\n\n /**\n * Mark all messages in a room as read\n * Uses socket (fast) with API fallback (reliable)\n * @param conversationId - Conversation ID\n */\n public async markRoomMessagesRead(conversationId: string): Promise<number> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n if (this.config?.enableLogging) {\n console.log('📖 ChatUserManager: Marking room as read', { conversationId });\n }\n\n // Socket-primary: faster, server handles DB + notifies other participants\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_room_read', { roomId: conversationId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: mark_room_read sent via socket', { roomId: conversationId });\n }\n\n // Emit local event for immediate UI update\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount: 0 });\n return 0;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: Socket not connected, falling back to API');\n }\n\n const response = await this.api.post(`/api/chat-users/chats/${conversationId}/mark-read`);\n const markedCount = response.data.data.markedAsReadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('✅ ChatUserManager: Room messages marked as read via API', { conversationId, markedCount });\n }\n\n // Emit conversation read event (local UI update)\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount });\n\n return markedCount;\n } catch (error: any) {\n console.error('❌ ChatUserManager: Mark room messages as read failed', {\n conversationId,\n error: error.response?.data || error.message,\n status: error.response?.status,\n });\n throw new Error(error.response?.data?.message || error.message || 'Failed to mark room messages as read');\n }\n }\n\n /**\n * Mark specific message as read\n * Uses socket (fast) with API fallback (reliable)\n * @param messageId - Message ID\n */\n public async markMessageRead(messageId: string): Promise<boolean> {\n if (!this.api) {\n throw new Error('ChatUserManager not initialized');\n }\n\n try {\n // Socket-primary: faster, server handles DB + notifies sender\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_message_read', { messageId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: mark_message_read sent via socket', { messageId });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread: true });\n return true;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ChatUserManager: Socket not connected, falling back to API for mark-message-read');\n }\n\n const response = await this.api.post(`/api/chat-users/messages/${messageId}/mark-read`);\n const wasUnread = response.data.data.wasUnread || false;\n\n if (this.config?.enableLogging) {\n console.log('✅ ChatUserManager: Message marked as read via API', { messageId, wasUnread });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread });\n return wasUnread;\n } catch (error: any) {\n console.error('❌ ChatUserManager: Mark message as read failed', {\n messageId,\n error: error.response?.data || error.message,\n status: error.response?.status,\n });\n throw new Error(error.response?.data?.message || error.message || 'Failed to mark message as read');\n }\n }\n\n /**\n * Start viewing a conversation (auto-marks messages as read)\n * @param conversationId - Conversation ID\n */\n public startViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: true \n });\n \n if (this.config?.enableLogging) {\n console.log('👀 ChatUserManager: Started viewing conversation', { conversationId });\n }\n }\n }\n\n /**\n * Stop viewing a conversation\n * @param conversationId - Conversation ID\n */\n public stopViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: false \n });\n \n if (this.config?.enableLogging) {\n console.log('👁️ ChatUserManager: Stopped viewing conversation', { conversationId });\n }\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser } from '../types';\n\nexport interface UserSearchOptions {\n query?: string;\n limit?: number;\n offset?: number;\n role?: string;\n status?: 'online' | 'offline' | 'away' | 'busy';\n}\n\nexport interface UserUpdateData {\n name?: string;\n avatar?: string;\n status?: 'online' | 'offline' | 'away' | 'busy';\n metadata?: Record<string, any>;\n}\n\n/**\n * UserManager handles all user-related operations\n * Provides methods for user search, update, blocking, etc.\n */\nexport class UserManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize UserManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Get user by ID\n * @param userId - User ID to fetch\n */\n public async getUser(userId: string): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/users/${userId}`);\n \n if (this.config?.enableLogging) {\n console.log('👤 UserManager: User fetched successfully', { userId });\n }\n\n return response.data.user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get user');\n }\n }\n\n /**\n * Search for users\n * @param options - Search options\n */\n public async searchUsers(options: UserSearchOptions = {}): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.query) params.append('q', options.query);\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.role) params.append('role', options.role);\n if (options.status) params.append('status', options.status);\n\n const response = await this.api.get(`/api/users/search?${params.toString()}`);\n \n if (this.config?.enableLogging) {\n console.log('🔍 UserManager: Users searched successfully', { \n query: options.query, \n count: response.data.users?.length || 0 \n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Search users failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to search users');\n }\n }\n\n /**\n * Get all users (paginated)\n * @param limit - Number of users to fetch\n * @param offset - Offset for pagination\n */\n public async getAllUsers(limit: number = 20, offset: number = 0): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/users?limit=${limit}&offset=${offset}`);\n \n if (this.config?.enableLogging) {\n console.log('👥 UserManager: All users fetched successfully', { \n count: response.data.users?.length || 0,\n limit,\n offset\n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get all users failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get users');\n }\n }\n\n /**\n * Update current user's profile\n * @param updateData - Data to update\n */\n public async updateCurrentUser(updateData: UserUpdateData): Promise<ChatSDKUser> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.put('/api/users/me', updateData);\n \n if (this.config?.enableLogging) {\n console.log('✏️ UserManager: User profile updated successfully');\n }\n\n // Emit user update event\n this.chatSDK.events?.emit('user.updated', { user: response.data.user });\n\n return response.data.user;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Update user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update user');\n }\n }\n\n /**\n * Update user status (online, offline, away, busy)\n * @param status - New status\n */\n public async updateStatus(status: 'online' | 'offline' | 'away' | 'busy'): Promise<void> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n await this.api.put('/api/users/me/status', { status });\n \n if (this.config?.enableLogging) {\n console.log('📊 UserManager: User status updated successfully', { status });\n }\n\n // Emit status update event\n this.chatSDK.events?.emit('user.status.updated', { status });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Update status failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update status');\n }\n }\n\n /**\n * Block a user\n * @param userId - User ID to block\n */\n public async blockUser(userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n await this.api.post(`/api/users/${userId}/block`);\n \n if (this.config?.enableLogging) {\n console.log('🚫 UserManager: User blocked successfully', { userId });\n }\n\n // Emit user blocked event\n this.chatSDK.events?.emit('user.blocked', { userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Block user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to block user');\n }\n }\n\n /**\n * Unblock a user\n * @param userId - User ID to unblock\n */\n public async unblockUser(userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/users/${userId}/block`);\n \n if (this.config?.enableLogging) {\n console.log('✅ UserManager: User unblocked successfully', { userId });\n }\n\n // Emit user unblocked event\n this.chatSDK.events?.emit('user.unblocked', { userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Unblock user failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to unblock user');\n }\n }\n\n /**\n * Get blocked users list\n */\n public async getBlockedUsers(): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/users/me/blocked');\n \n if (this.config?.enableLogging) {\n console.log('📋 UserManager: Blocked users fetched successfully', { \n count: response.data.users?.length || 0 \n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get blocked users failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get blocked users');\n }\n }\n\n /**\n * Get user's online status\n * @param userId - User ID to check\n */\n public async getUserStatus(userId: string): Promise<'online' | 'offline' | 'away' | 'busy'> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/users/${userId}/status`);\n \n return response.data.status;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get user status failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get user status');\n }\n }\n\n /**\n * Get multiple users by IDs\n * @param userIds - Array of user IDs\n */\n public async getUsersByIds(userIds: string[]): Promise<ChatSDKUser[]> {\n if (!this.api) {\n throw new Error('UserManager not initialized');\n }\n\n try {\n const response = await this.api.post('/api/users/batch', { userIds });\n \n if (this.config?.enableLogging) {\n console.log('👥 UserManager: Users fetched by IDs successfully', { \n requestedCount: userIds.length,\n receivedCount: response.data.users?.length || 0 \n });\n }\n\n return response.data.users || [];\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ UserManager: Get users by IDs failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get users by IDs');\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKUser, ChatSDKConversation, ChatSDKMessage, ProductContext } from '../types';\n\n// Re-export types for external use\nexport type { ChatSDKConversation, ChatSDKMessage } from '../types';\n\nexport interface CreateConversationOptions {\n type: 'direct' | 'group';\n participantIds: string[];\n name?: string;\n description?: string;\n avatar?: string;\n metadata?: Record<string, any>;\n productContext?: ProductContext;\n}\n\nexport interface ConversationListOptions {\n limit?: number;\n offset?: number;\n type?: 'direct' | 'group';\n unreadOnly?: boolean;\n}\n\n/**\n * ConversationManager handles all conversation operations\n * Provides methods for creating chats, getting conversation lists, etc.\n */\nexport class ConversationManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize ConversationManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with external group ID\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n */\n public async startChat(externalGroupId: string, userId: string): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const response = await this.api.post('/api/chat-users/chats', {\n type: 'direct',\n participants: [userId],\n externalGroupId\n });\n\n if (this.config?.enableLogging) {\n console.log('⚡ Using externalGroupId:', externalGroupId);\n }\n\n console.log('📡 Server response:', response.data);\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ConversationManager: Direct chat started successfully', { \n conversationId: conversation.id,\n userId \n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Start chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start chat');\n }\n }\n\n /**\n * ⚡ OPTIMIZED: Start a direct chat with product context\n * @param externalGroupId - External group ID (GUID) for fast room lookup\n * @param userId - User ID to start chat with\n * @param productContext - Product information to associate with the conversation (camelCase format)\n * @param chatMetadata - Optional chat-specific metadata\n */\n public async startChatWithProduct(\n externalGroupId: string,\n userId: string, \n productContext: {\n productId: string;\n productName: string;\n productImage: string;\n price?: number;\n currency?: string;\n category?: string;\n productMetadata?: Record<string, any>;\n },\n chatMetadata?: Record<string, any>\n ): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n if (!externalGroupId) {\n throw new Error('External Group ID is required');\n }\n\n try {\n const requestBody: any = {\n type: 'direct',\n participants: [userId],\n externalGroupId,\n metadata: {\n productContext: {\n productId: productContext.productId,\n productName: productContext.productName,\n productImage: productContext.productImage,\n price: productContext.price,\n currency: productContext.currency,\n category: productContext.category,\n productMetadata: productContext.productMetadata\n }\n }\n };\n\n // Add chatMetadata if provided\n if (chatMetadata && Object.keys(chatMetadata).length > 0) {\n requestBody.chatMetadata = chatMetadata;\n }\n\n if (this.config?.enableLogging) {\n console.log('⚡ Using externalGroupId:', externalGroupId);\n }\n\n const response = await this.api.post('/api/chat-users/chats', requestBody);\n\n console.log('📡 Server response:', response.data);\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('💬 ConversationManager: Product chat started successfully', { \n conversationId: conversation.id,\n userId,\n productId: productContext.productId,\n productName: productContext.productName\n });\n }\n\n // Join WebSocket room for real-time messages\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.joinRoom(conversation.id);\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Start product chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to start product chat');\n }\n }\n\n /**\n * Create a group conversation\n * @param options - Group creation options\n */\n public async createGroup(options: CreateConversationOptions): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post('/api/conversations', options);\n\n console.log('📡 Group creation response:', response.data);\n const conversation = response.data.data || response.data.conversation || response.data;\n\n if (this.config?.enableLogging) {\n console.log('👥 ConversationManager: Group created successfully', { \n conversationId: conversation.id,\n participantCount: options.participantIds.length \n });\n }\n\n // Emit conversation created event\n this.chatSDK.events?.emit('conversation.created', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Create group failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to create group');\n }\n }\n\n /**\n * Get conversation list\n * @param options - List options\n */\n public async getConversations(options: ConversationListOptions = {}): Promise<ChatSDKConversation[]> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.type) params.append('type', options.type);\n if (options.unreadOnly) params.append('unreadOnly', 'true');\n\n const response = await this.api.get(`/api/chat-users/chats?${params.toString()}`);\n\n console.log('📡 Conversations response:', response.data);\n const conversations = response.data.data || response.data.conversations || response.data || [];\n\n if (this.config?.enableLogging) {\n console.log('📋 ConversationManager: Conversations fetched successfully', { \n count: conversations.length \n });\n }\n\n return conversations;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get conversations failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get conversations');\n }\n }\n\n /**\n * Get conversation by ID\n * @param conversationId - Conversation ID\n */\n public async getConversation(conversationId: string): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/chat-users/chats/${conversationId}`);\n\n if (this.config?.enableLogging) {\n console.log('💬 ConversationManager: Conversation fetched successfully', { conversationId });\n }\n\n return response.data.conversation || response.data;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get conversation');\n }\n }\n\n /**\n * Update conversation (name, description, etc.)\n * @param conversationId - Conversation ID\n * @param updateData - Data to update\n */\n public async updateConversation(\n conversationId: string, \n updateData: Partial<Pick<ChatSDKConversation, 'name' | 'description' | 'avatar' | 'metadata'>>\n ): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.put(`/api/conversations/${conversationId}`, updateData);\n\n const conversation = response.data.conversation;\n\n if (this.config?.enableLogging) {\n console.log('✏️ ConversationManager: Conversation updated successfully', { conversationId });\n }\n\n // Emit conversation updated event\n this.chatSDK.events?.emit('conversation.updated', { conversation });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Update conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update conversation');\n }\n }\n\n /**\n * Add participants to group conversation\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to add\n */\n public async addParticipants(conversationId: string, userIds: string[]): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/conversations/${conversationId}/participants`, {\n userIds\n });\n\n const conversation = response.data.conversation;\n\n if (this.config?.enableLogging) {\n console.log('➕ ConversationManager: Participants added successfully', { \n conversationId,\n addedCount: userIds.length \n });\n }\n\n // Emit participants added event\n this.chatSDK.events?.emit('conversation.participants.added', { \n conversation, \n addedUserIds: userIds \n });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Add participants failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to add participants');\n }\n }\n\n /**\n * Remove participants from group conversation\n * @param conversationId - Conversation ID\n * @param userIds - User IDs to remove\n */\n public async removeParticipants(conversationId: string, userIds: string[]): Promise<ChatSDKConversation> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.delete(`/api/conversations/${conversationId}/participants`, {\n data: { userIds }\n });\n\n const conversation = response.data.conversation;\n\n if (this.config?.enableLogging) {\n console.log('➖ ConversationManager: Participants removed successfully', { \n conversationId,\n removedCount: userIds.length \n });\n }\n\n // Emit participants removed event\n this.chatSDK.events?.emit('conversation.participants.removed', { \n conversation, \n removedUserIds: userIds \n });\n\n return conversation;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Remove participants failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to remove participants');\n }\n }\n\n /**\n * Leave conversation\n * @param conversationId - Conversation ID\n */\n public async leaveConversation(conversationId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n await this.api.post(`/api/conversations/${conversationId}/leave`);\n\n if (this.config?.enableLogging) {\n console.log('🚪 ConversationManager: Left conversation successfully', { conversationId });\n }\n\n // Emit conversation left event\n this.chatSDK.events?.emit('conversation.left', { conversationId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Leave conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to leave conversation');\n }\n }\n\n /**\n * Delete conversation\n * @param conversationId - Conversation ID\n */\n public async deleteConversation(conversationId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/conversations/${conversationId}`);\n\n if (this.config?.enableLogging) {\n console.log('🗑️ ConversationManager: Conversation deleted successfully', { conversationId });\n }\n\n // Emit conversation deleted event\n this.chatSDK.events?.emit('conversation.deleted', { conversationId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Delete conversation failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to delete conversation');\n }\n }\n\n /**\n * Mark conversation as read\n * @param conversationId - Conversation ID\n */\n public async markAsRead(conversationId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n await this.api.post(`/api/chat-users/chats/${conversationId}/mark-read`);\n\n if (this.config?.enableLogging) {\n console.log('👁️ ConversationManager: Conversation marked as read', { conversationId });\n }\n\n // Emit conversation read event\n this.chatSDK.events?.emit('conversation.read', { conversationId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Mark as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark conversation as read');\n }\n }\n\n // ===================================\n // 📊 UNREAD MESSAGES METHODS\n // ===================================\n\n /**\n * Get count of conversations with unread messages\n */\n public async getUnreadConversationsCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/conversations-count');\n const count = response.data.data.unreadConversationsCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Unread conversations count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get unread conversations count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread conversations count');\n }\n }\n\n /**\n * Get total count of unread messages across all conversations\n */\n public async getTotalUnreadCount(): Promise<number> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/total-count');\n const count = response.data.data.totalUnreadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Total unread count fetched', { count });\n }\n\n return count;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get total unread count failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get total unread count');\n }\n }\n\n /**\n * Get detailed unread messages summary\n */\n public async getUnreadSummary(): Promise<{\n unreadSummary: Array<{\n room_id: string;\n room_name: string;\n room_type: string;\n unread_count: number;\n last_unread_message_time: string;\n last_unread_message_content: string;\n last_unread_sender_name: string;\n }>;\n totalConversationsWithUnread: number;\n totalUnreadMessages: number;\n }> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get('/api/chat-users/unread/summary');\n const summary = response.data.data;\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Unread summary fetched', { \n conversations: summary.totalConversationsWithUnread,\n totalMessages: summary.totalUnreadMessages \n });\n }\n\n return summary;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get unread summary failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get unread summary');\n }\n }\n\n /**\n * Mark all messages in a room as read\n * Uses socket (fast) with API fallback (reliable)\n * @param conversationId - Conversation ID\n */\n public async markRoomMessagesRead(conversationId: string): Promise<number> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n // Socket-primary: faster, server handles DB + notifies other participants\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_room_read', { roomId: conversationId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: mark_room_read sent via socket', { roomId: conversationId });\n }\n\n // Emit local event for immediate UI update\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount: 0 });\n return 0;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: Socket not connected, falling back to API');\n }\n\n const response = await this.api.post(`/api/chat-users/chats/${conversationId}/mark-read`);\n const markedCount = response.data.data.markedAsReadCount || 0;\n\n if (this.config?.enableLogging) {\n console.log('✅ ConversationManager: Room messages marked as read via API', { conversationId, markedCount });\n }\n\n // Emit conversation read event (local UI update)\n this.chatSDK.events?.emit('conversation.read', { conversationId, markedCount });\n\n return markedCount;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Mark room messages as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark room messages as read');\n }\n }\n\n /**\n * Mark specific message as read\n * Uses socket (fast) with API fallback (reliable)\n * @param messageId - Message ID\n */\n public async markMessageRead(messageId: string): Promise<boolean> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n // Socket-primary: faster, server handles DB + notifies sender\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('mark_message_read', { messageId });\n\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: mark_message_read sent via socket', { messageId });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread: true });\n return true;\n }\n\n // API fallback: socket not connected\n if (this.config?.enableLogging) {\n console.log('📡 ConversationManager: Socket not connected, falling back to API for mark-message-read');\n }\n\n const response = await this.api.post(`/api/chat-users/messages/${messageId}/mark-read`);\n const wasUnread = response.data.data.wasUnread || false;\n\n if (this.config?.enableLogging) {\n console.log('✅ ConversationManager: Message marked as read via API', { messageId, wasUnread });\n }\n\n this.chatSDK.events?.emit('message.read', { messageId, wasUnread });\n return wasUnread;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Mark message as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark message as read');\n }\n }\n\n /**\n * Start viewing a conversation (auto-marks messages as read)\n * @param conversationId - Conversation ID\n */\n public startViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: true \n });\n \n if (this.config?.enableLogging) {\n console.log('👀 ConversationManager: Started viewing conversation', { conversationId });\n }\n }\n }\n\n /**\n * Stop viewing a conversation\n * @param conversationId - Conversation ID\n */\n public stopViewingConversation(conversationId: string): void {\n if (this.chatSDK.socket?.isConnected()) {\n this.chatSDK.socket.emit('viewing_conversation', { \n roomId: conversationId, \n isViewing: false \n });\n \n if (this.config?.enableLogging) {\n console.log('👁️ ConversationManager: Stopped viewing conversation', { conversationId });\n }\n }\n }\n\n // ===================================\n // 🚫 USER BLOCKING METHODS (Chat-Specific)\n // ===================================\n\n /**\n * Block a user in a specific chat\n * @param chatId - Chat/Conversation ID\n * @param userId - User ID to block\n */\n public async blockUserInChat(chatId: string, userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/chat-users/chats/${chatId}/block-user`, {\n userId\n });\n\n if (this.config?.enableLogging) {\n console.log('🚫 ConversationManager: User blocked in chat', { chatId, userId });\n }\n\n // Emit user blocked event\n this.chatSDK.events?.emit('user.blocked', { chatId, userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Block user in chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to block user in chat');\n }\n }\n\n /**\n * Unblock a user in a specific chat\n * @param chatId - Chat/Conversation ID\n * @param userId - User ID to unblock\n */\n public async unblockUserInChat(chatId: string, userId: string): Promise<void> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/chat-users/chats/${chatId}/unblock-user`, {\n userId\n });\n\n if (this.config?.enableLogging) {\n console.log('✅ ConversationManager: User unblocked in chat', { chatId, userId });\n }\n\n // Emit user unblocked event\n this.chatSDK.events?.emit('user.unblocked', { chatId, userId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Unblock user in chat failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to unblock user in chat');\n }\n }\n\n /**\n * Get block status for a chat\n * @param chatId - Chat/Conversation ID\n * @returns Block status information\n */\n public async getBlockStatus(chatId: string): Promise<{\n chatId: string;\n currentUserId: string;\n isBlockedByOther: boolean;\n blockedByInfo: {\n blockedBy: string;\n blockedAt: string;\n } | null;\n usersBlockedByMe: string[];\n blockedUsers: Record<string, any>;\n }> {\n if (!this.api) {\n throw new Error('ConversationManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/chat-users/chats/${chatId}/block-status`);\n\n if (this.config?.enableLogging) {\n console.log('📊 ConversationManager: Block status fetched', { chatId });\n }\n\n return response.data.data;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ ConversationManager: Get block status failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get block status');\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\nimport { ChatSDKMessage } from '../types';\n\nexport interface SendMessageOptions {\n conversationId: string;\n content: string;\n type?: 'text' | 'image' | 'video' | 'audio' | 'file' | 'location';\n metadata?: Record<string, any>;\n replyToMessageId?: string;\n}\n\nexport interface MessageListOptions {\n conversationId: string;\n limit?: number;\n offset?: number;\n before?: string; // Message ID - get messages before this\n after?: string; // Message ID - get messages after this\n}\n\nexport interface MessageSearchOptions {\n conversationId?: string;\n query: string;\n limit?: number;\n offset?: number;\n messageType?: 'text' | 'image' | 'video' | 'audio' | 'file' | 'location';\n}\n\n/**\n * MessageManager handles all message operations\n * Provides methods for sending, receiving, and managing messages\n */\nexport class MessageManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize MessageManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Send a text message\n * @param conversationId - Conversation ID\n * @param content - Message content\n * @param metadata - Optional metadata\n */\n public async sendMessage(\n conversationId: string, \n content: string, \n metadata?: Record<string, any>\n ): Promise<ChatSDKMessage> {\n return this.sendMessageWithOptions({\n conversationId,\n content,\n type: 'text',\n metadata\n });\n }\n\n /**\n * Send a message with full options\n * @param options - Send message options\n */\n public async sendMessageWithOptions(options: SendMessageOptions): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n // Try socket first if available\n if (this.chatSDK.socket && this.chatSDK.socket.isConnected()) {\n try {\n return await this.sendMessageViaSocket(options);\n } catch (socketError) {\n if (this.config?.enableLogging) {\n console.warn('⚠️ Socket send failed, falling back to HTTP:', socketError);\n }\n // Fall through to HTTP fallback\n }\n }\n\n // HTTP fallback\n return this.sendMessageViaHttp(options);\n }\n\n /**\n * Send message via socket\n */\n private async sendMessageViaSocket(options: SendMessageOptions): Promise<ChatSDKMessage> {\n return new Promise((resolve, reject) => {\n if (!this.chatSDK.socket || !this.chatSDK.socket.isConnected()) {\n reject(new Error('Socket not connected'));\n return;\n }\n\n // Get current user for sender info\n const currentUser = this.chatSDK.getCurrentUser();\n if (!currentUser) {\n reject(new Error('User not authenticated'));\n return;\n }\n\n // Prepare socket message data\n const messageData = {\n conversationId: options.conversationId,\n content: options.content,\n messageType: options.type || 'text',\n metadata: options.metadata,\n senderId: currentUser.id,\n senderName: currentUser.name,\n senderEmail: currentUser.email\n };\n\n // Set up one-time listeners\n const onSuccess = (message: ChatSDKMessage) => {\n this.chatSDK.socket.off('message-sent', onSuccess);\n this.chatSDK.socket.off('message-error', onError);\n resolve(message);\n };\n\n const onError = (error: any) => {\n this.chatSDK.socket.off('message-sent', onSuccess);\n this.chatSDK.socket.off('message-error', onError);\n reject(new Error(error.message || 'Socket send failed'));\n };\n\n // Listen for response\n this.chatSDK.socket.on('message-sent', onSuccess);\n this.chatSDK.socket.on('message-error', onError);\n\n // Send via socket\n this.chatSDK.socket.emit('send_message', messageData);\n\n if (this.config?.enableLogging) {\n console.log('📤 MessageManager: Message sent via socket', {\n conversationId: options.conversationId,\n content: options.content?.substring(0, 50) + (options.content?.length > 50 ? '...' : ''),\n type: options.type || 'text'\n });\n }\n\n // Timeout after 10 seconds\n setTimeout(() => {\n this.chatSDK.socket.off('message-sent', onSuccess);\n this.chatSDK.socket.off('message-error', onError);\n reject(new Error('Socket send timeout'));\n }, 10000);\n });\n }\n\n /**\n * Send message via HTTP (fallback)\n */\n private async sendMessageViaHttp(options: SendMessageOptions): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n try {\n const response = await this.api.post('/api/chat-users/messages', {\n roomId: options.conversationId,\n content: options.content,\n messageType: options.type || 'text',\n metadata: options.metadata,\n replyToMessageId: options.replyToMessageId\n });\n\n const message = response.data.data || response.data.message || response.data;\n \n if (this.config?.enableLogging) {\n console.log('📡 Message sent via HTTP:', {\n id: message.id,\n content: message.content?.substring(0, 50) + (message.content?.length > 50 ? '...' : ''),\n type: message.type || 'text'\n });\n }\n\n // Emit message sent event\n this.chatSDK.events?.emit('message.sent', { message });\n\n return message;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: HTTP send failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to send message');\n }\n }\n\n /**\n * Get message history for a conversation\n * @param options - Message list options\n */\n public async getMessages(options: MessageListOptions): Promise<ChatSDKMessage[]> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.before) params.append('before', options.before);\n if (options.after) params.append('after', options.after);\n\n const response = await this.api.get(\n `/api/chat-users/messages/${options.conversationId}?${params.toString()}`\n );\n\n console.log('📡 Get messages response:', response.data);\n console.log('📡 Raw server messages:', JSON.stringify(response.data, null, 2));\n \n const messages = response.data.data || response.data.messages || response.data || [];\n\n if (this.config?.enableLogging) {\n console.log('📥 MessageManager: Messages fetched successfully', { \n conversationId: options.conversationId,\n count: messages.length \n });\n }\n\n // Map server response format to SDK format\n const mappedMessages = messages.map((msg: any) => ({\n ...msg,\n type: msg.messageType || msg.type || 'text', // ✅ Map messageType to type\n conversationId: msg.roomId || msg.conversationId, // ✅ Map roomId to conversationId\n timestamp: msg.createdAt || msg.timestamp || new Date().toISOString() // ✅ Ensure timestamp\n }));\n\n console.log('📥 Final processed messages:', mappedMessages);\n return mappedMessages;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Get messages failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get messages');\n }\n }\n\n /**\n * Get a specific message by ID\n * @param messageId - Message ID\n */\n public async getMessage(messageId: string): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/messages/${messageId}`);\n\n if (this.config?.enableLogging) {\n console.log('📄 MessageManager: Message fetched successfully', { messageId });\n }\n\n return response.data.message;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Get message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get message');\n }\n }\n\n /**\n * Update a message (edit)\n * @param messageId - Message ID to update\n * @param content - New content\n * @param metadata - Updated metadata\n */\n public async updateMessage(\n messageId: string, \n content: string, \n metadata?: Record<string, any>\n ): Promise<ChatSDKMessage> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const response = await this.api.put(`/api/messages/${messageId}`, {\n content,\n metadata\n });\n\n const message = response.data.message;\n\n if (this.config?.enableLogging) {\n console.log('✏️ MessageManager: Message updated successfully', { messageId });\n }\n\n // Emit message updated event\n this.chatSDK.events?.emit('message.updated', { message });\n\n return message;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Update message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to update message');\n }\n }\n\n /**\n * Delete a message\n * @param messageId - Message ID to delete\n * @param deleteForEveryone - Whether to delete for all participants\n */\n public async deleteMessage(messageId: string, deleteForEveryone: boolean = false): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/messages/${messageId}`, {\n data: { deleteForEveryone }\n });\n\n if (this.config?.enableLogging) {\n console.log('🗑️ MessageManager: Message deleted successfully', { \n messageId,\n deleteForEveryone \n });\n }\n\n // Emit message deleted event\n this.chatSDK.events?.emit('message.deleted', { messageId, deleteForEveryone });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Delete message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to delete message');\n }\n }\n\n /**\n * Mark messages as read\n * @param conversationId - Conversation ID\n * @param messageIds - Message IDs to mark as read (optional, marks all if not provided)\n */\n public async markAsRead(conversationId: string, messageIds?: string[]): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.put(`/api/conversations/${conversationId}/messages/read`, {\n messageIds\n });\n\n if (this.config?.enableLogging) {\n console.log('👁️ MessageManager: Messages marked as read', { \n conversationId,\n messageCount: messageIds?.length || 'all'\n });\n }\n\n // Emit messages read event\n this.chatSDK.events?.emit('messages.read', { conversationId, messageIds });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Mark as read failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to mark messages as read');\n }\n }\n\n /**\n * Search messages\n * @param options - Search options\n */\n public async searchMessages(options: MessageSearchOptions): Promise<ChatSDKMessage[]> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n \n params.append('q', options.query);\n if (options.conversationId) params.append('conversationId', options.conversationId);\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.messageType) params.append('type', options.messageType);\n\n const response = await this.api.get(`/api/messages/search?${params.toString()}`);\n\n const messages = response.data.messages || [];\n\n if (this.config?.enableLogging) {\n console.log('🔍 MessageManager: Messages searched successfully', { \n query: options.query,\n count: messages.length \n });\n }\n\n return messages;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Search messages failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to search messages');\n }\n }\n\n /**\n * Send typing indicator\n * @param conversationId - Conversation ID\n * @param isTyping - Whether user is typing\n */\n public async sendTypingIndicator(conversationId: string, isTyping: boolean): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.post(`/api/conversations/${conversationId}/typing`, {\n isTyping\n });\n\n if (this.config?.enableLogging && isTyping) {\n console.log('⌨️ MessageManager: Typing indicator sent', { conversationId });\n }\n\n // Emit typing event\n this.chatSDK.events?.emit('typing.indicator', { conversationId, isTyping });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Send typing indicator failed', error.response?.data || error.message);\n }\n // Don't throw error for typing indicator failures\n }\n }\n\n /**\n * React to a message (like, heart, etc.)\n * @param messageId - Message ID\n * @param reaction - Reaction type\n */\n public async reactToMessage(messageId: string, reaction: string): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.post(`/api/messages/${messageId}/reactions`, {\n reaction\n });\n\n if (this.config?.enableLogging) {\n console.log('😊 MessageManager: Message reaction sent', { messageId, reaction });\n }\n\n // Emit reaction event\n this.chatSDK.events?.emit('message.reaction', { messageId, reaction });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: React to message failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to react to message');\n }\n }\n\n /**\n * Remove reaction from a message\n * @param messageId - Message ID\n * @param reaction - Reaction type to remove\n */\n public async removeReaction(messageId: string, reaction: string): Promise<void> {\n if (!this.api) {\n throw new Error('MessageManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/messages/${messageId}/reactions/${reaction}`);\n\n if (this.config?.enableLogging) {\n console.log('🗑️ MessageManager: Message reaction removed', { messageId, reaction });\n }\n\n // Emit reaction removed event\n this.chatSDK.events?.emit('message.reaction.removed', { messageId, reaction });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MessageManager: Remove reaction failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to remove reaction');\n }\n }\n} ","import axios, { AxiosInstance } from 'axios';\nimport { ChatSDKConfig } from '../ChatSDK';\n\nexport interface MediaUploadOptions {\n file: File;\n type: 'image' | 'video' | 'audio' | 'document';\n conversationId?: string;\n caption?: string;\n metadata?: Record<string, any>;\n onProgress?: (progress: number) => void;\n}\n\nexport interface MediaUploadResult {\n fileUrl: string;\n fileName: string;\n fileSize: number;\n mimeType: string;\n thumbnailUrl?: string;\n}\n\nexport interface MediaDownloadOptions {\n mediaId: string;\n quality?: 'original' | 'high' | 'medium' | 'low';\n}\n\n/**\n * MediaManager handles all media and file operations\n * Provides methods for uploading, downloading, and managing media files\n */\nexport class MediaManager {\n private chatSDK: any;\n private api: AxiosInstance | null = null;\n private config: ChatSDKConfig | null = null;\n private maxFileSize: number = 50 * 1024 * 1024; // 50MB default\n private allowedTypes: string[] = [\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp',\n 'video/mp4', 'video/webm', 'video/quicktime',\n 'audio/mpeg', 'audio/wav', 'audio/ogg',\n 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'text/plain'\n ];\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize MediaManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n // Create axios instance for regular API calls\n this.api = axios.create({\n baseURL: config.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: config.timeout || 30000,\n });\n\n // Add request interceptor for token\n this.api.interceptors.request.use(\n (config) => {\n const token = localStorage.getItem('chatSDKToken');\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Upload a file/media\n * @param options - Upload options\n */\n public async uploadMedia(options: MediaUploadOptions): Promise<MediaUploadResult> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n // Validate file\n this.validateFile(options.file);\n\n try {\n const formData = new FormData();\n formData.append('file', options.file);\n formData.append('type', options.type);\n \n if (options.conversationId) {\n formData.append('chatId', options.conversationId);\n }\n if (options.caption) {\n formData.append('caption', options.caption);\n }\n if (options.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata));\n }\n\n const response = await this.api.post('/api/chat-users/upload', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress: (progressEvent) => {\n if (options.onProgress && progressEvent.total) {\n const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total);\n options.onProgress(progress);\n }\n },\n timeout: 5 * 60 * 1000, // 5 minutes for file upload\n });\n\n const result = response.data.data;\n\n if (this.config?.enableLogging) {\n console.log('📎 MediaManager: File uploaded successfully', {\n url: result.fileUrl,\n fileName: result.fileName,\n fileSize: result.fileSize,\n mimeType: result.mimeType,\n type: options.type\n });\n }\n\n // Emit media uploaded event\n this.chatSDK.events?.emit('media.uploaded', { media: result });\n\n return result;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Upload failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to upload file');\n }\n }\n\n /**\n * Upload image and send as message\n * @param conversationId - Conversation ID\n * @param file - Image file\n * @param caption - Optional caption\n */\n public async sendImage(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'image',\n conversationId,\n caption\n });\n }\n\n /**\n * Upload video and send as message\n * @param conversationId - Conversation ID\n * @param file - Video file\n * @param caption - Optional caption\n */\n public async sendVideo(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'video',\n conversationId,\n caption\n });\n }\n\n /**\n * Upload audio and send as message\n * @param conversationId - Conversation ID\n * @param file - Audio file\n * @param caption - Optional caption\n */\n public async sendAudio(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'audio',\n conversationId,\n caption\n });\n }\n\n /**\n * Upload document and send as message\n * @param conversationId - Conversation ID\n * @param file - Document file\n * @param caption - Optional caption\n */\n public async sendDocument(\n conversationId: string, \n file: File, \n caption?: string\n ): Promise<MediaUploadResult> {\n return this.uploadMedia({\n file,\n type: 'document',\n conversationId,\n caption\n });\n }\n\n /**\n * Get media information\n * @param mediaId - Media ID\n */\n public async getMedia(mediaId: string): Promise<MediaUploadResult> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n const response = await this.api.get(`/api/media/${mediaId}`);\n\n if (this.config?.enableLogging) {\n console.log('📄 MediaManager: Media info fetched successfully', { mediaId });\n }\n\n return response.data.media;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Get media failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get media');\n }\n }\n\n /**\n * Get download URL for media\n * @param options - Download options\n */\n public async getDownloadUrl(options: MediaDownloadOptions): Promise<string> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n const params = new URLSearchParams();\n if (options.quality) {\n params.append('quality', options.quality);\n }\n\n const response = await this.api.get(\n `/api/media/${options.mediaId}/download?${params.toString()}`\n );\n\n const downloadUrl = response.data.url;\n\n if (this.config?.enableLogging) {\n console.log('🔗 MediaManager: Download URL generated', { \n mediaId: options.mediaId,\n quality: options.quality \n });\n }\n\n return downloadUrl;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Get download URL failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to get download URL');\n }\n }\n\n /**\n * Delete media\n * @param mediaId - Media ID to delete\n */\n public async deleteMedia(mediaId: string): Promise<void> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n await this.api.delete(`/api/media/${mediaId}`);\n\n if (this.config?.enableLogging) {\n console.log('🗑️ MediaManager: Media deleted successfully', { mediaId });\n }\n\n // Emit media deleted event\n this.chatSDK.events?.emit('media.deleted', { mediaId });\n\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Delete media failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to delete media');\n }\n }\n\n /**\n * Generate thumbnail for media\n * @param mediaId - Media ID\n * @param size - Thumbnail size\n */\n public async generateThumbnail(mediaId: string, size: 'small' | 'medium' | 'large' = 'medium'): Promise<string> {\n if (!this.api) {\n throw new Error('MediaManager not initialized');\n }\n\n try {\n const response = await this.api.post(`/api/media/${mediaId}/thumbnail`, { size });\n\n const thumbnailUrl = response.data.thumbnailUrl;\n\n if (this.config?.enableLogging) {\n console.log('🖼️ MediaManager: Thumbnail generated', { mediaId, size });\n }\n\n return thumbnailUrl;\n } catch (error: any) {\n if (this.config?.enableLogging) {\n console.error('❌ MediaManager: Generate thumbnail failed', error.response?.data || error.message);\n }\n throw new Error(error.response?.data?.message || 'Failed to generate thumbnail');\n }\n }\n\n /**\n * Set maximum file size\n * @param sizeInBytes - Maximum file size in bytes\n */\n public setMaxFileSize(sizeInBytes: number): void {\n this.maxFileSize = sizeInBytes;\n \n if (this.config?.enableLogging) {\n console.log('📏 MediaManager: Max file size updated', { \n sizeInMB: Math.round(sizeInBytes / (1024 * 1024)) \n });\n }\n }\n\n /**\n * Set allowed file types\n * @param mimeTypes - Array of allowed MIME types\n */\n public setAllowedTypes(mimeTypes: string[]): void {\n this.allowedTypes = mimeTypes;\n \n if (this.config?.enableLogging) {\n console.log('📋 MediaManager: Allowed types updated', { types: mimeTypes });\n }\n }\n\n /**\n * Validate file before upload\n * @param file - File to validate\n */\n private validateFile(file: File): void {\n // Check file size\n if (file.size > this.maxFileSize) {\n throw new Error(`File size exceeds maximum allowed size of ${Math.round(this.maxFileSize / (1024 * 1024))}MB`);\n }\n\n // Check file type\n if (!this.allowedTypes.includes(file.type)) {\n throw new Error(`File type ${file.type} is not allowed`);\n }\n\n // Check file name\n if (!file.name || file.name.trim().length === 0) {\n throw new Error('File must have a valid name');\n }\n }\n\n /**\n * Check if file type is supported\n * @param mimeType - MIME type to check\n */\n public isTypeSupported(mimeType: string): boolean {\n return this.allowedTypes.includes(mimeType);\n }\n\n /**\n * Get file type category from MIME type\n * @param mimeType - MIME type\n */\n public getFileTypeCategory(mimeType: string): 'image' | 'video' | 'audio' | 'document' {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n return 'document';\n }\n\n /**\n * Format file size in human readable format\n * @param bytes - File size in bytes\n */\n public formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n} ","import { ChatSDKConfig } from '../ChatSDK';\r\n\r\nexport type EventCallback = (data: any) => void;\r\n\r\nexport interface ChatSDKEvent {\r\n type: string;\r\n data: any;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * EventManager handles all real-time events and WebSocket connections\r\n * Provides event emission, listening, and real-time communication\r\n */\r\nexport class EventManager {\r\n private chatSDK: any;\r\n private config: ChatSDKConfig | null = null;\r\n private socket: WebSocket | null = null;\r\n private eventListeners: Map<string, EventCallback[]> = new Map();\r\n private isConnected: boolean = false;\r\n private reconnectAttempts: number = 0;\r\n private maxReconnectAttempts: number = 5;\r\n private reconnectDelay: number = 1000; // Start with 1 second\r\n private heartbeatInterval: NodeJS.Timeout | null = null;\r\n private connectionTimeout: NodeJS.Timeout | null = null;\r\n\r\n constructor(chatSDK: any) {\r\n this.chatSDK = chatSDK;\r\n }\r\n\r\n /**\r\n * Initialize EventManager with configuration\r\n */\r\n public async init(config: ChatSDKConfig): Promise<void> {\r\n this.config = config;\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('📡 EventManager: Initialized');\r\n }\r\n }\r\n\r\n /**\r\n * Connect to WebSocket for real-time events\r\n * NOTE: Disabled - using Socket.io SocketManager instead\r\n */\r\n public async connect(): Promise<void> {\r\n if (!this.config) {\r\n throw new Error('EventManager not initialized');\r\n }\r\n\r\n // Skip WebSocket connection - using Socket.io SocketManager instead\r\n if (this.config?.enableLogging) {\r\n console.log('📡 EventManager: Skipping native WebSocket connection (using Socket.io instead)');\r\n }\r\n \r\n this.isConnected = true;\r\n return Promise.resolve();\r\n\r\n /* DISABLED - Using Socket.io SocketManager instead\r\n if (this.isConnected || this.socket?.readyState === WebSocket.CONNECTING) {\r\n return;\r\n }\r\n\r\n try {\r\n const wsUrl = this.config.wsUrl || this.config.apiBaseUrl.replace('http', 'ws') + '/ws';\r\n const token = localStorage.getItem('chatSDKToken');\r\n \r\n if (!token) {\r\n throw new Error('No authentication token found');\r\n }\r\n\r\n const socketUrl = `${wsUrl}?token=${encodeURIComponent(token)}`;\r\n \r\n if (this.config.enableLogging) {\r\n console.log('🔌 EventManager: Connecting to WebSocket...', { url: wsUrl });\r\n }\r\n\r\n this.socket = new WebSocket(socketUrl);\r\n \r\n this.socket.onopen = this.handleOpen.bind(this);\r\n this.socket.onmessage = this.handleMessage.bind(this);\r\n this.socket.onclose = this.handleClose.bind(this);\r\n this.socket.onerror = this.handleError.bind(this);\r\n\r\n // Set connection timeout\r\n this.connectionTimeout = setTimeout(() => {\r\n if (this.socket?.readyState === WebSocket.CONNECTING) {\r\n this.socket.close();\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Connection timeout');\r\n }\r\n }\r\n }, 10000); // 10 seconds timeout\r\n\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Connection failed', error);\r\n }\r\n throw error;\r\n }\r\n */ // End of disabled WebSocket code\r\n }\r\n\r\n /**\r\n * Disconnect from WebSocket\r\n * NOTE: Disabled - using Socket.io SocketManager instead\r\n */\r\n public async disconnect(): Promise<void> {\r\n // Skip WebSocket disconnection - using Socket.io SocketManager instead\r\n if (this.config?.enableLogging) {\r\n console.log('📡 EventManager: Skipping native WebSocket disconnection (using Socket.io instead)');\r\n }\r\n \r\n this.isConnected = false;\r\n return Promise.resolve();\r\n\r\n /* DISABLED - Using Socket.io SocketManager instead\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n \r\n if (this.heartbeatInterval) {\r\n clearInterval(this.heartbeatInterval);\r\n this.heartbeatInterval = null;\r\n }\r\n\r\n if (this.connectionTimeout) {\r\n clearTimeout(this.connectionTimeout);\r\n this.connectionTimeout = null;\r\n }\r\n */\r\n\r\n this.isConnected = false;\r\n this.reconnectAttempts = 0;\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('🔌 EventManager: Disconnected');\r\n }\r\n }\r\n\r\n /**\r\n * Add event listener\r\n * @param event - Event name\r\n * @param callback - Callback function\r\n */\r\n public on(event: string, callback: EventCallback): void {\r\n if (!this.eventListeners.has(event)) {\r\n this.eventListeners.set(event, []);\r\n }\r\n this.eventListeners.get(event)!.push(callback);\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('👂 EventManager: Event listener added', { event });\r\n }\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n * @param event - Event name\r\n * @param callback - Callback function to remove\r\n */\r\n public off(event: string, callback?: EventCallback): void {\r\n if (!callback) {\r\n // Remove all listeners for this event\r\n this.eventListeners.delete(event);\r\n return;\r\n }\r\n\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n const index = listeners.indexOf(callback);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n }\r\n \r\n if (listeners.length === 0) {\r\n this.eventListeners.delete(event);\r\n }\r\n }\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('🔇 EventManager: Event listener removed', { event });\r\n }\r\n }\r\n\r\n /**\r\n * Emit local event\r\n * @param event - Event name\r\n * @param data - Event data\r\n */\r\n public emit(event: string, data: any): void {\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n listeners.forEach(callback => {\r\n try {\r\n callback(data);\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Error in event callback', { event, error });\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('📢 EventManager: Event emitted', { event, data });\r\n }\r\n }\r\n\r\n /**\r\n * Send message through WebSocket\r\n * @param type - Message type\r\n * @param data - Message data\r\n */\r\n public send(type: string, data: any): void {\r\n if (!this.isConnected || !this.socket) {\r\n if (this.config?.enableLogging) {\r\n console.warn('⚠️ EventManager: Cannot send message - not connected');\r\n }\r\n return;\r\n }\r\n\r\n const message = {\r\n type,\r\n data,\r\n timestamp: Date.now()\r\n };\r\n\r\n try {\r\n this.socket.send(JSON.stringify(message));\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('📤 EventManager: Message sent', { type, data });\r\n }\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Failed to send message', { type, error });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if connected to WebSocket\r\n */\r\n public isSocketConnected(): boolean {\r\n return this.isConnected && this.socket?.readyState === WebSocket.OPEN;\r\n }\r\n\r\n /**\r\n * Get connection status\r\n */\r\n public getConnectionStatus(): 'connected' | 'connecting' | 'disconnected' | 'error' {\r\n if (!this.socket) return 'disconnected';\r\n \r\n switch (this.socket.readyState) {\r\n case WebSocket.CONNECTING:\r\n return 'connecting';\r\n case WebSocket.OPEN:\r\n return 'connected';\r\n case WebSocket.CLOSING:\r\n case WebSocket.CLOSED:\r\n return 'disconnected';\r\n default:\r\n return 'error';\r\n }\r\n }\r\n\r\n // Private methods for WebSocket event handling\r\n private handleOpen(event: Event): void {\r\n this.isConnected = true;\r\n this.reconnectAttempts = 0;\r\n this.reconnectDelay = 1000;\r\n\r\n if (this.connectionTimeout) {\r\n clearTimeout(this.connectionTimeout);\r\n this.connectionTimeout = null;\r\n }\r\n\r\n // Start heartbeat\r\n this.startHeartbeat();\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('✅ EventManager: WebSocket connected');\r\n }\r\n\r\n this.emit('connection.open', { timestamp: Date.now() });\r\n }\r\n\r\n private handleMessage(event: MessageEvent): void {\r\n try {\r\n const message = JSON.parse(event.data);\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('📥 EventManager: Message received', message);\r\n }\r\n\r\n // Handle special system messages\r\n if (message.type === 'heartbeat') {\r\n this.send('heartbeat', { timestamp: Date.now() });\r\n return;\r\n }\r\n\r\n // Emit the received event\r\n this.emit(message.type, message.data);\r\n \r\n // Also emit a general message event\r\n this.emit('message.received', message);\r\n\r\n } catch (error) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Failed to parse message', { data: event.data, error });\r\n }\r\n }\r\n }\r\n\r\n private handleClose(event: CloseEvent): void {\r\n this.isConnected = false;\r\n \r\n if (this.heartbeatInterval) {\r\n clearInterval(this.heartbeatInterval);\r\n this.heartbeatInterval = null;\r\n }\r\n\r\n if (this.config?.enableLogging) {\r\n console.log('🔌 EventManager: WebSocket closed', { \r\n code: event.code, \r\n reason: event.reason,\r\n wasClean: event.wasClean \r\n });\r\n }\r\n\r\n this.emit('connection.close', { \r\n code: event.code, \r\n reason: event.reason,\r\n timestamp: Date.now() \r\n });\r\n\r\n // Attempt reconnection if not a clean close\r\n if (!event.wasClean && this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.attemptReconnect();\r\n }\r\n }\r\n\r\n private handleError(event: Event): void {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: WebSocket error', event);\r\n }\r\n\r\n this.emit('connection.error', { \r\n error: event,\r\n timestamp: Date.now() \r\n });\r\n }\r\n\r\n private startHeartbeat(): void {\r\n if (this.heartbeatInterval) {\r\n clearInterval(this.heartbeatInterval);\r\n }\r\n\r\n this.heartbeatInterval = setInterval(() => {\r\n if (this.isConnected) {\r\n this.send('ping', { timestamp: Date.now() });\r\n }\r\n }, 30000); // Send ping every 30 seconds\r\n }\r\n\r\n private attemptReconnect(): void {\r\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Max reconnection attempts reached');\r\n }\r\n this.emit('connection.failed', { \r\n attempts: this.reconnectAttempts,\r\n timestamp: Date.now() \r\n });\r\n return;\r\n }\r\n\r\n this.reconnectAttempts++;\r\n \r\n if (this.config?.enableLogging) {\r\n console.log(`🔄 EventManager: Attempting reconnection ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);\r\n }\r\n\r\n setTimeout(() => {\r\n this.connect().catch(error => {\r\n if (this.config?.enableLogging) {\r\n console.error('❌ EventManager: Reconnection failed', error);\r\n }\r\n this.attemptReconnect();\r\n });\r\n }, this.reconnectDelay);\r\n\r\n // Exponential backoff\r\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, 30000); // Max 30 seconds\r\n }\r\n\r\n /**\r\n * Set maximum reconnection attempts\r\n * @param attempts - Maximum number of attempts\r\n */\r\n public setMaxReconnectAttempts(attempts: number): void {\r\n this.maxReconnectAttempts = attempts;\r\n }\r\n\r\n /**\r\n * Clear all event listeners\r\n */\r\n public clearAllListeners(): void {\r\n this.eventListeners.clear();\r\n \r\n if (this.config?.enableLogging) {\r\n console.log('🧹 EventManager: All event listeners cleared');\r\n }\r\n }\r\n\r\n /**\r\n * Get list of active event listeners\r\n */\r\n public getActiveListeners(): string[] {\r\n return Array.from(this.eventListeners.keys());\r\n }\r\n} ","import { ChatSDKUser, ChatSDKMessage, ChatSDKConversation, ProductContext } from '../types';\r\n\r\n/**\r\n * ✅ Parsing utilities for React SDK\r\n * Handles only the standard server API formats - no alternate field names\r\n * WebSocket format vs HTTP API format (minimal differences)\r\n */\r\nexport class ParseUtils {\r\n /**\r\n * Parse user data - handles standard server format only\r\n * @param data User data from server\r\n * @returns Validated ChatSDKUser object\r\n */\r\n static parseUser(data: any): ChatSDKUser {\r\n if (!data) {\r\n throw new Error('User data is required');\r\n }\r\n\r\n // Server uses standard camelCase format\r\n return {\r\n id: data.id,\r\n externalUserId: data.externalUserId,\r\n appId: data.appId,\r\n name: data.name,\r\n username: data.username,\r\n displayName: data.displayName,\r\n email: data.email,\r\n avatar: data.avatar,\r\n avatarUrl: data.avatarUrl,\r\n status: data.status || 'offline',\r\n isOnline: data.isOnline || false,\r\n isRegistered: data.isRegistered || true,\r\n lastSeen: data.lastSeen,\r\n createdAt: data.createdAt,\r\n updatedAt: data.updatedAt,\r\n metadata: data.metadata || {},\r\n \r\n // Include any other server fields as-is\r\n ...data\r\n };\r\n }\r\n\r\n /**\r\n * Parse message data - handles WebSocket and HTTP API formats only\r\n * @param data Message data from server\r\n * @returns Validated ChatSDKMessage object\r\n */\r\n static parseMessage(data: any): ChatSDKMessage {\r\n if (!data) {\r\n throw new Error('Message data is required');\r\n }\r\n\r\n // Handle the standard server format - no alternate keys, use what actually comes from API\r\n \r\n // Determine message type - use explicit type or infer from metadata\r\n let messageType = data.type || 'text';\r\n \r\n // If type is not set but we have file metadata, infer from mimeType\r\n if (messageType === 'text' && data.metadata?.fileUrl && data.metadata?.mimeType) {\r\n const mimeType = data.metadata.mimeType;\r\n if (mimeType.startsWith('image/')) {\r\n messageType = 'image';\r\n } else if (mimeType.startsWith('video/')) {\r\n messageType = 'video';\r\n } else if (mimeType.startsWith('audio/')) {\r\n messageType = 'audio';\r\n } else {\r\n messageType = 'file';\r\n }\r\n }\r\n \r\n const parsedMessage = {\r\n id: data.id,\r\n content: data.content,\r\n senderId: data.senderId,\r\n \r\n // Use standard camelCase - only the keys that actually come from server\r\n roomId: data.roomId || data.conversationId, // Keep this minimal fallback for WebSocket vs HTTP\r\n conversationId: data.conversationId || data.roomId, // Required by ChatSDKMessage type\r\n \r\n // Sender info (only standard camelCase fields)\r\n senderName: data.senderName,\r\n senderEmail: data.senderEmail,\r\n senderAvatar: data.senderAvatar,\r\n senderExternalUserId: data.senderExternalUserId,\r\n \r\n // Use the determined message type\r\n messageType: messageType,\r\n type: messageType,\r\n \r\n // Required status fields\r\n status: data.status || 'sent',\r\n isRead: data.isRead || false,\r\n isDelivered: data.isDelivered || false,\r\n \r\n // Timestamps (standard fields only)\r\n timestamp: data.timestamp,\r\n createdAt: data.createdAt,\r\n updatedAt: data.updatedAt,\r\n \r\n // Keep metadata as-is - file info stays in metadata where ChatWindow expects it\r\n metadata: data.metadata || {}\r\n };\r\n\r\n console.log('✅ ParseUtils: Parsed message:', {\r\n id: parsedMessage.id,\r\n type: parsedMessage.type,\r\n messageType: parsedMessage.messageType,\r\n roomId: parsedMessage.roomId,\r\n hasMetadata: !!parsedMessage.metadata,\r\n metadataKeys: Object.keys(parsedMessage.metadata || {}),\r\n fileUrl: parsedMessage.metadata?.fileUrl\r\n });\r\n return parsedMessage;\r\n }\r\n\r\n /**\r\n * Parse conversation data - handles standard server format only\r\n * @param data Conversation data from server\r\n * @returns Validated ChatSDKConversation object\r\n */\r\n static parseConversation(data: any): ChatSDKConversation {\r\n if (!data) {\r\n throw new Error('Conversation data is required');\r\n }\r\n\r\n // Server uses standard camelCase format\r\n return {\r\n id: data.id,\r\n conversationId: data.conversationId || data.id,\r\n name: data.name,\r\n description: data.description,\r\n type: data.type || 'direct',\r\n avatar: data.avatar,\r\n participants: Array.isArray(data.participants) ? data.participants.map((p: any) => this.parseUser(p)) : [],\r\n lastMessage: data.lastMessage ? this.parseMessage(data.lastMessage) : null,\r\n productContext: data.productContext ? this.parseProductContext(data.productContext) : undefined,\r\n metadata: data.metadata || {},\r\n createdAt: data.createdAt,\r\n updatedAt: data.updatedAt,\r\n \r\n // Include any other server fields as-is\r\n ...data\r\n };\r\n }\r\n\r\n /**\r\n * Parse product context - handles standard server format only\r\n * @param data Product context data from server\r\n * @returns Validated ProductContext object or undefined\r\n */\r\n static parseProductContext(data: any): ProductContext | undefined {\r\n if (!data) {\r\n return undefined;\r\n }\r\n\r\n // Server uses standard camelCase format\r\n return {\r\n productId: data.productId,\r\n productName: data.productName,\r\n productImage: data.productImage,\r\n price: data.price,\r\n currency: data.currency,\r\n category: data.category,\r\n productMetadata: data.productMetadata || {},\r\n \r\n // Include any other server fields as-is\r\n ...data\r\n };\r\n }\r\n\r\n /**\r\n * Simple array validation - server returns consistent data\r\n */\r\n static parseMessages(messages: any[]): ChatSDKMessage[] {\r\n return Array.isArray(messages) ? messages : [];\r\n }\r\n\r\n static parseConversations(conversations: any[]): ChatSDKConversation[] {\r\n return Array.isArray(conversations) ? conversations : [];\r\n }\r\n\r\n static parseUsers(users: any[]): ChatSDKUser[] {\r\n return Array.isArray(users) ? users : [];\r\n }\r\n} ","import { io, Socket } from 'socket.io-client';\nimport { ChatSDK, ChatSDKConfig } from '../ChatSDK';\nimport { ParseUtils } from '../utils/ParseUtils';\n\nexport interface SocketConfig {\n url: string;\n enableLogging?: boolean;\n}\n\nexport interface SocketEvents {\n 'message_received': (message: any) => void;\n 'typing_indicator': (data: any) => void;\n 'user_status_changed': (data: any) => void;\n 'conversation_updated': (data: any) => void;\n 'connection_status': (status: 'connected' | 'disconnected' | 'error') => void;\n}\n\n/**\n * SocketManager handles real-time WebSocket connections\n * Provides methods for real-time chat, user status, and notifications\n */\nexport class SocketManager {\n private chatSDK: any;\n private socket: any = null;\n private config: ChatSDKConfig | null = null;\n private currentUserId: string | null = null;\n private joinedRooms: Set<string> = new Set();\n\n constructor(chatSDK: any) {\n this.chatSDK = chatSDK;\n }\n\n /**\n * Initialize SocketManager with configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n this.config = config;\n \n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Starting initialization...', {\n apiBaseUrl: config.apiBaseUrl,\n enableLogging: config.enableLogging\n });\n }\n\n try {\n // Create socket connection\n // Use wsUrl if provided, otherwise derive from apiBaseUrl\n let socketUrl = config.wsUrl;\n if (!socketUrl && config.apiBaseUrl) {\n // Remove /api suffix if present, and ensure we have a valid URL\n socketUrl = config.apiBaseUrl.replace(/\\/api\\/?$/, '');\n }\n // Fallback to localhost only in development\n if (!socketUrl) {\n socketUrl = config.environment === 'production' \n ? 'https://chatsdk-mzad-admin.onrender.com' // Default production URL\n : 'http://localhost:5001';\n }\n \n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Creating socket connection to:', socketUrl, {\n wsUrl: config.wsUrl,\n apiBaseUrl: config.apiBaseUrl,\n environment: config.environment\n });\n }\n \n this.socket = io(socketUrl, {\n transports: ['websocket', 'polling'], // Try websocket first, fallback to polling\n autoConnect: false,\n forceNew: true,\n \n // ✅ Connection & Keep-Alive Settings - Match server configuration\n timeout: 45000, // 45 seconds - initial connection timeout (matches server)\n reconnection: true, // Enable automatic reconnection\n reconnectionAttempts: 10, // Try up to 10 times\n reconnectionDelay: 2000, // 2 seconds - initial delay\n reconnectionDelayMax: 10000, // 10 seconds - max delay with exponential backoff\n \n // ✅ Additional settings for stability\n upgrade: true, // Allow upgrade from polling to websocket\n rememberUpgrade: false, // Don't remember upgrade preference (test each time)\n });\n\n this.setupEventListeners();\n \n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Initialized successfully with socket:', !!this.socket);\n }\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Initialization failed', error);\n }\n throw error;\n }\n }\n\n /**\n * Connect to WebSocket server\n */\n public async connect(userId: string): Promise<void> {\n if (!this.socket) {\n throw new Error('SocketManager not initialized');\n }\n\n this.currentUserId = userId;\n\n // Get the actual socket URL being used\n let socketUrl = this.config?.wsUrl;\n if (!socketUrl && this.config?.apiBaseUrl) {\n socketUrl = this.config.apiBaseUrl.replace(/\\/api\\/?$/, '');\n }\n if (!socketUrl) {\n socketUrl = this.config?.environment === 'production' \n ? 'https://chatsdk-mzad-admin.onrender.com'\n : 'http://localhost:5001';\n }\n \n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Attempting to connect to WebSocket server...', {\n userId,\n socketUrl,\n wsUrl: this.config?.wsUrl,\n apiBaseUrl: this.config?.apiBaseUrl,\n environment: this.config?.environment,\n hasSocket: !!this.socket\n });\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Connection timeout after 10 seconds');\n }\n reject(new Error('Connection timeout'));\n }, 10000);\n\n this.socket!.connect();\n\n this.socket!.on('connect', () => {\n clearTimeout(timeout);\n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Connected to WebSocket server successfully!');\n }\n\n // Authenticate user\n this.socket!.emit('authenticate', { userId, appId: this.config?.appId });\n if (this.config?.enableLogging) {\n console.log('🔐 SocketManager: Sent authentication for user:', userId);\n }\n resolve();\n });\n\n this.socket!.on('connect_error', (error: any) => {\n clearTimeout(timeout);\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Connection failed with error:', error);\n }\n reject(error);\n });\n\n this.socket!.on('disconnect', (reason: any) => {\n if (this.config?.enableLogging) {\n console.log('🔌 SocketManager: Disconnected from server, reason:', reason);\n }\n });\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n public disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.joinedRooms.clear();\n \n if (this.config?.enableLogging) {\n console.log('�� SocketManager: Disconnected from WebSocket server');\n }\n }\n }\n\n /**\n * Join a conversation for real-time messages\n */\n public joinConversation(conversationId: string): void {\n if (!this.socket || !this.socket.connected) {\n if (this.config?.enableLogging) {\n console.warn('SocketManager: Cannot join conversation - not connected');\n }\n return;\n }\n\n if (!this.joinedRooms.has(conversationId)) {\n this.socket.emit('join_conversation', { \n conversationId,\n appId: this.config?.appId \n });\n this.joinedRooms.add(conversationId);\n \n if (this.config?.enableLogging) {\n console.log(`🏠 SocketManager: Joined conversation ${conversationId}`);\n }\n }\n }\n\n /**\n * Leave a conversation\n */\n public leaveConversation(conversationId: string): void {\n if (!this.socket || !this.socket.connected) {\n return;\n }\n\n if (this.joinedRooms.has(conversationId)) {\n this.socket.emit('leave_conversation', { conversationId });\n this.joinedRooms.delete(conversationId);\n \n if (this.config?.enableLogging) {\n console.log(`🏠 SocketManager: Left conversation ${conversationId}`);\n }\n }\n }\n\n /**\n * Send typing indicator\n */\n public sendTypingIndicator(conversationId: string, isTyping: boolean): void {\n if (!this.socket || !this.socket.connected) {\n if (this.config?.enableLogging) {\n console.warn('SocketManager: Cannot send typing indicator - not connected');\n }\n return;\n }\n\n this.socket.emit('typing_indicator', {\n conversationId,\n isTyping,\n userId: this.currentUserId\n });\n\n if (this.config?.enableLogging) {\n console.log(`⌨️ SocketManager: Typing indicator sent: ${isTyping} for conversation ${conversationId}`);\n }\n }\n\n /**\n * Send a real-time message\n */\n public sendMessage(data: {\n chatId: string;\n content: string;\n type?: string;\n senderId: string;\n senderName: string;\n metadata?: any;\n }): void {\n if (!this.socket || !this.socket.connected) {\n if (this.config?.enableLogging) {\n console.warn('SocketManager: Cannot send message - not connected');\n }\n return;\n }\n\n const messageData = {\n ...data,\n timestamp: new Date().toISOString(),\n senderId: this.currentUserId || data.senderId\n };\n\n this.socket.emit('send-message', messageData);\n \n if (this.config?.enableLogging) {\n console.log('📤 SocketManager: Message sent via WebSocket', messageData);\n }\n }\n\n /**\n * Set up event listeners for real-time events\n */\n private setupEventListeners(): void {\n if (!this.socket) return;\n\n // ✅ Handle incoming messages with proper parsing\n this.socket.on('message_received', (message: any) => {\n try {\n // Parse message with alternate field name support\n const parsedMessage = ParseUtils.parseMessage(message);\n\n // Emit parsed message to ChatSDK event system\n this.chatSDK.events?.emit('message.received', { message: parsedMessage });\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to parse received message', error);\n }\n // Fallback: emit original message\n this.chatSDK.events?.emit('message.received', { message });\n }\n });\n\n // ✅ Handle typing indicators with field mapping\n this.socket.on('typing_indicator', (data: any) => {\n try {\n // Normalize field names\n const normalizedData = {\n userId: data.userId || data.user_id,\n conversationId: data.conversationId || data.conversation_id || data.room_id,\n isTyping: data.isTyping || data.is_typing,\n timestamp: data.timestamp || data.created_at\n };\n\n if (this.config?.enableLogging) {\n console.log('⌨️ SocketManager: Typing indicator received', normalizedData);\n }\n\n this.chatSDK.events?.emit('typing.indicator', normalizedData);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process typing indicator', error);\n }\n // Fallback: emit original data\n this.chatSDK.events?.emit('typing.indicator', data);\n }\n });\n\n // ✅ Handle user status updates with field mapping\n this.socket.on('user_status_changed', (data: any) => {\n try {\n // Normalize field names\n const normalizedData = {\n userId: data.userId || data.user_id,\n status: data.status,\n timestamp: data.timestamp || data.updated_at || data.last_seen\n };\n\n if (this.config?.enableLogging) {\n console.log('👤 SocketManager: User status update', normalizedData);\n }\n\n this.chatSDK.events?.emit('user.status.changed', normalizedData);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process user status update', error);\n }\n // Fallback: emit original data\n this.chatSDK.events?.emit('user.status.changed', data);\n }\n });\n\n // ✅ Handle conversation updates with field mapping\n this.socket.on('conversation_updated', (data: any) => {\n try {\n // Normalize field names\n const normalizedData = {\n conversationId: data.conversationId || data.conversation_id || data.room_id,\n lastMessage: data.lastMessage || data.last_message,\n unreadCount: data.unreadCount || data.unread_count,\n timestamp: data.timestamp || data.updated_at\n };\n\n if (this.config?.enableLogging) {\n console.log('💬 SocketManager: Conversation update', normalizedData);\n }\n\n this.chatSDK.events?.emit('conversation.updated', normalizedData);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process conversation update', error);\n }\n // Fallback: emit original data\n this.chatSDK.events?.emit('conversation.updated', data);\n }\n });\n\n // Handle user joined room\n this.socket.on('user-joined-room', (data: any) => {\n if (this.config?.enableLogging) {\n console.log('🏠 SocketManager: User joined room', data);\n }\n\n this.chatSDK.events?.emit('room.user.joined', data);\n });\n\n // Handle user left room\n this.socket.on('user-left-room', (data: any) => {\n if (this.config?.enableLogging) {\n console.log('🚪 SocketManager: User left room', data);\n }\n\n this.chatSDK.events?.emit('room.user.left', data);\n });\n\n // Handle online users list\n this.socket.on('online-users', (users: any[]) => {\n try {\n // Parse users with alternate field support\n const parsedUsers = ParseUtils.parseUsers(users);\n \n if (this.config?.enableLogging) {\n console.log('🌐 SocketManager: Online users update', { count: parsedUsers.length });\n }\n\n this.chatSDK.events?.emit('users.online', { users: parsedUsers });\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to parse online users', error);\n }\n // Fallback: emit original users\n this.chatSDK.events?.emit('users.online', { users });\n }\n });\n\n // ✅ Handle block/unblock updates\n this.socket.on('conversation_block_status', (data: any) => {\n if (this.config?.enableLogging) {\n console.log('🚫 SocketManager: Conversation block status update', data);\n }\n\n this.chatSDK.events?.emit('conversation.block_status', data);\n });\n\n // ✅ Handle read receipt for single message\n this.socket.on('message_read_receipt', (data: {\n messageId: string;\n roomId: string;\n readBy: string;\n readAt: string;\n isRead: boolean;\n }) => {\n try {\n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Message read receipt received', data);\n }\n this.chatSDK.events?.emit('message.read.receipt', data);\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process read receipt', error);\n }\n this.chatSDK.events?.emit('message.read.receipt', data);\n }\n });\n\n // ✅ Handle read receipt for multiple messages (room read)\n this.socket.on('messages_read_receipt', (data: {\n roomId: string;\n messageIds: string[];\n readBy: string;\n readAt: string;\n isRead: boolean;\n }) => {\n try {\n if (this.config?.enableLogging) {\n console.log('📥 SocketManager: messages_read_receipt received from server', {\n roomId: data.roomId,\n messageIds: data.messageIds,\n messageCount: data.messageIds?.length,\n readBy: data.readBy,\n isRead: data.isRead\n });\n }\n \n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Messages read receipt received', data);\n }\n \n if (this.config?.enableLogging) {\n console.log('📤 SocketManager: Emitting messages.read.receipt to chatSDK.events');\n }\n this.chatSDK.events?.emit('messages.read.receipt', data);\n if (this.config?.enableLogging) {\n console.log('✅ SocketManager: Successfully emitted messages.read.receipt');\n }\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ SocketManager: Failed to process read receipts', error);\n }\n this.chatSDK.events?.emit('messages.read.receipt', data);\n }\n });\n }\n\n /**\n * Check if socket is connected\n */\n public isConnected(): boolean {\n return this.socket?.connected || false;\n }\n\n /**\n * Get socket connection status\n */\n public getStatus(): { connected: boolean; userId: string | null; rooms: string[] } {\n return {\n connected: this.isConnected(),\n userId: this.currentUserId,\n rooms: Array.from(this.joinedRooms)\n };\n }\n\n // Legacy methods for backward compatibility\n public joinRoom(roomId: string): void {\n this.joinConversation(roomId);\n }\n\n public leaveRoom(roomId: string): void {\n this.leaveConversation(roomId);\n }\n\n /**\n * Emit a socket event\n */\n public emit(event: string, data: any): void {\n if (this.socket && this.socket.connected) {\n this.socket.emit(event, data);\n if (this.config?.enableLogging) {\n console.log('📤 SocketManager: Emitted event:', event, data);\n }\n } else {\n if (this.config?.enableLogging) {\n console.warn('⚠️ SocketManager: Cannot emit event - not connected:', event);\n }\n }\n }\n\n /**\n * Listen to a socket event\n */\n public on(event: string, callback: (data: any) => void): void {\n if (this.socket) {\n this.socket.on(event, callback);\n if (this.config?.enableLogging) {\n console.log('👂 SocketManager: Listening to event:', event);\n }\n } else {\n if (this.config?.enableLogging) {\n console.warn('⚠️ SocketManager: Cannot listen to event - socket not available:', event);\n }\n }\n }\n\n /**\n * Stop listening to a socket event\n */\n public off(event: string, callback?: (data: any) => void): void {\n if (this.socket) {\n this.socket.off(event, callback);\n if (this.config?.enableLogging) {\n console.log('🔇 SocketManager: Stopped listening to event:', event);\n }\n }\n }\n} ","import { AuthManager } from './managers/AuthManager';\nimport { ChatUserManager } from './managers/ChatUserManager';\nimport { UserManager } from './managers/UserManager';\nimport { ConversationManager } from './managers/ConversationManager';\nimport { MessageManager } from './managers/MessageManager';\nimport { MediaManager } from './managers/MediaManager';\nimport { EventManager } from './managers/EventManager';\nimport { SocketManager } from './managers/SocketManager';\nimport { ChatSDKUser } from './types';\n\n// Re-export types for external use\nexport type { ChatSDKUser } from './types';\n\nexport interface ChatSDKConfig {\n apiBaseUrl: string;\n wsUrl?: string;\n appId: string;\n apiKey?: string;\n environment: 'development' | 'staging' | 'production';\n enableLogging?: boolean;\n autoConnect?: boolean;\n timeout?: number;\n}\n\nexport interface ChatSDKError {\n code: string;\n message: string;\n details?: any;\n}\n\n/**\n * Main ChatSDK class - Entry point for all chat functionality\n * Similar to CometChat SDK structure with simplified wrapper methods\n */\nexport class ChatSDK {\n private static instance: ChatSDK | null = null;\n private config: ChatSDKConfig | null = null;\n private isInitialized: boolean = false;\n public currentUser: ChatSDKUser | null = null;\n\n // Managers\n public auth: AuthManager;\n public chatUsers: ChatUserManager;\n public users: UserManager;\n public conversations: ConversationManager;\n public messages: MessageManager;\n public media: MediaManager;\n public events: EventManager;\n public socket: SocketManager;\n\n private constructor() {\n // Initialize managers\n this.auth = new AuthManager(this);\n this.chatUsers = new ChatUserManager(this);\n this.users = new UserManager(this);\n this.conversations = new ConversationManager(this);\n this.messages = new MessageManager(this);\n this.media = new MediaManager(this);\n this.events = new EventManager(this);\n this.socket = new SocketManager(this);\n }\n\n /**\n * Get singleton instance of ChatSDK\n */\n public static getInstance(): ChatSDK {\n if (!ChatSDK.instance) {\n ChatSDK.instance = new ChatSDK();\n }\n return ChatSDK.instance;\n }\n\n /**\n * Initialize ChatSDK with configuration\n * @param config - ChatSDK configuration\n */\n public async init(config: ChatSDKConfig): Promise<void> {\n try {\n this.config = {\n enableLogging: true,\n autoConnect: true,\n timeout: 30000,\n ...config\n };\n\n if (this.config.enableLogging) {\n console.log('🚀 ChatSDK: Initializing...', this.config);\n }\n\n // Initialize all managers\n await this.auth.init(this.config);\n await this.chatUsers.init(this.config);\n await this.users.init(this.config);\n await this.conversations.init(this.config);\n await this.messages.init(this.config);\n await this.media.init(this.config);\n await this.events.init(this.config);\n await this.socket.init(this.config);\n\n this.isInitialized = true;\n\n if (this.config.enableLogging) {\n console.log('✅ ChatSDK: Initialized successfully');\n }\n\n // Auto-connect if enabled and token exists\n if (this.config.autoConnect && this.auth.hasValidToken()) {\n await this.connect();\n }\n\n } catch (error) {\n console.error('❌ ChatSDK: Initialization failed', error);\n throw new Error(`ChatSDK initialization failed: ${error}`);\n }\n }\n\n /**\n * Connect to chat services\n */\n public async connect(userId?: string): Promise<ChatSDKUser> {\n this.ensureInitialized();\n \n try {\n let user: ChatSDKUser;\n \n // If userId is provided, use it (for chat-users authentication)\n if (userId) {\n console.log('🔌 ChatSDK: Using provided userId for connection:', userId);\n user = {\n id: userId,\n externalUserId: userId,\n appId: process.env.REACT_APP_APP_ID || '',\n name: 'Chat User',\n email: `${userId}@example.com`,\n status: 'online',\n isOnline: true,\n isRegistered: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n this.currentUser = user;\n } else {\n // Otherwise, try to get current user from auth system\n user = await this.auth.getCurrentUser();\n this.currentUser = user;\n }\n \n // Connect to real-time services\n await this.events.connect();\n \n // Connect to WebSocket for real-time chat\n try {\n console.log('🔌 ChatSDK: Attempting WebSocket connection for user:', user.id);\n await this.socket.connect(user.id);\n console.log('✅ ChatSDK: WebSocket connected successfully');\n } catch (socketError) {\n console.warn('⚠️ ChatSDK: WebSocket connection failed, continuing without real-time features:', socketError);\n // Continue without WebSocket - the app can still work with HTTP polling\n }\n \n if (this.config?.enableLogging) {\n console.log('🔗 ChatSDK: Connected successfully', user);\n }\n \n return user;\n } catch (error) {\n if (this.config?.enableLogging) {\n console.error('❌ ChatSDK: Connection failed', error);\n }\n \n // Clear invalid token and reset current user\n await this.auth.logout();\n this.currentUser = null;\n \n throw error;\n }\n }\n\n /**\n * Disconnect from chat services\n */\n public async disconnect(): Promise<void> {\n try {\n await this.events.disconnect();\n this.socket.disconnect();\n this.currentUser = null;\n \n if (this.config?.enableLogging) {\n console.log('🔌 ChatSDK: Disconnected');\n }\n } catch (error) {\n console.error('❌ ChatSDK: Disconnect failed', error);\n throw error;\n }\n }\n\n /**\n * Login user with email and password\n * @param email - User email\n * @param password - User password\n */\n public async login(email: string, password: string): Promise<ChatSDKUser> {\n this.ensureInitialized();\n return await this.auth.login(email, password);\n }\n\n /**\n * Register new user\n * @param email - User email \n * @param password - User password\n * @param name - User name\n * @param metadata - Additional user data\n */\n public async register(email: string, password: string, name: string, metadata?: Record<string, any>): Promise<ChatSDKUser> {\n this.ensureInitialized();\n return await this.auth.register(email, password, name, metadata);\n }\n\n /**\n * Logout current user\n */\n public async logout(): Promise<void> {\n this.ensureInitialized();\n await this.auth.logout();\n await this.disconnect();\n }\n\n /**\n * Get current logged in user\n */\n public getCurrentUser(): ChatSDKUser | null {\n return this.currentUser;\n }\n\n /**\n * Check if SDK is initialized\n */\n public isSDKInitialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Get SDK configuration\n */\n public getConfig(): ChatSDKConfig | null {\n return this.config;\n }\n\n /**\n * Enable/disable logging\n */\n public setLogging(enabled: boolean): void {\n if (this.config) {\n this.config.enableLogging = enabled;\n }\n }\n\n /**\n * Get SDK version\n */\n public getVersion(): string {\n return '1.0.0';\n }\n\n // Private helper methods\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('ChatSDK not initialized. Call ChatSDK.init() first.');\n }\n }\n}\n\n// Export singleton instance\nexport default ChatSDK.getInstance(); ","let e={data:\"\"},t=t=>\"object\"==typeof window?((t?t.querySelector(\"#_goober\"):window._goober)||Object.assign((t||document.head).appendChild(document.createElement(\"style\")),{innerHTML:\" \",id:\"_goober\"})).firstChild:t||e,r=e=>{let r=t(e),l=r.data;return r.data=\"\",l},l=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,a=/\\/\\*[^]*?\\*\\/| +/g,n=/\\n+/g,o=(e,t)=>{let r=\"\",l=\"\",a=\"\";for(let n in e){let c=e[n];\"@\"==n[0]?\"i\"==n[1]?r=n+\" \"+c+\";\":l+=\"f\"==n[1]?o(c,n):n+\"{\"+o(c,\"k\"==n[1]?\"\":t)+\"}\":\"object\"==typeof c?l+=o(c,t?t.replace(/([^,])+/g,e=>n.replace(/([^,]*:\\S+\\([^)]*\\))|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):n):null!=c&&(n=/^--/.test(n)?n:n.replace(/[A-Z]/g,\"-$&\").toLowerCase(),a+=o.p?o.p(n,c):n+\":\"+c+\";\")}return r+(t&&a?t+\"{\"+a+\"}\":a)+l},c={},s=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+s(e[r]);return t}return e},i=(e,t,r,i,p)=>{let u=s(e),d=c[u]||(c[u]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return\"go\"+r})(u));if(!c[d]){let t=u!==e?e:(e=>{let t,r,o=[{}];for(;t=l.exec(e.replace(a,\"\"));)t[4]?o.shift():t[3]?(r=t[3].replace(n,\" \").trim(),o.unshift(o[0][r]=o[0][r]||{})):o[0][t[1]]=t[2].replace(n,\" \").trim();return o[0]})(e);c[d]=o(p?{[\"@keyframes \"+d]:t}:t,r?\"\":\".\"+d)}let f=r&&c.g?c.g:null;return r&&(c.g=c[d]),((e,t,r,l)=>{l?t.data=t.data.replace(l,e):-1===t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(c[d],t,i,f),d},p=(e,t,r)=>e.reduce((e,l,a)=>{let n=t[a];if(n&&n.call){let e=n(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;n=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":o(e,\"\"):!1===e?\"\":e}return e+l+(null==n?\"\":n)},\"\");function u(e){let r=this||{},l=e.call?e(r.p):e;return i(l.unshift?l.raw?p(l,[].slice.call(arguments,1),r.p):l.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):l,t(r.target),r.g,r.o,r.k)}let d,f,g,b=u.bind({g:1}),h=u.bind({k:1});function m(e,t,r,l){o.p=t,d=e,f=r,g=l}function j(e,t){let r=this||{};return function(){let l=arguments;function a(n,o){let c=Object.assign({},n),s=c.className||a.className;r.p=Object.assign({theme:f&&f()},c),r.o=/ *go\\d+/.test(s),c.className=u.apply(r,l)+(s?\" \"+s:\"\"),t&&(c.ref=o);let i=e;return e[0]&&(i=c.as||e,delete c.as),g&&i[0]&&g(c),d(i,c)}return t?t(a):a}}export{u as css,r as extractCss,b as glob,h as keyframes,m as setup,j as styled};\n","\"use client\";\nvar W=e=>typeof e==\"function\",f=(e,t)=>W(e)?e(t):e;var F=(()=>{let e=0;return()=>(++e).toString()})(),A=(()=>{let e;return()=>{if(e===void 0&&typeof window<\"u\"){let t=matchMedia(\"(prefers-reduced-motion: reduce)\");e=!t||t.matches}return e}})();import{useEffect as H,useState as j,useRef as Q}from\"react\";var Y=20;var U=(e,t)=>{switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,Y)};case 1:return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case 2:let{toast:r}=t;return U(e,{type:e.toasts.find(o=>o.id===r.id)?1:0,toast:r});case 3:let{toastId:s}=t;return{...e,toasts:e.toasts.map(o=>o.id===s||s===void 0?{...o,dismissed:!0,visible:!1}:o)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let a=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(o=>({...o,pauseDuration:o.pauseDuration+a}))}}},P=[],y={toasts:[],pausedAt:void 0},u=e=>{y=U(y,e),P.forEach(t=>{t(y)})},q={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},D=(e={})=>{let[t,r]=j(y),s=Q(y);H(()=>(s.current!==y&&r(y),P.push(r),()=>{let o=P.indexOf(r);o>-1&&P.splice(o,1)}),[]);let a=t.toasts.map(o=>{var n,i,p;return{...e,...e[o.type],...o,removeDelay:o.removeDelay||((n=e[o.type])==null?void 0:n.removeDelay)||(e==null?void 0:e.removeDelay),duration:o.duration||((i=e[o.type])==null?void 0:i.duration)||(e==null?void 0:e.duration)||q[o.type],style:{...e.style,...(p=e[o.type])==null?void 0:p.style,...o.style}}});return{...t,toasts:a}};var J=(e,t=\"blank\",r)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:\"status\",\"aria-live\":\"polite\"},message:e,pauseDuration:0,...r,id:(r==null?void 0:r.id)||F()}),x=e=>(t,r)=>{let s=J(t,e,r);return u({type:2,toast:s}),s.id},c=(e,t)=>x(\"blank\")(e,t);c.error=x(\"error\");c.success=x(\"success\");c.loading=x(\"loading\");c.custom=x(\"custom\");c.dismiss=e=>{u({type:3,toastId:e})};c.remove=e=>u({type:4,toastId:e});c.promise=(e,t,r)=>{let s=c.loading(t.loading,{...r,...r==null?void 0:r.loading});return typeof e==\"function\"&&(e=e()),e.then(a=>{let o=t.success?f(t.success,a):void 0;return o?c.success(o,{id:s,...r,...r==null?void 0:r.success}):c.dismiss(s),a}).catch(a=>{let o=t.error?f(t.error,a):void 0;o?c.error(o,{id:s,...r,...r==null?void 0:r.error}):c.dismiss(s)}),e};import{useEffect as $,useCallback as L}from\"react\";var K=(e,t)=>{u({type:1,toast:{id:e,height:t}})},X=()=>{u({type:5,time:Date.now()})},b=new Map,Z=1e3,ee=(e,t=Z)=>{if(b.has(e))return;let r=setTimeout(()=>{b.delete(e),u({type:4,toastId:e})},t);b.set(e,r)},O=e=>{let{toasts:t,pausedAt:r}=D(e);$(()=>{if(r)return;let o=Date.now(),n=t.map(i=>{if(i.duration===1/0)return;let p=(i.duration||0)+i.pauseDuration-(o-i.createdAt);if(p<0){i.visible&&c.dismiss(i.id);return}return setTimeout(()=>c.dismiss(i.id),p)});return()=>{n.forEach(i=>i&&clearTimeout(i))}},[t,r]);let s=L(()=>{r&&u({type:6,time:Date.now()})},[r]),a=L((o,n)=>{let{reverseOrder:i=!1,gutter:p=8,defaultPosition:d}=n||{},h=t.filter(m=>(m.position||d)===(o.position||d)&&m.height),v=h.findIndex(m=>m.id===o.id),S=h.filter((m,E)=>E<v&&m.visible).length;return h.filter(m=>m.visible).slice(...i?[S+1]:[0,S]).reduce((m,E)=>m+(E.height||0)+p,0)},[t]);return $(()=>{t.forEach(o=>{if(o.dismissed)ee(o.id,o.removeDelay);else{let n=b.get(o.id);n&&(clearTimeout(n),b.delete(o.id))}})},[t]),{toasts:t,handlers:{updateHeight:K,startPause:X,endPause:s,calculateOffset:a}}};import*as l from\"react\";import{styled as B,keyframes as z}from\"goober\";import*as g from\"react\";import{styled as w,keyframes as me}from\"goober\";import{styled as te,keyframes as I}from\"goober\";var oe=I`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`,re=I`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`,se=I`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`,k=te(\"div\")`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${e=>e.primary||\"#ff4b4b\"};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${oe} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${re} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${e=>e.secondary||\"#fff\"};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${se} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;import{styled as ae,keyframes as ie}from\"goober\";var ne=ie`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`,V=ae(\"div\")`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${e=>e.secondary||\"#e0e0e0\"};\n border-right-color: ${e=>e.primary||\"#616161\"};\n animation: ${ne} 1s linear infinite;\n`;import{styled as ce,keyframes as N}from\"goober\";var pe=N`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`,de=N`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`,_=ce(\"div\")`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${e=>e.primary||\"#61d345\"};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${pe} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${de} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${e=>e.secondary||\"#fff\"};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;var ue=w(\"div\")`\n position: absolute;\n`,le=w(\"div\")`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`,fe=me`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`,Te=w(\"div\")`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${fe} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`,M=({toast:e})=>{let{icon:t,type:r,iconTheme:s}=e;return t!==void 0?typeof t==\"string\"?g.createElement(Te,null,t):t:r===\"blank\"?null:g.createElement(le,null,g.createElement(V,{...s}),r!==\"loading\"&&g.createElement(ue,null,r===\"error\"?g.createElement(k,{...s}):g.createElement(_,{...s})))};var ye=e=>`\n0% {transform: translate3d(0,${e*-200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`,ge=e=>`\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${e*-150}%,-1px) scale(.6); opacity:0;}\n`,he=\"0%{opacity:0;} 100%{opacity:1;}\",xe=\"0%{opacity:1;} 100%{opacity:0;}\",be=B(\"div\")`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`,Se=B(\"div\")`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`,Ae=(e,t)=>{let s=e.includes(\"top\")?1:-1,[a,o]=A()?[he,xe]:[ye(s),ge(s)];return{animation:t?`${z(a)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${z(o)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},C=l.memo(({toast:e,position:t,style:r,children:s})=>{let a=e.height?Ae(e.position||t||\"top-center\",e.visible):{opacity:0},o=l.createElement(M,{toast:e}),n=l.createElement(Se,{...e.ariaProps},f(e.message,e));return l.createElement(be,{className:e.className,style:{...a,...r,...e.style}},typeof s==\"function\"?s({icon:o,message:n}):l.createElement(l.Fragment,null,o,n))});import{css as Pe,setup as Re}from\"goober\";import*as T from\"react\";Re(T.createElement);var ve=({id:e,className:t,style:r,onHeightUpdate:s,children:a})=>{let o=T.useCallback(n=>{if(n){let i=()=>{let p=n.getBoundingClientRect().height;s(e,p)};i(),new MutationObserver(i).observe(n,{subtree:!0,childList:!0,characterData:!0})}},[e,s]);return T.createElement(\"div\",{ref:o,className:t,style:r},a)},Ee=(e,t)=>{let r=e.includes(\"top\"),s=r?{top:0}:{bottom:0},a=e.includes(\"center\")?{justifyContent:\"center\"}:e.includes(\"right\")?{justifyContent:\"flex-end\"}:{};return{left:0,right:0,display:\"flex\",position:\"absolute\",transition:A()?void 0:\"all 230ms cubic-bezier(.21,1.02,.73,1)\",transform:`translateY(${t*(r?1:-1)}px)`,...s,...a}},De=Pe`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`,R=16,Oe=({reverseOrder:e,position:t=\"top-center\",toastOptions:r,gutter:s,children:a,containerStyle:o,containerClassName:n})=>{let{toasts:i,handlers:p}=O(r);return T.createElement(\"div\",{id:\"_rht_toaster\",style:{position:\"fixed\",zIndex:9999,top:R,left:R,right:R,bottom:R,pointerEvents:\"none\",...o},className:n,onMouseEnter:p.startPause,onMouseLeave:p.endPause},i.map(d=>{let h=d.position||t,v=p.calculateOffset(d,{reverseOrder:e,gutter:s,defaultPosition:t}),S=Ee(h,v);return T.createElement(ve,{id:d.id,key:d.id,onHeightUpdate:p.updateHeight,className:d.visible?De:\"\",style:S},d.type===\"custom\"?f(d.message,d):a?a(d):T.createElement(C,{toast:d,position:h}))}))};var Vt=c;export{_ as CheckmarkIcon,k as ErrorIcon,V as LoaderIcon,C as ToastBar,M as ToastIcon,Oe as Toaster,Vt as default,f as resolveValue,c as toast,O as useToaster,D as useToasterStore};\n//# sourceMappingURL=index.mjs.map","// English translations for ChatSDK\nexport default {\n // General\n send: 'Send',\n \n // Conversations\n conversations_title: 'Chats',\n no_conversations_title: 'No conversations yet',\n no_conversations_message: 'Start chatting with product owners to see conversations here',\n loading_conversations: 'Loading conversations...',\n error_load_conversations: 'Failed to load conversations',\n select_conversation: 'Select a conversation',\n select_conversation_message: 'Choose a conversation from the list to start chatting',\n select_conversation_tip: '💡 Tip: Click on any conversation in the sidebar to open it here',\n \n // Chat\n message_hint: 'Start typing a message',\n attach_file: 'Attach file',\n loading_messages: 'Loading messages...',\n \n // Messages\n file_sent_successfully: 'File uploaded and sent!',\n uploading: 'Uploading...',\n sent: 'Sent',\n read: 'Read',\n \n // Errors\n error_load_messages: 'Failed to load messages',\n error_send_message: 'Failed to send message',\n error_file_upload: 'Failed to upload file',\n error_unknown: 'Unknown error',\n error_user_blocked: 'Your account has been blocked by administrator',\n error_registration_failed: 'Registration failed. Please try again.',\n \n // Success messages\n login_successful: 'Login successful!',\n registration_successful: 'Registration and login successful!',\n complete_profile_info: 'Please complete your profile information.',\n \n // Block/Unblock\n block_user: 'Block User',\n unblock_user: 'Unblock',\n user_blocked: 'User blocked',\n user_unblocked: 'User unblocked',\n block_user_confirm: 'Are you sure you want to block this user?',\n unblock_user_confirm: 'Are you sure you want to unblock this user?',\n you_are_blocked: 'You have been blocked in this chat',\n you_have_blocked: 'You\\'ve blocked {{userName}}',\n you_have_blocked_submessage: 'You can\\'t message them in this chat, and you won\\'t receive their messages.',\n blocked_by_user: 'You have been blocked by {{userName}}',\n blocked_by_user_submessage: 'You can\\'t send messages in this chat.',\n user_is_blocked: 'This user is blocked in this chat',\n failed_to_block: 'Failed to block user',\n failed_to_unblock: 'Failed to unblock user',\n user_not_found: 'User not found',\n user_id_not_found: 'User ID not found',\n cannot_block_self: 'You cannot block yourself',\n \n // Additional UI strings\n loading: 'Loading...',\n unknown_user: 'Unknown User',\n image: 'Image',\n file: 'File',\n no_messages_yet: 'No messages yet',\n yesterday: 'Yesterday',\n unknown_size: 'Unknown size',\n download: 'Download',\n search: 'Search',\n back: 'Back',\n call: 'Call',\n options: 'Options',\n close: 'Close',\n no_phone_number: 'No phone number available',\n number_copied: 'Phone number copied to clipboard',\n no_search_results: 'No conversations found',\n\n // Demo app UI\n demo_title: 'ChatSDK Demo',\n welcome: 'Welcome',\n logout: 'Logout',\n products: 'Products',\n all_products: 'All Products',\n my_products: 'My Products',\n conversations: 'Conversations',\n sdk_tester: 'SDK Tester',\n sdk_tester_desc: 'SDK testing tools will be available here',\n loading_products: 'Loading products...',\n no_products_listed: \"You haven't listed any products yet.\",\n realtime_active: 'Real-time Chat Active',\n http_only: 'HTTP Only',\n failed_to_load_products: 'Failed to load products',\n failed_to_start_chat: 'Failed to start chat',\n cannot_chat_self: 'You cannot start a chat with yourself!',\n starting_chat: 'Starting chat with product owner...',\n chat_opened: 'Chat popup opened!',\n failed_init: 'Failed to initialize app',\n\n // Login / Registration\n login: 'Login',\n login_as: 'Login as',\n checking: 'Checking...',\n registering: 'Registering...',\n complete_registration: 'Complete Registration',\n back_to_login: 'Back to Login',\n quick_demo_login: 'Quick Demo Login (with sample conversations):',\n external_user_id: 'External User ID:',\n app_id_label: 'App ID:',\n full_name: 'Full Name:',\n email_label: 'Email:',\n welcome_demo: 'Welcome to the ChatSDK Demo Application',\n enter_user_id: 'Enter your user ID (e.g., user1)',\n enter_app_id: 'Enter app ID',\n enter_full_name: 'Enter your full name',\n enter_email: 'Enter your email',\n\n // Product card\n chat_with_owner: 'Chat with Owner',\n your_product: 'Your Product',\n owner_label: 'Owner:',\n};\n","// Arabic translations for ChatSDK\nexport default {\n // General\n send: 'إرسال',\n \n // Conversations\n conversations_title: 'الدردشة',\n no_conversations_title: 'لا توجد محادثات بعد',\n no_conversations_message: 'ابدأ الدردشة مع مالكي المنتجات لمشاهدة محادثاتك هنا',\n loading_conversations: 'جاري تحميل المحادثات...',\n error_load_conversations: 'فشل تحميل المحادثات',\n select_conversation: 'اختر محادثة',\n select_conversation_message: 'اختر محادثة من القائمة لبدء الدردشة',\n select_conversation_tip: '💡 نصيحة: انقر على أي محادثة في الشريط الجانبي لفتحها هنا',\n \n // Chat\n message_hint: 'اكتب رسالة هنا',\n attach_file: 'إرفاق ملف',\n loading_messages: 'جاري تحميل الرسائل...',\n \n // Messages\n file_sent_successfully: 'تم إرسال الملف بنجاح!',\n uploading: 'جاري الرفع...',\n sent: 'تم الإرسال',\n read: 'تم القراءة',\n \n // Errors\n error_load_messages: 'فشل تحميل الرسائل',\n error_send_message: 'فشل إرسال الرسالة',\n error_file_upload: 'فشل رفع الملف',\n error_unknown: 'خطأ غير معروف',\n error_user_blocked: 'تم حظر حسابك من قبل المسؤول',\n error_registration_failed: 'فشل التسجيل. يرجى المحاولة مرة أخرى.',\n \n // Success messages\n login_successful: 'تم تسجيل الدخول بنجاح!',\n registration_successful: 'تم التسجيل وتسجيل الدخول بنجاح!',\n complete_profile_info: 'يرجى إكمال معلومات ملفك الشخصي.',\n \n // Block/Unblock\n block_user: 'حظر المستخدم',\n unblock_user: 'إلغاء الحظر',\n user_blocked: 'تم حظر المستخدم',\n user_unblocked: 'تم إلغاء حظر المستخدم',\n block_user_confirm: 'هل أنت متأكد أنك تريد حظر هذا المستخدم؟',\n unblock_user_confirm: 'هل أنت متأكد أنك تريد إلغاء حظر هذا المستخدم؟',\n you_are_blocked: 'تم حظرك في هذه المحادثة',\n you_have_blocked: 'لقد قمت بحظر {{userName}}',\n you_have_blocked_submessage: 'لا يمكنك مراسلتهم في هذه المحادثة، ولن تتلقى رسائلهم.',\n blocked_by_user: 'تم حظرك من قبل {{userName}}',\n blocked_by_user_submessage: 'لا يمكنك إرسال الرسائل في هذه المحادثة.',\n user_is_blocked: 'هذا المستخدم محظور في هذه المحادثة',\n failed_to_block: 'فشل حظر المستخدم',\n failed_to_unblock: 'فشل إلغاء حظر المستخدم',\n user_not_found: 'المستخدم غير موجود',\n user_id_not_found: 'معرف المستخدم غير موجود',\n cannot_block_self: 'لا يمكنك حظر نفسك',\n \n // Additional UI strings\n loading: 'جاري التحميل...',\n unknown_user: 'مستخدم غير معروف',\n image: 'صورة',\n file: 'ملف',\n no_messages_yet: 'لا توجد رسائل بعد',\n yesterday: 'أمس',\n unknown_size: 'حجم غير معروف',\n download: 'تنزيل',\n search: 'بحث',\n back: 'رجوع',\n call: 'اتصال',\n options: 'خيارات',\n close: 'إغلاق',\n no_phone_number: 'لا يوجد رقم هاتف متاح',\n number_copied: 'تم نسخ رقم الهاتف',\n no_search_results: 'لم يتم العثور على محادثات',\n\n // Demo app UI\n demo_title: 'عرض ChatSDK',\n welcome: 'مرحبًا',\n logout: 'تسجيل الخروج',\n products: 'المنتجات',\n all_products: 'كل المنتجات',\n my_products: 'منتجاتي',\n conversations: 'المحادثات',\n sdk_tester: 'اختبار SDK',\n sdk_tester_desc: 'ستتوفر أدوات اختبار SDK هنا',\n loading_products: 'جاري تحميل المنتجات...',\n no_products_listed: 'لم تقم بنشر أي منتجات بعد.',\n realtime_active: 'الدردشة المباشرة نشطة',\n http_only: 'HTTP فقط',\n failed_to_load_products: 'فشل تحميل المنتجات',\n failed_to_start_chat: 'فشل بدء الدردشة',\n cannot_chat_self: 'لا يمكنك بدء محادثة مع نفسك!',\n starting_chat: 'جاري بدء الدردشة مع مالك المنتج...',\n chat_opened: 'تم فتح نافذة الدردشة!',\n failed_init: 'فشل تهيئة التطبيق',\n\n // Login / Registration\n login: 'تسجيل الدخول',\n login_as: 'تسجيل الدخول كـ',\n checking: 'جاري التحقق...',\n registering: 'جاري التسجيل...',\n complete_registration: 'إكمال التسجيل',\n back_to_login: 'العودة لتسجيل الدخول',\n quick_demo_login: 'تسجيل دخول سريع (مع محادثات تجريبية):',\n external_user_id: 'معرف المستخدم الخارجي:',\n app_id_label: 'معرف التطبيق:',\n full_name: 'الاسم الكامل:',\n email_label: 'البريد الإلكتروني:',\n welcome_demo: 'مرحبًا بك في تطبيق عرض ChatSDK',\n enter_user_id: 'أدخل معرف المستخدم (مثل user1)',\n enter_app_id: 'أدخل معرف التطبيق',\n enter_full_name: 'أدخل اسمك الكامل',\n enter_email: 'أدخل بريدك الإلكتروني',\n\n // Product card\n chat_with_owner: 'الدردشة مع المالك',\n your_product: 'منتجك',\n owner_label: 'المالك:',\n};\n","// i18n utility for ChatSDK\nimport en from './locales/en';\nimport ar from './locales/ar';\n\nconst locales = {\n en,\n ar,\n};\n\ntype Locale = keyof typeof locales;\ntype TranslationKey = keyof typeof en;\n\nlet currentLocale: Locale = 'en';\n\n/**\n * Set the current language for the SDK\n * @param locale - Language code ('en' or 'ar')\n */\nexport const changeLanguage = (locale: string) => {\n if (locales[locale as Locale]) {\n currentLocale = locale as Locale;\n document.documentElement.lang = locale;\n document.documentElement.dir = isRTL() ? 'rtl' : 'ltr';\n // Store preference in localStorage\n localStorage.setItem('chatSDK_language', locale);\n } else {\n console.warn(`Locale \"${locale}\" not found, falling back to \"en\".`);\n currentLocale = 'en';\n document.documentElement.lang = 'en';\n document.documentElement.dir = 'ltr';\n }\n};\n\n/**\n * Get the current language code\n * @returns Current language code ('en' or 'ar')\n */\nexport const getCurrentLanguage = (): string => currentLocale;\n\n/**\n * Check if current language is RTL\n * @returns true if RTL language (Arabic), false otherwise\n */\nexport const isRTL = (): boolean => currentLocale === 'ar';\n\n/**\n * Translate a key to the current language\n * @param key - Translation key\n * @param replacements - Optional placeholder replacements\n * @returns Translated string\n */\nexport const t = (key: TranslationKey, replacements?: Record<string, string | number>): string => {\n let translation = locales[currentLocale][key] || locales['en'][key] || key;\n\n if (replacements) {\n for (const placeholder in replacements) {\n translation = translation.replace(\n new RegExp(`{{${placeholder}}}`, 'g'),\n String(replacements[placeholder])\n );\n }\n }\n return translation;\n};\n\n// Initialize with stored language or default\nconst storedLanguage = localStorage.getItem('chatSDK_language');\nif (storedLanguage) {\n changeLanguage(storedLanguage);\n} else {\n changeLanguage('en');\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { Message, Conversation, User } from '../types';\nimport { ChatSDK } from '../ChatSDK';\nimport toast from 'react-hot-toast';\nimport { t } from '../i18n';\n\nexport interface ChatWindowProps {\n conversation: Conversation | null;\n currentUser: User;\n onClose?: () => void;\n onBack?: () => void;\n}\n\nconst ChatWindow: React.FC<ChatWindowProps> = ({ conversation, currentUser, onClose, onBack }) => {\n const [messages, setMessages] = useState<Message[]>([]);\n const [newMessage, setNewMessage] = useState('');\n const [loading, setLoading] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState<{ [key: string]: number }>({});\n const [loadingMore, setLoadingMore] = useState(false);\n const [hasMoreMessages, setHasMoreMessages] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [blockStatus, setBlockStatus] = useState<any>(null);\n const [isBlocked, setIsBlocked] = useState(false);\n const [hasBlockedOther, setHasBlockedOther] = useState(false);\n const [showOptionsMenu, setShowOptionsMenu] = useState(false);\n const [stickyDate, setStickyDate] = useState<string | null>(null);\n const [stickyDateVisible, setStickyDateVisible] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const chatMessagesRef = useRef<HTMLDivElement>(null);\n const stickyDateTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n \n const MESSAGES_PER_PAGE = 20;\n\n // Get other participant\n const getOtherParticipant = useCallback(() => {\n if (!conversation || !currentUser) return null;\n \n const participants = conversation.participants || [];\n if (participants.length === 0) return null;\n \n const currentUserId = currentUser.id || (currentUser as any).userId;\n const currentUserExternalId = currentUser.externalUserId || (currentUser as any).external_user_id;\n \n return participants.find((p: any) => {\n const pId = p.id || p.userId;\n const pExternalId = p.externalUserId || p.external_user_id;\n const isSameById = currentUserId && pId && pId === currentUserId;\n const isSameByExternalId = currentUserExternalId && pExternalId && pExternalId === currentUserExternalId;\n return !(isSameById || isSameByExternalId) && (pId || pExternalId);\n }) || null;\n }, [conversation, currentUser]);\n\n const otherParticipant = getOtherParticipant();\n\n // Header info\n const getChatHeaderInfo = useCallback(() => {\n if (!conversation) return { userName: t('conversations_title'), productName: null, productImage: null, productMetadata: null };\n \n const userName = otherParticipant \n ? ((otherParticipant as any).name || \n (otherParticipant as any).userName || \n (otherParticipant as any).displayName ||\n (otherParticipant as any).externalUserId ||\n t('unknown_user'))\n : t('unknown_user');\n \n const productContext = conversation.productContext || (conversation as any).product_context;\n if (productContext) {\n return {\n userName,\n productName: productContext.productName || productContext.product_name,\n productImage: productContext.productImage || productContext.product_image,\n productId: productContext.productId || productContext.product_id,\n productMetadata: productContext.productMetadata || productContext.product_metadata\n };\n }\n \n return { userName, productName: null, productImage: null, productMetadata: null };\n }, [conversation, otherParticipant]);\n\n const headerInfo = getChatHeaderInfo();\n\n // Conversation lifecycle\n useEffect(() => {\n if (conversation) {\n setShowOptionsMenu(false);\n loadMessages(1, false);\n joinChatRoom();\n \n const sdk = ChatSDK.getInstance();\n sdk.chatUsers.startViewingConversation(conversation.id);\n }\n\n return () => {\n if (conversation) {\n leaveChatRoom();\n const sdk = ChatSDK.getInstance();\n sdk.chatUsers.stopViewingConversation(conversation.id);\n }\n };\n }, [conversation]);\n\n // Real-time message listening\n useEffect(() => {\n const sdk = ChatSDK.getInstance();\n \n const handleNewMessage = (data: { message: any }) => {\n const message = data.message;\n \n if (message.roomId === conversation?.id) {\n setMessages(prev => {\n const messageExists = prev.some(m => m.id === message.id);\n if (!messageExists) {\n if (message.senderId !== currentUser.id) {\n sdk.chatUsers.markMessageRead(message.id).catch(error => {\n console.warn('ChatWindow: Failed to mark message as read:', error);\n });\n }\n \n return [...prev, {\n id: message.id,\n content: message.content,\n senderId: message.senderId,\n senderName: message.senderName,\n timestamp: message.createdAt || message.timestamp,\n conversationId: message.roomId,\n type: message.messageType || message.type || 'text',\n metadata: message.metadata || undefined,\n isRead: message.isRead !== undefined ? message.isRead : (message.senderId === currentUser.id ? false : true),\n isDelivered: message.isDelivered !== undefined ? message.isDelivered : true,\n status: message.status || 'sent'\n }];\n }\n return prev;\n });\n }\n };\n\n const handleReadReceipt = (data: { messageId: string; roomId: string; isRead: boolean }) => {\n if (!data.messageId || data.roomId !== conversation?.id) return;\n setMessages(prev => prev.map(msg => \n msg.id === data.messageId && msg.senderId === currentUser.id\n ? { ...msg, isRead: data.isRead }\n : msg\n ));\n };\n\n const handleReadReceipts = (data: { roomId: string; messageIds: string[]; isRead: boolean }) => {\n if (data.roomId !== conversation?.id) return;\n const currentUserId = currentUser?.id;\n \n if (!data.messageIds || data.messageIds.length === 0) {\n setMessages(prev => prev.map(msg => {\n if (msg.senderId === currentUserId && !msg.isRead) {\n return { ...msg, isRead: data.isRead };\n }\n return msg;\n }));\n return;\n }\n \n const messageIdSet = new Set(data.messageIds);\n setMessages(prev => prev.map(msg => {\n if (messageIdSet.has(msg.id) && msg.senderId === currentUserId) {\n return { ...msg, isRead: data.isRead };\n }\n return msg;\n }));\n };\n\n const handleRealtimeBlockStatus = (payload: any) => {\n if (!conversation) return;\n const payloadConversationId = payload?.conversationId || payload?.chatId || payload?.roomId;\n if (payloadConversationId !== conversation.id) return;\n\n const blockedUsers = payload?.blockedUsers || {};\n conversation.metadata = {\n ...(conversation.metadata || {}),\n blockedUsers\n };\n\n const currentUserId = currentUser.id || (currentUser as any).userId;\n const other = getOtherParticipant();\n const otherUserId = other\n ? ((other as any).id || (other as any).userId || (other as any).externalUserId || (other as any).external_user_id)\n : null;\n\n setIsBlocked(blockedUsers[currentUserId] === 1);\n setHasBlockedOther(otherUserId ? blockedUsers[otherUserId] === 1 : false);\n };\n\n sdk.events.on('message.received', handleNewMessage);\n sdk.events.on('message.read.receipt', handleReadReceipt);\n sdk.events.on('messages.read.receipt', handleReadReceipts);\n sdk.events.on('conversation.block_status', handleRealtimeBlockStatus);\n \n return () => {\n sdk.events.off('message.received', handleNewMessage);\n sdk.events.off('message.read.receipt', handleReadReceipt);\n sdk.events.off('messages.read.receipt', handleReadReceipts);\n sdk.events.off('conversation.block_status', handleRealtimeBlockStatus);\n };\n }, [conversation?.id, currentUser?.id]);\n\n // Block status from conversation metadata\n useEffect(() => {\n if (!conversation || !currentUser) {\n setIsBlocked(false);\n setHasBlockedOther(false);\n setBlockStatus(null);\n return;\n }\n \n const metadata = conversation.metadata || {};\n const blockedUsers = metadata.blockedUsers || {};\n const currentUserId = currentUser.id || (currentUser as any).userId;\n const other = getOtherParticipant();\n const otherUserId = other ? ((other as any).id || (other as any).userId || (other as any).externalUserId || (other as any).external_user_id) : null;\n \n setIsBlocked(blockedUsers[currentUserId] === 1);\n setHasBlockedOther(otherUserId ? (blockedUsers[otherUserId] === 1) : false);\n setBlockStatus({\n chatId: conversation.id,\n currentUserId,\n isBlockedByOther: blockedUsers[currentUserId] === 1,\n usersBlockedByMe: Object.keys(blockedUsers).filter((userId: string) => blockedUsers[userId] === 1),\n blockedUsers\n });\n }, [conversation?.id, JSON.stringify(conversation?.metadata), currentUser?.id]);\n\n // Scroll to bottom on new messages\n useEffect(() => {\n scrollToBottom();\n }, [messages]);\n\n // Close options menu on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.chat-options-wrapper')) {\n setShowOptionsMenu(false);\n }\n };\n document.addEventListener('click', handleClick);\n return () => {\n document.removeEventListener('click', handleClick);\n if (stickyDateTimeoutRef.current) clearTimeout(stickyDateTimeoutRef.current);\n };\n }, []);\n\n const joinChatRoom = () => {\n if (conversation) {\n const sdk = ChatSDK.getInstance();\n sdk.socket.joinRoom(conversation.id);\n }\n };\n\n const leaveChatRoom = () => {\n if (conversation) {\n const sdk = ChatSDK.getInstance();\n sdk.socket.leaveRoom(conversation.id);\n }\n };\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n const formatTime = (timestamp: string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n };\n\n const formatDateDivider = (timestamp: string) => {\n const date = new Date(timestamp);\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const msgDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const diffDays = Math.floor((today.getTime() - msgDate.getTime()) / (1000 * 60 * 60 * 24));\n \n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n \n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n \n if (diffDays < 7) return `${days[date.getDay()]}, ${day}/${month}`;\n return `${day}/${month}/${date.getFullYear()}`;\n };\n\n const shouldShowDateDivider = (message: Message, index: number): boolean => {\n if (index === 0) return true;\n const prevMessage = messages[index - 1];\n const prevDate = new Date(prevMessage.timestamp).toDateString();\n const currDate = new Date(message.timestamp).toDateString();\n return prevDate !== currDate;\n };\n\n const getFileIcon = (mimeType?: string) => {\n if (!mimeType) return '📎';\n if (mimeType.includes('pdf')) return '📄';\n if (mimeType.includes('word')) return '📝';\n if (mimeType.includes('excel')) return '📊';\n if (mimeType.includes('audio')) return '🎵';\n if (mimeType.includes('video')) return '🎥';\n return '📎';\n };\n\n // Sticky date header on scroll\n const handleMessagesScroll = () => {\n if (!chatMessagesRef.current) return;\n\n const container = chatMessagesRef.current;\n const dividers = container.querySelectorAll('.date-divider[data-date]');\n \n if (dividers.length === 0) return;\n\n let currentDate: string | null = null;\n const containerTop = container.getBoundingClientRect().top;\n\n for (let i = dividers.length - 1; i >= 0; i--) {\n const divider = dividers[i] as HTMLElement;\n const dividerTop = divider.getBoundingClientRect().top;\n \n if (dividerTop <= containerTop + 50) {\n currentDate = divider.getAttribute('data-date');\n break;\n }\n }\n\n if (!currentDate && messages.length > 0) {\n currentDate = formatDateDivider(messages[0].timestamp);\n }\n\n if (currentDate) {\n setStickyDate(currentDate);\n setStickyDateVisible(true);\n\n if (stickyDateTimeoutRef.current) clearTimeout(stickyDateTimeoutRef.current);\n stickyDateTimeoutRef.current = setTimeout(() => {\n setStickyDateVisible(false);\n }, 2000);\n }\n };\n\n // Call user - web copies number, mobile opens dialer\n const handleCallUser = () => {\n if (!otherParticipant) return;\n \n const other = otherParticipant as any;\n const phoneNumber = other.phone || other.phoneNumber || other.mobile || other.externalUserId || '';\n \n if (!phoneNumber) {\n toast.error(t('no_phone_number') || 'No phone number available');\n return;\n }\n \n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n \n if (isMobile) {\n window.location.href = `tel:${phoneNumber}`;\n } else {\n navigator.clipboard.writeText(phoneNumber).then(() => {\n toast.success(t('number_copied') || `Phone number copied: ${phoneNumber}`);\n }).catch(() => {\n const textArea = document.createElement('textarea');\n textArea.value = phoneNumber;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n toast.success(t('number_copied') || `Phone number copied: ${phoneNumber}`);\n });\n }\n };\n\n const loadMessages = async (page: number = 1, append: boolean = false) => {\n if (!conversation) return;\n \n if (page === 1) {\n setLoading(true);\n setMessages([]);\n setCurrentPage(1);\n setHasMoreMessages(true);\n } else {\n setLoadingMore(true);\n }\n \n try {\n const sdk = ChatSDK.getInstance();\n const fetchedMessages = await sdk.messages.getMessages({\n conversationId: conversation.id,\n limit: MESSAGES_PER_PAGE,\n offset: (page - 1) * MESSAGES_PER_PAGE\n });\n \n const sortedMessages = fetchedMessages.sort((a: Message, b: Message) => \n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n \n if (append && page > 1) {\n setMessages(prev => [...sortedMessages, ...prev]);\n } else {\n setMessages(sortedMessages);\n }\n \n setHasMoreMessages(fetchedMessages.length === MESSAGES_PER_PAGE);\n setCurrentPage(page);\n \n } catch (error) {\n toast.error(t('error_load_messages'));\n } finally {\n setLoading(false);\n setLoadingMore(false);\n }\n };\n\n const sendMessage = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!conversation || !newMessage.trim() || isBlocked) {\n if (isBlocked) {\n toast.error(t('you_are_blocked'));\n }\n return;\n }\n\n const messageContent = newMessage.trim();\n setNewMessage('');\n\n try {\n const sdk = ChatSDK.getInstance();\n await sdk.messages.sendMessage(conversation.id, messageContent);\n } catch (error) {\n setNewMessage(messageContent);\n toast.error(t('error_send_message'));\n }\n };\n\n const handleFileUpload = async (file: File) => {\n if (!conversation) return;\n\n const tempMessageId = `temp_${Date.now()}`;\n \n const placeholderMessage: Message = {\n id: tempMessageId,\n conversationId: conversation.id,\n senderId: currentUser.id,\n senderName: currentUser.name,\n content: `${file.name}`,\n type: file.type.startsWith('image/') ? 'image' : 'file',\n timestamp: new Date().toISOString(),\n status: 'sending',\n isRead: false,\n isDelivered: false,\n isUploading: true,\n uploadProgress: 0,\n localFileUri: URL.createObjectURL(file),\n metadata: {\n fileName: file.name,\n fileSize: file.size,\n mimeType: file.type\n }\n };\n\n setMessages(prev => [...prev, placeholderMessage]);\n setUploadProgress(prev => ({ ...prev, [tempMessageId]: 0 }));\n\n try {\n setUploading(true);\n \n const sdk = ChatSDK.getInstance();\n const mediaType = sdk.media.getFileTypeCategory(file.type);\n \n const uploadResult = await sdk.media.uploadMedia({\n file,\n type: mediaType,\n conversationId: conversation.id,\n onProgress: (progress) => {\n setUploadProgress(prev => ({ ...prev, [tempMessageId]: progress }));\n setMessages(prev => prev.map(msg => \n msg.id === tempMessageId \n ? { ...msg, uploadProgress: progress }\n : msg\n ));\n }\n });\n\n setUploadProgress(prev => ({ ...prev, [tempMessageId]: 100 }));\n \n const messageType = mediaType === 'document' ? 'file' : (mediaType === 'image' ? 'image' : 'file');\n const attachmentMetadata = {\n fileUrl: uploadResult.fileUrl,\n fileName: uploadResult.fileName,\n fileSize: uploadResult.fileSize,\n mimeType: uploadResult.mimeType || file.type\n };\n \n await sdk.messages.sendMessageWithOptions({\n conversationId: conversation.id,\n content: `${file.name}`,\n type: messageType,\n metadata: attachmentMetadata\n });\n\n setTimeout(() => {\n setMessages(prev => prev.filter(msg => msg.id !== tempMessageId));\n setUploadProgress(prev => {\n const newProgress = { ...prev };\n delete newProgress[tempMessageId];\n return newProgress;\n });\n }, 200);\n\n toast.success(t('file_sent_successfully'));\n\n } catch (error: any) {\n setMessages(prev => prev.filter(msg => msg.id !== tempMessageId));\n setUploadProgress(prev => {\n const newProgress = { ...prev };\n delete newProgress[tempMessageId];\n return newProgress;\n });\n toast.error(t('error_file_upload') + ': ' + (error.message || t('error_unknown')));\n } finally {\n setUploading(false);\n }\n };\n\n const handleBlockUser = async () => {\n setShowOptionsMenu(false);\n if (!conversation || !currentUser) return;\n \n if (!window.confirm(t('block_user_confirm'))) return;\n \n try {\n const sdk = ChatSDK.getInstance();\n if (!otherParticipant) {\n toast.error(t('user_not_found'));\n return;\n }\n \n const currentUserId = currentUser.id || (currentUser as any).userId;\n const userIdToBlock = (otherParticipant as any).id || (otherParticipant as any).userId || \n (otherParticipant as any).externalUserId || (otherParticipant as any).external_user_id;\n if (!userIdToBlock) {\n toast.error(t('user_id_not_found'));\n return;\n }\n \n if (userIdToBlock === currentUserId) {\n toast.error(t('cannot_block_self'));\n return;\n }\n \n await sdk.conversations.blockUserInChat(conversation.id, userIdToBlock);\n \n const metadata = conversation.metadata || {};\n const blockedUsers = metadata.blockedUsers || {};\n blockedUsers[userIdToBlock] = 1;\n \n if (conversation) {\n conversation.metadata = { ...metadata, blockedUsers };\n }\n \n setHasBlockedOther(true);\n toast.success(t('user_blocked'));\n } catch (error) {\n toast.error(t('failed_to_block'));\n }\n };\n\n const handleUnblockUser = async () => {\n setShowOptionsMenu(false);\n if (!conversation || !currentUser) return;\n \n if (!window.confirm(t('unblock_user_confirm'))) return;\n \n try {\n const sdk = ChatSDK.getInstance();\n if (!otherParticipant) {\n toast.error(t('user_not_found'));\n return;\n }\n \n const userIdToUnblock = (otherParticipant as any).id || (otherParticipant as any).userId || \n (otherParticipant as any).externalUserId || (otherParticipant as any).external_user_id;\n if (!userIdToUnblock) {\n toast.error(t('user_id_not_found'));\n return;\n }\n \n await sdk.conversations.unblockUserInChat(conversation.id, userIdToUnblock);\n \n const metadata = conversation.metadata || {};\n const blockedUsers = metadata.blockedUsers || {};\n delete blockedUsers[userIdToUnblock];\n \n if (conversation) {\n conversation.metadata = { ...metadata, blockedUsers };\n }\n \n setHasBlockedOther(false);\n toast.success(t('user_unblocked'));\n } catch (error) {\n toast.error(t('failed_to_unblock'));\n }\n };\n\n // Loading state\n if (loading && messages.length === 0) {\n return (\n <div className=\"chat-window\">\n <div className=\"chat-header\">\n <div className=\"chat-header-left\">\n <h3 style={{ margin: 0 }}>{t('loading')}</h3>\n </div>\n <div className=\"chat-header-actions\">\n {onClose && <button onClick={onClose} className=\"close-button\">&times;</button>}\n </div>\n </div>\n <div className=\"loading-messages\">{t('loading_messages')}</div>\n </div>\n );\n }\n\n return (\n <div className=\"chat-window\">\n {/* Chat Header */}\n <div className=\"chat-header\">\n <div className=\"chat-header-left\">\n {/* Back button (visible on mobile) */}\n {onBack && (\n <button className=\"chat-back-btn\" onClick={onBack} title={t('back') || 'Back'}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"/>\n </svg>\n </button>\n )}\n\n <div className=\"chat-header-avatar\">\n <div className=\"avatar-placeholder\">\n {headerInfo.userName ? headerInfo.userName.charAt(0).toUpperCase() : '?'}\n </div>\n </div>\n <div className=\"chat-header-info\">\n <h3 className=\"chat-participant-name\">{headerInfo.userName}</h3>\n </div>\n </div>\n\n <div className=\"chat-header-actions\">\n {/* Call Button */}\n {otherParticipant && (\n <button onClick={handleCallUser} className=\"chat-action-btn\" title={t('call') || 'Call'}>\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/>\n </svg>\n </button>\n )}\n\n {/* Close/Minimize button */}\n {onClose && (\n <button onClick={onClose} className=\"chat-action-btn\" title={t('close') || 'Close'}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7\"/>\n </svg>\n </button>\n )}\n\n {/* Options Menu */}\n {conversation && otherParticipant && (\n <div className=\"chat-options-wrapper\">\n <button onClick={() => setShowOptionsMenu(!showOptionsMenu)} className=\"chat-action-btn\" title={t('options') || 'Options'}>\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"5\" r=\"2\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2\"/>\n <circle cx=\"12\" cy=\"19\" r=\"2\"/>\n </svg>\n </button>\n {showOptionsMenu && (\n <div className=\"chat-options-menu\">\n {!isBlocked && !hasBlockedOther && (\n <button onClick={handleBlockUser} className=\"danger\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\"/></svg>\n {t('block_user')}\n </button>\n )}\n {hasBlockedOther && (\n <button onClick={handleUnblockUser}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M2 12h20\"/></svg>\n {t('unblock_user')}\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Product Context Bar */}\n {headerInfo.productName && (\n <div className=\"chat-product-bar\">\n {headerInfo.productImage && (\n <img src={headerInfo.productImage} alt={headerInfo.productName} />\n )}\n <div className=\"chat-product-bar-info\">\n <p className=\"chat-product-bar-name\">{headerInfo.productName}</p>\n {headerInfo.productMetadata?.price && (\n <p className=\"chat-product-bar-price\">\n {headerInfo.productMetadata.price} {headerInfo.productMetadata.currency || 'QAR'}\n </p>\n )}\n </div>\n </div>\n )}\n\n {/* Messages Area */}\n <div className=\"chat-messages\" ref={chatMessagesRef} onScroll={handleMessagesScroll} onClick={() => setShowOptionsMenu(false)}>\n {/* Sticky Date Header */}\n {stickyDate && !loading && messages.length > 0 && (\n <div className={`sticky-date-header ${stickyDateVisible ? 'sticky-date-visible' : ''}`}>\n <span className=\"sticky-date-pill\">{stickyDate}</span>\n </div>\n )}\n\n {loading ? (\n <div className=\"loading-messages\">{t('loading_messages')}</div>\n ) : (\n <>\n {messages.map((message, index) => (\n <React.Fragment key={message.id}>\n {/* Date Divider */}\n {shouldShowDateDivider(message, index) && (\n <div className=\"date-divider\" data-date={formatDateDivider(message.timestamp)}>\n <div className=\"date-divider-line\"></div>\n <span className=\"date-divider-text\">{formatDateDivider(message.timestamp)}</span>\n <div className=\"date-divider-line\"></div>\n </div>\n )}\n\n {/* Message Bubble */}\n <div className={`message ${message.senderId === currentUser.id ? 'sent' : 'received'}`}>\n <div className=\"message-content\">\n {/* Upload Progress Bar */}\n {message.isUploading && message.uploadProgress !== undefined && (\n <div className=\"upload-progress-bar\">\n <div className=\"upload-progress-fill\" style={{ width: `${message.uploadProgress}%` }} />\n </div>\n )}\n \n {/* Image Message */}\n {message.type === 'image' && (message.metadata?.fileUrl || message.localFileUri) ? (\n <div className=\"message-attachment image-attachment\">\n <img \n src={message.isUploading ? message.localFileUri : message.metadata?.fileUrl} \n alt={message.metadata?.fileName || t('image')}\n className={message.isUploading ? 'uploading-image' : ''}\n onClick={() => !message.isUploading && message.metadata?.fileUrl && window.open(message.metadata.fileUrl, '_blank')}\n />\n <div className=\"attachment-info\">\n {message.metadata?.fileName || t('image')}\n {message.metadata?.fileSize && (\n <span> &bull; {Math.round(message.metadata.fileSize / 1024)} KB</span>\n )}\n </div>\n </div>\n ) : message.type === 'file' && message.metadata?.fileUrl ? (\n /* File Message */\n <div className=\"message-attachment file-attachment\">\n <div className=\"file-info\">\n <div className=\"file-icon\">\n {getFileIcon(message.metadata?.mimeType)}\n </div>\n <div className=\"file-details\">\n <div className=\"file-name\">\n {message.metadata?.fileName || t('file')}\n </div>\n <div className=\"file-size\">\n {message.metadata?.fileSize ? \n `${Math.round(message.metadata.fileSize / 1024)} KB` : \n t('unknown_size')\n }\n </div>\n </div>\n </div>\n <a \n href={message.metadata?.fileUrl || '#'} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n className=\"download-btn\"\n >\n {t('download')}\n </a>\n </div>\n ) : (\n /* Text Message */\n message.content\n )}\n\n {/* Time & Read Status (inside bubble) */}\n <div className=\"message-footer\">\n <span className=\"message-time\">{formatTime(message.timestamp)}</span>\n {message.senderId === currentUser.id && (\n <span className=\"message-status\">\n <span className=\"read-status\">\n {message.isRead ? (\n <svg className=\"read-check is-read\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" width=\"20\" height=\"20\">\n <polyline points=\"1 13 5 17 11 9\"/>\n <polyline points=\"7 13 11 17 17 9\"/>\n </svg>\n ) : (\n <svg className=\"read-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" width=\"20\" height=\"20\">\n <polyline points=\"4 13 8 17 16 9\"/>\n </svg>\n )}\n </span>\n </span>\n )}\n </div>\n </div>\n </div>\n </React.Fragment>\n ))}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Blocking UI - User has blocked other */}\n {hasBlockedOther && (\n <div className=\"blocked-ui blocked-by-me\">\n <div className=\"blocked-title\">\n {t('you_have_blocked', { userName: headerInfo.userName || t('unknown_user') })}\n </div>\n <div className=\"blocked-message\">\n {t('you_have_blocked_submessage')}\n </div>\n <button onClick={handleUnblockUser} className=\"unblock-btn\">\n {t('unblock_user')}\n </button>\n </div>\n )}\n\n {/* Blocked UI - User is blocked */}\n {isBlocked && !hasBlockedOther && (\n <div className=\"blocked-ui blocked-by-other\">\n <div className=\"blocked-title\">\n {t('blocked_by_user', { userName: headerInfo.userName || t('unknown_user') })}\n </div>\n <div className=\"blocked-message\">\n {t('blocked_by_user_submessage')}\n </div>\n </div>\n )}\n\n {/* Message Input Form */}\n {!hasBlockedOther && !isBlocked && (\n <form onSubmit={sendMessage} className=\"chat-input\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || uploading || isBlocked}\n className=\"attachment-btn\"\n title={t('attach_file')}\n >\n {uploading ? (\n <span>&#8987;</span>\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/>\n </svg>\n )}\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n style={{ display: 'none' }}\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n handleFileUpload(file);\n e.target.value = '';\n }\n }}\n />\n <input\n type=\"text\"\n value={newMessage}\n onChange={(e) => setNewMessage(e.target.value)}\n placeholder={isBlocked ? t('you_are_blocked') : (uploading ? t('uploading') : t('message_hint'))}\n disabled={loading || uploading || isBlocked}\n />\n <button type=\"submit\" disabled={!newMessage.trim() || loading || uploading || isBlocked} className=\"send-btn\">\n {uploading ? t('uploading') : t('send')}\n </button>\n </form>\n )}\n </div>\n );\n};\n\nexport default ChatWindow;\n","import React from 'react';\nimport OriginalChatWindow from '@source/components/ChatWindow';\nimport type { ChatWindowProps } from '@source/components/ChatWindow';\n\nexport type { ChatWindowProps };\n\nconst ChatWindow: React.FC<ChatWindowProps> = (props) => (\n <div className=\"chatsdk-root\">\n <OriginalChatWindow {...props} />\n </div>\n);\n\nexport default ChatWindow;\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Conversation, User } from '../types';\nimport { ChatSDK } from '../ChatSDK';\nimport toast from 'react-hot-toast';\nimport { t } from '../i18n';\n\nexport interface ConversationListProps {\n currentUser: User;\n onSelectConversation: (conversation: Conversation) => void;\n selectedConversationId?: string;\n}\n\nconst ConversationList: React.FC<ConversationListProps> = ({ \n currentUser, \n onSelectConversation, \n selectedConversationId \n}) => {\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [loading, setLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const selectedConversationIdRef = useRef<string | undefined>(selectedConversationId);\n const currentUserIdRef = useRef<string>(currentUser.id);\n\n useEffect(() => {\n selectedConversationIdRef.current = selectedConversationId;\n }, [selectedConversationId]);\n\n useEffect(() => {\n currentUserIdRef.current = currentUser.id;\n }, [currentUser.id]);\n\n useEffect(() => {\n loadConversations();\n }, []);\n\n useEffect(() => {\n if (currentUser) {\n setConversations([]);\n loadConversations();\n }\n }, [currentUser.id]);\n\n useEffect(() => {\n const sdk = ChatSDK.getInstance();\n \n const handleNewMessage = (data: { message: any }) => {\n const message = data.message;\n const conversationId = message.roomId || message.conversationId;\n \n setConversations(prev => \n prev.map(conv => {\n if (conv.id === conversationId) {\n const isNotSender = message.senderId !== currentUserIdRef.current;\n const isNotCurrentlyViewing = selectedConversationIdRef.current !== conversationId;\n const shouldIncreaseUnread = isNotSender && isNotCurrentlyViewing;\n \n return {\n ...conv,\n lastMessage: message,\n unreadCount: shouldIncreaseUnread ? conv.unreadCount + 1 : conv.unreadCount\n };\n }\n return conv;\n }).sort((a, b) => {\n const aTime = a.lastMessage?.timestamp || a.createdAt;\n const bTime = b.lastMessage?.timestamp || b.createdAt;\n return new Date(bTime).getTime() - new Date(aTime).getTime();\n })\n );\n \n if (message.senderId !== currentUserIdRef.current && selectedConversationIdRef.current === conversationId) {\n const sdk = ChatSDK.getInstance();\n sdk.chatUsers.markMessageRead(message.id).then(() => {\n setConversations(prev => \n prev.map(conv => \n conv.id === conversationId ? { ...conv, unreadCount: 0 } : conv\n )\n );\n }).catch(error => {\n console.warn('Failed to auto-mark message as read:', error);\n });\n }\n };\n\n const handleConversationUpdate = (data: { conversationId?: string; conversation?: any; lastMessage?: any }) => {\n const updatedConversationId = data.conversationId || data.conversation?.id || data.conversation?.conversationId;\n if (!updatedConversationId) return;\n\n const payloadLastMessage = data.lastMessage || data.conversation?.lastMessage;\n const payloadUnreadCount = data.conversation?.unreadCount;\n\n setConversations(prev => {\n const conversationExists = prev.some(c => c.id === updatedConversationId);\n \n if (!conversationExists) {\n loadConversations();\n return prev;\n }\n \n return prev\n .map(conv => {\n if (conv.id !== updatedConversationId) return conv;\n\n const isOpen = selectedConversationIdRef.current === updatedConversationId;\n const myUserId = currentUserIdRef.current;\n\n if (typeof payloadUnreadCount === 'number') {\n return {\n ...conv,\n lastMessage: payloadLastMessage || conv.lastMessage,\n unreadCount: isOpen ? 0 : payloadUnreadCount,\n } as Conversation;\n }\n\n const fromOtherUser = payloadLastMessage?.senderId && payloadLastMessage.senderId !== myUserId;\n const shouldIncrease = Boolean(payloadLastMessage) && fromOtherUser && !isOpen;\n\n return {\n ...conv,\n lastMessage: payloadLastMessage || conv.lastMessage,\n unreadCount: isOpen ? 0 : (shouldIncrease ? conv.unreadCount + 1 : conv.unreadCount),\n } as Conversation;\n })\n .sort((a, b) => {\n const aTime = a.lastMessage?.timestamp || a.createdAt;\n const bTime = b.lastMessage?.timestamp || b.createdAt;\n return new Date(bTime).getTime() - new Date(aTime).getTime();\n });\n });\n };\n\n const handleConversationRead = (data: { conversationId?: string; roomId?: string; markedCount?: number }) => {\n const id = data.conversationId || data.roomId;\n if (!id) return;\n setConversations(prev => \n prev.map(conv => \n conv.id === id ? { ...conv, unreadCount: 0 } : conv\n )\n );\n };\n\n const handleAutoMarkedRead = (data: { roomId?: string; conversationId?: string; markedAsReadCount?: number }) => {\n const id = data.roomId || data.conversationId;\n if (!id) return;\n setConversations(prev => \n prev.map(conv => \n conv.id === id ? { ...conv, unreadCount: 0 } : conv\n )\n );\n };\n\n sdk.events.on('message.received', handleNewMessage);\n sdk.events.on('conversation.updated', handleConversationUpdate);\n sdk.events.on('conversation.read', handleConversationRead);\n \n if (sdk.socket?.isConnected()) {\n sdk.socket.on('auto_marked_read', handleAutoMarkedRead);\n sdk.socket.on('room_marked_read', handleConversationRead);\n }\n \n return () => {\n sdk.events.off('message.received', handleNewMessage);\n sdk.events.off('conversation.updated', handleConversationUpdate);\n sdk.events.off('conversation.read', handleConversationRead);\n \n if (sdk.socket?.isConnected()) {\n sdk.socket.off('auto_marked_read', handleAutoMarkedRead);\n sdk.socket.off('room_marked_read', handleConversationRead);\n }\n };\n }, []);\n\n const handleSelectConversation = async (conversation: Conversation) => {\n try {\n if (conversation.unreadCount > 0) {\n const sdk = ChatSDK.getInstance();\n await sdk.chatUsers.markRoomMessagesRead(conversation.id);\n sdk.chatUsers.startViewingConversation(conversation.id);\n }\n onSelectConversation(conversation);\n } catch (error) {\n console.error('Failed to mark conversation as read:', error);\n onSelectConversation(conversation);\n }\n };\n\n const loadConversations = async () => {\n setLoading(true);\n try {\n const sdk = ChatSDK.getInstance();\n const result = await sdk.chatUsers.getConversations();\n let fetchedConversations = result;\n \n if (result && typeof result === 'object' && !Array.isArray(result)) {\n fetchedConversations = (result as any).conversations || (result as any).data || [];\n }\n \n setConversations(Array.isArray(fetchedConversations) ? fetchedConversations : []);\n } catch (error) {\n toast.error(t('error_load_conversations'));\n } finally {\n setLoading(false);\n }\n };\n\n const getOtherParticipant = (conversation: Conversation) => {\n return conversation.participants.find((p: User) => p.id !== currentUser.id);\n };\n\n const getOtherParticipantName = (conversation: Conversation) => {\n const otherParticipant = getOtherParticipant(conversation);\n return otherParticipant?.name || t('unknown_user');\n };\n\n const getLastMessageText = (conversation: Conversation) => {\n return conversation.lastMessage?.content || t('no_messages_yet');\n };\n\n const formatTime = (timestamp: string) => {\n const date = new Date(timestamp);\n const now = new Date();\n const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60);\n const diffInDays = diffInHours / 24;\n \n if (diffInHours < 24) {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n } else if (diffInDays < 7) {\n const dayNum = Math.floor(diffInDays);\n return `${dayNum}d ago`;\n } else {\n const day = date.getDate();\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${day} ${months[date.getMonth()]}`;\n }\n };\n\n // Filtered conversations based on search query\n const filteredConversations = searchQuery.trim()\n ? conversations.filter(conv => {\n const query = searchQuery.toLowerCase().trim();\n const name = getOtherParticipantName(conv).toLowerCase();\n const product = conv.productContext?.productName?.toLowerCase() || '';\n const lastMsg = getLastMessageText(conv).toLowerCase();\n return name.includes(query) || product.includes(query) || lastMsg.includes(query);\n })\n : conversations;\n\n if (loading) {\n return (\n <div className=\"conversation-list loading\">\n <div className=\"loading-spinner\">{t('loading_conversations')}</div>\n </div>\n );\n }\n\n return (\n <div className=\"conversation-list\">\n <div className=\"conversation-list-header\">\n <h3>{t('conversations_title')}</h3>\n </div>\n\n {/* Search Bar */}\n <div className=\"conversation-search\">\n <div className=\"conversation-search-input\">\n <span className=\"search-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n </svg>\n </span>\n <input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n type=\"text\"\n placeholder={t('search') || 'Search'}\n />\n </div>\n </div>\n \n <div className=\"conversations\">\n {filteredConversations.length === 0 ? (\n <div className=\"empty-conversations\">\n <p>{searchQuery ? (t('no_search_results') || 'No results found') : t('no_conversations_title')}</p>\n {!searchQuery && <p>{t('no_conversations_message')}</p>}\n </div>\n ) : (\n filteredConversations.map((conversation) => {\n const isSelected = selectedConversationId === conversation.id;\n \n return (\n <div\n key={conversation.id}\n className={`conversation-item ${isSelected ? 'selected' : ''} ${conversation.unreadCount > 0 ? 'has-unread' : ''}`}\n onClick={() => handleSelectConversation(conversation)}\n >\n <div className=\"conversation-avatar\">\n {conversation.productContext?.productImage ? (\n <img \n src={conversation.productContext.productImage} \n alt={conversation.productContext.productName}\n className=\"product-image\"\n />\n ) : (\n <div className=\"avatar-placeholder\">\n {getOtherParticipantName(conversation).charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n \n <div className=\"conversation-content\">\n <div className=\"conversation-header\">\n <div className=\"conversation-title-wrapper\">\n <h4 className=\"conversation-participant-name\">\n {getOtherParticipantName(conversation)}\n </h4>\n </div>\n {conversation.lastMessage && (\n <span className=\"conversation-time\">\n {formatTime(conversation.lastMessage.timestamp)}\n </span>\n )}\n </div>\n \n <div className=\"conversation-details\">\n <p className=\"conversation-last-message\">\n {getLastMessageText(conversation)}\n </p>\n \n {conversation.unreadCount > 0 && (\n <span className=\"unread-badge\">\n {conversation.unreadCount}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n};\n\nexport default ConversationList;\n","import React from 'react';\nimport OriginalConversationList from '@source/components/ConversationList';\nimport type { ConversationListProps } from '@source/components/ConversationList';\n\nexport type { ConversationListProps };\n\nconst ConversationList: React.FC<ConversationListProps> = (props) => (\n <div className=\"chatsdk-root\">\n <OriginalConversationList {...props} />\n </div>\n);\n\nexport default ConversationList;\n","import React, { useState, useEffect, createContext, useContext, ReactNode } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\ninterface UseThemeReturn {\n theme: Theme;\n actualTheme: 'light' | 'dark';\n setTheme: (theme: Theme) => void;\n toggleTheme: () => void;\n}\n\n/**\n * Custom hook for theme management\n * Supports light, dark, and auto (system preference) themes\n */\nexport const useTheme = (): UseThemeReturn => {\n // Get initial theme from localStorage or default to 'auto'\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window !== 'undefined') {\n return (localStorage.getItem('chatSDK-theme') as Theme) || 'auto';\n }\n return 'auto';\n });\n\n // Get system preference\n const [systemPreference, setSystemPreference] = useState<'light' | 'dark'>(() => {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n });\n\n // Calculate actual theme based on theme setting and system preference\n const actualTheme: 'light' | 'dark' = theme === 'auto' ? systemPreference : theme;\n\n // Listen for system preference changes\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n \n const handleChange = (e: MediaQueryListEvent) => {\n setSystemPreference(e.matches ? 'dark' : 'light');\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, []);\n\n // Apply theme to document\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const root = document.documentElement;\n \n // Remove existing theme classes\n root.classList.remove('theme-light', 'theme-dark');\n root.removeAttribute('data-theme');\n \n // Apply new theme\n root.classList.add(`theme-${actualTheme}`);\n root.setAttribute('data-theme', actualTheme);\n }, [actualTheme]);\n\n // Set theme and persist to localStorage\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n if (typeof window !== 'undefined') {\n localStorage.setItem('chatSDK-theme', newTheme);\n }\n };\n\n // Toggle between light and dark (skips auto)\n const toggleTheme = () => {\n if (theme === 'auto') {\n setTheme(systemPreference === 'light' ? 'dark' : 'light');\n } else {\n setTheme(actualTheme === 'light' ? 'dark' : 'light');\n }\n };\n\n return {\n theme,\n actualTheme,\n setTheme,\n toggleTheme,\n };\n};\n\n/**\n * Theme Context for React components\n */\ninterface ThemeContextType extends UseThemeReturn {}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ children }) => {\n const themeValues = useTheme();\n\n return (\n <ThemeContext.Provider value={themeValues}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useThemeContext = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useThemeContext must be used within a ThemeProvider');\n }\n return context;\n};\n","import React from 'react';\r\nimport { useThemeContext } from '../hooks/useTheme';\r\n\r\ninterface ThemeToggleProps {\r\n className?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\n/**\r\n * Theme toggle button component\r\n * Allows users to switch between light, dark, and auto themes\r\n */\r\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ \r\n className = '', \r\n showLabel = false \r\n}) => {\r\n const { theme, actualTheme, setTheme } = useThemeContext();\r\n\r\n const getThemeIcon = () => {\r\n switch (theme) {\r\n case 'light':\r\n return (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 2.25a.75.75 0 01.75.75v2.25a.75.75 0 01-1.5 0V3a.75.75 0 01.75-.75zM7.5 12a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM18.894 6.166a.75.75 0 00-1.06-1.06l-1.591 1.59a.75.75 0 101.06 1.061l1.591-1.59zM21.75 12a.75.75 0 01-.75.75h-2.25a.75.75 0 010-1.5H21a.75.75 0 01.75.75zM17.834 18.894a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 10-1.061 1.06l1.59 1.591zM12 18a.75.75 0 01.75.75V21a.75.75 0 01-1.5 0v-2.25A.75.75 0 0112 18zM7.758 17.303a.75.75 0 00-1.061-1.06l-1.591 1.59a.75.75 0 001.06 1.061l1.591-1.59zM6 12a.75.75 0 01-.75.75H3a.75.75 0 010-1.5h2.25A.75.75 0 016 12zM6.697 7.757a.75.75 0 001.06-1.06l-1.59-1.591a.75.75 0 00-1.061 1.06l1.59 1.591z\" />\r\n </svg>\r\n );\r\n case 'dark':\r\n return (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path fillRule=\"evenodd\" d=\"M9.528 1.718a.75.75 0 01.162.819A8.97 8.97 0 009 6a9 9 0 009 9 8.97 8.97 0 003.463-.69.75.75 0 01.981.98 10.503 10.503 0 01-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 01.818.162z\" clipRule=\"evenodd\" />\r\n </svg>\r\n );\r\n case 'auto':\r\n return (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path fillRule=\"evenodd\" d=\"M2.25 6a3 3 0 013-3h13.5a3 3 0 013 3v12a3 3 0 01-3 3H5.25a3 3 0 01-3-3V6zm3.97.97a.75.75 0 011.06 0l2.25 2.25a.75.75 0 010 1.06l-2.25 2.25a.75.75 0 01-1.06-1.06l1.72-1.72-1.72-1.72a.75.75 0 010-1.06zm4.28 4.28a.75.75 0 000 1.5h3a.75.75 0 000-1.5h-3z\" clipRule=\"evenodd\" />\r\n </svg>\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const getThemeLabel = () => {\r\n switch (theme) {\r\n case 'light':\r\n return 'Light';\r\n case 'dark':\r\n return 'Dark';\r\n case 'auto':\r\n return `Auto (${actualTheme})`;\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n const cycleTheme = () => {\r\n switch (theme) {\r\n case 'light':\r\n setTheme('dark');\r\n break;\r\n case 'dark':\r\n setTheme('auto');\r\n break;\r\n case 'auto':\r\n setTheme('light');\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={cycleTheme}\r\n className={`\r\n inline-flex items-center gap-2 px-3 py-2 rounded-md\r\n text-on-surface bg-surface-variant hover:bg-primary hover:text-on-primary\r\n border border-figma-separator transition-colors duration-200\r\n focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\r\n ${className}\r\n `}\r\n title={`Current theme: ${getThemeLabel()}. Click to cycle.`}\r\n aria-label={`Switch theme. Current: ${getThemeLabel()}`}\r\n >\r\n {getThemeIcon()}\r\n {showLabel && (\r\n <span className=\"text-sm font-medium\">\r\n {getThemeLabel()}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n};\r\n\r\nexport default ThemeToggle;","/**\r\n * ChatSDK React - Theme System\r\n * Material Design 3 + Figma Colors matching Android implementation\r\n */\r\n\r\n// Import all theme CSS files\r\nimport './figma-colors.css';\r\nimport './theme-dark.css';\r\nimport './theme-utils.css';\r\n\r\n// Export theme-related hooks and components\r\nexport { useTheme, useThemeContext, ThemeProvider } from '../hooks/useTheme';\r\nexport { ThemeToggle } from '../components/ThemeToggle';\r\n\r\n// Theme types\r\nexport type { Theme } from '../hooks/useTheme';\r\n\r\n/**\r\n * Initialize theme system\r\n * Call this once in your app's entry point\r\n */\r\nexport const initializeTheme = () => {\r\n // Set initial theme based on saved preference or system\r\n const savedTheme = localStorage.getItem('chatSDK-theme') as 'light' | 'dark' | 'auto' | null;\r\n const systemPrefersDark = window.matchMedia?.('(prefers-color-scheme: dark)').matches;\r\n \r\n const initialTheme = savedTheme || 'auto';\r\n const actualTheme = initialTheme === 'auto' \r\n ? (systemPrefersDark ? 'dark' : 'light') \r\n : initialTheme;\r\n\r\n // Apply theme to document\r\n document.documentElement.classList.add(`theme-${actualTheme}`);\r\n document.documentElement.setAttribute('data-theme', actualTheme);\r\n};\r\n\r\n/**\r\n * Theme configuration object\r\n * Matches Android Material Design 3 color scheme\r\n */\r\nexport const themeConfig = {\r\n // Material Design 3 Primary Colors\r\n primary: {\r\n main: '#2196F3',\r\n onPrimary: '#FFFFFF',\r\n container: '#BBDEFB',\r\n onContainer: '#0D47A1',\r\n dark: '#1976D2',\r\n },\r\n \r\n // Material Design 3 Secondary Colors\r\n secondary: {\r\n main: '#FF4081',\r\n onSecondary: '#FFFFFF',\r\n container: '#FCE4EC',\r\n onContainer: '#880E4F',\r\n },\r\n \r\n // Surface Colors\r\n surface: {\r\n main: '#FFFFFF',\r\n onSurface: '#212121',\r\n variant: '#F5F5F5',\r\n onVariant: '#757575',\r\n },\r\n \r\n // Background Colors\r\n background: {\r\n main: '#FFFFFF',\r\n onBackground: '#212121',\r\n },\r\n \r\n // Error Colors\r\n error: {\r\n main: '#F44336',\r\n onError: '#FFFFFF',\r\n container: '#FFEBEE',\r\n onContainer: '#B71C1C',\r\n },\r\n \r\n // Status Colors\r\n status: {\r\n success: '#4CAF50',\r\n warning: '#FF9800',\r\n error: '#F44336',\r\n info: '#2196F3',\r\n },\r\n \r\n // Figma Design Colors\r\n figma: {\r\n background: '#F0F0F0',\r\n textPrimary: '#1E1E1E',\r\n textProduct: '#95265B',\r\n textTimestamp: '#878787',\r\n separator: '#C4C4C4',\r\n onlineIndicator: '#4CAF50',\r\n },\r\n \r\n // Chat Colors\r\n chat: {\r\n background: '#F4F4F4',\r\n productText: '#923060',\r\n messageReceived: '#FFFFFF',\r\n messageSent: '#C4C4C4',\r\n inputBackground: '#FBFBFB',\r\n inputPlaceholder: '#C4C4C4',\r\n timestamp: '#878787',\r\n primaryText: '#1E1E1E',\r\n },\r\n \r\n // Component Colors\r\n message: {\r\n sentBackground: '#2196F3',\r\n receivedBackground: '#F5F5F5',\r\n },\r\n \r\n avatar: {\r\n background: '#E0E0E0',\r\n border: '#BDBDBD',\r\n },\r\n \r\n input: {\r\n background: '#FAFAFA',\r\n border: '#E0E0E0',\r\n },\r\n \r\n badge: {\r\n unreadBackground: '#F44336',\r\n },\r\n \r\n // Common Colors\r\n common: {\r\n white: '#FFFFFF',\r\n black: '#000000',\r\n transparent: 'transparent',\r\n },\r\n};\r\n\r\n/**\r\n * Dark theme configuration\r\n */\r\nexport const darkThemeConfig = {\r\n primary: {\r\n main: '#90CAF9',\r\n onPrimary: '#0D47A1',\r\n container: '#1565C0',\r\n onContainer: '#E3F2FD',\r\n dark: '#42A5F5',\r\n },\r\n \r\n secondary: {\r\n main: '#F8BBD9',\r\n onSecondary: '#4A148C',\r\n container: '#7B1FA2',\r\n onContainer: '#FCE4EC',\r\n },\r\n \r\n surface: {\r\n main: '#121212',\r\n onSurface: '#FFFFFF',\r\n variant: '#1E1E1E',\r\n onVariant: '#BDBDBD',\r\n },\r\n \r\n background: {\r\n main: '#121212',\r\n onBackground: '#FFFFFF',\r\n },\r\n \r\n error: {\r\n main: '#CF6679',\r\n onError: '#000000',\r\n container: '#B00020',\r\n onContainer: '#FECDD3',\r\n },\r\n \r\n figma: {\r\n background: '#1E1E1E',\r\n textPrimary: '#FFFFFF',\r\n textProduct: '#F8BBD9',\r\n textTimestamp: '#BDBDBD',\r\n separator: '#424242',\r\n onlineIndicator: '#4CAF50',\r\n },\r\n \r\n chat: {\r\n background: '#121212',\r\n productText: '#F8BBD9',\r\n messageReceived: '#2C2C2C',\r\n messageSent: '#424242',\r\n inputBackground: '#1E1E1E',\r\n inputPlaceholder: '#757575',\r\n timestamp: '#BDBDBD',\r\n primaryText: '#FFFFFF',\r\n },\r\n};\r\n\r\nexport default {\r\n initializeTheme,\r\n themeConfig,\r\n darkThemeConfig,\r\n};","// ============================================================\n// @traiyani/chatsdk-react - Pre-built React ChatSDK Package\n// ============================================================\n\n// Import all CSS so it gets bundled into a single chatsdk.css\nimport '@source/styles/figma-colors.css';\nimport '@source/styles/theme-dark.css';\nimport '@source/styles/theme-utils.css';\nimport '@source/conversation/conversation.css';\n\n// ---- Core SDK class ----\nexport { ChatSDK } from '@source/ChatSDK';\nexport type { ChatSDKConfig, ChatSDKError } from '@source/ChatSDK';\n\n// ---- React Components (with .chatsdk-root scoping) ----\nexport { default as ChatWindow } from './components/ChatWindow';\nexport { default as ConversationList } from './components/ConversationList';\nexport { ThemeToggle } from '@source/components/ThemeToggle';\n\n// ---- Component Prop Types ----\nexport type { ChatWindowProps } from './components/ChatWindow';\nexport type { ConversationListProps } from './components/ConversationList';\n\n// ---- React Hooks ----\nexport { useTheme, useThemeContext, ThemeProvider } from '@source/hooks/useTheme';\nexport type { Theme } from '@source/hooks/useTheme';\n\n// ---- Theme System ----\nexport { initializeTheme, themeConfig, darkThemeConfig } from '@source/styles/index';\n\n// ---- Manager classes (for advanced usage) ----\nexport { AuthManager } from '@source/managers/AuthManager';\nexport { UserManager } from '@source/managers/UserManager';\nexport { ConversationManager } from '@source/managers/ConversationManager';\nexport { MessageManager } from '@source/managers/MessageManager';\nexport { MediaManager } from '@source/managers/MediaManager';\nexport { EventManager } from '@source/managers/EventManager';\nexport { SocketManager } from '@source/managers/SocketManager';\n\n// ---- Utility classes ----\nexport { ParseUtils } from '@source/utils/ParseUtils';\n\n// ---- i18n utilities ----\nexport { changeLanguage, getCurrentLanguage, isRTL, t } from '@source/i18n';\n\n// ---- Types ----\nexport type {\n ChatSDKUser,\n ChatSDKMessage,\n ChatSDKConversation,\n ProductContext,\n Product,\n ChatState,\n User,\n Message,\n Conversation,\n} from '@source/types';\n\nexport type { UserSearchOptions, UserUpdateData } from '@source/managers/UserManager';\nexport type { SendMessageOptions, MessageListOptions, MessageSearchOptions } from '@source/managers/MessageManager';\nexport type { MediaUploadOptions, MediaUploadResult, MediaDownloadOptions } from '@source/managers/MediaManager';\nexport type { EventCallback, ChatSDKEvent } from '@source/managers/EventManager';\nexport type { CreateConversationOptions, ConversationListOptions } from '@source/managers/ConversationManager';\n\n// ---- Helper utilities ----\nexport const ChatSDKHelpers = {\n async init(config: import('@source/ChatSDK').ChatSDKConfig) {\n const { ChatSDK } = await import('@source/ChatSDK');\n return ChatSDK.getInstance().init(config);\n },\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n formatTimeAgo(timestamp: string | Date): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return 'now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n },\n};\n"],"names":["AuthManager","chatSDK","config","axios","token","error","response","_a","isSessionRestore","_b","_c","externalUserId","appId","name","email","user","_d","_f","_e","password","metadata","auth","authToken","newPassword","ChatUserManager","saveToken","_g","userData","isLoggedinUser","registerError","fcmToken","platform","tokens","options","params","conversations","externalGroupId","userId","conversation","productContext","chatMetadata","requestBody","count","summary","conversationId","markedCount","_h","_i","_k","_j","messageId","wasUnread","UserManager","limit","offset","updateData","status","userIds","ConversationManager","chatId","MessageManager","content","socketError","resolve","reject","currentUser","messageData","onSuccess","message","onError","messages","mappedMessages","msg","deleteForEveryone","messageIds","isTyping","reaction","MediaManager","formData","result","progressEvent","progress","file","caption","mediaId","downloadUrl","size","thumbnailUrl","sizeInBytes","mimeTypes","mimeType","bytes","k","sizes","i","EventManager","event","callback","listeners","index","data","type","attempts","ParseUtils","messageType","parsedMessage","p","users","SocketManager","socketUrl","io","timeout","reason","normalizedData","parsedUsers","roomId","_ChatSDK","enabled","ChatSDK","e","t","l","a","n","o","r","c","s","u","d","f","g","h","m","j","W","F","A","Y","U","P","y","J","x","oe","I","re","se","te","ne","ie","V","ae","pe","N","de","_","ce","ue","w","le","fe","me","Te","M","ye","ge","he","xe","be","B","Se","Ae","z","Re","T","Pe","Vt","en","ar","locales","currentLocale","changeLanguage","locale","isRTL","getCurrentLanguage","key","replacements","translation","placeholder","storedLanguage","ChatWindow","onClose","onBack","setMessages","useState","newMessage","setNewMessage","loading","setLoading","uploading","setUploading","uploadProgress","setUploadProgress","loadingMore","setLoadingMore","hasMoreMessages","setHasMoreMessages","currentPage","setCurrentPage","blockStatus","setBlockStatus","isBlocked","setIsBlocked","hasBlockedOther","setHasBlockedOther","showOptionsMenu","setShowOptionsMenu","stickyDate","setStickyDate","stickyDateVisible","setStickyDateVisible","messagesEndRef","useRef","fileInputRef","chatMessagesRef","stickyDateTimeoutRef","MESSAGES_PER_PAGE","getOtherParticipant","useCallback","participants","currentUserId","currentUserExternalId","pId","pExternalId","otherParticipant","headerInfo","userName","useEffect","loadMessages","joinChatRoom","leaveChatRoom","sdk","handleNewMessage","prev","handleReadReceipt","handleReadReceipts","messageIdSet","handleRealtimeBlockStatus","payload","blockedUsers","other","otherUserId","scrollToBottom","handleClick","formatTime","timestamp","formatDateDivider","date","now","today","msgDate","diffDays","days","day","month","shouldShowDateDivider","prevMessage","prevDate","currDate","getFileIcon","handleMessagesScroll","container","dividers","currentDate","containerTop","divider","handleCallUser","phoneNumber","toast","textArea","page","append","fetchedMessages","sortedMessages","b","sendMessage","messageContent","handleFileUpload","tempMessageId","placeholderMessage","mediaType","uploadResult","attachmentMetadata","newProgress","handleBlockUser","userIdToBlock","handleUnblockUser","userIdToUnblock","jsxs","jsx","Fragment","React","props","OriginalChatWindow","ConversationList","onSelectConversation","selectedConversationId","setConversations","searchQuery","setSearchQuery","selectedConversationIdRef","currentUserIdRef","loadConversations","conv","isNotSender","isNotCurrentlyViewing","aTime","bTime","handleConversationUpdate","updatedConversationId","payloadLastMessage","payloadUnreadCount","isOpen","myUserId","fromOtherUser","shouldIncrease","handleConversationRead","id","handleAutoMarkedRead","handleSelectConversation","fetchedConversations","getOtherParticipantName","getLastMessageText","diffInHours","diffInDays","filteredConversations","query","product","lastMsg","isSelected","OriginalConversationList","useTheme","theme","setThemeState","systemPreference","setSystemPreference","actualTheme","mediaQuery","handleChange","root","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","themeValues","useThemeContext","context","useContext","ThemeToggle","className","showLabel","getThemeIcon","getThemeLabel","initializeTheme","savedTheme","systemPrefersDark","initialTheme","themeConfig","darkThemeConfig","ChatSDKHelpers","ChatSDK$1","diffMs","diffMins","diffHours"],"mappings":"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","x_google_ignoreList":[10,11]}