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.
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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":["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":["useState","useEffect","useCallback","useRef","useState","useEffect","useCallback","useState","useEffect","useCallback","useRef","useState","useEffect","useCallback","useCallback","useState","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","TypingIndicator","jsx","useState","useRef","useEffect","EmojiPicker","jsx","jsxs","jsx","jsxs","formatFileSize"]}
1
+ {"version":3,"sources":["../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":["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":["createContext","useContext","jsx","createContext","useContext","jsx","createContext","useContext","jsx","createContext","useContext","jsx","createContext","useContext","jsx","useState","useEffect","useCallback","useRef","useState","useEffect","useCallback","useState","useEffect","useCallback","useRef","useState","useEffect","useCallback","useCallback","useState","useCallback","useState","useEffect","useCallback","jsx","useState","useEffect","useCallback","useState","useCallback","useMemo","useEffect","useRef","jsx","Avatar","MessageStatus","MessageActions","DateSeparator","EmptyStateIndicator","LoadingIndicator","LoadingErrorIndicator","ReactionPicker","TypingIndicator","MediaMessage","ThreadHeader","Modal","ChatInput","Search","OnlineBadge","useState","useRef","useEffect","useCallback","useMemo","jsx","React","useEffect","useRef","useState","useRef","useEffect","jsx","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useRef","useEffect","React","useState","useRef","useCallback","Fragment","jsx","jsxs","text","useState","useRef","useCallback","jsx","jsxs","jsx","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","formatFileSize","jsx","jsxs","jsx","jsxs","useEffect","useCallback","jsx","jsxs","useState","useCallback","useMemo","jsx","jsxs"]}