hermes-chat-react 0.1.2 → 0.1.3

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,"sources":["../src/react.ts","../src/core/HermesClient.ts","../src/core/EventEmitter.ts","../src/react/hooks/useMessages.ts","../src/react/hooks/useRooms.ts","../src/react/hooks/usePresence.ts","../src/react/hooks/useTyping.ts","../src/react/hooks/useReadReceipts.ts","../src/react/hooks/useReactions.ts","../src/react/hooks/useUpload.ts","../src/react/components/MessageList.tsx","../src/react/components/ChatInput.tsx","../src/react/components/RoomList.tsx","../src/react/components/TypingIndicator.tsx","../src/react/components/OnlineBadge.tsx","../src/react/components/ReactionPicker.tsx","../src/react/components/MediaMessage.tsx"],"sourcesContent":["\nexport * from \"./index\";\n\nexport { useMessages } from \"./react/hooks/useMessages\";\nexport { useRooms } from \"./react/hooks/useRooms\";\nexport { usePresence } from \"./react/hooks/usePresence\";\nexport { useTyping } from \"./react/hooks/useTyping\";\nexport { useReadReceipts } from \"./react/hooks/useReadReceipts\";\nexport { useReactions } from \"./react/hooks/useReactions\";\nexport { useUpload } from \"./react/hooks/useUpload\";\n\nexport { MessageList } from \"./react/components/MessageList\";\nexport { ChatInput } from \"./react/components/ChatInput\";\nexport { RoomList } from \"./react/components/RoomList\";\nexport { TypingIndicator } from \"./react/components/TypingIndicator\";\nexport { OnlineBadge } from \"./react/components/OnlineBadge\";\nexport { ReactionPicker } from \"./react/components/ReactionPicker\";\nexport { MediaMessage } from \"./react/components/MediaMessage\";\n","import { io, Socket } from \"socket.io-client\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport type {\n HermesConfig,\n HermesUser,\n ConnectionStatus,\n Message,\n Room,\n SendMessageInput,\n MessageHistoryResult,\n CreateDirectRoomInput,\n CreateGroupRoomInput,\n UploadResult,\n} from \"../types/index\";\n\n// Manual interface — avoids Extract<> returning never on discriminated union\ninterface ApiKeyConfig {\n endpoint: string;\n apiKey: string;\n secret: string;\n userId: string;\n displayName: string;\n avatar?: string;\n email?: string;\n}\n\nexport class HermesClient extends EventEmitter {\n private config: HermesConfig;\n private socket: Socket | null = null;\n private token: string | null = null;\n\n public user: HermesUser | null = null;\n public status: ConnectionStatus = \"idle\";\n\n constructor(config: HermesConfig) {\n super();\n this.config = config;\n if (\"token\" in config && typeof config.token === \"string\") {\n this.token = config.token;\n }\n }\n\n async connect(): Promise<HermesUser> {\n this.status = \"connecting\";\n try {\n if (this.token) {\n await this._connectSocket();\n return this.user!;\n }\n if (!(\"apiKey\" in this.config)) {\n throw new Error(\"Either token or (apiKey + secret + userId) must be provided\");\n }\n const cfg = this.config as unknown as ApiKeyConfig;\n const res = await fetch(`${cfg.endpoint}/hermes/connect`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n apiKey: cfg.apiKey,\n secret: cfg.secret,\n userId: cfg.userId,\n displayName: cfg.displayName ?? cfg.userId,\n avatar: cfg.avatar,\n email: cfg.email,\n }),\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.message || \"Auth failed\");\n this.token = data.token;\n this.user = {\n userId: data.user.hermesUserId,\n displayName: data.user.displayName,\n avatar: data.user.avatar,\n email: data.user.email,\n };\n await this._connectSocket();\n return this.user!;\n } catch (err) {\n this.status = \"error\";\n this.emit(\"error\", err as Error);\n throw err;\n }\n }\n\n private async _connectSocket(): Promise<void> {\n this.socket = io(`${this.config.endpoint}/hermes`, {\n auth: { token: this.token },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n });\n this._wireSocketEvents();\n await new Promise<void>((resolve, reject) => {\n this.socket!.once(\"connect\", resolve);\n this.socket!.once(\"connect_error\", (err) => reject(err));\n });\n this.status = \"connected\";\n this.emit(\"connected\");\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.token = null;\n this.status = \"disconnected\";\n this.emit(\"disconnected\", \"manual\");\n }\n\n private _wireSocketEvents(): void {\n const s = this.socket!;\n s.on(\"disconnect\", (reason) => { this.status = \"disconnected\"; this.emit(\"disconnected\", reason); });\n s.on(\"connect_error\", (err) => { this.status = \"error\"; this.emit(\"error\", err); });\n s.on(\"message:receive\", (msg: Message) => this.emit(\"message:receive\", msg));\n s.on(\"message:deleted\", (data) => this.emit(\"message:deleted\", data));\n s.on(\"message:edited\", (msg: Message) => this.emit(\"message:edited\", msg));\n s.on(\"room:created\", (room: Room) => this.emit(\"room:created\", room));\n s.on(\"room:deleted\", (data) => this.emit(\"room:deleted\", data));\n s.on(\"room:member:joined\", (data) => this.emit(\"room:member:joined\", data));\n s.on(\"room:member:left\", (data) => this.emit(\"room:member:left\", data));\n s.on(\"user:online\", (event) => this.emit(\"user:online\", event));\n s.on(\"user:offline\", (event) => this.emit(\"user:offline\", event));\n s.on(\"typing:started\", (event) => this.emit(\"typing:started\", event));\n s.on(\"typing:stopped\", (event) => this.emit(\"typing:stopped\", event));\n s.on(\"receipt:updated\", (event) => this.emit(\"receipt:updated\", event));\n s.on(\"reaction:updated\", (event) => this.emit(\"reaction:updated\", event));\n }\n\n _emit<T = any>(event: string, data?: any): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.socket?.connected) return reject(new Error(\"Not connected to Hermes engine\"));\n const timer = setTimeout(() => reject(new Error(`Timed out waiting for \"${event}\"`)), 5000);\n const callback = (response: any) => {\n clearTimeout(timer);\n if (response?.success === false) reject(new Error(response.error || \"Unknown error\"));\n else resolve(response);\n };\n if (data && Object.keys(data).length > 0) this.socket!.emit(event, data, callback);\n else this.socket!.emit(event, callback);\n });\n }\n\n async sendMessage(input: SendMessageInput): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:send\", input);\n return res.message;\n }\n async getHistory(roomId: string, before?: string, limit?: number): Promise<MessageHistoryResult> {\n return this._emit(\"message:history\", { roomId, before, limit });\n }\n async deleteMessage(messageId: string, roomId: string): Promise<void> {\n await this._emit(\"message:delete\", { messageId, roomId });\n }\n async editMessage(messageId: string, roomId: string, text: string): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:edit\", { messageId, roomId, text });\n return res.message;\n }\n async createDirectRoom(input: CreateDirectRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:direct\", { targetHermesUserId: input.targetUserId });\n return res.room;\n }\n async createGroupRoom(input: CreateGroupRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:group\", input);\n return res.room;\n }\n async deleteRoom(roomId: string): Promise<void> { await this._emit(\"room:delete\", { roomId }); }\n async getRooms(): Promise<Room[]> {\n const res = await this._emit<{ rooms: Room[] }>(\"room:list\");\n return res.rooms;\n }\n async addMember(roomId: string, newMemberId: string): Promise<void> { await this._emit(\"room:member:add\", { roomId, newMemberId }); }\n async removeMember(roomId: string, targetId: string): Promise<void> { await this._emit(\"room:member:remove\", { roomId, targetId }); }\n pingPresence(roomId: string): void { this.socket?.emit(\"presence:ping\", { roomId }); }\n startTyping(roomId: string): void { this.socket?.emit(\"typing:start\", { roomId }); }\n stopTyping(roomId: string): void { this.socket?.emit(\"typing:stop\", { roomId }); }\n async markSeen(roomId: string, lastMessageId: string): Promise<void> { await this._emit(\"receipt:seen\", { roomId, lastMessageId }); }\n async addReaction(messageId: string, roomId: string, emoji: string): Promise<void> { await this._emit(\"reaction:add\", { messageId, roomId, emoji }); }\n async uploadFile(file: File): Promise<UploadResult> {\n if (!this.token) throw new Error(\"Not connected\");\n const formData = new FormData();\n formData.append(\"file\", file);\n const res = await fetch(`${this.config.endpoint}/hermes/upload`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.token}` },\n body: formData,\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"Upload failed\");\n return data as UploadResult;\n }\n get isConnected(): boolean { return this.status === \"connected\" && !!this.socket?.connected; }\n get currentUser(): HermesUser | null { return this.user; }\n}\n","import type { HermesEvents } from \"../types/index\";\n\ntype EventKey = keyof HermesEvents;\ntype EventCallback<K extends EventKey> = HermesEvents[K];\ntype ListenerMap = { [K in EventKey]?: EventCallback<K>[] };\n\nexport class EventEmitter {\n private listeners: ListenerMap = {};\n\n on<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n (this.listeners[event] as EventCallback<K>[]).push(callback);\n return this;\n }\n\n off<K extends EventKey>(event: K, callback: EventCallback<K>): void {\n if (!this.listeners[event]) return;\n this.listeners[event] = (\n this.listeners[event] as EventCallback<K>[]\n ).filter((cb) => cb !== callback) as any;\n }\n\n once<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n const wrapper = ((...args: any[]) => {\n (callback as any)(...args);\n this.off(event, wrapper as any);\n }) as EventCallback<K>;\n return this.on(event, wrapper);\n }\n\n emit<K extends EventKey>(\n event: K,\n ...args: Parameters<EventCallback<K>>\n ): this {\n if (!this.listeners[event]) return this;\n (this.listeners[event] as EventCallback<K>[]).forEach((cb) =>\n (cb as any)(...args),\n );\n return this;\n }\n\n removeAllListeners<K extends EventKey>(event?: K): this {\n if (event) {\n delete this.listeners[event];\n } else {\n this.listeners = {};\n }\n return this;\n }\n\n listenerCount<K extends EventKey>(event: K): number {\n return this.listeners[event]?.length ?? 0;\n }\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { Message, SendMessageInput } from \"../../types/index\";\n\nexport const useMessages = (client: HermesClient, roomId: string | null) => {\n const [messages, setMessages] = useState<Message[]>([]);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [hasMore, setHasMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [typingUsers, setTypingUsers] = useState<\n { userId: string; displayName: string }[]\n >([]);\n const oldestMessageId = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (!roomId || !client.isConnected) return;\n\n setMessages([]);\n setHasMore(false);\n oldestMessageId.current = undefined;\n setLoading(true);\n setError(null);\n\n client\n .getHistory(roomId)\n .then(({ messages: msgs, hasMore: more }) => {\n setMessages(msgs);\n setHasMore(more);\n if (msgs.length > 0) oldestMessageId.current = msgs[0]._id;\n })\n .catch((err) => setError(err.message))\n .finally(() => setLoading(false));\n }, [roomId, client.isConnected]);\n\n useEffect(() => {\n if (!roomId) return;\n\n const onReceive = (msg: Message) => {\n if (msg.roomId !== roomId) return;\n setMessages((prev) => {\n if (prev.find((m) => m._id === msg._id)) return prev;\n return [...prev, msg];\n });\n };\n\n const onDeleted = ({\n messageId,\n }: {\n messageId: string;\n roomId: string;\n }) => {\n setMessages((prev) =>\n prev.map((m) =>\n m._id === messageId ? { ...m, isDeleted: true, text: undefined } : m,\n ),\n );\n };\n\n const onEdited = (msg: Message) => {\n setMessages((prev) => prev.map((m) => (m._id === msg._id ? msg : m)));\n };\n\n client.on(\"message:receive\", onReceive);\n client.on(\"message:deleted\", onDeleted);\n client.on(\"message:edited\", onEdited);\n\n return () => {\n client.off(\"message:receive\", onReceive);\n client.off(\"message:deleted\", onDeleted);\n client.off(\"message:edited\", onEdited);\n };\n }, [roomId, client]);\n\n useEffect(() => {\n const onReaction = ({ messageId, reactions }: any) => {\n setMessages((prev) =>\n prev.map((m) => (m._id === messageId ? { ...m, reactions } : m)),\n );\n };\n client.on(\"reaction:updated\", onReaction);\n return () => { client.off(\"reaction:updated\", onReaction); };\n }, [client]);\n\n useEffect(() => {\n if (!roomId) return;\n\n const onStarted = ({ userId, displayName, roomId: rid }: any) => {\n if (rid !== roomId) return;\n setTypingUsers((prev) => [\n ...prev.filter((u) => u.userId !== userId),\n { userId, displayName },\n ]);\n };\n\n const onStopped = ({ userId, roomId: rid }: any) => {\n if (rid !== roomId) return;\n setTypingUsers((prev) => prev.filter((u) => u.userId !== userId));\n };\n\n client.on(\"typing:started\", onStarted);\n client.on(\"typing:stopped\", onStopped);\n\n return () => {\n client.off(\"typing:started\", onStarted);\n client.off(\"typing:stopped\", onStopped);\n \n setTypingUsers([]);\n };\n }, [roomId, client]);\n\n const loadMore = useCallback(async () => {\n if (!roomId || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const { messages: older, hasMore: more } = await client.getHistory(\n roomId,\n oldestMessageId.current,\n );\n setMessages((prev) => [...older, ...prev]);\n setHasMore(more);\n if (older.length > 0) oldestMessageId.current = older[0]._id;\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoadingMore(false);\n }\n }, [roomId, loadingMore, hasMore, client]);\n\n const sendMessage = useCallback(\n async (input: Omit<SendMessageInput, \"roomId\">) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.sendMessage({ ...input, roomId });\n },\n [roomId, client],\n );\n\n const editMessage = useCallback(\n async (messageId: string, text: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.editMessage(messageId, roomId, text);\n },\n [roomId, client],\n );\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.deleteMessage(messageId, roomId);\n },\n [roomId, client],\n );\n\n const addReaction = useCallback(\n async (messageId: string, emoji: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.addReaction(messageId, roomId, emoji);\n },\n [roomId, client],\n );\n\n return {\n messages,\n loading,\n loadingMore,\n hasMore,\n error,\n typingUsers,\n sendMessage,\n editMessage,\n deleteMessage,\n addReaction,\n loadMore,\n };\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type {\n Room,\n CreateDirectRoomInput,\n CreateGroupRoomInput,\n} from \"../../types/index\";\n\nexport const useRooms = (client: HermesClient) => {\n const [rooms, setRooms] = useState<Room[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const fetchedRef = useRef(false);\n\n \n const fetchRooms = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n \n await new Promise<void>((resolve, reject) => {\n if (client.isConnected) return resolve();\n let attempts = 0;\n const interval = setInterval(() => {\n attempts++;\n if (client.isConnected) {\n clearInterval(interval);\n resolve();\n } else if (attempts > 50) {\n clearInterval(interval);\n reject(new Error(\"Connection timeout\"));\n }\n }, 100);\n });\n\n try {\n const data = await client.getRooms();\n console.log(\"[useRooms] fetched:\", data.length, \"rooms\");\n setRooms(data);\n fetchedRef.current = true;\n } catch (err: any) {\n console.error(\"[useRooms] fetch error:\", err.message);\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n \n useEffect(() => {\n fetchRooms();\n const onConnected = () => {\n if (!fetchedRef.current) fetchRooms();\n };\n client.on(\"connected\", onConnected);\n return () => {\n client.off(\"connected\", onConnected);\n };\n }, [fetchRooms, client]);\n\n \n useEffect(() => {\n const onCreated = (room: Room) => {\n setRooms((prev) => {\n if (prev.find((r) => r._id === room._id)) return prev;\n return [{ ...room, unreadCount: 0 }, ...prev];\n });\n };\n\n const onDeleted = ({ roomId }: { roomId: string }) =>\n setRooms((prev) => prev.filter((r) => r._id !== roomId));\n\n const onMemberJoined = ({\n roomId,\n userId,\n }: {\n roomId: string;\n userId: string;\n }) =>\n setRooms((prev) =>\n prev.map((r) =>\n r._id === roomId ? { ...r, members: [...r.members, userId] } : r,\n ),\n );\n\n const onMemberLeft = ({\n roomId,\n userId,\n }: {\n roomId: string;\n userId: string;\n }) =>\n setRooms((prev) =>\n prev.map((r) =>\n r._id === roomId\n ? { ...r, members: r.members.filter((m) => m !== userId) }\n : r,\n ),\n );\n\n const onMessage = (msg: any) =>\n setRooms((prev) => {\n const idx = prev.findIndex((r) => r._id === msg.roomId);\n if (idx === -1) return prev;\n const updated = {\n ...prev[idx],\n lastMessage: msg,\n lastActivity: msg.createdAt,\n };\n return [updated, ...prev.filter((r) => r._id !== msg.roomId)];\n });\n\n client.on(\"room:created\", onCreated);\n client.on(\"room:deleted\", onDeleted);\n client.on(\"room:member:joined\", onMemberJoined);\n client.on(\"room:member:left\", onMemberLeft);\n client.on(\"message:receive\", onMessage);\n\n return () => {\n client.off(\"room:created\", onCreated);\n client.off(\"room:deleted\", onDeleted);\n client.off(\"room:member:joined\", onMemberJoined);\n client.off(\"room:member:left\", onMemberLeft);\n client.off(\"message:receive\", onMessage);\n };\n }, [client]);\n\n \n const createDirect = useCallback(\n async (input: CreateDirectRoomInput) => {\n const room = await client.createDirectRoom(input);\n setRooms((prev) => {\n if (prev.find((r) => r._id === room._id)) return prev;\n return [{ ...room, unreadCount: 0 }, ...prev];\n });\n return room;\n },\n [client],\n );\n\n const createGroup = useCallback(\n async (input: CreateGroupRoomInput) => {\n const room = await client.createGroupRoom(input);\n setRooms((prev) => {\n if (prev.find((r) => r._id === room._id)) return prev;\n return [{ ...room, unreadCount: 0 }, ...prev];\n });\n return room;\n },\n [client],\n );\n\n const deleteRoom = useCallback(\n async (roomId: string) => {\n await client.deleteRoom(roomId);\n setRooms((prev) => prev.filter((r) => r._id !== roomId));\n },\n [client],\n );\n\n const addMember = useCallback(\n (roomId: string, userId: string) => client.addMember(roomId, userId),\n [client],\n );\n\n const removeMember = useCallback(\n (roomId: string, userId: string) => client.removeMember(roomId, userId),\n [client],\n );\n\n return {\n rooms,\n loading,\n error,\n createDirect,\n createGroup,\n deleteRoom,\n addMember,\n removeMember,\n refetch: fetchRooms,\n };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\n\nexport const usePresence = (client: HermesClient) => {\n const [onlineMap, setOnlineMap] = useState<Map<string, boolean>>(new Map());\n\n useEffect(() => {\n const onOnline = ({ userId }: { userId: string }) => {\n setOnlineMap((prev) => new Map(prev).set(userId, true));\n };\n\n const onOffline = ({ userId }: { userId: string }) => {\n setOnlineMap((prev) => new Map(prev).set(userId, false));\n };\n\n client.on(\"user:online\", onOnline);\n client.on(\"user:offline\", onOffline);\n\n return () => {\n client.off(\"user:online\", onOnline);\n client.off(\"user:offline\", onOffline);\n };\n }, [client]);\n\n const isOnline = useCallback(\n (userId: string): boolean => onlineMap.get(userId) ?? false,\n [onlineMap],\n );\n\n const onlineUsers = Array.from(onlineMap.entries())\n .filter(([, online]) => online)\n .map(([userId]) => userId);\n\n return { isOnline, onlineUsers, onlineMap };\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { TypingEvent } from \"../../types/index\";\n\nexport const useTyping = (client: HermesClient, roomId: string | null) => {\n \n const [typingUsers, setTypingUsers] = useState<Map<string, string>>(\n new Map(),\n );\n const timeouts = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n const typingRef = useRef(false);\n const stopTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (!roomId) return;\n\n const onStart = (event: TypingEvent) => {\n if (event.roomId !== roomId) return;\n if (event.userId === client.currentUser?.userId) return;\n\n setTypingUsers((prev) =>\n new Map(prev).set(event.userId, event.displayName),\n );\n\n \n const existing = timeouts.current.get(event.userId);\n if (existing) clearTimeout(existing);\n const t = setTimeout(() => {\n setTypingUsers((prev) => {\n const next = new Map(prev);\n next.delete(event.userId);\n return next;\n });\n }, 4000);\n timeouts.current.set(event.userId, t);\n };\n\n const onStop = (event: TypingEvent) => {\n if (event.roomId !== roomId) return;\n setTypingUsers((prev) => {\n const next = new Map(prev);\n next.delete(event.userId);\n return next;\n });\n const existing = timeouts.current.get(event.userId);\n if (existing) clearTimeout(existing);\n timeouts.current.delete(event.userId);\n };\n\n client.on(\"typing:started\", onStart);\n client.on(\"typing:stopped\", onStop);\n\n return () => {\n client.off(\"typing:started\", onStart);\n client.off(\"typing:stopped\", onStop);\n timeouts.current.forEach(clearTimeout);\n timeouts.current.clear();\n };\n }, [roomId, client]);\n\n \n const startTyping = useCallback(() => {\n if (!roomId) return;\n\n if (!typingRef.current) {\n client.startTyping(roomId);\n typingRef.current = true;\n }\n\n \n if (stopTimeout.current) clearTimeout(stopTimeout.current);\n stopTimeout.current = setTimeout(() => {\n client.stopTyping(roomId);\n typingRef.current = false;\n }, 3000);\n }, [roomId, client]);\n\n \n const stopTyping = useCallback(() => {\n if (!roomId) return;\n if (stopTimeout.current) clearTimeout(stopTimeout.current);\n if (typingRef.current) {\n client.stopTyping(roomId);\n typingRef.current = false;\n }\n }, [roomId, client]);\n\n \n const typingText = (() => {\n const names = Array.from(typingUsers.values());\n if (names.length === 0) return null;\n if (names.length === 1) return `${names[0]} is typing...`;\n if (names.length === 2) return `${names[0]} and ${names[1]} are typing...`;\n return `${names[0]} and ${names.length - 1} others are typing...`;\n })();\n\n return {\n typingUsers, \n typingText, \n isAnyoneTyping: typingUsers.size > 0,\n startTyping,\n stopTyping,\n };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { ReceiptEvent } from \"../../types/index\";\n\nexport const useReadReceipts = (\n client: HermesClient,\n roomId: string | null,\n) => {\n \n const [receipts, setReceipts] = useState<Map<string, Set<string>>>(new Map());\n\n useEffect(() => {\n if (!roomId) return;\n\n const onReceipt = (event: ReceiptEvent) => {\n if (event.roomId !== roomId) return;\n setReceipts((prev) => {\n const next = new Map(prev);\n const existing = next.get(event.lastMessageId) ?? new Set();\n existing.add(event.userId);\n next.set(event.lastMessageId, existing);\n return next;\n });\n };\n\n client.on(\"receipt:updated\", onReceipt);\n return () => client.off(\"receipt:updated\", onReceipt);\n }, [roomId, client]);\n\n \n const markSeen = useCallback(\n async (lastMessageId: string) => {\n if (!roomId) return;\n await client.markSeen(roomId, lastMessageId);\n },\n [roomId, client],\n );\n\n \n const seenBy = useCallback(\n (messageId: string): string[] => {\n return Array.from(receipts.get(messageId) ?? []);\n },\n [receipts],\n );\n\n return { markSeen, seenBy, receipts };\n};\n","import { useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { Reaction } from \"../../types/index\";\n\nexport const useReactions = (client: HermesClient, roomId: string | null) => {\n \n const react = useCallback(\n async (messageId: string, emoji: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n await client.addReaction(messageId, roomId, emoji);\n },\n [roomId, client],\n );\n\n \n const hasReacted = useCallback(\n (reactions: Reaction[], emoji: string): boolean => {\n const userId = client.currentUser?.userId;\n if (!userId) return false;\n return (\n reactions.find((r) => r.emoji === emoji)?.users.includes(userId) ??\n false\n );\n },\n [client],\n );\n\n \n const getCount = useCallback(\n (reactions: Reaction[], emoji: string): number => {\n return reactions.find((r) => r.emoji === emoji)?.users.length ?? 0;\n },\n [],\n );\n\n \n const getEmojis = useCallback((reactions: Reaction[]): string[] => {\n return reactions.filter((r) => r.users.length > 0).map((r) => r.emoji);\n }, []);\n\n return { react, hasReacted, getCount, getEmojis };\n};\n","import { useState, useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { UploadResult, Message } from \"../../types/index\";\n\nexport const useUpload = (client: HermesClient) => {\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [lastUpload, setLastUpload] = useState<UploadResult | null>(null);\n\n \n const upload = useCallback(\n async (file: File): Promise<UploadResult | null> => {\n setUploading(true);\n setError(null);\n try {\n const result = await client.uploadFile(file);\n setLastUpload(result);\n return result;\n } catch (err: any) {\n setError(err.message);\n return null;\n } finally {\n setUploading(false);\n }\n },\n [client],\n );\n\n \n const sendFile = useCallback(\n async (\n roomId: string,\n file: File,\n replyTo?: string,\n ): Promise<Message | null> => {\n setUploading(true);\n setError(null);\n try {\n const uploaded = await client.uploadFile(file);\n setLastUpload(uploaded);\n const message = await client.sendMessage({\n roomId,\n type: uploaded.type,\n url: uploaded.url,\n fileName: uploaded.fileName,\n fileSize: uploaded.fileSize,\n mimeType: uploaded.mimeType,\n thumbnail: uploaded.thumbnail,\n replyTo,\n });\n return message;\n } catch (err: any) {\n setError(err.message);\n return null;\n } finally {\n setUploading(false);\n }\n },\n [client],\n );\n\n \n const validate = useCallback((file: File, maxMb = 50): string | null => {\n if (file.size > maxMb * 1024 * 1024) {\n return `File too large. Max size is ${maxMb}MB.`;\n }\n const allowed = [\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"video/mp4\",\n \"video/webm\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"application/pdf\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"text/plain\",\n ];\n if (!allowed.includes(file.type)) {\n return `File type not supported: ${file.type}`;\n }\n return null;\n }, []);\n\n return { upload, sendFile, validate, uploading, error, lastUpload };\n};\n","import React, { useEffect, useRef, useState } from \"react\";\nimport type { Message, HermesUser, Reaction } from \"../../types/index\";\n\ninterface MessageListProps {\n messages: Message[];\n currentUser: HermesUser;\n loading?: boolean;\n loadingMore?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onEdit?: (messageId: string, text: string) => void;\n onDelete?: (messageId: string) => void;\n onReact?: (messageId: string, emoji: string) => void;\n onReply?: (message: Message) => void;\n renderMessage?: (message: Message, isOwn: boolean) => React.ReactNode;\n renderAvatar?: (senderId: string) => React.ReactNode;\n className?: string;\n autoScroll?: boolean;\n \n typingUsers?: { userId: string; displayName: string }[];\n}\n\nconst formatTime = (iso: string) =>\n new Date(iso).toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n\nconst formatFileSize = (bytes?: number) => {\n if (!bytes) return \"\";\n if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${bytes} B`;\n};\n\nconst REACTION_EMOJIS = [\n \"🫠\",\n \"🥹\",\n \"🫡\",\n \"🤌\",\n \"🫶\",\n \"💀\",\n \"🔥\",\n \"✨\",\n \"🫣\",\n \"😮‍💨\",\n \"🪄\",\n \"🥲\",\n \"💅\",\n \"🫦\",\n \"🤯\",\n \"🌚\",\n \"👁️\",\n \"🫀\",\n \"🦋\",\n \"🪐\",\n];\n\nconst EmojiPicker: React.FC<{\n onPick: (emoji: string) => void;\n onClose: () => void;\n isOwn: boolean;\n}> = ({ onPick, onClose, isOwn }) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 8px)\",\n [isOwn ? \"right\" : \"left\"]: 0,\n zIndex: 100,\n background: \"#1a1a2e\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 14,\n padding: \"8px 10px\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.4)\",\n display: \"grid\",\n gridTemplateColumns: \"repeat(5, 1fr)\",\n gap: 4,\n animation: \"hermes-pop 0.15s ease\",\n }}\n >\n {REACTION_EMOJIS.map((emoji) => (\n <button\n key={emoji}\n onClick={() => {\n onPick(emoji);\n onClose();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 20,\n padding: \"4px\",\n borderRadius: 8,\n lineHeight: 1,\n transition: \"transform 0.1s, background 0.1s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.transform =\n \"scale(1.3)\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.08)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.transform = \"scale(1)\";\n (e.currentTarget as HTMLButtonElement).style.background = \"none\";\n }}\n >\n {emoji}\n </button>\n ))}\n </div>\n );\n};\n\nconst TypingIndicator: React.FC<{\n typingUsers: { userId: string; displayName: string }[];\n}> = ({ typingUsers }) => {\n if (!typingUsers.length) return null;\n\n const text =\n typingUsers.length === 1\n ? `${typingUsers[0].displayName} is typing`\n : typingUsers.length === 2\n ? `${typingUsers[0].displayName} and ${typingUsers[1].displayName} are typing`\n : `${typingUsers[0].displayName} and ${typingUsers.length - 1} others are typing`;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 16px 2px\",\n minHeight: 28,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 3,\n background: \"#f0f0f0\",\n borderRadius: 12,\n padding: \"6px 10px\",\n }}\n >\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#999\",\n display: \"block\",\n animation: `hermes-bounce 1.2s ease-in-out ${i * 0.18}s infinite`,\n }}\n />\n ))}\n </div>\n <span style={{ fontSize: 11, color: \"#999\" }}>{text}</span>\n </div>\n );\n};\n\nconst DefaultMessage: React.FC<{\n message: Message;\n isOwn: boolean;\n onEdit?: (messageId: string, text: string) => void;\n onDelete?: (messageId: string) => void;\n onReact?: (messageId: string, emoji: string) => void;\n onReply?: (message: Message) => void;\n renderAvatar?: (senderId: string) => React.ReactNode;\n}> = ({ message, isOwn, onEdit, onDelete, onReact, onReply, renderAvatar }) => {\n const [hovered, setHovered] = useState(false);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n if (message.isDeleted) {\n return (\n <div\n style={{\n opacity: 0.5,\n fontStyle: \"italic\",\n padding: \"4px 16px\",\n fontSize: 13,\n }}\n >\n This message was deleted.\n </div>\n );\n }\n\n return (\n <div\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => {\n setHovered(false);\n }}\n style={{\n display: \"flex\",\n flexDirection: isOwn ? \"row-reverse\" : \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n marginBottom: 4,\n position: \"relative\",\n }}\n >\n {}\n {!isOwn && (\n <div style={{ flexShrink: 0 }}>\n {renderAvatar ? (\n renderAvatar(message.senderId)\n ) : (\n <div\n style={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n background: \"#e0e0e0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 12,\n fontWeight: 600,\n }}\n >\n {message.senderId.slice(-2).toUpperCase()}\n </div>\n )}\n </div>\n )}\n\n {}\n <div\n style={{\n maxWidth: \"70%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isOwn ? \"flex-end\" : \"flex-start\",\n }}\n >\n {}\n {(onEdit || onDelete || onReact || onReply) && (\n <div\n style={{\n display: \"flex\",\n flexDirection: isOwn ? \"row-reverse\" : \"row\",\n gap: 2,\n marginBottom: 4,\n opacity: hovered ? 1 : 0,\n pointerEvents: hovered ? \"auto\" : \"none\",\n transition: \"opacity 0.15s ease\",\n position: \"relative\",\n }}\n >\n {}\n {onReact && (\n <div style={{ position: \"relative\" }}>\n <ActionBtn\n onClick={() => setPickerOpen((p) => !p)}\n title=\"React\"\n >\n 🫠\n </ActionBtn>\n {pickerOpen && (\n <EmojiPicker\n isOwn={isOwn}\n onPick={(emoji) => onReact(message._id, emoji)}\n onClose={() => setPickerOpen(false)}\n />\n )}\n </div>\n )}\n {onReply && (\n <ActionBtn onClick={() => onReply(message)} title=\"Reply\">\n ↩\n </ActionBtn>\n )}\n {isOwn && onEdit && message.type === \"text\" && (\n <ActionBtn\n onClick={() => {\n const text = window.prompt(\"Edit message:\", message.text);\n if (text) onEdit(message._id, text);\n }}\n title=\"Edit\"\n >\n ✏️\n </ActionBtn>\n )}\n {isOwn && onDelete && (\n <ActionBtn onClick={() => onDelete(message._id)} title=\"Delete\">\n 🗑\n </ActionBtn>\n )}\n </div>\n )}\n\n {}\n <div\n style={{\n padding: \"8px 12px\",\n borderRadius: isOwn ? \"16px 16px 4px 16px\" : \"16px 16px 16px 4px\",\n background: isOwn ? \"#0084ff\" : \"#f0f0f0\",\n color: isOwn ? \"#fff\" : \"#000\",\n }}\n >\n {}\n {message.replyTo && (\n <div\n style={{\n borderLeft: \"3px solid rgba(255,255,255,0.4)\",\n paddingLeft: 8,\n marginBottom: 6,\n fontSize: 12,\n opacity: 0.75,\n }}\n >\n Replying to a message\n </div>\n )}\n\n {message.type === \"text\" && (\n <p style={{ margin: 0, wordBreak: \"break-word\" }}>\n {message.text}\n {message.editedAt && (\n <span style={{ fontSize: 10, opacity: 0.6, marginLeft: 6 }}>\n (edited)\n </span>\n )}\n </p>\n )}\n {message.type === \"link\" && (\n <div>\n {message.text && (\n <p style={{ margin: \"0 0 4px\" }}>{message.text}</p>\n )}\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: isOwn ? \"#cce4ff\" : \"#0084ff\",\n wordBreak: \"break-all\",\n }}\n >\n {message.url}\n </a>\n </div>\n )}\n {message.type === \"image\" && (\n <img\n src={message.url}\n alt={message.fileName || \"image\"}\n style={{ maxWidth: \"100%\", borderRadius: 8, display: \"block\" }}\n />\n )}\n {message.type === \"video\" && (\n <video\n src={message.url}\n controls\n style={{ maxWidth: \"100%\", borderRadius: 8 }}\n />\n )}\n {message.type === \"audio\" && (\n <audio src={message.url} controls style={{ width: \"100%\" }} />\n )}\n {message.type === \"document\" && (\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: isOwn ? \"#fff\" : \"#333\",\n textDecoration: \"none\",\n }}\n >\n <span style={{ fontSize: 24 }}>📄</span>\n <div>\n <div style={{ fontWeight: 600, fontSize: 13 }}>\n {message.fileName}\n </div>\n <div style={{ fontSize: 11, opacity: 0.7 }}>\n {formatFileSize(message.fileSize)}\n </div>\n </div>\n </a>\n )}\n\n {}\n <div\n style={{\n fontSize: 10,\n opacity: 0.6,\n textAlign: \"right\",\n marginTop: 4,\n }}\n >\n {formatTime(message.createdAt)}\n </div>\n </div>\n\n {}\n {message.reactions?.filter((r: Reaction) => r.users.length > 0).length >\n 0 && (\n <div\n style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\", marginTop: 4 }}\n >\n {message.reactions\n .filter((r: Reaction) => r.users.length > 0)\n .map((r: Reaction) => (\n <span\n key={r.emoji}\n onClick={() => onReact?.(message._id, r.emoji)}\n style={{\n background: \"#f0f0f0\",\n border: \"1px solid rgba(0,0,0,0.08)\",\n borderRadius: 20,\n padding: \"2px 8px\",\n fontSize: 13,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n transition: \"transform 0.1s\",\n userSelect: \"none\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.transform = \"scale(1.1)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.transform = \"scale(1)\")\n }\n >\n {r.emoji}\n <span\n style={{ fontSize: 11, fontWeight: 600, color: \"#555\" }}\n >\n {r.users.length}\n </span>\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nconst ActionBtn: React.FC<{\n onClick: () => void;\n title?: string;\n children: React.ReactNode;\n}> = ({ onClick, title, children }) => (\n <button\n onClick={onClick}\n title={title}\n style={{\n background: \"#fff\",\n border: \"1px solid rgba(0,0,0,0.1)\",\n borderRadius: 8,\n cursor: \"pointer\",\n fontSize: 14,\n padding: \"3px 6px\",\n lineHeight: 1,\n boxShadow: \"0 1px 4px rgba(0,0,0,0.1)\",\n transition: \"transform 0.1s\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.transform = \"scale(1.15)\")}\n onMouseLeave={(e) => (e.currentTarget.style.transform = \"scale(1)\")}\n >\n {children}\n </button>\n);\n\nexport const MessageList: React.FC<MessageListProps> = ({\n messages,\n currentUser,\n loading = false,\n loadingMore = false,\n hasMore = false,\n onLoadMore,\n onEdit,\n onDelete,\n onReact,\n onReply,\n renderMessage,\n renderAvatar,\n className = \"\",\n autoScroll = true,\n typingUsers = [],\n}) => {\n const bottomRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoScroll && bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, autoScroll]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !onLoadMore) return;\n const onScroll = () => {\n if (container.scrollTop === 0 && hasMore && !loadingMore) onLoadMore();\n };\n container.addEventListener(\"scroll\", onScroll);\n return () => container.removeEventListener(\"scroll\", onScroll);\n }, [hasMore, loadingMore, onLoadMore]);\n\n if (loading) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n Loading messages...\n </div>\n );\n }\n\n return (\n <>\n <style>{`\n @keyframes hermes-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-5px); }\n }\n @keyframes hermes-pop {\n from { opacity: 0; transform: scale(0.85); }\n to { opacity: 1; transform: scale(1); }\n }\n `}</style>\n\n <div\n ref={containerRef}\n className={`hermes-message-list ${className}`}\n style={{\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n padding: \"16px\",\n }}\n >\n {}\n {hasMore && (\n <div style={{ textAlign: \"center\", marginBottom: 12 }}>\n {loadingMore ? (\n <span style={{ fontSize: 12, opacity: 0.5 }}>\n Loading older messages...\n </span>\n ) : (\n <button\n onClick={onLoadMore}\n style={{\n background: \"none\",\n border: \"1px solid #ddd\",\n borderRadius: 12,\n padding: \"4px 12px\",\n cursor: \"pointer\",\n fontSize: 12,\n }}\n >\n Load older messages\n </button>\n )}\n </div>\n )}\n\n {messages.length === 0 && (\n <div\n style={{\n textAlign: \"center\",\n opacity: 0.4,\n margin: \"auto\",\n fontSize: 14,\n }}\n >\n No messages yet. Say hello! 👋\n </div>\n )}\n\n {messages.map((message) => {\n const isOwn = message.senderId === currentUser.userId;\n return (\n <div key={message._id} style={{ marginBottom: 8 }}>\n {renderMessage ? (\n renderMessage(message, isOwn)\n ) : (\n <DefaultMessage\n message={message}\n isOwn={isOwn}\n onEdit={onEdit}\n onDelete={onDelete}\n onReact={onReact}\n onReply={onReply}\n renderAvatar={renderAvatar}\n />\n )}\n </div>\n );\n })}\n\n {}\n <TypingIndicator typingUsers={typingUsers} />\n\n <div ref={bottomRef} />\n </div>\n </>\n );\n};\n","import React, { useState, useRef, useCallback } from \"react\";\nimport type { Message, UploadResult } from \"../../types/index\";\n\ninterface ChatInputProps {\n onSendText: (text: string) => Promise<void> | void;\n onSendFile?: (file: File) => Promise<void> | void;\n onTypingStart?: () => void;\n onTypingStop?: () => void;\n replyingTo?: Message | null;\n onCancelReply?: () => void;\n disabled?: boolean;\n placeholder?: string;\n maxLength?: number;\n className?: string;\n inputClassName?: string;\n renderAttachIcon?: () => React.ReactNode;\n renderSendIcon?: () => React.ReactNode;\n}\n\nexport const ChatInput: React.FC<ChatInputProps> = ({\n onSendText,\n onSendFile,\n onTypingStart,\n onTypingStop,\n replyingTo,\n onCancelReply,\n disabled = false,\n placeholder = \"Type a message...\",\n maxLength = 4000,\n className = \"\",\n inputClassName = \"\",\n renderAttachIcon,\n renderSendIcon,\n}) => {\n const [text, setText] = useState(\"\");\n const [sending, setSending] = useState(false);\n const fileRef = useRef<HTMLInputElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n \n const resizeTextarea = useCallback(() => {\n const el = textareaRef.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`;\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n resizeTextarea();\n onTypingStart?.();\n };\n\n const handleSend = async () => {\n const trimmed = text.trim();\n if (!trimmed || sending || disabled) return;\n\n setSending(true);\n try {\n await onSendText(trimmed);\n setText(\"\");\n if (textareaRef.current) textareaRef.current.style.height = \"auto\";\n onTypingStop?.();\n } finally {\n setSending(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !onSendFile) return;\n await onSendFile(file);\n \n if (fileRef.current) fileRef.current.value = \"\";\n };\n\n return (\n <div\n className={`hermes-chat-input ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n padding: \"8px 12px\",\n borderTop: \"1px solid #e0e0e0\",\n }}\n >\n {}\n {replyingTo && (\n <div\n className=\"hermes-chat-input__reply\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"6px 10px\",\n marginBottom: 6,\n background: \"#f5f5f5\",\n borderRadius: 8,\n borderLeft: \"3px solid #0084ff\",\n fontSize: 12,\n }}\n >\n <div style={{ overflow: \"hidden\" }}>\n <span style={{ fontWeight: 600, marginRight: 4 }}>\n Replying to:\n </span>\n <span style={{ opacity: 0.7 }}>\n {replyingTo.type === \"text\"\n ? replyingTo.text?.slice(0, 60)\n : `[${replyingTo.type}]`}\n </span>\n </div>\n <button\n onClick={onCancelReply}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 16,\n lineHeight: 1,\n }}\n >\n ✕\n </button>\n </div>\n )}\n\n {}\n <div\n className=\"hermes-chat-input__row\"\n style={{ display: \"flex\", alignItems: \"flex-end\", gap: 8 }}\n >\n {}\n {onSendFile && (\n <>\n <button\n onClick={() => fileRef.current?.click()}\n disabled={disabled}\n className=\"hermes-chat-input__attach\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 6,\n flexShrink: 0,\n opacity: disabled ? 0.4 : 1,\n }}\n >\n {renderAttachIcon ? (\n renderAttachIcon()\n ) : (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n )}\n </button>\n <input\n ref={fileRef}\n type=\"file\"\n style={{ display: \"none\" }}\n onChange={handleFileChange}\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt\"\n />\n </>\n )}\n\n {}\n <textarea\n ref={textareaRef}\n value={text}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={() => onTypingStop?.()}\n placeholder={placeholder}\n disabled={disabled}\n maxLength={maxLength}\n rows={1}\n className={`hermes-chat-input__textarea ${inputClassName}`}\n style={{\n flex: 1,\n resize: \"none\",\n border: \"1px solid #e0e0e0\",\n borderRadius: 20,\n padding: \"8px 14px\",\n fontSize: 14,\n lineHeight: 1.5,\n outline: \"none\",\n overflow: \"hidden\",\n background: disabled ? \"#f5f5f5\" : \"#fff\",\n }}\n />\n\n {}\n <button\n onClick={handleSend}\n disabled={!text.trim() || sending || disabled}\n className=\"hermes-chat-input__send\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 6,\n flexShrink: 0,\n opacity: !text.trim() || sending || disabled ? 0.4 : 1,\n }}\n >\n {renderSendIcon ? (\n renderSendIcon()\n ) : (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n )}\n </button>\n </div>\n\n {}\n {text.length > maxLength * 0.8 && (\n <div\n style={{\n fontSize: 10,\n textAlign: \"right\",\n opacity: 0.5,\n marginTop: 2,\n }}\n >\n {text.length}/{maxLength}\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport type { Room } from \"../../types/index\";\n\ninterface RoomListProps {\n rooms: Room[];\n activeRoomId?: string | null;\n currentUserId: string;\n loading?: boolean;\n onSelectRoom: (room: Room) => void;\n onCreateDirect?: () => void;\n onCreateGroup?: () => void;\n renderRoomItem?: (room: Room, isActive: boolean) => React.ReactNode;\n renderAvatar?: (room: Room) => React.ReactNode;\n renderEmpty?: () => React.ReactNode;\n className?: string;\n itemClassName?: string;\n}\n\nconst formatLastActivity = (iso: string) => {\n const date = new Date(iso);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n if (diffMins < 1) return \"now\";\n if (diffMins < 60) return `${diffMins}m`;\n if (diffHours < 24) return `${diffHours}h`;\n if (diffDays < 7) return `${diffDays}d`;\n return date.toLocaleDateString();\n};\n\nconst getRoomName = (room: Room, currentUserId: string) => {\n if (room.type === \"group\") return room.name ?? \"Group\";\n const other = room.members.find((m) => m !== currentUserId);\n return other ?? \"Direct Message\";\n};\n\nconst getLastMessagePreview = (room: Room): string => {\n const msg = room.lastMessage as any;\n if (!msg) return \"No messages yet\";\n if (msg.isDeleted) return \"Message deleted\";\n if (msg.type === \"text\") return msg.text?.slice(0, 50) ?? \"\";\n if (msg.type === \"image\") return \"📷 Image\";\n if (msg.type === \"video\") return \"🎥 Video\";\n if (msg.type === \"audio\") return \"🎵 Audio\";\n if (msg.type === \"document\") return `📄 ${msg.fileName ?? \"File\"}`;\n if (msg.type === \"link\") return `🔗 ${msg.url}`;\n return \"\";\n};\n\nconst DefaultRoomItem: React.FC<{\n room: Room;\n isActive: boolean;\n currentUserId: string;\n renderAvatar?: (room: Room) => React.ReactNode;\n itemClassName?: string;\n}> = ({ room, isActive, currentUserId, renderAvatar, itemClassName }) => (\n <div\n className={`hermes-room-item ${isActive ? \"hermes-room-item--active\" : \"\"} ${itemClassName ?? \"\"}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n cursor: \"pointer\",\n background: isActive ? \"rgba(0,132,255,0.08)\" : \"transparent\",\n borderLeft: isActive ? \"3px solid #0084ff\" : \"3px solid transparent\",\n }}\n >\n <div style={{ flexShrink: 0 }}>\n {renderAvatar ? (\n renderAvatar(room)\n ) : (\n <div\n style={{\n width: 42,\n height: 42,\n borderRadius: \"50%\",\n background: \"#e0e0e0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontWeight: 700,\n fontSize: 16,\n }}\n >\n {room.type === \"group\" ? \"G\" : \"D\"}\n </div>\n )}\n </div>\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n fontSize: 14,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {getRoomName(room, currentUserId)}\n </span>\n <span\n style={{ fontSize: 11, opacity: 0.5, flexShrink: 0, marginLeft: 4 }}\n >\n {formatLastActivity(room.lastActivity)}\n </span>\n </div>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: 2,\n }}\n >\n <span\n style={{\n fontSize: 13,\n opacity: 0.6,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {getLastMessagePreview(room)}\n </span>\n {room.unreadCount > 0 && (\n <span\n style={{\n background: \"#0084ff\",\n color: \"#fff\",\n borderRadius: 10,\n fontSize: 11,\n fontWeight: 700,\n padding: \"1px 7px\",\n flexShrink: 0,\n marginLeft: 4,\n }}\n >\n {room.unreadCount > 99 ? \"99+\" : room.unreadCount}\n </span>\n )}\n </div>\n </div>\n </div>\n);\n\nexport const RoomList: React.FC<RoomListProps> = ({\n rooms,\n activeRoomId,\n currentUserId,\n loading = false,\n onSelectRoom,\n onCreateDirect,\n onCreateGroup,\n renderRoomItem,\n renderAvatar,\n renderEmpty,\n className = \"\",\n itemClassName = \"\",\n}) => {\n return (\n <div\n className={`hermes-room-list ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n overflowY: \"auto\",\n }}\n >\n {}\n {(onCreateDirect || onCreateGroup) && (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n padding: \"10px 12px\",\n borderBottom: \"1px solid #e0e0e0\",\n }}\n >\n {onCreateDirect && (\n <button\n onClick={onCreateDirect}\n style={{\n flex: 1,\n background: \"#0084ff\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 8,\n padding: \"8px 10px\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n + Direct\n </button>\n )}\n {onCreateGroup && (\n <button\n onClick={onCreateGroup}\n style={{\n flex: 1,\n background: \"none\",\n border: \"1px solid #e0e0e0\",\n borderRadius: 8,\n padding: \"8px 10px\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n + Group\n </button>\n )}\n </div>\n )}\n\n {loading && (\n <div style={{ padding: \"12px 16px\", opacity: 0.5, fontSize: 13 }}>\n Loading rooms...\n </div>\n )}\n\n {!loading && rooms.length === 0 && (\n <div\n style={{\n textAlign: \"center\",\n padding: 24,\n opacity: 0.4,\n fontSize: 13,\n }}\n >\n {renderEmpty ? renderEmpty() : \"No conversations yet.\"}\n </div>\n )}\n\n {!loading &&\n rooms.map((room) => {\n const isActive = room._id === activeRoomId;\n return (\n <div key={room._id} onClick={() => onSelectRoom(room)}>\n {renderRoomItem ? (\n renderRoomItem(room, isActive)\n ) : (\n <DefaultRoomItem\n room={room}\n isActive={isActive}\n currentUserId={currentUserId}\n renderAvatar={renderAvatar}\n itemClassName={itemClassName}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from \"react\";\n\ninterface TypingIndicatorProps {\n typingText: string | null;\n className?: string;\n}\n\nexport const TypingIndicator: React.FC<TypingIndicatorProps> = ({\n typingText,\n className = \"\",\n}) => {\n if (!typingText) return null;\n\n return (\n <div\n className={`hermes-typing-indicator ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 16px\",\n minHeight: 24,\n }}\n >\n <div style={{ display: \"flex\", gap: 3 }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#aaa\",\n display: \"block\",\n animation: `hermes-bounce 1.2s ease-in-out ${i * 0.2}s infinite`,\n }}\n />\n ))}\n </div>\n <span style={{ fontSize: 12, opacity: 0.6 }}>{typingText}</span>\n <style>{`\n @keyframes hermes-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n }\n `}</style>\n </div>\n );\n};\n","import React from \"react\";\n\ninterface OnlineBadgeProps {\n isOnline: boolean;\n size?: number;\n className?: string;\n}\n\nexport const OnlineBadge: React.FC<OnlineBadgeProps> = ({\n isOnline,\n size = 10,\n className = \"\",\n}) => (\n <span\n className={`hermes-online-badge ${isOnline ? \"hermes-online-badge--online\" : \"hermes-online-badge--offline\"} ${className}`}\n data-online={isOnline}\n style={{\n display: \"inline-block\",\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: isOnline ? \"#22c55e\" : \"#d1d5db\",\n boxShadow: isOnline ? \"0 0 0 2px #fff\" : \"none\",\n flexShrink: 0,\n }}\n />\n);\n","import React, { useState, useRef, useEffect } from \"react\";\nimport type { Reaction } from \"../../types/index\";\nimport EmojiPicker, { Theme, type EmojiClickData } from \"emoji-picker-react\";\n\ninterface ReactionPickerProps {\n onSelect: (emoji: string) => void;\n currentReactions?: Reaction[];\n currentUserId?: string;\n emojis?: string[];\n className?: string;\n align?: \"left\" | \"right\";\n}\n\nconst DEFAULT_EMOJIS = [\"👍\", \"❤️\", \"😂\", \"😮\", \"😢\", \"🔥\", \"🎉\", \"👏\"];\n\nexport const ReactionPicker: React.FC<ReactionPickerProps> = ({\n onSelect,\n currentReactions = [],\n currentUserId,\n emojis = DEFAULT_EMOJIS,\n className = \"\",\n align = \"left\",\n}) => {\n const [showPicker, setShowPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n \n const hasReacted = (emoji: string) => {\n if (!currentUserId) return false;\n\n return (\n currentReactions\n .find((r) => r.emoji === emoji)\n ?.users.includes(currentUserId) ?? false\n );\n };\n\n const handleEmojiClick = (emojiData: EmojiClickData) => {\n onSelect(emojiData.emoji);\n setShowPicker(false);\n };\n\n \n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (!containerRef.current) return;\n\n const target = e.target as Node;\n\n if (!containerRef.current.contains(target)) {\n setShowPicker(false);\n }\n };\n\n if (showPicker) {\n window.addEventListener(\"click\", handleOutsideClick);\n }\n\n return () => window.removeEventListener(\"click\", handleOutsideClick);\n }, [showPicker]);\n\n return (\n <div\n ref={containerRef}\n style={{ position: \"relative\", display: \"inline-block\" }}\n className={className}\n >\n {}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n flexWrap: \"wrap\",\n padding: \"6px 8px\",\n background: \"#111\",\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.08)\",\n }}\n >\n {emojis.map((emoji) => (\n <button\n key={emoji}\n onClick={() => onSelect(emoji)}\n style={{\n background: hasReacted(emoji)\n ? \"rgba(57,255,20,0.12)\"\n : \"transparent\",\n border: hasReacted(emoji)\n ? \"1px solid rgba(57,255,20,0.35)\"\n : \"1px solid transparent\",\n borderRadius: 8,\n padding: \"4px 6px\",\n cursor: \"pointer\",\n fontSize: 18,\n lineHeight: 1,\n transition: \"transform 0.12s ease\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.transform = \"scale(1.2)\")\n }\n onMouseLeave={(e) => (e.currentTarget.style.transform = \"scale(1)\")}\n >\n {emoji}\n </button>\n ))}\n\n {}\n <button\n onClick={(e) => {\n e.stopPropagation();\n setShowPicker((v) => !v);\n }}\n style={{\n borderRadius: 8,\n padding: \"4px 6px\",\n cursor: \"pointer\",\n fontSize: 18,\n border: \"1px solid transparent\",\n background: \"transparent\",\n }}\n >\n ➕\n </button>\n </div>\n\n {}\n {showPicker && (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 6px)\",\n [align === \"right\" ? \"right\" : \"left\"]: 0,\n zIndex: 50,\n animation: \"hermes-pop 0.15s ease\",\n }}\n >\n <EmojiPicker\n theme={Theme.DARK}\n onEmojiClick={handleEmojiClick}\n height={440}\n width={360}\n searchPlaceHolder=\"Search emoji...\"\n lazyLoadEmojis\n />\n </div>\n )}\n\n {}\n <style>{`\n @keyframes hermes-pop {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n `}</style>\n </div>\n );\n};\n","import React from \"react\";\nimport type { Message } from \"../../types/index\";\n\ninterface MediaMessageProps {\n message: Message;\n className?: string;\n maxWidth?: number | string;\n}\n\nconst formatFileSize = (bytes?: number) => {\n if (!bytes) return \"\";\n if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${bytes} B`;\n};\n\nexport const MediaMessage: React.FC<MediaMessageProps> = ({\n message,\n className = \"\",\n maxWidth = 300,\n}) => {\n if (!message.url) return null;\n\n return (\n <div\n className={`hermes-media-message hermes-media-message--${message.type} ${className}`}\n style={{ maxWidth }}\n >\n {message.type === \"image\" && (\n <img\n src={message.url}\n alt={message.fileName ?? \"image\"}\n style={{\n width: \"100%\",\n borderRadius: 10,\n display: \"block\",\n cursor: \"pointer\",\n }}\n onClick={() => window.open(message.url, \"_blank\")}\n />\n )}\n\n {message.type === \"video\" && (\n <video\n src={message.url}\n poster={message.thumbnail}\n controls\n style={{ width: \"100%\", borderRadius: 10 }}\n />\n )}\n\n {message.type === \"audio\" && (\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: 8 }}\n >\n <span style={{ fontSize: 20 }}>🎵</span>\n <audio src={message.url} controls style={{ flex: 1, height: 36 }} />\n </div>\n )}\n\n {message.type === \"document\" && (\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n borderRadius: 10,\n border: \"1px solid #e0e0e0\",\n textDecoration: \"none\",\n color: \"inherit\",\n }}\n >\n <span style={{ fontSize: 28, flexShrink: 0 }}>📄</span>\n <div style={{ overflow: \"hidden\" }}>\n <div\n style={{\n fontWeight: 600,\n fontSize: 13,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {message.fileName ?? \"Document\"}\n </div>\n <div style={{ fontSize: 11, opacity: 0.6 }}>\n {formatFileSize(message.fileSize)} · Click to download\n </div>\n </div>\n </a>\n )}\n\n {message.type === \"link\" && (\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e0e0e0\",\n textDecoration: \"none\",\n color: \"#0084ff\",\n wordBreak: \"break-all\",\n fontSize: 13,\n }}\n >\n 🔗 {message.url}\n </a>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":["TypingIndicator","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","TypingIndicator","import_jsx_runtime","import_react","import_jsx_runtime","EmojiPicker","import_jsx_runtime","formatFileSize"]}
1
+ {"version":3,"sources":["../src/react.ts","../src/core/HermesClient.ts","../src/core/EventEmitter.ts","../src/react/context/ChatContext.tsx","../src/react/context/RoomStateContext.tsx","../src/react/context/RoomActionContext.tsx","../src/react/context/MessageContext.tsx","../src/react/context/ComponentContext.tsx","../src/react/context/TypingContext.tsx","../src/react/hooks/useMessages.ts","../src/react/hooks/useRooms.ts","../src/react/hooks/usePresence.ts","../src/react/hooks/useTyping.ts","../src/react/hooks/useReadReceipts.ts","../src/react/hooks/useReactions.ts","../src/react/hooks/useUpload.ts","../src/react/components/Chat/Chat.tsx","../src/react/components/Room/Room.tsx","../src/react/components/Window/Window.tsx","../src/react/components/MessageList.tsx","../src/react/components/Message/Message.tsx","../src/react/components/Avatar/Avatar.tsx","../src/react/components/Message/MessageStatus.tsx","../src/react/components/Message/MessageActions.tsx","../src/react/components/DateSeparator/DateSeparator.tsx","../src/react/components/EmptyStateIndicator/EmptyStateIndicator.tsx","../src/react/components/Loading/LoadingIndicator.tsx","../src/react/components/TypingIndicator.tsx","../src/react/components/ChatInput.tsx","../src/react/components/RoomList.tsx","../src/react/components/OnlineBadge.tsx","../src/react/components/ReactionPicker.tsx","../src/react/components/MediaMessage.tsx","../src/react/components/Thread/ThreadHeader.tsx","../src/react/components/Thread/Thread.tsx","../src/react/components/Modal/Modal.tsx","../src/react/components/Search/Search.tsx"],"sourcesContent":["\nexport * from \"./index\";\n\n// ─── Context Providers & Hooks ───\nexport * from \"./react/context\";\n\n// ─── Hooks ───\nexport { useMessages } from \"./react/hooks/useMessages\";\nexport { useRooms } from \"./react/hooks/useRooms\";\nexport { usePresence } from \"./react/hooks/usePresence\";\nexport { useTyping } from \"./react/hooks/useTyping\";\nexport { useReadReceipts } from \"./react/hooks/useReadReceipts\";\nexport { useReactions } from \"./react/hooks/useReactions\";\nexport { useUpload } from \"./react/hooks/useUpload\";\n\n// ─── Wrapper Components ───\nexport { Chat } from \"./react/components/Chat\";\nexport type { ChatProps } from \"./react/components/Chat\";\nexport { Room } from \"./react/components/Room\";\nexport type { RoomProps } from \"./react/components/Room\";\nexport { Window } from \"./react/components/Window\";\nexport type { WindowProps } from \"./react/components/Window\";\n\n// ─── Core UI Components (original names preserved) ───\nexport { MessageList } from \"./react/components/MessageList\";\nexport { ChatInput } from \"./react/components/ChatInput\";\nexport { RoomList } from \"./react/components/RoomList\";\nexport { TypingIndicator } from \"./react/components/TypingIndicator\";\nexport { OnlineBadge } from \"./react/components/OnlineBadge\";\nexport { ReactionPicker } from \"./react/components/ReactionPicker\";\nexport { MediaMessage } from \"./react/components/MediaMessage\";\n\n// ─── New Feature Components ───\nexport { Message, MessageStatus, MessageActions } from \"./react/components/Message\";\nexport type { MessageProps, MessageStatusProps, MessageActionsProps } from \"./react/components/Message\";\nexport { Thread, ThreadHeader } from \"./react/components/Thread\";\nexport type { ThreadProps, ThreadHeaderProps } from \"./react/components/Thread\";\nexport { Avatar } from \"./react/components/Avatar\";\nexport type { AvatarProps } from \"./react/components/Avatar\";\nexport { DateSeparator } from \"./react/components/DateSeparator\";\nexport type { DateSeparatorProps } from \"./react/components/DateSeparator\";\nexport { LoadingIndicator, LoadingErrorIndicator } from \"./react/components/Loading\";\nexport type { LoadingIndicatorProps, LoadingErrorIndicatorProps } from \"./react/components/Loading\";\nexport { EmptyStateIndicator } from \"./react/components/EmptyStateIndicator\";\nexport type { EmptyStateIndicatorProps } from \"./react/components/EmptyStateIndicator\";\nexport { Modal } from \"./react/components/Modal\";\nexport type { ModalProps } from \"./react/components/Modal\";\nexport { Search } from \"./react/components/Search\";\nexport type { SearchProps } from \"./react/components/Search\";\n","import { io, Socket } from \"socket.io-client\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport type {\n HermesConfig,\n HermesUser,\n ConnectionStatus,\n Message,\n Room,\n SendMessageInput,\n MessageHistoryResult,\n CreateDirectRoomInput,\n CreateGroupRoomInput,\n UploadResult,\n} from \"../types/index\";\n\ninterface ApiKeyConfig {\n endpoint: string;\n apiKey: string;\n secret: string;\n userId: string;\n displayName: string;\n avatar?: string;\n email?: string;\n}\n\nexport class HermesClient extends EventEmitter {\n private config: HermesConfig;\n private socket: Socket | null = null;\n private token: string | null = null;\n\n public user: HermesUser | null = null;\n public status: ConnectionStatus = \"idle\";\n\n constructor(config: HermesConfig) {\n super();\n this.config = config;\n if (\"token\" in config && typeof config.token === \"string\") {\n this.token = config.token;\n }\n }\n\n async connect(): Promise<HermesUser> {\n this.status = \"connecting\";\n try {\n if (this.token) {\n await this._connectSocket();\n return this.user!;\n }\n if (!(\"apiKey\" in this.config)) {\n throw new Error(\"Either token or (apiKey + secret + userId) must be provided\");\n }\n const cfg = this.config as unknown as ApiKeyConfig;\n const res = await fetch(`${cfg.endpoint}/hermes/connect`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n apiKey: cfg.apiKey,\n secret: cfg.secret,\n userId: cfg.userId,\n }),\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.message || \"Auth failed\");\n this.token = data.token;\n this.user = {\n userId: data.user.hermesUserId,\n displayName: data.user.displayName,\n avatar: data.user.avatar,\n email: data.user.email,\n };\n await this._connectSocket();\n return this.user!;\n } catch (err) {\n this.status = \"error\";\n this.emit(\"error\", err as Error);\n throw err;\n }\n }\n\n private async _connectSocket(): Promise<void> {\n this.socket = io(`${this.config.endpoint}/hermes`, {\n auth: { token: this.token },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n });\n this._wireSocketEvents();\n await new Promise<void>((resolve, reject) => {\n this.socket!.once(\"connect\", resolve);\n this.socket!.once(\"connect_error\", (err) => reject(err));\n });\n this.status = \"connected\";\n this.emit(\"connected\");\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.token = null;\n this.status = \"disconnected\";\n this.emit(\"disconnected\", \"manual\");\n }\n\n private _wireSocketEvents(): void {\n const s = this.socket!;\n s.on(\"disconnect\", (reason) => { this.status = \"disconnected\"; this.emit(\"disconnected\", reason); });\n s.on(\"connect_error\", (err) => { this.status = \"error\"; this.emit(\"error\", err); });\n s.on(\"message:receive\", (msg: Message) => this.emit(\"message:receive\", msg));\n s.on(\"message:deleted\", (data) => this.emit(\"message:deleted\", data));\n s.on(\"message:edited\", (msg: Message) => this.emit(\"message:edited\", msg));\n s.on(\"room:created\", (room: Room) => this.emit(\"room:created\", room));\n s.on(\"room:deleted\", (data) => this.emit(\"room:deleted\", data));\n s.on(\"room:member:joined\", (data) => this.emit(\"room:member:joined\", data));\n s.on(\"room:member:left\", (data) => this.emit(\"room:member:left\", data));\n s.on(\"user:online\", (event) => this.emit(\"user:online\", event));\n s.on(\"user:offline\", (event) => this.emit(\"user:offline\", event));\n s.on(\"typing:started\", (event) => this.emit(\"typing:started\", event));\n s.on(\"typing:stopped\", (event) => this.emit(\"typing:stopped\", event));\n s.on(\"receipt:updated\", (event) => this.emit(\"receipt:updated\", event));\n s.on(\"reaction:updated\", (event) => this.emit(\"reaction:updated\", event));\n }\n\n _emit<T = any>(event: string, data?: any): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.socket?.connected) return reject(new Error(\"Not connected to Hermes engine\"));\n const timer = setTimeout(() => reject(new Error(`Timed out waiting for \"${event}\"`)), 5000);\n const callback = (response: any) => {\n clearTimeout(timer);\n if (response?.success === false) reject(new Error(response.error || \"Unknown error\"));\n else resolve(response);\n };\n if (data && Object.keys(data).length > 0) this.socket!.emit(event, data, callback);\n else this.socket!.emit(event, callback);\n });\n }\n\n async sendMessage(input: SendMessageInput): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:send\", input);\n return res.message;\n }\n async getHistory(roomId: string, before?: string, limit?: number): Promise<MessageHistoryResult> {\n return this._emit(\"message:history\", { roomId, before, limit });\n }\n async deleteMessage(messageId: string, roomId: string): Promise<void> {\n await this._emit(\"message:delete\", { messageId, roomId });\n }\n async editMessage(messageId: string, roomId: string, text: string): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:edit\", { messageId, roomId, text });\n return res.message;\n }\n async createDirectRoom(input: CreateDirectRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:direct\", { targetHermesUserId: input.targetUserId });\n return res.room;\n }\n async createGroupRoom(input: CreateGroupRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:group\", input);\n return res.room;\n }\n async deleteRoom(roomId: string): Promise<void> { await this._emit(\"room:delete\", { roomId }); }\n async getRooms(): Promise<Room[]> {\n const res = await this._emit<{ rooms: Room[] }>(\"room:list\");\n return res.rooms;\n }\n async addMember(roomId: string, newMemberId: string): Promise<void> { await this._emit(\"room:member:add\", { roomId, newMemberId }); }\n async removeMember(roomId: string, targetId: string): Promise<void> { await this._emit(\"room:member:remove\", { roomId, targetId }); }\n pingPresence(roomId: string): void { this.socket?.emit(\"presence:ping\", { roomId }); }\n startTyping(roomId: string): void { this.socket?.emit(\"typing:start\", { roomId }); }\n stopTyping(roomId: string): void { this.socket?.emit(\"typing:stop\", { roomId }); }\n async markSeen(roomId: string, lastMessageId: string): Promise<void> { await this._emit(\"receipt:seen\", { roomId, lastMessageId }); }\n async addReaction(messageId: string, roomId: string, emoji: string): Promise<void> { await this._emit(\"reaction:add\", { messageId, roomId, emoji }); }\n async uploadFile(file: File): Promise<UploadResult> {\n if (!this.token) throw new Error(\"Not connected\");\n const formData = new FormData();\n formData.append(\"file\", file);\n const res = await fetch(`${this.config.endpoint}/hermes/upload`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.token}` },\n body: formData,\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"Upload failed\");\n return data as UploadResult;\n }\n get isConnected(): boolean { return this.status === \"connected\" && !!this.socket?.connected; }\n get currentUser(): HermesUser | null { return this.user; }\n}\n","import type { HermesEvents } from \"../types/index\";\n\ntype EventKey = keyof HermesEvents;\ntype EventCallback<K extends EventKey> = HermesEvents[K];\ntype ListenerMap = { [K in EventKey]?: EventCallback<K>[] };\n\nexport class EventEmitter {\n private listeners: ListenerMap = {};\n\n on<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n (this.listeners[event] as EventCallback<K>[]).push(callback);\n return this;\n }\n\n off<K extends EventKey>(event: K, callback: EventCallback<K>): void {\n if (!this.listeners[event]) return;\n this.listeners[event] = (\n this.listeners[event] as EventCallback<K>[]\n ).filter((cb) => cb !== callback) as any;\n }\n\n once<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n const wrapper = ((...args: any[]) => {\n (callback as any)(...args);\n this.off(event, wrapper as any);\n }) as EventCallback<K>;\n return this.on(event, wrapper);\n }\n\n emit<K extends EventKey>(\n event: K,\n ...args: Parameters<EventCallback<K>>\n ): this {\n if (!this.listeners[event]) return this;\n (this.listeners[event] as EventCallback<K>[]).forEach((cb) =>\n (cb as any)(...args),\n );\n return this;\n }\n\n removeAllListeners<K extends EventKey>(event?: K): this {\n if (event) {\n delete this.listeners[event];\n } else {\n this.listeners = {};\n }\n return this;\n }\n\n listenerCount<K extends EventKey>(event: K): number {\n return this.listeners[event]?.length ?? 0;\n }\n}\n","import React, { createContext, useContext } from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { HermesUser, Room } from \"../../types/index\";\n\nexport type CustomClasses = Partial<\n Record<\n | \"chat\"\n | \"roomList\"\n | \"room\"\n | \"messageList\"\n | \"message\"\n | \"thread\"\n | \"window\",\n string\n >\n>;\n\nexport interface ChatContextValue {\n /** The HermesClient instance powering the SDK */\n client: HermesClient;\n /** The currently connected user */\n currentUser: HermesUser | null;\n /** Visual theme identifier */\n theme: string;\n /** The currently active room */\n activeRoom?: Room;\n /** Set the active room */\n setActiveRoom: (room?: Room) => void;\n /** Open mobile navigation */\n openMobileNav: () => void;\n /** Close mobile navigation */\n closeMobileNav: () => void;\n /** Whether mobile nav is open */\n navOpen: boolean;\n /** Custom CSS class overrides for main SDK containers */\n customClasses?: CustomClasses;\n}\n\nexport const ChatContext = createContext<ChatContextValue | undefined>(\n undefined\n);\n\nexport const ChatProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: ChatContextValue }>) => (\n <ChatContext.Provider value={value}>{children}</ChatContext.Provider>\n);\n\n/**\n * Access the ChatContext. Must be used within a `<Chat>` component.\n */\nexport const useChatContext = (componentName?: string): ChatContextValue => {\n const contextValue = useContext(ChatContext);\n if (!contextValue) {\n console.warn(\n `useChatContext was called outside of ChatProvider. Make sure this hook is called within a child of the <Chat> component.${componentName ? ` Errored in: ${componentName}` : \"\"}`\n );\n return {} as ChatContextValue;\n }\n return contextValue;\n};\n","import React, { createContext, useContext } from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport type { Message, Room } from \"../../types/index\";\n\nexport interface RoomStateContextValue {\n /** The Room object for this context */\n room: Room;\n /** Messages in the current room */\n messages: Message[];\n /** Whether messages are initially loading */\n loading: boolean;\n /** Whether older messages are being loaded */\n loadingMore: boolean;\n /** Whether there are more messages to load */\n hasMore: boolean;\n /** Error during message fetching */\n error: string | null;\n /** Members of the room */\n members: string[];\n /** The active thread parent message (null if no thread open) */\n thread: Message | null;\n /** Messages within the active thread */\n threadMessages: Message[];\n /** Whether the thread has more messages to load */\n threadHasMore: boolean;\n /** Whether thread is loading more messages */\n threadLoadingMore: boolean;\n /** Pinned messages in the room */\n pinnedMessages: Message[];\n}\n\nexport const RoomStateContext = createContext<\n RoomStateContextValue | undefined\n>(undefined);\n\nexport const RoomStateProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: RoomStateContextValue }>) => (\n <RoomStateContext.Provider value={value}>\n {children}\n </RoomStateContext.Provider>\n);\n\n/**\n * Access the RoomStateContext. Must be used within a `<Room>` component.\n */\nexport const useRoomStateContext = (\n componentName?: string\n): RoomStateContextValue => {\n const contextValue = useContext(RoomStateContext);\n if (!contextValue) {\n console.warn(\n `useRoomStateContext was called outside of RoomStateProvider. Make sure this hook is called within a child of the <Room> component.${componentName ? ` Errored in: ${componentName}` : \"\"}`\n );\n return {} as RoomStateContextValue;\n }\n return contextValue;\n};\n","import React, { createContext, useContext } from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport type { Message, SendMessageInput } from \"../../types/index\";\n\nexport interface RoomActionContextValue {\n /** Send a message to the current room */\n sendMessage: (\n input: Omit<SendMessageInput, \"roomId\">\n ) => Promise<Message>;\n /** Edit a message */\n editMessage: (messageId: string, text: string) => Promise<Message>;\n /** Delete a message */\n deleteMessage: (messageId: string) => Promise<void>;\n /** Add a reaction to a message */\n addReaction: (messageId: string, emoji: string) => Promise<void>;\n /** Load older messages */\n loadMore: () => Promise<void>;\n /** Mark room as seen */\n markRead: (lastMessageId: string) => Promise<void>;\n /** Open a thread for a specific message */\n openThread: (message: Message) => void;\n /** Close the currently open thread */\n closeThread: () => void;\n /** Load more thread replies */\n loadMoreThread: () => Promise<void>;\n}\n\nexport const RoomActionContext = createContext<\n RoomActionContextValue | undefined\n>(undefined);\n\nexport const RoomActionProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: RoomActionContextValue }>) => (\n <RoomActionContext.Provider value={value}>\n {children}\n </RoomActionContext.Provider>\n);\n\n/**\n * Access the RoomActionContext. Must be used within a `<Room>` component.\n */\nexport const useRoomActionContext = (\n componentName?: string\n): RoomActionContextValue => {\n const contextValue = useContext(RoomActionContext);\n if (!contextValue) {\n console.warn(\n `useRoomActionContext was called outside of RoomActionProvider. Make sure this hook is called within a child of the <Room> component.${componentName ? ` Errored in: ${componentName}` : \"\"}`\n );\n return {} as RoomActionContextValue;\n }\n return contextValue;\n};\n","import React, { createContext, useContext } from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport type { Message, DeliveryStatus } from \"../../types/index\";\n\nexport type GroupStyle = \"top\" | \"middle\" | \"bottom\" | \"single\";\n\nexport interface MessageContextValue {\n /** The message object */\n message: Message;\n /** Whether actions (edit, delete, flag, etc.) are enabled */\n actionsEnabled: boolean;\n /** Whether this message belongs to the current user */\n isMyMessage: boolean;\n /** Handle editing the message */\n handleEdit: (text: string) => Promise<void>;\n /** Handle deleting the message */\n handleDelete: () => Promise<void>;\n /** Handle adding a reaction */\n handleReaction: (emoji: string) => Promise<void>;\n /** Handle replying (inline quote) */\n handleReply: () => void;\n /** Handle opening a thread */\n handleOpenThread: () => void;\n /** Message delivery status */\n deliveryStatus: DeliveryStatus;\n /** Users who have seen this message */\n readBy: string[];\n /** Group style for visual grouping of consecutive messages from the same sender */\n groupStyle: GroupStyle;\n /** Whether this message is highlighted (e.g. jump-to-message) */\n highlighted?: boolean;\n /** Whether this message is in a thread list */\n threadList?: boolean;\n /** Custom date formatter */\n formatDate?: (date: Date) => string;\n}\n\nexport const MessageContext = createContext<MessageContextValue | undefined>(\n undefined\n);\n\nexport const MessageProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: MessageContextValue }>) => (\n <MessageContext.Provider value={value}>{children}</MessageContext.Provider>\n);\n\n/**\n * Access the MessageContext. Must be used within a `<Message>` component.\n */\nexport const useMessageContext = (\n componentName?: string\n): MessageContextValue => {\n const contextValue = useContext(MessageContext);\n if (!contextValue) {\n console.warn(\n `useMessageContext was called outside of MessageProvider.${componentName ? ` Errored in: ${componentName}` : \"\"}`\n );\n return {} as MessageContextValue;\n }\n return contextValue;\n};\n","import React, { createContext, useContext } from \"react\";\nimport type { PropsWithChildren } from \"react\";\n\n/**\n * ComponentContext allows developers to override any internal UI component\n * with their own implementation. This is the Inversion of Control (IoC) pattern\n * used by Stream Chat React.\n *\n * Usage:\n * ```tsx\n * <Room roomId={id} Avatar={MyCustomAvatar} Message={MyCustomMessage}>\n * <MessageList />\n * </Room>\n * ```\n */\nexport interface ComponentContextValue {\n /** Custom Avatar component */\n Avatar?: React.ComponentType<any>;\n /** Custom Message bubble component */\n Message?: React.ComponentType<any>;\n /** Custom MessageStatus component (delivery indicators) */\n MessageStatus?: React.ComponentType<any>;\n /** Custom MessageActions component (hover toolbar) */\n MessageActions?: React.ComponentType<any>;\n /** Custom DateSeparator component */\n DateSeparator?: React.ComponentType<any>;\n /** Custom EmptyStateIndicator component */\n EmptyStateIndicator?: React.ComponentType<any>;\n /** Custom LoadingIndicator component */\n LoadingIndicator?: React.ComponentType<any>;\n /** Custom LoadingErrorIndicator component */\n LoadingErrorIndicator?: React.ComponentType<any>;\n /** Custom ReactionPicker component */\n ReactionPicker?: React.ComponentType<any>;\n /** Custom TypingIndicator component */\n TypingIndicator?: React.ComponentType<any>;\n /** Custom MediaMessage (attachment renderer) component */\n MediaMessage?: React.ComponentType<any>;\n /** Custom ThreadHeader component */\n ThreadHeader?: React.ComponentType<any>;\n /** Custom Modal component */\n Modal?: React.ComponentType<any>;\n /** Custom ChatInput component */\n ChatInput?: React.ComponentType<any>;\n /** Custom RoomListItem component */\n RoomListItem?: React.ComponentType<any>;\n /** Custom Search component */\n Search?: React.ComponentType<any>;\n /** Custom OnlineBadge component */\n OnlineBadge?: React.ComponentType<any>;\n}\n\nexport const ComponentContext = createContext<ComponentContextValue>({});\n\nexport const ComponentProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: Partial<ComponentContextValue> }>) => (\n <ComponentContext.Provider value={value as ComponentContextValue}>\n {children}\n </ComponentContext.Provider>\n);\n\n/**\n * Access component overrides. Returns an empty object if no overrides are set.\n */\nexport const useComponentContext = (\n _componentName?: string\n): ComponentContextValue => useContext(ComponentContext);\n","import React, { createContext, useContext } from \"react\";\nimport type { PropsWithChildren } from \"react\";\n\nexport interface TypingContextValue {\n /** Map of userId → displayName for users currently typing */\n typingUsers: Map<string, string>;\n /** Human-readable typing indicator text (e.g. \"Alice is typing...\") */\n typingText: string | null;\n /** Whether anyone is currently typing */\n isAnyoneTyping: boolean;\n /** Emit a typing start event */\n startTyping: () => void;\n /** Emit a typing stop event */\n stopTyping: () => void;\n}\n\nexport const TypingContext = createContext<TypingContextValue | undefined>(\n undefined\n);\n\nexport const TypingProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: TypingContextValue }>) => (\n <TypingContext.Provider value={value}>{children}</TypingContext.Provider>\n);\n\n/**\n * Access typing state for the current room. Must be within a `<Room>` component.\n */\nexport const useTypingContext = (\n componentName?: string\n): TypingContextValue => {\n const contextValue = useContext(TypingContext);\n if (!contextValue) {\n console.warn(\n `useTypingContext was called outside of TypingProvider.${componentName ? ` Errored in: ${componentName}` : \"\"}`\n );\n return {} as TypingContextValue;\n }\n return contextValue;\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { Message, SendMessageInput } from \"../../types/index\";\n\nexport const useMessages = (client: HermesClient, roomId: string | null) => {\n const [messages, setMessages] = useState<Message[]>([]);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [hasMore, setHasMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [typingUsers, setTypingUsers] = useState<\n { userId: string; displayName: string }[]\n >([]);\n const oldestMessageId = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (!roomId || !client.isConnected) return;\n\n setMessages([]);\n setHasMore(false);\n oldestMessageId.current = undefined;\n setLoading(true);\n setError(null);\n\n client\n .getHistory(roomId)\n .then(({ messages: msgs, hasMore: more }) => {\n setMessages(msgs);\n setHasMore(more);\n if (msgs.length > 0) oldestMessageId.current = msgs[0]._id;\n })\n .catch((err) => setError(err.message))\n .finally(() => setLoading(false));\n }, [roomId, client.isConnected]);\n\n useEffect(() => {\n if (!roomId) return;\n\n const onReceive = (msg: Message) => {\n if (msg.roomId !== roomId) return;\n setMessages((prev) => {\n if (prev.find((m) => m._id === msg._id)) return prev;\n return [...prev, msg];\n });\n };\n\n const onDeleted = ({\n messageId,\n }: {\n messageId: string;\n roomId: string;\n }) => {\n setMessages((prev) =>\n prev.map((m) =>\n m._id === messageId ? { ...m, isDeleted: true, text: undefined } : m,\n ),\n );\n };\n\n const onEdited = (msg: Message) => {\n setMessages((prev) => prev.map((m) => (m._id === msg._id ? msg : m)));\n };\n\n client.on(\"message:receive\", onReceive);\n client.on(\"message:deleted\", onDeleted);\n client.on(\"message:edited\", onEdited);\n\n return () => {\n client.off(\"message:receive\", onReceive);\n client.off(\"message:deleted\", onDeleted);\n client.off(\"message:edited\", onEdited);\n };\n }, [roomId, client]);\n\n useEffect(() => {\n const onReaction = ({ messageId, reactions }: any) => {\n setMessages((prev) =>\n prev.map((m) => (m._id === messageId ? { ...m, reactions } : m)),\n );\n };\n client.on(\"reaction:updated\", onReaction);\n return () => { client.off(\"reaction:updated\", onReaction); };\n }, [client]);\n\n useEffect(() => {\n if (!roomId) return;\n\n const onStarted = ({ userId, displayName, roomId: rid }: any) => {\n if (rid !== roomId) return;\n setTypingUsers((prev) => [\n ...prev.filter((u) => u.userId !== userId),\n { userId, displayName },\n ]);\n };\n\n const onStopped = ({ userId, roomId: rid }: any) => {\n if (rid !== roomId) return;\n setTypingUsers((prev) => prev.filter((u) => u.userId !== userId));\n };\n\n client.on(\"typing:started\", onStarted);\n client.on(\"typing:stopped\", onStopped);\n\n return () => {\n client.off(\"typing:started\", onStarted);\n client.off(\"typing:stopped\", onStopped);\n \n setTypingUsers([]);\n };\n }, [roomId, client]);\n\n const loadMore = useCallback(async () => {\n if (!roomId || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const { messages: older, hasMore: more } = await client.getHistory(\n roomId,\n oldestMessageId.current,\n );\n setMessages((prev) => [...older, ...prev]);\n setHasMore(more);\n if (older.length > 0) oldestMessageId.current = older[0]._id;\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoadingMore(false);\n }\n }, [roomId, loadingMore, hasMore, client]);\n\n const sendMessage = useCallback(\n async (input: Omit<SendMessageInput, \"roomId\">) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.sendMessage({ ...input, roomId });\n },\n [roomId, client],\n );\n\n const editMessage = useCallback(\n async (messageId: string, text: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.editMessage(messageId, roomId, text);\n },\n [roomId, client],\n );\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.deleteMessage(messageId, roomId);\n },\n [roomId, client],\n );\n\n const addReaction = useCallback(\n async (messageId: string, emoji: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.addReaction(messageId, roomId, emoji);\n },\n [roomId, client],\n );\n\n return {\n messages,\n loading,\n loadingMore,\n hasMore,\n error,\n typingUsers,\n sendMessage,\n editMessage,\n deleteMessage,\n addReaction,\n loadMore,\n };\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type {\n Room,\n CreateDirectRoomInput,\n CreateGroupRoomInput,\n} from \"../../types/index\";\n\nexport const useRooms = (client: HermesClient) => {\n const [rooms, setRooms] = useState<Room[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const fetchedRef = useRef(false);\n\n \n const fetchRooms = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n \n await new Promise<void>((resolve, reject) => {\n if (client.isConnected) return resolve();\n let attempts = 0;\n const interval = setInterval(() => {\n attempts++;\n if (client.isConnected) {\n clearInterval(interval);\n resolve();\n } else if (attempts > 50) {\n clearInterval(interval);\n reject(new Error(\"Connection timeout\"));\n }\n }, 100);\n });\n\n try {\n const data = await client.getRooms();\n console.log(\"[useRooms] fetched:\", data.length, \"rooms\");\n setRooms(data);\n fetchedRef.current = true;\n } catch (err: any) {\n console.error(\"[useRooms] fetch error:\", err.message);\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n \n useEffect(() => {\n fetchRooms();\n const onConnected = () => {\n if (!fetchedRef.current) fetchRooms();\n };\n client.on(\"connected\", onConnected);\n return () => {\n client.off(\"connected\", onConnected);\n };\n }, [fetchRooms, client]);\n\n \n useEffect(() => {\n const onCreated = (room: Room) => {\n setRooms((prev) => {\n if (prev.find((r) => r._id === room._id)) return prev;\n return [{ ...room, unreadCount: 0 }, ...prev];\n });\n };\n\n const onDeleted = ({ roomId }: { roomId: string }) =>\n setRooms((prev) => prev.filter((r) => r._id !== roomId));\n\n const onMemberJoined = ({\n roomId,\n userId,\n }: {\n roomId: string;\n userId: string;\n }) =>\n setRooms((prev) =>\n prev.map((r) =>\n r._id === roomId ? { ...r, members: [...r.members, userId] } : r,\n ),\n );\n\n const onMemberLeft = ({\n roomId,\n userId,\n }: {\n roomId: string;\n userId: string;\n }) =>\n setRooms((prev) =>\n prev.map((r) =>\n r._id === roomId\n ? { ...r, members: r.members.filter((m) => m !== userId) }\n : r,\n ),\n );\n\n const onMessage = (msg: any) =>\n setRooms((prev) => {\n const idx = prev.findIndex((r) => r._id === msg.roomId);\n if (idx === -1) return prev;\n const updated = {\n ...prev[idx],\n lastMessage: msg,\n lastActivity: msg.createdAt,\n };\n return [updated, ...prev.filter((r) => r._id !== msg.roomId)];\n });\n\n client.on(\"room:created\", onCreated);\n client.on(\"room:deleted\", onDeleted);\n client.on(\"room:member:joined\", onMemberJoined);\n client.on(\"room:member:left\", onMemberLeft);\n client.on(\"message:receive\", onMessage);\n\n return () => {\n client.off(\"room:created\", onCreated);\n client.off(\"room:deleted\", onDeleted);\n client.off(\"room:member:joined\", onMemberJoined);\n client.off(\"room:member:left\", onMemberLeft);\n client.off(\"message:receive\", onMessage);\n };\n }, [client]);\n\n \n const createDirect = useCallback(\n async (input: CreateDirectRoomInput) => {\n const room = await client.createDirectRoom(input);\n setRooms((prev) => {\n if (prev.find((r) => r._id === room._id)) return prev;\n return [{ ...room, unreadCount: 0 }, ...prev];\n });\n return room;\n },\n [client],\n );\n\n const createGroup = useCallback(\n async (input: CreateGroupRoomInput) => {\n const room = await client.createGroupRoom(input);\n setRooms((prev) => {\n if (prev.find((r) => r._id === room._id)) return prev;\n return [{ ...room, unreadCount: 0 }, ...prev];\n });\n return room;\n },\n [client],\n );\n\n const deleteRoom = useCallback(\n async (roomId: string) => {\n await client.deleteRoom(roomId);\n setRooms((prev) => prev.filter((r) => r._id !== roomId));\n },\n [client],\n );\n\n const addMember = useCallback(\n (roomId: string, userId: string) => client.addMember(roomId, userId),\n [client],\n );\n\n const removeMember = useCallback(\n (roomId: string, userId: string) => client.removeMember(roomId, userId),\n [client],\n );\n\n return {\n rooms,\n loading,\n error,\n createDirect,\n createGroup,\n deleteRoom,\n addMember,\n removeMember,\n refetch: fetchRooms,\n };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\n\nexport const usePresence = (client: HermesClient) => {\n const [onlineMap, setOnlineMap] = useState<Map<string, boolean>>(new Map());\n\n useEffect(() => {\n const onOnline = ({ userId }: { userId: string }) => {\n setOnlineMap((prev) => new Map(prev).set(userId, true));\n };\n\n const onOffline = ({ userId }: { userId: string }) => {\n setOnlineMap((prev) => new Map(prev).set(userId, false));\n };\n\n client.on(\"user:online\", onOnline);\n client.on(\"user:offline\", onOffline);\n\n return () => {\n client.off(\"user:online\", onOnline);\n client.off(\"user:offline\", onOffline);\n };\n }, [client]);\n\n const isOnline = useCallback(\n (userId: string): boolean => onlineMap.get(userId) ?? false,\n [onlineMap],\n );\n\n const onlineUsers = Array.from(onlineMap.entries())\n .filter(([, online]) => online)\n .map(([userId]) => userId);\n\n return { isOnline, onlineUsers, onlineMap };\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { TypingEvent } from \"../../types/index\";\n\nexport const useTyping = (client: HermesClient, roomId: string | null) => {\n \n const [typingUsers, setTypingUsers] = useState<Map<string, string>>(\n new Map(),\n );\n const timeouts = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n const typingRef = useRef(false);\n const stopTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (!roomId) return;\n\n const onStart = (event: TypingEvent) => {\n if (event.roomId !== roomId) return;\n if (event.userId === client.currentUser?.userId) return;\n\n setTypingUsers((prev) =>\n new Map(prev).set(event.userId, event.displayName),\n );\n\n \n const existing = timeouts.current.get(event.userId);\n if (existing) clearTimeout(existing);\n const t = setTimeout(() => {\n setTypingUsers((prev) => {\n const next = new Map(prev);\n next.delete(event.userId);\n return next;\n });\n }, 4000);\n timeouts.current.set(event.userId, t);\n };\n\n const onStop = (event: TypingEvent) => {\n if (event.roomId !== roomId) return;\n setTypingUsers((prev) => {\n const next = new Map(prev);\n next.delete(event.userId);\n return next;\n });\n const existing = timeouts.current.get(event.userId);\n if (existing) clearTimeout(existing);\n timeouts.current.delete(event.userId);\n };\n\n client.on(\"typing:started\", onStart);\n client.on(\"typing:stopped\", onStop);\n\n return () => {\n client.off(\"typing:started\", onStart);\n client.off(\"typing:stopped\", onStop);\n timeouts.current.forEach(clearTimeout);\n timeouts.current.clear();\n };\n }, [roomId, client]);\n\n \n const startTyping = useCallback(() => {\n if (!roomId) return;\n\n if (!typingRef.current) {\n client.startTyping(roomId);\n typingRef.current = true;\n }\n\n \n if (stopTimeout.current) clearTimeout(stopTimeout.current);\n stopTimeout.current = setTimeout(() => {\n client.stopTyping(roomId);\n typingRef.current = false;\n }, 3000);\n }, [roomId, client]);\n\n \n const stopTyping = useCallback(() => {\n if (!roomId) return;\n if (stopTimeout.current) clearTimeout(stopTimeout.current);\n if (typingRef.current) {\n client.stopTyping(roomId);\n typingRef.current = false;\n }\n }, [roomId, client]);\n\n \n const typingText = (() => {\n const names = Array.from(typingUsers.values());\n if (names.length === 0) return null;\n if (names.length === 1) return `${names[0]} is typing...`;\n if (names.length === 2) return `${names[0]} and ${names[1]} are typing...`;\n return `${names[0]} and ${names.length - 1} others are typing...`;\n })();\n\n return {\n typingUsers, \n typingText, \n isAnyoneTyping: typingUsers.size > 0,\n startTyping,\n stopTyping,\n };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { ReceiptEvent } from \"../../types/index\";\n\nexport const useReadReceipts = (\n client: HermesClient,\n roomId: string | null,\n) => {\n \n const [receipts, setReceipts] = useState<Map<string, Set<string>>>(new Map());\n\n useEffect(() => {\n if (!roomId) return;\n\n const onReceipt = (event: ReceiptEvent) => {\n if (event.roomId !== roomId) return;\n setReceipts((prev) => {\n const next = new Map(prev);\n const existing = next.get(event.lastMessageId) ?? new Set();\n existing.add(event.userId);\n next.set(event.lastMessageId, existing);\n return next;\n });\n };\n\n client.on(\"receipt:updated\", onReceipt);\n return () => client.off(\"receipt:updated\", onReceipt);\n }, [roomId, client]);\n\n \n const markSeen = useCallback(\n async (lastMessageId: string) => {\n if (!roomId) return;\n await client.markSeen(roomId, lastMessageId);\n },\n [roomId, client],\n );\n\n \n const seenBy = useCallback(\n (messageId: string): string[] => {\n return Array.from(receipts.get(messageId) ?? []);\n },\n [receipts],\n );\n\n return { markSeen, seenBy, receipts };\n};\n","import { useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { Reaction } from \"../../types/index\";\n\nexport const useReactions = (client: HermesClient, roomId: string | null) => {\n \n const react = useCallback(\n async (messageId: string, emoji: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n await client.addReaction(messageId, roomId, emoji);\n },\n [roomId, client],\n );\n\n \n const hasReacted = useCallback(\n (reactions: Reaction[], emoji: string): boolean => {\n const userId = client.currentUser?.userId;\n if (!userId) return false;\n return (\n reactions.find((r) => r.emoji === emoji)?.users.includes(userId) ??\n false\n );\n },\n [client],\n );\n\n \n const getCount = useCallback(\n (reactions: Reaction[], emoji: string): number => {\n return reactions.find((r) => r.emoji === emoji)?.users.length ?? 0;\n },\n [],\n );\n\n \n const getEmojis = useCallback((reactions: Reaction[]): string[] => {\n return reactions.filter((r) => r.users.length > 0).map((r) => r.emoji);\n }, []);\n\n return { react, hasReacted, getCount, getEmojis };\n};\n","import { useState, useCallback } from \"react\";\nimport type { HermesClient } from \"../../core/HermesClient\";\nimport type { UploadResult, Message } from \"../../types/index\";\n\nexport const useUpload = (client: HermesClient) => {\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [lastUpload, setLastUpload] = useState<UploadResult | null>(null);\n\n \n const upload = useCallback(\n async (file: File): Promise<UploadResult | null> => {\n setUploading(true);\n setError(null);\n try {\n const result = await client.uploadFile(file);\n setLastUpload(result);\n return result;\n } catch (err: any) {\n setError(err.message);\n return null;\n } finally {\n setUploading(false);\n }\n },\n [client],\n );\n\n \n const sendFile = useCallback(\n async (\n roomId: string,\n file: File,\n replyTo?: string,\n ): Promise<Message | null> => {\n setUploading(true);\n setError(null);\n try {\n const uploaded = await client.uploadFile(file);\n setLastUpload(uploaded);\n const message = await client.sendMessage({\n roomId,\n type: uploaded.type,\n url: uploaded.url,\n fileName: uploaded.fileName,\n fileSize: uploaded.fileSize,\n mimeType: uploaded.mimeType,\n thumbnail: uploaded.thumbnail,\n replyTo,\n });\n return message;\n } catch (err: any) {\n setError(err.message);\n return null;\n } finally {\n setUploading(false);\n }\n },\n [client],\n );\n\n \n const validate = useCallback((file: File, maxMb = 50): string | null => {\n if (file.size > maxMb * 1024 * 1024) {\n return `File too large. Max size is ${maxMb}MB.`;\n }\n const allowed = [\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"video/mp4\",\n \"video/webm\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"application/pdf\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"text/plain\",\n ];\n if (!allowed.includes(file.type)) {\n return `File type not supported: ${file.type}`;\n }\n return null;\n }, []);\n\n return { upload, sendFile, validate, uploading, error, lastUpload };\n};\n","import React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport type { HermesClient } from \"../../../core/HermesClient\";\nimport type { Room, HermesUser } from \"../../../types/index\";\nimport { ChatProvider } from \"../../context/ChatContext\";\nimport type { CustomClasses } from \"../../context/ChatContext\";\n\nexport interface ChatProps {\n /** The HermesClient instance */\n client: HermesClient;\n /** Visual theme identifier, defaults to \"light\" */\n theme?: string;\n /** Custom CSS class overrides */\n customClasses?: CustomClasses;\n /** Initial mobile nav state */\n initialNavOpen?: boolean;\n}\n\n/**\n * Root wrapper component for the Hermes Chat SDK.\n *\n * Provides `ChatContext` to all child components. Place this at the top\n * of your chat UI tree.\n *\n * @example\n * ```tsx\n * const client = new HermesClient({ endpoint, apiKey, secret, userId, displayName });\n * await client.connect();\n *\n * <Chat client={client} theme=\"dark\">\n * <RoomList />\n * <Room roomId={activeRoomId}>\n * <Window>\n * <MessageList />\n * <ChatInput />\n * </Window>\n * </Room>\n * </Chat>\n * ```\n */\nexport const Chat = ({\n client,\n theme = \"light\",\n customClasses,\n initialNavOpen = false,\n children,\n}: PropsWithChildren<ChatProps>) => {\n const [activeRoom, setActiveRoom] = useState<Room | undefined>(undefined);\n const [navOpen, setNavOpen] = useState(initialNavOpen);\n const [currentUser, setCurrentUser] = useState<HermesUser | null>(\n client.currentUser\n );\n\n // Keep currentUser in sync if client connects after mounting\n useEffect(() => {\n if (client.currentUser) {\n setCurrentUser(client.currentUser);\n }\n const onConnected = () => setCurrentUser(client.currentUser);\n client.on(\"connected\", onConnected);\n return () => {\n client.off(\"connected\", onConnected);\n };\n }, [client]);\n\n const openMobileNav = useCallback(() => setNavOpen(true), []);\n const closeMobileNav = useCallback(() => setNavOpen(false), []);\n\n const handleSetActiveRoom = useCallback(\n (room?: Room) => {\n setActiveRoom(room);\n // auto-close mobile nav when selecting a room\n setNavOpen(false);\n },\n []\n );\n\n const chatContextValue = useMemo(\n () => ({\n client,\n currentUser,\n theme,\n activeRoom,\n setActiveRoom: handleSetActiveRoom,\n openMobileNav,\n closeMobileNav,\n navOpen,\n customClasses,\n }),\n [\n client,\n currentUser,\n theme,\n activeRoom,\n handleSetActiveRoom,\n openMobileNav,\n closeMobileNav,\n navOpen,\n customClasses,\n ]\n );\n\n const containerClass =\n customClasses?.chat || `hermes-chat hermes-chat--${theme}`;\n\n return (\n <ChatProvider value={chatContextValue}>\n <div className={containerClass}>{children}</div>\n </ChatProvider>\n );\n};\n","import React, { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport type { Message } from \"../../../types/index\";\nimport { useChatContext } from \"../../context/ChatContext\";\nimport { RoomStateProvider } from \"../../context/RoomStateContext\";\nimport { RoomActionProvider } from \"../../context/RoomActionContext\";\nimport { TypingProvider } from \"../../context/TypingContext\";\nimport { ComponentProvider } from \"../../context/ComponentContext\";\nimport type { ComponentContextValue } from \"../../context/ComponentContext\";\nimport type { TypingEvent } from \"../../../types/index\";\n\nexport interface RoomProps extends Partial<ComponentContextValue> {\n /** The room ID to load */\n roomId: string;\n}\n\n/**\n * Wraps a single room/channel, initialising all per-room state and making it\n * available to children via `RoomStateContext`, `RoomActionContext`, and\n * `TypingContext`.\n *\n * @example\n * ```tsx\n * <Room roomId=\"abc123\">\n * <Window>\n * <MessageList />\n * <ChatInput />\n * </Window>\n * <Thread />\n * </Room>\n * ```\n */\nexport const Room = ({\n roomId,\n children,\n // Component overrides forwarded to ComponentContext\n Avatar,\n Message: MessageOverride,\n MessageStatus,\n MessageActions,\n DateSeparator,\n EmptyStateIndicator,\n LoadingIndicator,\n LoadingErrorIndicator,\n ReactionPicker,\n TypingIndicator,\n MediaMessage,\n ThreadHeader,\n Modal,\n ChatInput,\n RoomListItem,\n Search,\n OnlineBadge,\n}: PropsWithChildren<RoomProps>) => {\n const { client, customClasses } = useChatContext(\"Room\");\n\n // ─── Messages state ───\n const [messages, setMessages] = useState<Message[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadingMore, setLoadingMore] = useState(false);\n const [hasMore, setHasMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const oldestMessageId = useRef<string | undefined>(undefined);\n\n // ─── Thread state ───\n const [thread, setThread] = useState<Message | null>(null);\n const [threadMessages, setThreadMessages] = useState<Message[]>([]);\n const [threadHasMore, setThreadHasMore] = useState(false);\n const [threadLoadingMore, setThreadLoadingMore] = useState(false);\n\n // ─── Typing state ───\n const [typingUsers, setTypingUsers] = useState<Map<string, string>>(\n new Map()\n );\n const typingTimeouts = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map()\n );\n const isTypingRef = useRef(false);\n const stopTypingTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ─── Fetch initial messages ───\n useEffect(() => {\n if (!roomId || !client?.isConnected) return;\n\n setMessages([]);\n setHasMore(false);\n setThread(null);\n setThreadMessages([]);\n oldestMessageId.current = undefined;\n setLoading(true);\n setError(null);\n\n client\n .getHistory(roomId)\n .then(({ messages: msgs, hasMore: more }) => {\n setMessages(msgs);\n setHasMore(more);\n if (msgs.length > 0) oldestMessageId.current = msgs[0]._id;\n })\n .catch((err: Error) => setError(err.message))\n .finally(() => setLoading(false));\n }, [roomId, client?.isConnected]);\n\n // ─── Real-time message events ───\n useEffect(() => {\n if (!roomId || !client) return;\n\n const onReceive = (msg: Message) => {\n if (msg.roomId !== roomId) return;\n // Thread reply\n if (msg.threadParentId && thread && msg.threadParentId === thread._id) {\n setThreadMessages((prev) =>\n prev.find((m) => m._id === msg._id) ? prev : [...prev, msg]\n );\n // Also update reply count on parent\n setMessages((prev) =>\n prev.map((m) =>\n m._id === msg.threadParentId\n ? { ...m, replyCount: (m.replyCount || 0) + 1 }\n : m\n )\n );\n return;\n }\n // Normal message\n setMessages((prev) =>\n prev.find((m) => m._id === msg._id) ? prev : [...prev, msg]\n );\n };\n\n const onDeleted = ({ messageId }: { messageId: string; roomId: string }) => {\n setMessages((prev) =>\n prev.map((m) =>\n m._id === messageId\n ? { ...m, isDeleted: true, text: undefined }\n : m\n )\n );\n setThreadMessages((prev) =>\n prev.map((m) =>\n m._id === messageId\n ? { ...m, isDeleted: true, text: undefined }\n : m\n )\n );\n };\n\n const onEdited = (msg: Message) => {\n setMessages((prev) => prev.map((m) => (m._id === msg._id ? msg : m)));\n setThreadMessages((prev) =>\n prev.map((m) => (m._id === msg._id ? msg : m))\n );\n };\n\n const onReaction = ({ messageId, reactions }: any) => {\n setMessages((prev) =>\n prev.map((m) => (m._id === messageId ? { ...m, reactions } : m))\n );\n setThreadMessages((prev) =>\n prev.map((m) => (m._id === messageId ? { ...m, reactions } : m))\n );\n };\n\n client.on(\"message:receive\", onReceive);\n client.on(\"message:deleted\", onDeleted);\n client.on(\"message:edited\", onEdited);\n client.on(\"reaction:updated\", onReaction);\n\n return () => {\n client.off(\"message:receive\", onReceive);\n client.off(\"message:deleted\", onDeleted);\n client.off(\"message:edited\", onEdited);\n client.off(\"reaction:updated\", onReaction);\n };\n }, [roomId, client, thread]);\n\n // ─── Typing events ───\n useEffect(() => {\n if (!roomId || !client) return;\n\n const onStart = (event: TypingEvent) => {\n if (event.roomId !== roomId) return;\n if (event.userId === client.currentUser?.userId) return;\n setTypingUsers((prev) =>\n new Map(prev).set(event.userId, event.displayName)\n );\n const existing = typingTimeouts.current.get(event.userId);\n if (existing) clearTimeout(existing);\n const t = setTimeout(() => {\n setTypingUsers((prev) => {\n const next = new Map(prev);\n next.delete(event.userId);\n return next;\n });\n }, 4000);\n typingTimeouts.current.set(event.userId, t);\n };\n\n const onStop = (event: TypingEvent) => {\n if (event.roomId !== roomId) return;\n setTypingUsers((prev) => {\n const next = new Map(prev);\n next.delete(event.userId);\n return next;\n });\n const existing = typingTimeouts.current.get(event.userId);\n if (existing) clearTimeout(existing);\n };\n\n client.on(\"typing:started\", onStart);\n client.on(\"typing:stopped\", onStop);\n\n return () => {\n client.off(\"typing:started\", onStart);\n client.off(\"typing:stopped\", onStop);\n typingTimeouts.current.forEach(clearTimeout);\n typingTimeouts.current.clear();\n setTypingUsers(new Map());\n };\n }, [roomId, client]);\n\n // ─── Actions ───\n const sendMessage = useCallback(\n async (input: Omit<import(\"../../../types/index\").SendMessageInput, \"roomId\">) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.sendMessage({ ...input, roomId });\n },\n [roomId, client]\n );\n\n const editMessage = useCallback(\n async (messageId: string, text: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.editMessage(messageId, roomId, text);\n },\n [roomId, client]\n );\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.deleteMessage(messageId, roomId);\n },\n [roomId, client]\n );\n\n const addReaction = useCallback(\n async (messageId: string, emoji: string) => {\n if (!roomId) throw new Error(\"No room selected\");\n return client.addReaction(messageId, roomId, emoji);\n },\n [roomId, client]\n );\n\n const loadMore = useCallback(async () => {\n if (!roomId || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const { messages: older, hasMore: more } = await client.getHistory(\n roomId,\n oldestMessageId.current\n );\n setMessages((prev) => [...older, ...prev]);\n setHasMore(more);\n if (older.length > 0) oldestMessageId.current = older[0]._id;\n } catch (err: any) {\n setError(err.message);\n } finally {\n setLoadingMore(false);\n }\n }, [roomId, loadingMore, hasMore, client]);\n\n const markRead = useCallback(\n async (lastMessageId: string) => {\n if (!roomId) return;\n await client.markSeen(roomId, lastMessageId);\n },\n [roomId, client]\n );\n\n const openThread = useCallback((message: Message) => {\n setThread(message);\n setThreadMessages([]);\n setThreadHasMore(false);\n // TODO: load thread replies from server when API supports it\n }, []);\n\n const closeThread = useCallback(() => {\n setThread(null);\n setThreadMessages([]);\n }, []);\n\n const loadMoreThread = useCallback(async () => {\n // Placeholder — will be implemented when server supports thread pagination\n }, []);\n\n const startTyping = useCallback(() => {\n if (!roomId) return;\n if (!isTypingRef.current) {\n client.startTyping(roomId);\n isTypingRef.current = true;\n }\n if (stopTypingTimeout.current) clearTimeout(stopTypingTimeout.current);\n stopTypingTimeout.current = setTimeout(() => {\n client.stopTyping(roomId);\n isTypingRef.current = false;\n }, 3000);\n }, [roomId, client]);\n\n const stopTyping = useCallback(() => {\n if (!roomId) return;\n if (stopTypingTimeout.current) clearTimeout(stopTypingTimeout.current);\n if (isTypingRef.current) {\n client.stopTyping(roomId);\n isTypingRef.current = false;\n }\n }, [roomId, client]);\n\n // ─── Memoized context values ───\n const typingText = useMemo(() => {\n const names = Array.from(typingUsers.values());\n if (names.length === 0) return null;\n if (names.length === 1) return `${names[0]} is typing...`;\n if (names.length === 2) return `${names[0]} and ${names[1]} are typing...`;\n return `${names[0]} and ${names.length - 1} others are typing...`;\n }, [typingUsers]);\n\n const roomStateValue = useMemo(\n () => ({\n room: { _id: roomId } as any,\n messages,\n loading,\n loadingMore,\n hasMore,\n error,\n members: [],\n thread,\n threadMessages,\n threadHasMore,\n threadLoadingMore,\n pinnedMessages: messages.filter((m) => m.pinnedAt),\n }),\n [messages, loading, loadingMore, hasMore, error, thread, threadMessages, threadHasMore, threadLoadingMore, roomId]\n );\n\n const roomActionValue = useMemo(\n () => ({\n sendMessage,\n editMessage,\n deleteMessage,\n addReaction,\n loadMore,\n markRead,\n openThread,\n closeThread,\n loadMoreThread,\n }),\n [sendMessage, editMessage, deleteMessage, addReaction, loadMore, markRead, openThread, closeThread, loadMoreThread]\n );\n\n const typingValue = useMemo(\n () => ({\n typingUsers,\n typingText,\n isAnyoneTyping: typingUsers.size > 0,\n startTyping,\n stopTyping,\n }),\n [typingUsers, typingText, startTyping, stopTyping]\n );\n\n const componentOverrides = useMemo(\n () => ({\n Avatar,\n Message: MessageOverride,\n MessageStatus,\n MessageActions,\n DateSeparator,\n EmptyStateIndicator,\n LoadingIndicator,\n LoadingErrorIndicator,\n ReactionPicker,\n TypingIndicator,\n MediaMessage,\n ThreadHeader,\n Modal,\n ChatInput,\n RoomListItem,\n Search,\n OnlineBadge,\n }),\n [Avatar, MessageOverride, MessageStatus, MessageActions, DateSeparator, EmptyStateIndicator, LoadingIndicator, LoadingErrorIndicator, ReactionPicker, TypingIndicator, MediaMessage, ThreadHeader, Modal, ChatInput, RoomListItem, Search, OnlineBadge]\n );\n\n const containerClass = customClasses?.room || \"hermes-room\";\n\n return (\n <RoomStateProvider value={roomStateValue}>\n <RoomActionProvider value={roomActionValue}>\n <TypingProvider value={typingValue}>\n <ComponentProvider value={componentOverrides}>\n <div className={containerClass}>{children}</div>\n </ComponentProvider>\n </TypingProvider>\n </RoomActionProvider>\n </RoomStateProvider>\n );\n};\n","import React from \"react\";\nimport type { PropsWithChildren } from \"react\";\nimport { useChatContext } from \"../../context/ChatContext\";\n\nexport interface WindowProps {\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Layout wrapper for the message area. Renders a flex-column container\n * that holds `<MessageList />` and `<ChatInput />`.\n *\n * @example\n * ```tsx\n * <Window>\n * <MessageList />\n * <ChatInput />\n * </Window>\n * ```\n */\nexport const Window = ({\n className = \"\",\n children,\n}: PropsWithChildren<WindowProps>) => {\n const { customClasses } = useChatContext(\"Window\");\n\n const containerClass =\n customClasses?.window || `hermes-window ${className}`.trim();\n\n return (\n <div\n className={containerClass}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n }}\n >\n {children}\n </div>\n );\n};\n","import React, { useEffect, useRef } from \"react\";\nimport type { Message as MessageType, HermesUser } from \"../../types/index\";\nimport { Message as DefaultMessage } from \"./Message/Message\";\nimport { DateSeparator as DefaultDateSeparator } from \"./DateSeparator/DateSeparator\";\nimport { EmptyStateIndicator as DefaultEmptyState } from \"./EmptyStateIndicator/EmptyStateIndicator\";\nimport { LoadingIndicator as DefaultLoading } from \"./Loading/LoadingIndicator\";\nimport { TypingIndicator as DefaultTypingIndicator } from \"./TypingIndicator\";\nimport { useRoomStateContext } from \"../context/RoomStateContext\";\nimport { useRoomActionContext } from \"../context/RoomActionContext\";\nimport { useChatContext } from \"../context/ChatContext\";\nimport { useTypingContext } from \"../context/TypingContext\";\nimport { useComponentContext } from \"../context/ComponentContext\";\n\nexport interface MessageListProps {\n /** Messages array (optional if inside <Room>) */\n messages?: MessageType[];\n /** Current user (optional if inside <Chat>) */\n currentUser?: HermesUser;\n /** Loading state */\n loading?: boolean;\n /** Loading more state */\n loadingMore?: boolean;\n /** Has more messages */\n hasMore?: boolean;\n /** Load more callback */\n onLoadMore?: () => void;\n /** Edit callback */\n onEdit?: (messageId: string, text: string) => void;\n /** Delete callback */\n onDelete?: (messageId: string) => void;\n /** Reaction callback */\n onReact?: (messageId: string, emoji: string) => void;\n /** Reply (quote) callback */\n onReply?: (message: MessageType) => void;\n /** Thread open callback */\n onOpenThread?: (message: MessageType) => void;\n /** Custom message renderer (full override) */\n renderMessage?: (message: MessageType, isOwn: boolean) => React.ReactNode;\n /** Custom avatar renderer */\n renderAvatar?: (senderId: string) => React.ReactNode;\n /** Additional class name */\n className?: string;\n /** Auto-scroll to bottom on new messages */\n autoScroll?: boolean;\n /** Typing users (optional if inside <Room>) */\n typingUsers?: { userId: string; displayName: string }[];\n /** Whether to show date separators between days */\n disableDateSeparator?: boolean;\n /** Typing indicator text (optional if inside <Room>) */\n typingText?: string | null;\n}\n\nconst isSameDay = (d1: string, d2: string) => {\n const a = new Date(d1);\n const b = new Date(d2);\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n};\n\n/**\n * Displays a scrollable list of messages with date separators,\n * typing indicators, and infinite scroll.\n *\n * **Context-aware:** When used inside `<Room>`, reads messages, loading state,\n * and typing state automatically. When used standalone, accepts all data via props.\n *\n * @example\n * ```tsx\n * // Context-aware (recommended)\n * <Room roomId={id}>\n * <Window>\n * <MessageList />\n * <ChatInput />\n * </Window>\n * </Room>\n *\n * // Standalone (prop-driven)\n * <MessageList\n * messages={messages}\n * currentUser={user}\n * onEdit={handleEdit}\n * onDelete={handleDelete}\n * />\n * ```\n */\nexport const MessageList: React.FC<MessageListProps> = (props) => {\n // Try to get context values — these will be empty objects if not in a provider\n const chatCtx = useChatContext(\"MessageList\");\n const roomStateCtx = useRoomStateContext(\"MessageList\");\n const roomActionCtx = useRoomActionContext(\"MessageList\");\n const typingCtx = useTypingContext(\"MessageList\");\n const componentCtx = useComponentContext(\"MessageList\");\n\n // Merge: props override context\n const messages = props.messages ?? roomStateCtx.messages ?? [];\n const currentUser = props.currentUser ?? (chatCtx.currentUser as HermesUser);\n const loading = props.loading ?? roomStateCtx.loading ?? false;\n const loadingMore = props.loadingMore ?? roomStateCtx.loadingMore ?? false;\n const hasMore = props.hasMore ?? roomStateCtx.hasMore ?? false;\n const onLoadMore = props.onLoadMore ?? roomActionCtx.loadMore;\n const onEdit = props.onEdit ?? (roomActionCtx.editMessage ? (id: string, text: string) => roomActionCtx.editMessage(id, text) : undefined);\n const onDelete = props.onDelete ?? (roomActionCtx.deleteMessage ? (id: string) => roomActionCtx.deleteMessage(id) : undefined);\n const onReact = props.onReact ?? (roomActionCtx.addReaction ? (id: string, emoji: string) => roomActionCtx.addReaction(id, emoji) : undefined);\n const onReply = props.onReply;\n const onOpenThread = props.onOpenThread ?? (roomActionCtx.openThread ? (msg: MessageType) => roomActionCtx.openThread(msg) : undefined);\n const autoScroll = props.autoScroll ?? true;\n const disableDateSeparator = props.disableDateSeparator ?? false;\n const className = props.className ?? \"\";\n const renderMessage = props.renderMessage;\n const renderAvatar = props.renderAvatar;\n\n // Typing\n const typingText = props.typingText ?? typingCtx.typingText ?? null;\n\n // Component overrides\n const MessageComponent = componentCtx.Message || DefaultMessage;\n const DateSepComponent = componentCtx.DateSeparator || DefaultDateSeparator;\n const EmptyComponent = componentCtx.EmptyStateIndicator || DefaultEmptyState;\n const LoadingComponent = componentCtx.LoadingIndicator || DefaultLoading;\n const TypingComponent = componentCtx.TypingIndicator || DefaultTypingIndicator;\n\n const bottomRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll\n useEffect(() => {\n if (autoScroll && bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, autoScroll]);\n\n // Infinite scroll\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !onLoadMore) return;\n const onScroll = () => {\n if (container.scrollTop === 0 && hasMore && !loadingMore) onLoadMore();\n };\n container.addEventListener(\"scroll\", onScroll);\n return () => container.removeEventListener(\"scroll\", onScroll);\n }, [hasMore, loadingMore, onLoadMore]);\n\n if (loading) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n flex: 1,\n }}\n >\n <LoadingComponent text=\"Loading messages...\" />\n </div>\n );\n }\n\n // Compute group styles\n const getGroupStyle = (index: number): \"top\" | \"middle\" | \"bottom\" | \"single\" => {\n const msg = messages[index];\n const prev = index > 0 ? messages[index - 1] : null;\n const next = index < messages.length - 1 ? messages[index + 1] : null;\n const sameSenderPrev = prev && prev.senderId === msg.senderId && !prev.isDeleted && isSameDay(prev.createdAt, msg.createdAt);\n const sameSenderNext = next && next.senderId === msg.senderId && !next.isDeleted && isSameDay(next.createdAt, msg.createdAt);\n if (sameSenderPrev && sameSenderNext) return \"middle\";\n if (sameSenderPrev) return \"bottom\";\n if (sameSenderNext) return \"top\";\n return \"single\";\n };\n\n return (\n <>\n <style>{`\n @keyframes hermes-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-5px); }\n }\n @keyframes hermes-pop {\n from { opacity: 0; transform: scale(0.85); }\n to { opacity: 1; transform: scale(1); }\n }\n `}</style>\n\n <div\n ref={containerRef}\n className={`hermes-message-list ${className}`}\n style={{\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"16px\",\n }}\n >\n {/* Load more */}\n {hasMore && (\n <div style={{ textAlign: \"center\", marginBottom: 12 }}>\n {loadingMore ? (\n <LoadingComponent size={20} text=\"Loading older messages...\" />\n ) : (\n <button\n onClick={onLoadMore}\n style={{\n background: \"none\",\n border: \"1px solid #ddd\",\n borderRadius: 12,\n padding: \"4px 12px\",\n cursor: \"pointer\",\n fontSize: 12,\n }}\n >\n Load older messages\n </button>\n )}\n </div>\n )}\n\n {/* Empty state */}\n {messages.length === 0 && <EmptyComponent listType=\"message\" />}\n\n {/* Messages */}\n {messages.map((message, index) => {\n const isOwn = message.senderId === currentUser?.userId;\n const groupStyle = getGroupStyle(index);\n\n // Date separator\n const showDateSep =\n !disableDateSeparator &&\n (index === 0 ||\n !isSameDay(messages[index - 1].createdAt, message.createdAt));\n\n return (\n <React.Fragment key={message._id}>\n {showDateSep && (\n <DateSepComponent date={new Date(message.createdAt)} />\n )}\n <div style={{ marginBottom: groupStyle === \"bottom\" || groupStyle === \"single\" ? 8 : 2 }}>\n {renderMessage ? (\n renderMessage(message, isOwn)\n ) : (\n <MessageComponent\n message={message}\n isOwn={isOwn}\n onEdit={onEdit}\n onDelete={onDelete}\n onReact={onReact}\n onReply={onReply}\n onOpenThread={onOpenThread}\n renderAvatar={renderAvatar}\n groupStyle={groupStyle}\n showAvatar\n />\n )}\n </div>\n </React.Fragment>\n );\n })}\n\n {/* Typing indicator */}\n {typingText && <TypingComponent typingText={typingText} />}\n\n <div ref={bottomRef} />\n </div>\n </>\n );\n};\n","import React, { useState, useRef, useEffect } from \"react\";\nimport type { Message as MessageType, Reaction } from \"../../../types/index\";\nimport { Avatar } from \"../Avatar/Avatar\";\nimport { MessageStatus } from \"./MessageStatus\";\nimport { MessageActions } from \"./MessageActions\";\n\nexport interface MessageProps {\n message: MessageType;\n isOwn: boolean;\n /** Callbacks (optional — will fall back to context if available) */\n onEdit?: (messageId: string, text: string) => void;\n onDelete?: (messageId: string) => void;\n onReact?: (messageId: string, emoji: string) => void;\n onReply?: (message: MessageType) => void;\n onOpenThread?: (message: MessageType) => void;\n onPin?: (message: MessageType) => void;\n /** Avatar customization */\n renderAvatar?: (senderId: string) => React.ReactNode;\n /** Sender display name (for avatar fallback) */\n senderName?: string;\n /** Sender avatar URL */\n senderImage?: string;\n /** Group style for visual grouping */\n groupStyle?: \"top\" | \"middle\" | \"bottom\" | \"single\";\n /** Additional class name */\n className?: string;\n /** Whether to show the avatar */\n showAvatar?: boolean;\n}\n\nconst REACTION_EMOJIS = [\"👍\", \"❤️\", \"😂\", \"😮\", \"😢\", \"🔥\", \"🎉\", \"👏\"];\n\nconst formatTime = (iso: string) =>\n new Date(iso).toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n\nconst formatFileSize = (bytes?: number) => {\n if (!bytes) return \"\";\n if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${bytes} B`;\n};\n\n/**\n * A single message bubble with avatar, content, reactions, delivery status,\n * and action toolbar. This is the primary message rendering component.\n *\n * Can be used standalone or within a `<MessageList>`.\n */\nexport const Message: React.FC<MessageProps> = ({\n message,\n isOwn,\n onEdit,\n onDelete,\n onReact,\n onReply,\n onOpenThread,\n onPin,\n renderAvatar,\n senderName,\n senderImage,\n groupStyle = \"single\",\n className = \"\",\n showAvatar = true,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [pickerOpen, setPickerOpen] = useState(false);\n const pickerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!pickerOpen) return;\n const handler = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setPickerOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [pickerOpen]);\n\n if (message.isDeleted) {\n return (\n <div\n className={`hermes-message hermes-message--deleted ${className}`}\n style={{\n opacity: 0.5,\n fontStyle: \"italic\",\n padding: \"4px 16px\",\n fontSize: 13,\n }}\n >\n This message was deleted.\n </div>\n );\n }\n\n const showAvatarSlot = showAvatar && !isOwn && (groupStyle === \"bottom\" || groupStyle === \"single\");\n\n return (\n <div\n className={`hermes-message ${isOwn ? \"hermes-message--own\" : \"hermes-message--other\"} ${className}`}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n flexDirection: isOwn ? \"row-reverse\" : \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n marginBottom: groupStyle === \"bottom\" || groupStyle === \"single\" ? 8 : 2,\n position: \"relative\",\n }}\n >\n {/* Avatar */}\n {!isOwn && (\n <div style={{ flexShrink: 0, width: 32 }}>\n {showAvatarSlot ? (\n renderAvatar ? (\n renderAvatar(message.senderId)\n ) : (\n <Avatar image={senderImage} name={senderName || message.senderId} size={32} />\n )\n ) : null}\n </div>\n )}\n\n {/* Content column */}\n <div\n style={{\n maxWidth: \"70%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isOwn ? \"flex-end\" : \"flex-start\",\n }}\n >\n {/* Actions toolbar */}\n {(onEdit || onDelete || onReact || onReply || onOpenThread) && (\n <div\n style={{\n marginBottom: 4,\n opacity: hovered ? 1 : 0,\n pointerEvents: hovered ? \"auto\" : \"none\",\n transition: \"opacity 0.15s ease\",\n position: \"relative\",\n }}\n >\n <MessageActions\n isOwn={isOwn}\n isText={message.type === \"text\"}\n hasThread={!!message.replyCount && message.replyCount > 0}\n replyCount={message.replyCount}\n onReact={onReact ? () => setPickerOpen((p) => !p) : undefined}\n onReply={onReply ? () => onReply(message) : undefined}\n onThread={onOpenThread ? () => onOpenThread(message) : undefined}\n onEdit={\n onEdit\n ? () => {\n const text = window.prompt(\"Edit message:\", message.text);\n if (text) onEdit(message._id, text);\n }\n : undefined\n }\n onDelete={onDelete ? () => onDelete(message._id) : undefined}\n onPin={onPin ? () => onPin(message) : undefined}\n />\n\n {/* Inline reaction picker */}\n {pickerOpen && onReact && (\n <div\n ref={pickerRef}\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 4px)\",\n [isOwn ? \"right\" : \"left\"]: 0,\n zIndex: 100,\n background: \"#1a1a2e\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 14,\n padding: \"8px 10px\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.4)\",\n display: \"flex\",\n gap: 4,\n animation: \"hermes-pop 0.15s ease\",\n }}\n >\n {REACTION_EMOJIS.map((emoji) => (\n <button\n key={emoji}\n onClick={() => {\n onReact(message._id, emoji);\n setPickerOpen(false);\n }}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 20,\n padding: \"4px\",\n borderRadius: 8,\n lineHeight: 1,\n transition: \"transform 0.1s\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.transform = \"scale(1.3)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.transform = \"scale(1)\")\n }\n >\n {emoji}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Sender name */}\n {!isOwn && (groupStyle === \"top\" || groupStyle === \"single\") && senderName && (\n <span style={{ fontSize: 11, fontWeight: 600, opacity: 0.6, marginBottom: 2, marginLeft: 4 }}>\n {senderName}\n </span>\n )}\n\n {/* Message bubble */}\n <div\n style={{\n padding: \"8px 12px\",\n borderRadius:\n isOwn\n ? groupStyle === \"top\" || groupStyle === \"single\"\n ? \"16px 16px 4px 16px\"\n : \"16px 4px 4px 16px\"\n : groupStyle === \"top\" || groupStyle === \"single\"\n ? \"16px 16px 16px 4px\"\n : \"4px 16px 16px 4px\",\n background: isOwn ? \"#0084ff\" : \"#f0f0f0\",\n color: isOwn ? \"#fff\" : \"#000\",\n }}\n >\n {/* Reply quote */}\n {message.replyTo && (\n <div\n style={{\n borderLeft: `3px solid ${isOwn ? \"rgba(255,255,255,0.4)\" : \"rgba(0,132,255,0.4)\"}`,\n paddingLeft: 8,\n marginBottom: 6,\n fontSize: 12,\n opacity: 0.75,\n }}\n >\n Replying to a message\n </div>\n )}\n\n {/* Text content */}\n {message.type === \"text\" && (\n <p style={{ margin: 0, wordBreak: \"break-word\" }}>\n {message.text}\n {message.editedAt && (\n <span style={{ fontSize: 10, opacity: 0.6, marginLeft: 6 }}>\n (edited)\n </span>\n )}\n </p>\n )}\n\n {/* Link */}\n {message.type === \"link\" && (\n <div>\n {message.text && <p style={{ margin: \"0 0 4px\" }}>{message.text}</p>}\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: isOwn ? \"#cce4ff\" : \"#0084ff\", wordBreak: \"break-all\" }}\n >\n {message.url}\n </a>\n </div>\n )}\n\n {/* Image */}\n {message.type === \"image\" && (\n <img\n src={message.url}\n alt={message.fileName || \"image\"}\n style={{ maxWidth: \"100%\", borderRadius: 8, display: \"block\" }}\n />\n )}\n\n {/* Video */}\n {message.type === \"video\" && (\n <video\n src={message.url}\n poster={message.thumbnail}\n controls\n style={{ maxWidth: \"100%\", borderRadius: 8 }}\n />\n )}\n\n {/* Audio */}\n {message.type === \"audio\" && (\n <audio src={message.url} controls style={{ width: \"100%\" }} />\n )}\n\n {/* Document */}\n {message.type === \"document\" && (\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: isOwn ? \"#fff\" : \"#333\",\n textDecoration: \"none\",\n }}\n >\n <span style={{ fontSize: 24 }}>📄</span>\n <div>\n <div style={{ fontWeight: 600, fontSize: 13 }}>{message.fileName}</div>\n <div style={{ fontSize: 11, opacity: 0.7 }}>\n {formatFileSize(message.fileSize)}\n </div>\n </div>\n </a>\n )}\n\n {/* Timestamp + delivery status */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 4,\n fontSize: 10,\n opacity: 0.6,\n marginTop: 4,\n }}\n >\n {formatTime(message.createdAt)}\n {message.pinnedAt && <span title=\"Pinned\">📌</span>}\n {isOwn && (\n <MessageStatus\n status={message.deliveryStatus}\n seenCount={message.seenBy?.length || 0}\n isMyMessage={isOwn}\n />\n )}\n </div>\n </div>\n\n {/* Thread reply count */}\n {message.replyCount && message.replyCount > 0 && onOpenThread && (\n <button\n onClick={() => onOpenThread(message)}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"#0084ff\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 600,\n padding: \"2px 4px\",\n marginTop: 2,\n }}\n >\n {message.replyCount} {message.replyCount === 1 ? \"reply\" : \"replies\"}\n </button>\n )}\n\n {/* Reactions */}\n {message.reactions?.filter((r: Reaction) => r.users.length > 0).length > 0 && (\n <div style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\", marginTop: 4 }}>\n {message.reactions\n .filter((r: Reaction) => r.users.length > 0)\n .map((r: Reaction) => (\n <span\n key={r.emoji}\n onClick={() => onReact?.(message._id, r.emoji)}\n style={{\n background: \"#f0f0f0\",\n border: \"1px solid rgba(0,0,0,0.08)\",\n borderRadius: 20,\n padding: \"2px 8px\",\n fontSize: 13,\n cursor: onReact ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n transition: \"transform 0.1s\",\n userSelect: \"none\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.transform = \"scale(1.1)\")}\n onMouseLeave={(e) => (e.currentTarget.style.transform = \"scale(1)\")}\n >\n {r.emoji}\n <span style={{ fontSize: 11, fontWeight: 600, color: \"#555\" }}>\n {r.users.length}\n </span>\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React from \"react\";\n\nexport interface AvatarProps {\n /** Image URL */\n image?: string;\n /** User's display name (used for fallback initials) */\n name?: string;\n /** Size in pixels */\n size?: number;\n /** Shape of the avatar */\n shape?: \"circle\" | \"square\" | \"rounded\";\n /** Additional class name */\n className?: string;\n /** Whether the user is online */\n online?: boolean;\n}\n\nconst getInitials = (name?: string): string => {\n if (!name) return \"?\";\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) return `${parts[0][0]}${parts[1][0]}`.toUpperCase();\n return name.slice(0, 2).toUpperCase();\n};\n\n/**\n * Displays a user avatar with fallback initials and optional online indicator.\n *\n * @example\n * ```tsx\n * <Avatar image={user.avatar} name={user.displayName} size={40} online />\n * ```\n */\nexport const Avatar: React.FC<AvatarProps> = ({\n image,\n name,\n size = 36,\n shape = \"circle\",\n className = \"\",\n online,\n}) => {\n const borderRadius =\n shape === \"circle\" ? \"50%\" : shape === \"rounded\" ? \"8px\" : \"0\";\n\n return (\n <div\n className={`hermes-avatar ${className}`}\n style={{\n position: \"relative\",\n width: size,\n height: size,\n flexShrink: 0,\n }}\n >\n {image ? (\n <img\n src={image}\n alt={name || \"avatar\"}\n style={{\n width: size,\n height: size,\n borderRadius,\n objectFit: \"cover\",\n display: \"block\",\n }}\n />\n ) : (\n <div\n style={{\n width: size,\n height: size,\n borderRadius,\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#fff\",\n fontWeight: 700,\n fontSize: size * 0.38,\n userSelect: \"none\",\n }}\n >\n {getInitials(name)}\n </div>\n )}\n {online !== undefined && (\n <span\n style={{\n position: \"absolute\",\n bottom: 0,\n right: 0,\n width: size * 0.3,\n height: size * 0.3,\n borderRadius: \"50%\",\n background: online ? \"#22c55e\" : \"#9ca3af\",\n border: \"2px solid #fff\",\n }}\n />\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport type { DeliveryStatus } from \"../../../types/index\";\n\nexport interface MessageStatusProps {\n /** The delivery status of the message */\n status: DeliveryStatus;\n /** Number of users who have seen the message */\n seenCount?: number;\n /** Whether this message was sent by the current user */\n isMyMessage?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Renders delivery status indicators: ✓ (sent), ✓✓ (delivered), ✓✓ blue (seen).\n * Only shown for the current user's own messages.\n */\nexport const MessageStatus: React.FC<MessageStatusProps> = ({\n status,\n seenCount = 0,\n isMyMessage = true,\n className = \"\",\n}) => {\n if (!isMyMessage) return null;\n\n const color = status === \"seen\" ? \"#0084ff\" : \"rgba(128,128,128,0.6)\";\n const checks = status === \"sent\" ? \"✓\" : \"✓✓\";\n\n return (\n <span\n className={`hermes-message-status ${className}`}\n title={\n status === \"seen\"\n ? `Seen by ${seenCount} ${seenCount === 1 ? \"person\" : \"people\"}`\n : status === \"delivered\"\n ? \"Delivered\"\n : \"Sent\"\n }\n style={{\n fontSize: 11,\n color,\n marginLeft: 4,\n userSelect: \"none\",\n }}\n >\n {checks}\n </span>\n );\n};\n","import React, { useState, useRef, useEffect } from \"react\";\n\nexport interface MessageActionsProps {\n /** Whether the current user owns the message */\n isOwn: boolean;\n /** Whether the message is a text message (enables edit) */\n isText: boolean;\n /** Whether the message has a thread */\n hasThread?: boolean;\n /** Reply count for threads */\n replyCount?: number;\n /** Callbacks */\n onReact?: () => void;\n onReply?: () => void;\n onThread?: () => void;\n onEdit?: () => void;\n onDelete?: () => void;\n onPin?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nconst ActionBtn: React.FC<{\n onClick: () => void;\n title?: string;\n children: React.ReactNode;\n}> = ({ onClick, title, children }) => (\n <button\n onClick={onClick}\n title={title}\n style={{\n background: \"#fff\",\n border: \"1px solid rgba(0,0,0,0.1)\",\n borderRadius: 8,\n cursor: \"pointer\",\n fontSize: 14,\n padding: \"3px 6px\",\n lineHeight: 1,\n boxShadow: \"0 1px 4px rgba(0,0,0,0.1)\",\n transition: \"transform 0.1s\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.transform = \"scale(1.15)\")}\n onMouseLeave={(e) => (e.currentTarget.style.transform = \"scale(1)\")}\n >\n {children}\n </button>\n);\n\n/**\n * Hover toolbar for message actions: React, Reply, Thread, Edit, Delete, Pin.\n */\nexport const MessageActions: React.FC<MessageActionsProps> = ({\n isOwn,\n isText,\n hasThread = false,\n replyCount = 0,\n onReact,\n onReply,\n onThread,\n onEdit,\n onDelete,\n onPin,\n className = \"\",\n}) => (\n <div\n className={`hermes-message-actions ${className}`}\n style={{\n display: \"flex\",\n flexDirection: isOwn ? \"row-reverse\" : \"row\",\n gap: 2,\n }}\n >\n {onReact && (\n <ActionBtn onClick={onReact} title=\"React\">\n 😊\n </ActionBtn>\n )}\n {onReply && (\n <ActionBtn onClick={onReply} title=\"Reply\">\n ↩\n </ActionBtn>\n )}\n {onThread && (\n <ActionBtn onClick={onThread} title={`Thread${replyCount > 0 ? ` (${replyCount})` : \"\"}`}>\n 🧵\n </ActionBtn>\n )}\n {isOwn && isText && onEdit && (\n <ActionBtn onClick={onEdit} title=\"Edit\">\n ✏️\n </ActionBtn>\n )}\n {onPin && (\n <ActionBtn onClick={onPin} title=\"Pin\">\n 📌\n </ActionBtn>\n )}\n {isOwn && onDelete && (\n <ActionBtn onClick={onDelete} title=\"Delete\">\n 🗑\n </ActionBtn>\n )}\n </div>\n);\n","import React from \"react\";\n\nexport interface DateSeparatorProps {\n /** The date to display */\n date: Date;\n /** Custom date formatter */\n formatDate?: (date: Date) => string;\n /** Additional class name */\n className?: string;\n}\n\nconst defaultFormat = (date: Date): string => {\n const now = new Date();\n const isToday =\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear();\n\n const yesterday = new Date(now);\n yesterday.setDate(yesterday.getDate() - 1);\n const isYesterday =\n date.getDate() === yesterday.getDate() &&\n date.getMonth() === yesterday.getMonth() &&\n date.getFullYear() === yesterday.getFullYear();\n\n if (isToday) return \"Today\";\n if (isYesterday) return \"Yesterday\";\n\n return date.toLocaleDateString(undefined, {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n};\n\n/**\n * Renders a date divider between message groups from different days.\n *\n * @example\n * ```tsx\n * <DateSeparator date={new Date(\"2024-01-15\")} />\n * ```\n */\nexport const DateSeparator: React.FC<DateSeparatorProps> = ({\n date,\n formatDate = defaultFormat,\n className = \"\",\n}) => (\n <div\n className={`hermes-date-separator ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"16px 0\",\n }}\n >\n <div\n style={{ flex: 1, height: 1, background: \"rgba(128,128,128,0.2)\" }}\n />\n <span\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: \"rgba(128,128,128,0.7)\",\n whiteSpace: \"nowrap\",\n userSelect: \"none\",\n }}\n >\n {formatDate(date)}\n </span>\n <div\n style={{ flex: 1, height: 1, background: \"rgba(128,128,128,0.2)\" }}\n />\n </div>\n);\n","import React from \"react\";\n\nexport interface EmptyStateIndicatorProps {\n /** The type of list that is empty */\n listType?: \"message\" | \"room\" | \"thread\" | \"search\";\n /** Custom text to display */\n text?: string;\n /** Additional class name */\n className?: string;\n}\n\nconst DEFAULT_TEXTS: Record<string, string> = {\n message: \"No messages yet. Say hello! 👋\",\n room: \"No conversations yet.\",\n thread: \"No replies yet.\",\n search: \"No results found.\",\n};\n\n/**\n * Shown when a list (messages, rooms, threads, search results) is empty.\n *\n * @example\n * ```tsx\n * <EmptyStateIndicator listType=\"message\" />\n * ```\n */\nexport const EmptyStateIndicator: React.FC<EmptyStateIndicatorProps> = ({\n listType = \"message\",\n text,\n className = \"\",\n}) => (\n <div\n className={`hermes-empty-state ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n padding: 32,\n textAlign: \"center\",\n opacity: 0.5,\n flex: 1,\n }}\n >\n <span style={{ fontSize: 36 }}>\n {listType === \"message\"\n ? \"💬\"\n : listType === \"room\"\n ? \"📭\"\n : listType === \"thread\"\n ? \"🧵\"\n : \"🔍\"}\n </span>\n <span style={{ fontSize: 14 }}>{text || DEFAULT_TEXTS[listType]}</span>\n </div>\n);\n","import React from \"react\";\n\nexport interface LoadingIndicatorProps {\n /** Size of the spinner in pixels */\n size?: number;\n /** Spinner color */\n color?: string;\n /** Loading text */\n text?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A simple animated loading spinner.\n */\nexport const LoadingIndicator: React.FC<LoadingIndicatorProps> = ({\n size = 32,\n color = \"#0084ff\",\n text,\n className = \"\",\n}) => (\n <div\n className={`hermes-loading ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n padding: 16,\n }}\n >\n <div\n style={{\n width: size,\n height: size,\n border: `3px solid rgba(128,128,128,0.15)`,\n borderTopColor: color,\n borderRadius: \"50%\",\n animation: \"hermes-spin 0.8s linear infinite\",\n }}\n />\n {text && (\n <span style={{ fontSize: 13, opacity: 0.6 }}>{text}</span>\n )}\n <style>{`\n @keyframes hermes-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n);\n\nexport interface LoadingErrorIndicatorProps {\n /** The error to display */\n error?: Error | string | null;\n /** Retry callback */\n onRetry?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an error state with an optional retry button.\n */\nexport const LoadingErrorIndicator: React.FC<LoadingErrorIndicatorProps> = ({\n error,\n onRetry,\n className = \"\",\n}) => {\n if (!error) return null;\n\n const message = typeof error === \"string\" ? error : error.message;\n\n return (\n <div\n className={`hermes-loading-error ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n padding: 24,\n textAlign: \"center\",\n }}\n >\n <span style={{ fontSize: 28 }}>⚠️</span>\n <span style={{ fontSize: 14, opacity: 0.7 }}>{message}</span>\n {onRetry && (\n <button\n onClick={onRetry}\n style={{\n marginTop: 4,\n padding: \"6px 16px\",\n border: \"1px solid rgba(128,128,128,0.3)\",\n borderRadius: 8,\n background: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n Retry\n </button>\n )}\n </div>\n );\n};\n","import React from \"react\";\n\ninterface TypingIndicatorProps {\n typingText: string | null;\n className?: string;\n}\n\nexport const TypingIndicator: React.FC<TypingIndicatorProps> = ({\n typingText,\n className = \"\",\n}) => {\n if (!typingText) return null;\n\n return (\n <div\n className={`hermes-typing-indicator ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 16px\",\n minHeight: 24,\n }}\n >\n <div style={{ display: \"flex\", gap: 3 }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#aaa\",\n display: \"block\",\n animation: `hermes-bounce 1.2s ease-in-out ${i * 0.2}s infinite`,\n }}\n />\n ))}\n </div>\n <span style={{ fontSize: 12, opacity: 0.6 }}>{typingText}</span>\n <style>{`\n @keyframes hermes-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n }\n `}</style>\n </div>\n );\n};\n","import React, { useState, useRef, useCallback } from \"react\";\nimport type { Message, UploadResult } from \"../../types/index\";\nimport { useRoomActionContext } from \"../context/RoomActionContext\";\nimport { useTypingContext } from \"../context/TypingContext\";\nimport { useChatContext } from \"../context/ChatContext\";\n\nexport interface ChatInputProps {\n /** Send text callback (optional if inside <Room>) */\n onSendText?: (text: string) => Promise<void> | void;\n /** Send file callback */\n onSendFile?: (file: File) => Promise<void> | void;\n /** Typing start callback (optional if inside <Room>) */\n onTypingStart?: () => void;\n /** Typing stop callback (optional if inside <Room>) */\n onTypingStop?: () => void;\n /** Message being replied to */\n replyingTo?: Message | null;\n /** Cancel reply callback */\n onCancelReply?: () => void;\n /** Whether input is disabled */\n disabled?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Maximum character length */\n maxLength?: number;\n /** Additional class name */\n className?: string;\n /** Input element class name */\n inputClassName?: string;\n /** Custom attach icon renderer */\n renderAttachIcon?: () => React.ReactNode;\n /** Custom send icon renderer */\n renderSendIcon?: () => React.ReactNode;\n}\n\n/**\n * Message composer with text input, file upload, and reply preview.\n *\n * **Context-aware:** When used inside `<Room>`, automatically binds to\n * `sendMessage` and typing events. When used standalone, accepts all callbacks via props.\n *\n * @example\n * ```tsx\n * // Context-aware\n * <Room roomId={id}>\n * <Window>\n * <MessageList />\n * <ChatInput />\n * </Window>\n * </Room>\n *\n * // Standalone\n * <ChatInput onSendText={handleSend} onSendFile={handleFile} />\n * ```\n */\nexport const ChatInput: React.FC<ChatInputProps> = (props) => {\n const roomActionCtx = useRoomActionContext(\"ChatInput\");\n const typingCtx = useTypingContext(\"ChatInput\");\n const chatCtx = useChatContext(\"ChatInput\");\n\n const onSendText = props.onSendText ?? (roomActionCtx.sendMessage\n ? async (text: string) => {\n await roomActionCtx.sendMessage({ type: \"text\", text });\n }\n : undefined);\n const onSendFile = props.onSendFile;\n const onTypingStart = props.onTypingStart ?? typingCtx.startTyping;\n const onTypingStop = props.onTypingStop ?? typingCtx.stopTyping;\n\n const {\n replyingTo,\n onCancelReply,\n disabled = false,\n placeholder = \"Type a message...\",\n maxLength = 4000,\n className = \"\",\n inputClassName = \"\",\n renderAttachIcon,\n renderSendIcon,\n } = props;\n\n const [text, setText] = useState(\"\");\n const [sending, setSending] = useState(false);\n const fileRef = useRef<HTMLInputElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const resizeTextarea = useCallback(() => {\n const el = textareaRef.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`;\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n resizeTextarea();\n onTypingStart?.();\n };\n\n const handleSend = async () => {\n const trimmed = text.trim();\n if (!trimmed || sending || disabled || !onSendText) return;\n setSending(true);\n try {\n await onSendText(trimmed);\n setText(\"\");\n if (textareaRef.current) textareaRef.current.style.height = \"auto\";\n onTypingStop?.();\n } finally {\n setSending(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !onSendFile) return;\n await onSendFile(file);\n if (fileRef.current) fileRef.current.value = \"\";\n };\n\n return (\n <div\n className={`hermes-chat-input ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n padding: \"8px 12px\",\n borderTop: \"1px solid #e0e0e0\",\n }}\n >\n {/* Reply preview */}\n {replyingTo && (\n <div\n className=\"hermes-chat-input__reply\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"6px 10px\",\n marginBottom: 6,\n background: \"#f5f5f5\",\n borderRadius: 8,\n borderLeft: \"3px solid #0084ff\",\n fontSize: 12,\n }}\n >\n <div style={{ overflow: \"hidden\" }}>\n <span style={{ fontWeight: 600, marginRight: 4 }}>Replying to:</span>\n <span style={{ opacity: 0.7 }}>\n {replyingTo.type === \"text\"\n ? replyingTo.text?.slice(0, 60)\n : `[${replyingTo.type}]`}\n </span>\n </div>\n <button\n onClick={onCancelReply}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 16,\n lineHeight: 1,\n }}\n >\n ✕\n </button>\n </div>\n )}\n\n {/* Input row */}\n <div\n className=\"hermes-chat-input__row\"\n style={{ display: \"flex\", alignItems: \"flex-end\", gap: 8 }}\n >\n {/* Attach button */}\n {onSendFile && (\n <>\n <button\n onClick={() => fileRef.current?.click()}\n disabled={disabled}\n className=\"hermes-chat-input__attach\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 6,\n flexShrink: 0,\n opacity: disabled ? 0.4 : 1,\n }}\n >\n {renderAttachIcon ? (\n renderAttachIcon()\n ) : (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n )}\n </button>\n <input\n ref={fileRef}\n type=\"file\"\n style={{ display: \"none\" }}\n onChange={handleFileChange}\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt\"\n />\n </>\n )}\n\n {/* Textarea */}\n <textarea\n ref={textareaRef}\n value={text}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={() => onTypingStop?.()}\n placeholder={placeholder}\n disabled={disabled}\n maxLength={maxLength}\n rows={1}\n className={`hermes-chat-input__textarea ${inputClassName}`}\n style={{\n flex: 1,\n resize: \"none\",\n border: \"1px solid #e0e0e0\",\n borderRadius: 20,\n padding: \"8px 14px\",\n fontSize: 14,\n lineHeight: 1.5,\n outline: \"none\",\n overflow: \"hidden\",\n background: disabled ? \"#f5f5f5\" : \"#fff\",\n }}\n />\n\n {/* Send button */}\n <button\n onClick={handleSend}\n disabled={!text.trim() || sending || disabled}\n className=\"hermes-chat-input__send\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 6,\n flexShrink: 0,\n opacity: !text.trim() || sending || disabled ? 0.4 : 1,\n }}\n >\n {renderSendIcon ? (\n renderSendIcon()\n ) : (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n )}\n </button>\n </div>\n\n {/* Character count */}\n {text.length > maxLength * 0.8 && (\n <div style={{ fontSize: 10, textAlign: \"right\", opacity: 0.5, marginTop: 2 }}>\n {text.length}/{maxLength}\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport type { Room } from \"../../types/index\";\n\ninterface RoomListProps {\n rooms: Room[];\n activeRoomId?: string | null;\n currentUserId: string;\n loading?: boolean;\n onSelectRoom: (room: Room) => void;\n onCreateDirect?: () => void;\n onCreateGroup?: () => void;\n renderRoomItem?: (room: Room, isActive: boolean) => React.ReactNode;\n renderAvatar?: (room: Room) => React.ReactNode;\n renderEmpty?: () => React.ReactNode;\n className?: string;\n itemClassName?: string;\n}\n\nconst formatLastActivity = (iso: string) => {\n const date = new Date(iso);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n if (diffMins < 1) return \"now\";\n if (diffMins < 60) return `${diffMins}m`;\n if (diffHours < 24) return `${diffHours}h`;\n if (diffDays < 7) return `${diffDays}d`;\n return date.toLocaleDateString();\n};\n\nconst getRoomName = (room: Room, currentUserId: string) => {\n if (room.type === \"group\") return room.name ?? \"Group\";\n const other = room.members.find((m) => m !== currentUserId);\n return other ?? \"Direct Message\";\n};\n\nconst getLastMessagePreview = (room: Room): string => {\n const msg = room.lastMessage as any;\n if (!msg) return \"No messages yet\";\n if (msg.isDeleted) return \"Message deleted\";\n if (msg.type === \"text\") return msg.text?.slice(0, 50) ?? \"\";\n if (msg.type === \"image\") return \"📷 Image\";\n if (msg.type === \"video\") return \"🎥 Video\";\n if (msg.type === \"audio\") return \"🎵 Audio\";\n if (msg.type === \"document\") return `📄 ${msg.fileName ?? \"File\"}`;\n if (msg.type === \"link\") return `🔗 ${msg.url}`;\n return \"\";\n};\n\nconst DefaultRoomItem: React.FC<{\n room: Room;\n isActive: boolean;\n currentUserId: string;\n renderAvatar?: (room: Room) => React.ReactNode;\n itemClassName?: string;\n}> = ({ room, isActive, currentUserId, renderAvatar, itemClassName }) => (\n <div\n className={`hermes-room-item ${isActive ? \"hermes-room-item--active\" : \"\"} ${itemClassName ?? \"\"}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n cursor: \"pointer\",\n background: isActive ? \"rgba(0,132,255,0.08)\" : \"transparent\",\n borderLeft: isActive ? \"3px solid #0084ff\" : \"3px solid transparent\",\n }}\n >\n <div style={{ flexShrink: 0 }}>\n {renderAvatar ? (\n renderAvatar(room)\n ) : (\n <div\n style={{\n width: 42,\n height: 42,\n borderRadius: \"50%\",\n background: \"#e0e0e0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontWeight: 700,\n fontSize: 16,\n }}\n >\n {room.type === \"group\" ? \"G\" : \"D\"}\n </div>\n )}\n </div>\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n fontSize: 14,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {getRoomName(room, currentUserId)}\n </span>\n <span\n style={{ fontSize: 11, opacity: 0.5, flexShrink: 0, marginLeft: 4 }}\n >\n {formatLastActivity(room.lastActivity)}\n </span>\n </div>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: 2,\n }}\n >\n <span\n style={{\n fontSize: 13,\n opacity: 0.6,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {getLastMessagePreview(room)}\n </span>\n {room.unreadCount > 0 && (\n <span\n style={{\n background: \"#0084ff\",\n color: \"#fff\",\n borderRadius: 10,\n fontSize: 11,\n fontWeight: 700,\n padding: \"1px 7px\",\n flexShrink: 0,\n marginLeft: 4,\n }}\n >\n {room.unreadCount > 99 ? \"99+\" : room.unreadCount}\n </span>\n )}\n </div>\n </div>\n </div>\n);\n\nexport const RoomList: React.FC<RoomListProps> = ({\n rooms,\n activeRoomId,\n currentUserId,\n loading = false,\n onSelectRoom,\n onCreateDirect,\n onCreateGroup,\n renderRoomItem,\n renderAvatar,\n renderEmpty,\n className = \"\",\n itemClassName = \"\",\n}) => {\n return (\n <div\n className={`hermes-room-list ${className}`}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n overflowY: \"auto\",\n }}\n >\n {}\n {(onCreateDirect || onCreateGroup) && (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n padding: \"10px 12px\",\n borderBottom: \"1px solid #e0e0e0\",\n }}\n >\n {onCreateDirect && (\n <button\n onClick={onCreateDirect}\n style={{\n flex: 1,\n background: \"#0084ff\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 8,\n padding: \"8px 10px\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n + Direct\n </button>\n )}\n {onCreateGroup && (\n <button\n onClick={onCreateGroup}\n style={{\n flex: 1,\n background: \"none\",\n border: \"1px solid #e0e0e0\",\n borderRadius: 8,\n padding: \"8px 10px\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n + Group\n </button>\n )}\n </div>\n )}\n\n {loading && (\n <div style={{ padding: \"12px 16px\", opacity: 0.5, fontSize: 13 }}>\n Loading rooms...\n </div>\n )}\n\n {!loading && rooms.length === 0 && (\n <div\n style={{\n textAlign: \"center\",\n padding: 24,\n opacity: 0.4,\n fontSize: 13,\n }}\n >\n {renderEmpty ? renderEmpty() : \"No conversations yet.\"}\n </div>\n )}\n\n {!loading &&\n rooms.map((room) => {\n const isActive = room._id === activeRoomId;\n return (\n <div key={room._id} onClick={() => onSelectRoom(room)}>\n {renderRoomItem ? (\n renderRoomItem(room, isActive)\n ) : (\n <DefaultRoomItem\n room={room}\n isActive={isActive}\n currentUserId={currentUserId}\n renderAvatar={renderAvatar}\n itemClassName={itemClassName}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from \"react\";\n\ninterface OnlineBadgeProps {\n isOnline: boolean;\n size?: number;\n className?: string;\n}\n\nexport const OnlineBadge: React.FC<OnlineBadgeProps> = ({\n isOnline,\n size = 10,\n className = \"\",\n}) => (\n <span\n className={`hermes-online-badge ${isOnline ? \"hermes-online-badge--online\" : \"hermes-online-badge--offline\"} ${className}`}\n data-online={isOnline}\n style={{\n display: \"inline-block\",\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: isOnline ? \"#22c55e\" : \"#d1d5db\",\n boxShadow: isOnline ? \"0 0 0 2px #fff\" : \"none\",\n flexShrink: 0,\n }}\n />\n);\n","import React, { useState, useRef, useEffect } from \"react\";\nimport type { Reaction } from \"../../types/index\";\nimport EmojiPicker, { Theme, type EmojiClickData } from \"emoji-picker-react\";\n\ninterface ReactionPickerProps {\n onSelect: (emoji: string) => void;\n currentReactions?: Reaction[];\n currentUserId?: string;\n emojis?: string[];\n className?: string;\n align?: \"left\" | \"right\";\n}\n\nconst DEFAULT_EMOJIS = [\"👍\", \"❤️\", \"😂\", \"😮\", \"😢\", \"🔥\", \"🎉\", \"👏\"];\n\nexport const ReactionPicker: React.FC<ReactionPickerProps> = ({\n onSelect,\n currentReactions = [],\n currentUserId,\n emojis = DEFAULT_EMOJIS,\n className = \"\",\n align = \"left\",\n}) => {\n const [showPicker, setShowPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n \n const hasReacted = (emoji: string) => {\n if (!currentUserId) return false;\n\n return (\n currentReactions\n .find((r) => r.emoji === emoji)\n ?.users.includes(currentUserId) ?? false\n );\n };\n\n const handleEmojiClick = (emojiData: EmojiClickData) => {\n onSelect(emojiData.emoji);\n setShowPicker(false);\n };\n\n \n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (!containerRef.current) return;\n\n const target = e.target as Node;\n\n if (!containerRef.current.contains(target)) {\n setShowPicker(false);\n }\n };\n\n if (showPicker) {\n window.addEventListener(\"click\", handleOutsideClick);\n }\n\n return () => window.removeEventListener(\"click\", handleOutsideClick);\n }, [showPicker]);\n\n return (\n <div\n ref={containerRef}\n style={{ position: \"relative\", display: \"inline-block\" }}\n className={className}\n >\n {}\n <div\n style={{\n display: \"flex\",\n gap: 4,\n flexWrap: \"wrap\",\n padding: \"6px 8px\",\n background: \"#111\",\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.08)\",\n }}\n >\n {emojis.map((emoji) => (\n <button\n key={emoji}\n onClick={() => onSelect(emoji)}\n style={{\n background: hasReacted(emoji)\n ? \"rgba(57,255,20,0.12)\"\n : \"transparent\",\n border: hasReacted(emoji)\n ? \"1px solid rgba(57,255,20,0.35)\"\n : \"1px solid transparent\",\n borderRadius: 8,\n padding: \"4px 6px\",\n cursor: \"pointer\",\n fontSize: 18,\n lineHeight: 1,\n transition: \"transform 0.12s ease\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.transform = \"scale(1.2)\")\n }\n onMouseLeave={(e) => (e.currentTarget.style.transform = \"scale(1)\")}\n >\n {emoji}\n </button>\n ))}\n\n {}\n <button\n onClick={(e) => {\n e.stopPropagation();\n setShowPicker((v) => !v);\n }}\n style={{\n borderRadius: 8,\n padding: \"4px 6px\",\n cursor: \"pointer\",\n fontSize: 18,\n border: \"1px solid transparent\",\n background: \"transparent\",\n }}\n >\n ➕\n </button>\n </div>\n\n {}\n {showPicker && (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 6px)\",\n [align === \"right\" ? \"right\" : \"left\"]: 0,\n zIndex: 50,\n animation: \"hermes-pop 0.15s ease\",\n }}\n >\n <EmojiPicker\n theme={Theme.DARK}\n onEmojiClick={handleEmojiClick}\n height={440}\n width={360}\n searchPlaceHolder=\"Search emoji...\"\n lazyLoadEmojis\n />\n </div>\n )}\n\n {}\n <style>{`\n @keyframes hermes-pop {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n `}</style>\n </div>\n );\n};\n","import React from \"react\";\nimport type { Message } from \"../../types/index\";\n\ninterface MediaMessageProps {\n message: Message;\n className?: string;\n maxWidth?: number | string;\n}\n\nconst formatFileSize = (bytes?: number) => {\n if (!bytes) return \"\";\n if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${bytes} B`;\n};\n\nexport const MediaMessage: React.FC<MediaMessageProps> = ({\n message,\n className = \"\",\n maxWidth = 300,\n}) => {\n if (!message.url) return null;\n\n return (\n <div\n className={`hermes-media-message hermes-media-message--${message.type} ${className}`}\n style={{ maxWidth }}\n >\n {message.type === \"image\" && (\n <img\n src={message.url}\n alt={message.fileName ?? \"image\"}\n style={{\n width: \"100%\",\n borderRadius: 10,\n display: \"block\",\n cursor: \"pointer\",\n }}\n onClick={() => window.open(message.url, \"_blank\")}\n />\n )}\n\n {message.type === \"video\" && (\n <video\n src={message.url}\n poster={message.thumbnail}\n controls\n style={{ width: \"100%\", borderRadius: 10 }}\n />\n )}\n\n {message.type === \"audio\" && (\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: 8 }}\n >\n <span style={{ fontSize: 20 }}>🎵</span>\n <audio src={message.url} controls style={{ flex: 1, height: 36 }} />\n </div>\n )}\n\n {message.type === \"document\" && (\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n borderRadius: 10,\n border: \"1px solid #e0e0e0\",\n textDecoration: \"none\",\n color: \"inherit\",\n }}\n >\n <span style={{ fontSize: 28, flexShrink: 0 }}>📄</span>\n <div style={{ overflow: \"hidden\" }}>\n <div\n style={{\n fontWeight: 600,\n fontSize: 13,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {message.fileName ?? \"Document\"}\n </div>\n <div style={{ fontSize: 11, opacity: 0.6 }}>\n {formatFileSize(message.fileSize)} · Click to download\n </div>\n </div>\n </a>\n )}\n\n {message.type === \"link\" && (\n <a\n href={message.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e0e0e0\",\n textDecoration: \"none\",\n color: \"#0084ff\",\n wordBreak: \"break-all\",\n fontSize: 13,\n }}\n >\n 🔗 {message.url}\n </a>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport type { Message as MessageType } from \"../../../types/index\";\n\nexport interface ThreadHeaderProps {\n /** The parent message of the thread */\n thread: MessageType;\n /** Close the thread panel */\n onClose: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Header for the thread panel showing parent message preview and close button.\n */\nexport const ThreadHeader: React.FC<ThreadHeaderProps> = ({\n thread,\n onClose,\n className = \"\",\n}) => (\n <div\n className={`hermes-thread-header ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"12px 16px\",\n borderBottom: \"1px solid rgba(128,128,128,0.15)\",\n }}\n >\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n <div style={{ fontWeight: 700, fontSize: 15, marginBottom: 2 }}>\n Thread\n </div>\n <div\n style={{\n fontSize: 12,\n opacity: 0.6,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {thread.type === \"text\"\n ? thread.text?.slice(0, 80)\n : `[${thread.type}]`}\n </div>\n </div>\n <button\n onClick={onClose}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 18,\n padding: 4,\n opacity: 0.6,\n lineHeight: 1,\n }}\n >\n ✕\n </button>\n </div>\n);\n","import React from \"react\";\nimport { useRoomStateContext } from \"../../context/RoomStateContext\";\nimport { useRoomActionContext } from \"../../context/RoomActionContext\";\nimport { useChatContext } from \"../../context/ChatContext\";\nimport { useComponentContext } from \"../../context/ComponentContext\";\nimport { ThreadHeader as DefaultThreadHeader } from \"./ThreadHeader\";\nimport { Message as DefaultMessage } from \"../Message/Message\";\nimport { EmptyStateIndicator } from \"../EmptyStateIndicator/EmptyStateIndicator\";\nimport type { Message as MessageType } from \"../../../types/index\";\n\nexport interface ThreadProps {\n /** Additional class name */\n className?: string;\n /** Whether to auto-focus the composer when thread opens */\n autoFocus?: boolean;\n}\n\n/**\n * Thread component renders a parent message with a list of replies\n * and a composer for new replies. It reads state from `RoomStateContext`\n * and actions from `RoomActionContext`.\n *\n * @example\n * ```tsx\n * <Room roomId={id}>\n * <Window>\n * <MessageList />\n * <ChatInput />\n * </Window>\n * <Thread />\n * </Room>\n * ```\n */\nexport const Thread: React.FC<ThreadProps> = ({\n className = \"\",\n autoFocus = true,\n}) => {\n const { currentUser, customClasses } = useChatContext(\"Thread\");\n const { thread, threadMessages, threadHasMore, threadLoadingMore } =\n useRoomStateContext(\"Thread\");\n const { closeThread, addReaction, deleteMessage, editMessage } =\n useRoomActionContext(\"Thread\");\n const {\n ThreadHeader: CustomThreadHeader,\n Message: CustomMessage,\n } = useComponentContext(\"Thread\");\n\n if (!thread) return null;\n\n const ThreadHeaderComponent = CustomThreadHeader || DefaultThreadHeader;\n const MessageComponent = CustomMessage || DefaultMessage;\n\n const threadClass =\n customClasses?.thread || `hermes-thread ${className}`.trim();\n\n return (\n <div\n className={threadClass}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n borderLeft: \"1px solid rgba(128,128,128,0.15)\",\n minWidth: 320,\n maxWidth: 420,\n }}\n >\n <ThreadHeaderComponent thread={thread} onClose={closeThread} />\n\n {/* Parent message */}\n <div\n style={{\n padding: \"12px 16px\",\n borderBottom: \"1px solid rgba(128,128,128,0.1)\",\n background: \"rgba(128,128,128,0.03)\",\n }}\n >\n <MessageComponent\n message={thread}\n isOwn={thread.senderId === currentUser?.userId}\n onReact={(id: string, emoji: string) => addReaction(id, emoji)}\n showAvatar\n />\n </div>\n\n {/* Replies */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {threadMessages.length === 0 ? (\n <EmptyStateIndicator listType=\"thread\" />\n ) : (\n threadMessages.map((msg) => (\n <div key={msg._id} style={{ marginBottom: 8 }}>\n <MessageComponent\n message={msg}\n isOwn={msg.senderId === currentUser?.userId}\n onEdit={(id: string, text: string) => editMessage(id, text)}\n onDelete={(id: string) => deleteMessage(id)}\n onReact={(id: string, emoji: string) => addReaction(id, emoji)}\n showAvatar\n />\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n","import React, { useEffect, useCallback } from \"react\";\nimport type { PropsWithChildren } from \"react\";\n\nexport interface ModalProps {\n /** Whether the modal is open */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Overlay modal for image previews, confirmations, and dialogs.\n *\n * @example\n * ```tsx\n * <Modal open={showPreview} onClose={() => setShowPreview(false)}>\n * <img src=\"...\" alt=\"preview\" />\n * </Modal>\n * ```\n */\nexport const Modal: React.FC<PropsWithChildren<ModalProps>> = ({\n open,\n onClose,\n className = \"\",\n children,\n}) => {\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose]\n );\n\n useEffect(() => {\n if (open) {\n document.addEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"hidden\";\n }\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"\";\n };\n }, [open, handleKeyDown]);\n\n if (!open) return null;\n\n return (\n <div\n className={`hermes-modal-overlay ${className}`}\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.6)\",\n backdropFilter: \"blur(4px)\",\n animation: \"hermes-fade-in 0.15s ease\",\n }}\n >\n <div\n className=\"hermes-modal-content\"\n onClick={(e) => e.stopPropagation()}\n style={{\n maxWidth: \"90vw\",\n maxHeight: \"90vh\",\n overflow: \"auto\",\n borderRadius: 12,\n background: \"#fff\",\n boxShadow: \"0 16px 64px rgba(0,0,0,0.3)\",\n animation: \"hermes-pop 0.2s ease\",\n }}\n >\n <button\n onClick={onClose}\n style={{\n position: \"absolute\",\n top: 16,\n right: 16,\n background: \"rgba(0,0,0,0.5)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"50%\",\n width: 32,\n height: 32,\n cursor: \"pointer\",\n fontSize: 16,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1,\n }}\n >\n ✕\n </button>\n {children}\n </div>\n <style>{`\n @keyframes hermes-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes hermes-pop {\n from { opacity: 0; transform: scale(0.9); }\n to { opacity: 1; transform: scale(1); }\n }\n `}</style>\n </div>\n );\n};\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport type { Message } from \"../../../types/index\";\n\nexport interface SearchProps {\n /** Messages to search through */\n messages?: Message[];\n /** Callback when a result is selected */\n onSelectResult?: (message: Message) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Client-side search component that filters messages.\n *\n * @example\n * ```tsx\n * <Search messages={messages} onSelectResult={msg => jumpTo(msg._id)} />\n * ```\n */\nexport const Search: React.FC<SearchProps> = ({\n messages = [],\n onSelectResult,\n placeholder = \"Search messages...\",\n className = \"\",\n}) => {\n const [query, setQuery] = useState(\"\");\n const [focused, setFocused] = useState(false);\n\n const results = useMemo(() => {\n if (!query.trim()) return [];\n const lower = query.toLowerCase();\n return messages\n .filter(\n (m) =>\n !m.isDeleted &&\n m.type === \"text\" &&\n m.text?.toLowerCase().includes(lower)\n )\n .slice(0, 20);\n }, [query, messages]);\n\n const handleSelect = useCallback(\n (msg: Message) => {\n onSelectResult?.(msg);\n setQuery(\"\");\n setFocused(false);\n },\n [onSelectResult]\n );\n\n return (\n <div\n className={`hermes-search ${className}`}\n style={{ position: \"relative\" }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 12px\",\n border: \"1px solid rgba(128,128,128,0.2)\",\n borderRadius: 10,\n background: focused ? \"#fff\" : \"rgba(128,128,128,0.05)\",\n transition: \"background 0.15s, border-color 0.15s\",\n borderColor: focused ? \"#0084ff\" : \"rgba(128,128,128,0.2)\",\n }}\n >\n <span style={{ fontSize: 14, opacity: 0.5 }}>🔍</span>\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setTimeout(() => setFocused(false), 200)}\n placeholder={placeholder}\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n fontSize: 13,\n background: \"transparent\",\n }}\n />\n {query && (\n <button\n onClick={() => setQuery(\"\")}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 14,\n opacity: 0.5,\n lineHeight: 1,\n }}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Results dropdown */}\n {focused && query.trim() && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n right: 0,\n zIndex: 50,\n background: \"#fff\",\n border: \"1px solid rgba(128,128,128,0.15)\",\n borderRadius: 10,\n boxShadow: \"0 8px 32px rgba(0,0,0,0.12)\",\n maxHeight: 300,\n overflowY: \"auto\",\n }}\n >\n {results.length === 0 ? (\n <div\n style={{\n padding: 16,\n textAlign: \"center\",\n fontSize: 13,\n opacity: 0.5,\n }}\n >\n No results found\n </div>\n ) : (\n results.map((msg) => (\n <div\n key={msg._id}\n onClick={() => handleSelect(msg)}\n style={{\n padding: \"8px 12px\",\n cursor: \"pointer\",\n borderBottom: \"1px solid rgba(128,128,128,0.08)\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background = \"rgba(0,132,255,0.05)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n <div\n style={{\n fontSize: 13,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {msg.text}\n </div>\n <div style={{ fontSize: 11, opacity: 0.5, marginTop: 2 }}>\n {new Date(msg.createdAt).toLocaleString()}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Avatar","MessageStatus","MessageActions","DateSeparator","EmptyStateIndicator","LoadingIndicator","LoadingErrorIndicator","ReactionPicker","TypingIndicator","MediaMessage","ThreadHeader","Modal","ChatInput","Search","OnlineBadge","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_react","import_jsx_runtime","text","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","EmojiPicker","import_jsx_runtime","formatFileSize","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}