@anakin824/prdg-chat-ui 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/lib/api.ts","../src/chat/lib/queryKeys.ts","../src/chat/provider/ChatContext.ts","../src/chat/hooks/useConversations.ts","../src/chat/lib/natsRealtime.ts","../src/chat/provider/ChatNatsBridge.tsx","../src/chat/provider/ChatProvider.tsx","../src/chat/hooks/useChatActions.ts","../src/chat/hooks/useConversationMembers.ts","../src/chat/lib/reconcile.ts","../src/chat/hooks/useMessages.ts","../src/chat/hooks/useChatPanelController.ts","scss-module:./chat.module.css#scss-module","../src/chat/components/ConversationList.tsx","../src/chat/hooks/useUpload.ts","../src/chat/hooks/useVoiceRecorder.ts","../src/chat/hooks/usePresignedUrl.ts","../src/chat/components/MessageInput.tsx","../src/chat/lib/media.ts","../src/chat/components/ImageMessage.tsx","../src/chat/components/VideoMessage.tsx","../src/chat/components/VoiceNotePlayer.tsx","../src/chat/components/MessageBubble.tsx","../src/chat/components/MessageThread.tsx","../src/chat/components/NewChatModal.tsx","../src/chat/components/TypingIndicator.tsx","../src/chat/components/ChatPanel.tsx","../src/chat/components/ChatWidget.tsx","../src/chat/lib/chatLabels.ts","scss-module:./standalone-chat.module.css#scss-module","../src/chat/components/ChatInboxSidebar.tsx","../src/chat/components/ChatMainColumn.tsx","../src/chat/components/StandaloneChatPage.tsx","../src/chat/components/ChatConversationView.tsx"],"names":["createContext","useContext","useQuery","useQueryClient","useMemo","useRef","useEffect","QueryClient","useCallback","useState","QueryClientProvider","useMutation","Lightbox","WaveSurfer","format","parseISO","useLayoutEffect","AnimatePresence","motion","initials"],"mappings":"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","file":"index.js","sourcesContent":["import type { Conversation, Message } from \"../types\";\n\nexport type ListConversationsRes = { items: Conversation[]; next_cursor: string };\nexport type ListMessagesRes = { items: Message[]; next_cursor: string };\n\nexport type AppUser = {\n id: string;\n tenant_id: string;\n display_name: string;\n email?: string | null;\n ext_user_id?: string | null;\n};\n\nexport type PresignPutRes = {\n upload_url: string;\n key: string;\n bucket: string;\n expires_in: number;\n};\n\nexport type PresignGetRes = { url: string; expires_in: number };\n\nexport class ChatAPI {\n constructor(\n private baseUrl: string,\n private getToken: () => string | null,\n /**\n * Called when a request returns 401. Should refresh the token and return the new one,\n * or return null if refresh is impossible. ChatAPI retries the failed request once with\n * the returned token. The provider also updates its token ref for future requests.\n */\n private onAuthError?: () => Promise<string | null>,\n ) {}\n\n private headers(tokenOverride?: string): HeadersInit {\n const t = tokenOverride ?? this.getToken();\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (t) h.Authorization = `Bearer ${t}`;\n return h;\n }\n\n private async json<T>(path: string, init?: RequestInit): Promise<T> {\n let res = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: { ...this.headers(), ...(init?.headers || {}) },\n });\n\n if (res.status === 401 && this.onAuthError) {\n const newToken = await this.onAuthError();\n if (newToken) {\n res = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: { ...this.headers(newToken), ...(init?.headers || {}) },\n });\n }\n }\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(err || res.statusText);\n }\n return res.json() as Promise<T>;\n }\n\n listConversations(cursor?: string, limit = 50): Promise<ListConversationsRes> {\n const q = new URLSearchParams();\n if (cursor) q.set(\"cursor\", cursor);\n q.set(\"limit\", String(limit));\n return this.json(`/conversations?${q}`);\n }\n\n listMessages(conversationId: string, cursor?: string, limit = 50): Promise<ListMessagesRes> {\n const q = new URLSearchParams();\n if (cursor) q.set(\"cursor\", cursor);\n q.set(\"limit\", String(limit));\n return this.json(`/conversations/${conversationId}/messages?${q}`);\n }\n\n findOrCreateDirect(peerUserId: string): Promise<Conversation> {\n return this.json(\"/conversations/direct\", {\n method: \"POST\",\n body: JSON.stringify({ peer_user_id: peerUserId }),\n });\n }\n\n createGroup(title: string, members: string[]): Promise<Conversation> {\n return this.json(\"/conversations/group\", {\n method: \"POST\",\n body: JSON.stringify({ title, members }),\n });\n }\n\n findOrCreateEntity(input: {\n title: string;\n entity_ref: string;\n entity_uuid: string;\n members?: string[];\n }): Promise<Conversation> {\n return this.json(\"/conversations/entity\", {\n method: \"POST\",\n body: JSON.stringify({\n title: input.title,\n entity_ref: input.entity_ref,\n entity_uuid: input.entity_uuid,\n members: input.members ?? [],\n }),\n });\n }\n\n listConversationMembers(conversationId: string): Promise<AppUser[]> {\n return this.json(`/conversations/${conversationId}/members`);\n }\n\n listContacts(q?: string, limit = 50): Promise<AppUser[]> {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (q) params.set(\"q\", q);\n return this.json(`/users?${params}`);\n }\n\n sendMessage(\n conversationId: string,\n body: {\n body?: string | null;\n client_id?: string | null;\n reply_to_message_id?: string | null;\n mentioned_user_ids?: string[];\n attachments?: Array<{\n storage_key: string;\n mime_type: string;\n byte_size: number;\n original_filename?: string | null;\n width?: number | null;\n height?: number | null;\n duration_seconds?: number | null;\n thumbnail_storage_key?: string | null;\n }>;\n },\n ): Promise<Message> {\n return this.json(`/conversations/${conversationId}/messages`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n presignPut(filename: string, contentType: string): Promise<PresignPutRes> {\n return this.json(\"/storage/presign-put\", {\n method: \"POST\",\n body: JSON.stringify({ filename, content_type: contentType }),\n });\n }\n\n presignGet(key: string): Promise<PresignGetRes> {\n return this.json(\"/storage/presign-get\", {\n method: \"POST\",\n body: JSON.stringify({ key }),\n });\n }\n}\n","/** Stable React Query keys for chat — use with invalidateQueries / host integrations. */\nexport const chatKeys = {\n all: [\"chat\"] as const,\n conversations: () => [...chatKeys.all, \"conversations\"] as const,\n messages: (conversationId: string | null) =>\n [...chatKeys.all, \"messages\", conversationId] as const,\n members: (conversationId: string) => [...chatKeys.all, \"members\", conversationId] as const,\n contacts: (q: string) => [...chatKeys.all, \"contacts\", q] as const,\n};\n","\"use client\";\n\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { createContext, useContext } from \"react\";\nimport type { ChatAPI } from \"../lib/api\";\nimport type { ChatConfig, ChatTheme } from \"../types\";\n\nexport type ChatContextValue = {\n api: ChatAPI;\n config: ChatConfig;\n /** Resolved theme tokens (defaults merged) */\n theme: ChatTheme;\n queryClient: QueryClient;\n /** prdg-chat user UUID for the current session — used to identify own messages, mentions, etc. */\n userId: string;\n /** Internal prdg-chat tenant UUID (API scope). */\n tenantId: string;\n /**\n * Conduitly tenant id for NATS subjects (`chat.{natsTenantId}.user.*`) — matches `tenant.slug` / Conduitly `tenant_id` in events.\n */\n natsTenantId: string;\n wsConnected: boolean;\n sendTyping: (conversationId: string) => void;\n sendTypingStop: (conversationId: string) => void;\n sendRead: (conversationId: string, messageId: string) => void;\n /**\n * Per-conversation map of user IDs currently typing.\n * Key: conversationId. Value: array of user IDs (never includes the current user).\n */\n typingByConversation: Record<string, string[]>;\n};\n\nconst ChatContext = createContext<ChatContextValue | null>(null);\n\nexport function useChat(): ChatContextValue {\n const v = useContext(ChatContext);\n if (!v) throw new Error(\"useChat must be used within ChatProvider\");\n return v;\n}\n\nexport { ChatContext };\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { chatKeys } from \"../lib/queryKeys\";\nimport { useChat } from \"../provider/ChatContext\";\n\nexport function useConversations() {\n const { api, wsConnected, config } = useChat();\n const interval = config.pollIntervalMs ?? 30_000;\n return useQuery({\n queryKey: chatKeys.conversations(),\n queryFn: () => api.listConversations(undefined, 50),\n refetchInterval: wsConnected ? false : interval,\n });\n}\n","import type { QueryClient } from \"@tanstack/react-query\";\r\nimport { chatKeys } from \"./queryKeys\";\r\n\r\n/**\r\n * Broker-style `nats://` URLs are not valid in the browser; nats.ws expects `ws://` or `wss://`.\r\n * `nats://` is mapped to `ws://` (plain WebSocket). Use explicit `wss://` in config when TLS is enabled.\r\n */\r\nexport function natsUrlToWebSocketUrl(url: string): string {\r\n const u = url.trim();\r\n if (!u) return u;\r\n if (/^nats:\\/\\//i.test(u)) return u.replace(/^nats:\\/\\//i, \"ws://\");\r\n if (/^tls:\\/\\//i.test(u)) return u.replace(/^tls:\\/\\//i, \"wss://\");\r\n return u;\r\n}\r\n\r\n/** Comma-separated broker URLs → list for `connect({ servers: [...] })`. */\r\nexport function parseNatsWebSocketServers(raw: string): string[] {\r\n return raw\r\n .split(\",\")\r\n .map((s) => natsUrlToWebSocketUrl(s))\r\n .filter((s) => s.length > 0);\r\n}\r\n\r\n/** Inbox for direct/group fan-out (see conduitly message-new FanOut). `natsTenantId` = Conduitly `tenant_id` (e.g. tenant slug). */\r\nexport function userInboxSubject(natsTenantId: string, userId: string): string {\r\n return `chat.${natsTenantId}.user.${userId}`;\r\n}\r\n\r\n/** Entity conversations publish only here, not per-user subjects. */\r\nexport function entityConversationSubject(natsTenantId: string, conversationId: string): string {\r\n return `chat.${natsTenantId}.conversation.${conversationId}`;\r\n}\r\n\r\n/**\r\n * NATS JSON from chat-message-new: `{ type: \"chat.message.new\", event_data: { conversation_id, ... } }`.\r\n * Invalidates React Query caches so the open thread and sidebar refresh without polling.\r\n */\r\nexport function invalidateQueriesFromNatsPayload(\r\n payload: unknown,\r\n queryClient: QueryClient,\r\n): void {\r\n if (!payload || typeof payload !== \"object\") return;\r\n const p = payload as Record<string, unknown>;\r\n if (p.type !== \"chat.message.new\") return;\r\n const ed = p.event_data;\r\n if (!ed || typeof ed !== \"object\") return;\r\n const convId = (ed as Record<string, unknown>).conversation_id;\r\n if (typeof convId !== \"string\" || !convId.trim()) return;\r\n void queryClient.invalidateQueries({ queryKey: chatKeys.messages(convId) });\r\n void queryClient.invalidateQueries({ queryKey: chatKeys.conversations() });\r\n}\r\n","\"use client\";\r\n\r\nimport type { NatsConnection } from \"nats.ws\";\r\nimport { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useEffect, useMemo, useRef } from \"react\";\r\nimport { useConversations } from \"../hooks/useConversations\";\r\nimport {\r\n entityConversationSubject,\r\n invalidateQueriesFromNatsPayload,\r\n parseNatsWebSocketServers,\r\n userInboxSubject,\r\n} from \"../lib/natsRealtime\";\r\nimport { useChat } from \"./ChatContext\";\r\n\r\ntype ChatNatsBridgeProps = {\r\n natsWsUrl: string;\r\n natsToken?: string;\r\n onConnectedChange: (connected: boolean) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to NATS over WebSocket and invalidates chat queries on `chat.message.new`.\r\n * Subjects match conduitly/message-new FanOut: user inbox + per-entity conversation.\r\n */\r\nexport function ChatNatsBridge({ natsWsUrl, natsToken, onConnectedChange }: ChatNatsBridgeProps) {\r\n const { natsTenantId, userId } = useChat();\r\n const queryClient = useQueryClient();\r\n const { data: convData } = useConversations();\r\n\r\n const entityConversationIds = useMemo(() => {\r\n const items = convData?.items ?? [];\r\n return items\r\n .filter((c) => String(c.kind).toLowerCase() === \"entity\")\r\n .map((c) => c.id)\r\n .sort();\r\n }, [convData?.items]);\r\n\r\n const entityKey = entityConversationIds.join(\",\");\r\n\r\n const servers = useMemo(() => parseNatsWebSocketServers(natsWsUrl), [natsWsUrl]);\r\n\r\n const onConnectedChangeRef = useRef(onConnectedChange);\r\n onConnectedChangeRef.current = onConnectedChange;\r\n\r\n const connRef = useRef<NatsConnection | null>(null);\r\n\r\n useEffect(() => {\r\n if (servers.length === 0) return;\r\n\r\n let cancelled = false;\r\n\r\n void (async () => {\r\n try {\r\n const { connect, JSONCodec } = await import(\"nats.ws\");\r\n const jc = JSONCodec();\r\n\r\n const opts: {\r\n servers: string[];\r\n maxReconnectAttempts: number;\r\n name: string;\r\n token?: string;\r\n } = {\r\n servers,\r\n maxReconnectAttempts: -1,\r\n name: `prdg-chat-web:${userId}`,\r\n };\r\n if (natsToken?.trim()) opts.token = natsToken.trim();\r\n\r\n const conn = await connect(opts);\r\n if (cancelled) {\r\n await conn.drain();\r\n return;\r\n }\r\n connRef.current = conn;\r\n onConnectedChangeRef.current(true);\r\n\r\n const handleMsg = (data: Uint8Array, subject: string): void => {\r\n if (process.env.NODE_ENV === \"development\") {\r\n console.debug(\"[NATS] raw message received on subject:\", subject, \"bytes:\", data.length);\r\n }\r\n let payload: unknown;\r\n try {\r\n payload = jc.decode(data);\r\n } catch (decodeErr) {\r\n if (process.env.NODE_ENV === \"development\") {\r\n console.error(\"[NATS] JSONCodec decode failed:\", decodeErr, \"raw:\", new TextDecoder().decode(data));\r\n }\r\n return;\r\n }\r\n if (process.env.NODE_ENV === \"development\") {\r\n console.debug(\"[NATS] decoded payload:\", payload);\r\n }\r\n invalidateQueriesFromNatsPayload(payload, queryClient);\r\n if (process.env.NODE_ENV === \"development\") {\r\n if (\r\n payload &&\r\n typeof payload === \"object\" &&\r\n (payload as Record<string, unknown>).type === \"chat.message.new\"\r\n ) {\r\n const p = payload as Record<string, unknown>;\r\n const ed = p.event_data as Record<string, unknown> | undefined;\r\n const rawTs =\r\n typeof ed?.timestamp_utc === \"string\" ? ed.timestamp_utc : null;\r\n const localTime = rawTs\r\n ? new Date(rawTs).toLocaleTimeString(undefined, {\r\n hour: \"numeric\",\r\n minute: \"2-digit\",\r\n hour12: true,\r\n })\r\n : new Date().toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\", hour12: true });\r\n console.log(\r\n `%c[NATS] chat.message.new`,\r\n \"color:#7c3aed;font-weight:bold\",\r\n `\\n subject: ${subject}`,\r\n `\\n conversation: ${typeof ed?.conversation_id === \"string\" ? ed.conversation_id : \"?\"}`,\r\n `\\n sender: ${typeof ed?.sender_id === \"string\" ? ed.sender_id : \"?\"}`,\r\n `\\n body: ${typeof ed?.body === \"string\" ? ed.body.slice(0, 200) : \"(no body)\"}`,\r\n `\\n time (local): ${localTime}`,\r\n );\r\n } else {\r\n console.debug(\r\n \"[NATS] message received — unexpected type:\",\r\n typeof payload === \"object\" && payload\r\n ? (payload as Record<string, unknown>).type\r\n : typeof payload,\r\n payload,\r\n );\r\n }\r\n }\r\n };\r\n\r\n const inbox = userInboxSubject(natsTenantId, userId);\r\n const subInbox = conn.subscribe(inbox);\r\n void (async () => {\r\n for await (const m of subInbox) {\r\n if (cancelled) break;\r\n handleMsg(m.data, m.subject);\r\n }\r\n })();\r\n\r\n for (const convId of entityConversationIds) {\r\n const subj = entityConversationSubject(natsTenantId, convId);\r\n const sub = conn.subscribe(subj);\r\n void (async () => {\r\n for await (const m of sub) {\r\n if (cancelled) break;\r\n handleMsg(m.data, m.subject);\r\n }\r\n })();\r\n }\r\n\r\n if (process.env.NODE_ENV === \"development\") {\r\n const subjectList = [\r\n inbox,\r\n ...entityConversationIds.map((id) => entityConversationSubject(natsTenantId, id)),\r\n ];\r\n console.info(\"[NATS] WebSocket connected — servers:\", servers, \"subjects:\", subjectList);\r\n void (async () => {\r\n for await (const s of conn.status()) {\r\n if (cancelled) break;\r\n console.debug(\"[NATS] connection status:\", s.type, s.data ?? \"\");\r\n }\r\n })();\r\n }\r\n\r\n await conn.closed();\r\n connRef.current = null;\r\n if (!cancelled) onConnectedChangeRef.current(false);\r\n } catch (err) {\r\n connRef.current = null;\r\n if (process.env.NODE_ENV === \"development\") {\r\n console.error(\"[NATS] WebSocket connect failed — check ws:// URL, NATS websocket block, and CORS/mixed content:\", err);\r\n }\r\n if (!cancelled) onConnectedChangeRef.current(false);\r\n }\r\n })();\r\n\r\n return () => {\r\n cancelled = true;\r\n onConnectedChangeRef.current(false);\r\n const c = connRef.current;\r\n connRef.current = null;\r\n void c?.drain();\r\n };\r\n }, [servers, natsToken, natsTenantId, userId, entityKey, queryClient, entityConversationIds]);\r\n\r\n return null;\r\n}\r\n","\"use client\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { ChatAPI } from \"../lib/api\";\nimport type { ChatConfig, ChatTheme } from \"../types\";\nimport { ChatNatsBridge } from \"./ChatNatsBridge\";\nimport { ChatContext, type ChatContextValue } from \"./ChatContext\";\nimport \"../styles/variables.css\";\n\nconst defaultTheme: Required<ChatTheme> = {\n primary: \"#0a84ff\",\n bubbleSent: \"#0a84ff\",\n bubbleReceived: \"#2c2c2e\",\n textOnSent: \"#ffffff\",\n textOnReceived: \"#f5f5f7\",\n radius: \"18px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n surface: \"#1c1c1e\",\n border: \"#3a3a3c\",\n mutedFill: \"rgba(0, 0, 0, 0.2)\",\n composerShadow: \"0 2px 16px rgba(0, 0, 0, 0.38)\",\n};\n\nexport type ChatProviderProps = {\n apiUrl: string;\n /** Current bearer token (HDS JWT in integrated mode, prdg-chat JWT in standalone). */\n token: string;\n /** prdg-chat user UUID — identifies the current user for own-message display, mentions, etc. */\n userId: string;\n /** Internal prdg-chat tenant UUID (JWT / API). */\n tenantId: string;\n /**\n * Conduitly `tenant_id` for NATS (`chat.{conduitly_tenant_id}.user.*`). Set via `conduitly_tenant_id` in dev.json or `NEXT_PUBLIC_CONDUITLY_TENANT_ID`; do not rely on internal prdg-chat tenant UUID.\n */\n conduitlyTenantId?: string;\n theme?: ChatTheme;\n pollIntervalMs?: number;\n onUnreadChange?: (n: number) => void;\n /**\n * Called when a request returns 401 (token expired). Should refresh the token and return\n * the new string, or return null if refresh is not possible (user will be logged out by host).\n * ChatProvider also uses the returned token for all subsequent requests without remounting.\n */\n onTokenRefresh?: () => Promise<string | null>;\n /**\n * When true, standalone UI shows Calls tab and audio/video header buttons. Default false.\n */\n callEnabled?: boolean;\n /**\n * NATS WebSocket URL(s) for `nats.ws`: a single `ws://`/`wss://` URL or comma-separated list.\n * Broker-style `nats://host:port` entries are converted to `ws://` for the browser.\n * When set, the client subscribes to chat subjects and turns off REST polling while connected.\n */\n natsWsUrl?: string;\n /** Optional NATS auth token (when the server uses token authentication). */\n natsToken?: string;\n children: ReactNode;\n};\n\nexport function ChatProvider({\n apiUrl,\n token,\n userId,\n tenantId,\n conduitlyTenantId,\n theme,\n pollIntervalMs = 30_000,\n onUnreadChange: _onUnreadChange,\n onTokenRefresh,\n callEnabled = false,\n natsWsUrl,\n natsToken,\n children,\n}: ChatProviderProps) {\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { staleTime: 5_000 },\n },\n }),\n [],\n );\n\n // Keep a ref so ChatAPI always reads the latest token without recreating the client on refresh.\n const tokenRef = useRef(token);\n useEffect(() => {\n tokenRef.current = token;\n }, [token]);\n\n // Called by ChatAPI on 401: run host refresh, update ref, return new token for retry.\n const handleAuthError = useCallback(async (): Promise<string | null> => {\n if (!onTokenRefresh) return null;\n const newToken = await onTokenRefresh();\n if (newToken) tokenRef.current = newToken;\n return newToken;\n }, [onTokenRefresh]);\n\n // api is stable as long as apiUrl doesn't change — token updates via ref.\n const api = useMemo(\n () => new ChatAPI(apiUrl.replace(/\\/$/, \"\"), () => tokenRef.current, handleAuthError),\n [apiUrl, handleAuthError],\n );\n\n const mergedTheme = useMemo(() => ({ ...defaultTheme, ...theme }), [theme]);\n\n const styleTag = useMemo(() => {\n const t = mergedTheme;\n return `[data-chat-root] {\n --chat-primary: ${t.primary};\n --chat-bubble-sent: ${t.bubbleSent};\n --chat-bubble-received: ${t.bubbleReceived};\n --chat-text-on-sent: ${t.textOnSent};\n --chat-text-on-received: ${t.textOnReceived};\n --chat-radius: ${t.radius};\n --chat-font-family: ${t.fontFamily};\n --chat-surface: ${t.surface};\n --chat-border: ${t.border};\n --chat-muted-fill: ${t.mutedFill};\n ${t.composerShadow ? `--chat-composer-shadow: ${t.composerShadow};` : \"\"}\n }`;\n }, [mergedTheme]);\n\n const [natsConnected, setNatsConnected] = useState(false);\n const natsUrl = natsWsUrl?.trim() ?? \"\";\n const wsConnected = Boolean(natsUrl) && natsConnected;\n\n const natsTenantId = useMemo(() => {\n const c = conduitlyTenantId?.trim();\n if (c) return c;\n if (process.env.NODE_ENV === \"development\" && natsUrl) {\n console.warn(\n \"[NATS] Missing conduitly_tenant_id — subjects will not match Conduitly. Set `conduitly_tenant_id` in public/dev.json or NEXT_PUBLIC_CONDUITLY_TENANT_ID (e.g. hdmme-20261703).\",\n );\n }\n return tenantId.trim();\n }, [conduitlyTenantId, tenantId, natsUrl]);\n const typingByConversation = useMemo(() => ({} as Record<string, string[]>), []);\n\n const sendTyping = useCallback((_conversationId: string) => {}, []);\n const sendTypingStop = useCallback((_conversationId: string) => {}, []);\n const sendRead = useCallback((_conversationId: string, _messageId: string) => {}, []);\n\n const config: ChatConfig = useMemo(\n () => ({\n apiUrl: apiUrl.replace(/\\/$/, \"\"),\n token,\n userId,\n tenantId,\n pollIntervalMs,\n callEnabled: Boolean(callEnabled),\n }),\n [apiUrl, token, userId, tenantId, pollIntervalMs, callEnabled],\n );\n\n const value: ChatContextValue = useMemo(\n () => ({\n api,\n config,\n theme: mergedTheme,\n queryClient,\n userId,\n tenantId,\n natsTenantId,\n wsConnected,\n sendTyping,\n sendTypingStop,\n sendRead,\n typingByConversation,\n }),\n [\n api,\n config,\n mergedTheme,\n queryClient,\n userId,\n tenantId,\n natsTenantId,\n wsConnected,\n sendTyping,\n sendTypingStop,\n sendRead,\n typingByConversation,\n ],\n );\n\n const layoutStyle: CSSProperties = {\n flex: 1,\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n };\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChatContext.Provider value={value}>\n <div style={layoutStyle}>\n {natsUrl ? (\n <ChatNatsBridge natsWsUrl={natsUrl} natsToken={natsToken} onConnectedChange={setNatsConnected} />\n ) : null}\n <style dangerouslySetInnerHTML={{ __html: styleTag }} />\n <div data-chat-root style={{ ...layoutStyle, flex: 1 }}>\n {children}\n </div>\n </div>\n </ChatContext.Provider>\n </QueryClientProvider>\n );\n}\n","\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback } from \"react\";\nimport type { Conversation } from \"../types\";\nimport { chatKeys } from \"../lib/queryKeys\";\nimport { useChat } from \"../provider/ChatContext\";\n\n/** Orchestrated mutations + cache invalidation for host UIs and internal widgets. */\nexport function useChatActions() {\n const { api } = useChat();\n const queryClient = useQueryClient();\n\n const openOrCreateDirect = useCallback(\n async (peerUserId: string): Promise<Conversation> => {\n const c = await api.findOrCreateDirect(peerUserId);\n await queryClient.invalidateQueries({ queryKey: chatKeys.conversations() });\n await queryClient.invalidateQueries({ queryKey: chatKeys.messages(c.id) });\n return c;\n },\n [api, queryClient],\n );\n\n const createGroup = useCallback(\n async (title: string, members: string[]): Promise<Conversation> => {\n const c = await api.createGroup(title, members);\n await queryClient.invalidateQueries({ queryKey: chatKeys.conversations() });\n await queryClient.invalidateQueries({ queryKey: chatKeys.messages(c.id) });\n return c;\n },\n [api, queryClient],\n );\n\n const findOrCreateEntity = useCallback(\n async (input: {\n title: string;\n entity_ref: string;\n entity_uuid: string;\n members?: string[];\n }): Promise<Conversation> => {\n const c = await api.findOrCreateEntity(input);\n await queryClient.invalidateQueries({ queryKey: chatKeys.conversations() });\n await queryClient.invalidateQueries({ queryKey: chatKeys.messages(c.id) });\n return c;\n },\n [api, queryClient],\n );\n\n const invalidateConversations = useCallback(() => {\n return queryClient.invalidateQueries({ queryKey: chatKeys.conversations() });\n }, [queryClient]);\n\n const invalidateMessages = useCallback(\n (conversationId: string) => {\n return queryClient.invalidateQueries({ queryKey: chatKeys.messages(conversationId) });\n },\n [queryClient],\n );\n\n const invalidateMembers = useCallback(\n (conversationId: string) => {\n return queryClient.invalidateQueries({ queryKey: chatKeys.members(conversationId) });\n },\n [queryClient],\n );\n\n const invalidateAllChat = useCallback(() => {\n return queryClient.invalidateQueries({ queryKey: chatKeys.all });\n }, [queryClient]);\n\n return {\n api,\n openOrCreateDirect,\n createGroup,\n findOrCreateEntity,\n invalidateConversations,\n invalidateMessages,\n invalidateMembers,\n invalidateAllChat,\n };\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useChat } from \"../provider/ChatContext\";\nimport { chatKeys } from \"../lib/queryKeys\";\n\nexport function useConversationMembers(conversationId: string | null) {\n const { api } = useChat();\n return useQuery({\n queryKey: conversationId ? chatKeys.members(conversationId) : [\"chat\", \"members\", \"none\"],\n queryFn: () => api.listConversationMembers(conversationId!),\n enabled: !!conversationId,\n staleTime: 60_000,\n });\n}\n","import type { Message } from \"../types\";\n\nexport type MessagePage = { items: Message[]; next_cursor: string };\n\n/**\n * REST is authoritative; merge in any client-only rows (WS-delivered before fetch,\n * or optimistic local-* ids) and dedupe by message id. Newest-first order.\n */\nexport function mergeMessagePages(server: MessagePage, prev: MessagePage | undefined): MessagePage {\n if (!prev?.items.length) return server;\n const serverIds = new Set(server.items.map((m) => m.id));\n // Keep local-only rows (optimistic / WS-early) that the server page doesn't cover.\n const extras = prev.items.filter((m) => !serverIds.has(m.id));\n const merged = [...server.items, ...extras];\n merged.sort(\n (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),\n );\n const seen = new Set<string>();\n const items: Message[] = [];\n for (const m of merged) {\n if (seen.has(m.id)) continue;\n seen.add(m.id);\n items.push(m);\n }\n return { items, next_cursor: server.next_cursor };\n}\n\n/**\n * Append a page of older messages fetched via cursor to the current in-memory page.\n * `current` is newest-first; older items go at the end. Deduplicates by id.\n * The resulting `next_cursor` comes from the older page (points even further back).\n */\nexport function appendOlderMessages(current: MessagePage, older: MessagePage): MessagePage {\n const currentIds = new Set(current.items.map((m) => m.id));\n const dedupedOlder = older.items.filter((m) => !currentIds.has(m.id));\n return {\n items: [...current.items, ...dedupedOlder],\n next_cursor: older.next_cursor,\n };\n}\n","\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { chatKeys } from \"../lib/queryKeys\";\nimport { useChat } from \"../provider/ChatContext\";\nimport { appendOlderMessages, mergeMessagePages } from \"../lib/reconcile\";\nimport type { MessagePage } from \"../lib/reconcile\";\n\n/** First page size for `GET /conversations/:id/messages` (newest first). Older pages use `next_cursor`. */\nexport const INITIAL_MESSAGE_PAGE_SIZE = 30;\n\nexport function useMessages(conversationId: string | null) {\n const { api, wsConnected, config, queryClient } = useChat();\n const interval = config.pollIntervalMs ?? 30_000;\n const [isFetchingOlder, setIsFetchingOlder] = useState(false);\n // Stable ref so fetchOlderMessages closure never goes stale.\n const fetchingRef = useRef(false);\n\n const query = useQuery({\n queryKey: chatKeys.messages(conversationId),\n queryFn: async () => {\n const res = await api.listMessages(conversationId!, undefined, INITIAL_MESSAGE_PAGE_SIZE);\n const prev = queryClient.getQueryData<MessagePage>(chatKeys.messages(conversationId));\n return mergeMessagePages(res, prev);\n },\n enabled: !!conversationId,\n refetchInterval: wsConnected ? false : interval,\n });\n\n const fetchOlderMessages = useCallback(async () => {\n if (!conversationId || fetchingRef.current) return;\n const current = queryClient.getQueryData<MessagePage>(chatKeys.messages(conversationId));\n // next_cursor is empty string when there are no more pages.\n if (!current?.next_cursor) return;\n\n fetchingRef.current = true;\n setIsFetchingOlder(true);\n try {\n const older = await api.listMessages(conversationId, current.next_cursor, INITIAL_MESSAGE_PAGE_SIZE);\n queryClient.setQueryData<MessagePage>(chatKeys.messages(conversationId), (prev) => {\n if (!prev) return older;\n return appendOlderMessages(prev, older);\n });\n } finally {\n fetchingRef.current = false;\n setIsFetchingOlder(false);\n }\n }, [conversationId, queryClient, api]);\n\n const cached = queryClient.getQueryData<MessagePage>(chatKeys.messages(conversationId));\n const hasMoreMessages = !!cached?.next_cursor;\n\n return {\n ...query,\n fetchOlderMessages,\n isFetchingOlder,\n hasMoreMessages,\n };\n}\n","\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { chatKeys } from \"../lib/queryKeys\";\nimport type { EntityConversationContext } from \"../types\";\nimport { useChat } from \"../provider/ChatContext\";\nimport { useChatActions } from \"./useChatActions\";\nimport { useConversationMembers } from \"./useConversationMembers\";\nimport { useConversations } from \"./useConversations\";\nimport { useMessages } from \"./useMessages\";\n\nexport type ChatPanelProps = {\n conversationId?: string;\n peerUserId?: string;\n entityContext?: EntityConversationContext;\n showNewChat?: boolean;\n onConversationChange?: (conversationId: string | null) => void;\n};\n\nexport function useChatPanelController({\n conversationId: initialId,\n peerUserId,\n entityContext,\n showNewChat = true,\n onConversationChange,\n}: ChatPanelProps) {\n const { openOrCreateDirect, findOrCreateEntity } = useChatActions();\n const { typingByConversation } = useChat();\n const queryClient = useQueryClient();\n const [selectedId, setSelectedId] = useState<string | null>(initialId ?? null);\n const [newChatOpen, setNewChatOpen] = useState(false);\n\n const setSelected = useCallback(\n (id: string | null) => {\n setSelectedId(id);\n onConversationChange?.(id);\n },\n [onConversationChange],\n );\n\n const refreshFromServer = useCallback(() => {\n void queryClient.invalidateQueries({ queryKey: chatKeys.conversations() });\n if (selectedId) void queryClient.invalidateQueries({ queryKey: chatKeys.messages(selectedId) });\n }, [queryClient, selectedId]);\n\n useEffect(() => {\n if (!peerUserId) return;\n void openOrCreateDirect(peerUserId)\n .then((c) => setSelected(c.id))\n .catch(console.error);\n }, [peerUserId, openOrCreateDirect]);\n\n useEffect(() => {\n if (!entityContext) return;\n void findOrCreateEntity({\n entity_ref: entityContext.entity_ref,\n entity_uuid: entityContext.entity_uuid,\n title: entityContext.title ?? entityContext.entity_ref,\n members: entityContext.members,\n })\n .then((c) => setSelected(c.id))\n .catch(console.error);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [entityContext?.entity_ref, entityContext?.entity_uuid]);\n\n useEffect(() => {\n if (initialId !== undefined) setSelectedId(initialId);\n }, [initialId]);\n\n const { data: convData } = useConversations();\n const {\n data: msgData,\n isLoading: loadMsg,\n fetchOlderMessages,\n isFetchingOlder,\n hasMoreMessages,\n } = useMessages(selectedId);\n\n const { data: membersForSelected = [] } = useConversationMembers(selectedId);\n const membersById = useMemo(\n () => Object.fromEntries(membersForSelected.map((m) => [m.id, m])),\n [membersForSelected],\n );\n const typingNames = useMemo(() => {\n if (!selectedId) return [];\n const ids = typingByConversation[selectedId] ?? [];\n return ids.map((id) => membersById[id]?.display_name ?? \"Someone\");\n }, [selectedId, typingByConversation, membersById]);\n\n return {\n selectedId,\n setSelected,\n newChatOpen,\n setNewChatOpen,\n refreshFromServer,\n convItems: convData?.items ?? [],\n messages: msgData?.items ?? [],\n loadMsg,\n fetchOlderMessages,\n isFetchingOlder,\n hasMoreMessages,\n typingNames,\n showNewChat,\n membersForSelected,\n };\n}\n","import \"G:\\prdg-chat\\web\\src\\chat\\components\\chat.module.css\"; export default {\"list\":\"chat__list\",\"row\":\"chat__row\",\"rowActive\":\"chat__rowActive\",\"thread\":\"chat__thread\",\"threadFlex\":\"chat__threadFlex\",\"bubbleRow\":\"chat__bubbleRow\",\"bubbleRowOwn\":\"chat__bubbleRowOwn\",\"bubbleRowOther\":\"chat__bubbleRowOther\",\"bubble\":\"chat__bubble\",\"bubbleOwn\":\"chat__bubbleOwn\",\"bubbleOther\":\"chat__bubbleOther\",\"meta\":\"chat__meta\",\"bubbleRowCompact\":\"chat__bubbleRowCompact\",\"olderSentinel\":\"chat__olderSentinel\",\"olderHint\":\"chat__olderHint\",\"olderSpinner\":\"chat__olderSpinner\",\"olderDot\":\"chat__olderDot\",\"chatBounce\":\"chat__chatBounce\",\"bubbleRowAnimateIn\":\"chat__bubbleRowAnimateIn\",\"msgFadeSlideIn\":\"chat__msgFadeSlideIn\",\"bubbleFailed\":\"chat__bubbleFailed\",\"statusSending\":\"chat__statusSending\",\"statusSpinner\":\"chat__statusSpinner\",\"chatSpin\":\"chat__chatSpin\",\"statusFailed\":\"chat__statusFailed\",\"inputRow\":\"chat__inputRow\",\"composer\":\"chat__composer\",\"toolBtn\":\"chat__toolBtn\",\"toolBtnRecording\":\"chat__toolBtnRecording\",\"composerDivider\":\"chat__composerDivider\",\"textareaGrow\":\"chat__textareaGrow\",\"textareaMirror\":\"chat__textareaMirror\",\"textarea\":\"chat__textarea\",\"sendBtn\":\"chat__sendBtn\",\"sendBtnIcon\":\"chat__sendBtnIcon\",\"iconBtn\":\"chat__iconBtn\",\"mediaThumb\":\"chat__mediaThumb\",\"imageWrap\":\"chat__imageWrap\",\"imageBtn\":\"chat__imageBtn\",\"imageSkeletonFill\":\"chat__imageSkeletonFill\",\"skeletonShimmer\":\"chat__skeletonShimmer\",\"imageSkeletonOverlay\":\"chat__imageSkeletonOverlay\",\"videoWrap\":\"chat__videoWrap\",\"videoPoster\":\"chat__videoPoster\",\"playOverlay\":\"chat__playOverlay\",\"voiceWrap\":\"chat__voiceWrap\",\"voiceBar\":\"chat__voiceBar\",\"fileChip\":\"chat__fileChip\",\"widgetFab\":\"chat__widgetFab\",\"fabBr\":\"chat__fabBr\",\"fabBl\":\"chat__fabBl\",\"widgetPanel\":\"chat__widgetPanel\",\"panelBr\":\"chat__panelBr\",\"panelBl\":\"chat__panelBl\",\"widgetHeader\":\"chat__widgetHeader\",\"widgetBody\":\"chat__widgetBody\",\"chatPanelInner\":\"chat__chatPanelInner\",\"panelToolbar\":\"chat__panelToolbar\",\"refreshBtn\":\"chat__refreshBtn\",\"chatPanelThread\":\"chat__chatPanelThread\",\"typing\":\"chat__typing\",\"typingIndicator\":\"chat__typingIndicator\",\"typingDots\":\"chat__typingDots\",\"bubbleDeleted\":\"chat__bubbleDeleted\",\"editedLabel\":\"chat__editedLabel\",\"modalBackdrop\":\"chat__modalBackdrop\",\"modalCard\":\"chat__modalCard\",\"modalHeader\":\"chat__modalHeader\",\"modalTitle\":\"chat__modalTitle\",\"modalClose\":\"chat__modalClose\",\"modalBody\":\"chat__modalBody\",\"modalPanel\":\"chat__modalPanel\",\"segmentWrap\":\"chat__segmentWrap\",\"segment\":\"chat__segment\",\"segmentActive\":\"chat__segmentActive\",\"modalLabel\":\"chat__modalLabel\",\"modalSearch\":\"chat__modalSearch\",\"modalList\":\"chat__modalList\",\"modalRow\":\"chat__modalRow\",\"modalRowHoriz\":\"chat__modalRowHoriz\",\"modalRowHorizSelected\":\"chat__modalRowHorizSelected\",\"modalRowInner\":\"chat__modalRowInner\",\"modalAvatar\":\"chat__modalAvatar\",\"modalCheckbox\":\"chat__modalCheckbox\",\"modalCheckboxOn\":\"chat__modalCheckboxOn\",\"modalName\":\"chat__modalName\",\"modalMeta\":\"chat__modalMeta\",\"modalEmpty\":\"chat__modalEmpty\",\"modalError\":\"chat__modalError\",\"modalPrimary\":\"chat__modalPrimary\",\"chipRow\":\"chat__chipRow\",\"chip\":\"chat__chip\",\"chipRemove\":\"chat__chipRemove\",\"inputWrap\":\"chat__inputWrap\",\"mentionPopover\":\"chat__mentionPopover\",\"mentionRow\":\"chat__mentionRow\",\"mentionRowActive\":\"chat__mentionRowActive\",\"panelToolbarInner\":\"chat__panelToolbarInner\"}","\"use client\";\n\nimport type { Conversation } from \"../types\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n items: Conversation[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n};\n\nexport function ConversationList({ items, selectedId, onSelect }: Props) {\n return (\n <div className={styles.list}>\n {items.map((c) => (\n <button\n key={c.id}\n type=\"button\"\n className={`${styles.row} ${selectedId === c.id ? styles.rowActive : \"\"}`}\n onClick={() => onSelect(c.id)}\n >\n {c.title || (c.kind === \"direct\" ? \"Direct\" : \"Chat\")}\n </button>\n ))}\n {items.length === 0 ? <div className={styles.typing}>No conversations yet.</div> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useChat } from \"../provider/ChatContext\";\n\nexport type UploadedPart = {\n storage_key: string;\n mime_type: string;\n byte_size: number;\n original_filename?: string;\n width?: number;\n height?: number;\n duration_seconds?: number;\n thumbnail_storage_key?: string;\n};\n\nexport function useUpload() {\n const { api } = useChat();\n\n const uploadFile = useCallback(\n async (file: File, meta?: Partial<UploadedPart>): Promise<UploadedPart> => {\n const ct = file.type || \"application/octet-stream\";\n const presign = await api.presignPut(file.name || \"file\", ct);\n const res = await fetch(presign.upload_url, {\n method: \"PUT\",\n body: file,\n headers: { \"Content-Type\": ct },\n });\n if (!res.ok) throw new Error(`upload failed: ${res.status}`);\n return {\n storage_key: presign.key,\n mime_type: ct,\n byte_size: file.size,\n original_filename: file.name,\n ...meta,\n };\n },\n [api],\n );\n\n return { uploadFile };\n}\n","\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport function useVoiceRecorder() {\n const [recording, setRecording] = useState(false);\n const mediaRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<BlobPart[]>([]);\n\n const start = useCallback(async () => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mime = MediaRecorder.isTypeSupported(\"audio/webm;codecs=opus\")\n ? \"audio/webm;codecs=opus\"\n : \"audio/webm\";\n const rec = new MediaRecorder(stream, { mimeType: mime });\n chunksRef.current = [];\n rec.ondataavailable = (e) => {\n if (e.data.size) chunksRef.current.push(e.data);\n };\n rec.start(100);\n mediaRef.current = rec;\n setRecording(true);\n }, []);\n\n const stop = useCallback(async (): Promise<{ blob: Blob; mimeType: string } | null> => {\n const rec = mediaRef.current;\n if (!rec) return null;\n return new Promise((resolve) => {\n rec.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: rec.mimeType });\n rec.stream.getTracks().forEach((t) => t.stop());\n mediaRef.current = null;\n setRecording(false);\n resolve({ blob, mimeType: rec.mimeType });\n };\n rec.stop();\n });\n }, []);\n\n return { recording, start, stop };\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useChat } from \"../provider/ChatContext\";\n\n/**\n * Module-level cache: storage_key → presigned URL (or a local object URL during upload).\n * Survives re-renders and component remounts within a browser session.\n * Avoids re-fetching the same key when an attachment component is unmounted\n * and remounted (e.g. during the optimistic → confirmed message swap).\n */\nconst urlCache = new Map<string, string>();\n\n/**\n * Pre-populate the cache with a local object URL before the optimistic message is shown.\n * Call this with `URL.createObjectURL(file)` right after the S3 upload so the image\n * renders from the local blob instead of waiting for a presign round-trip.\n */\nexport function primePresignedUrl(storageKey: string, url: string): void {\n if (!urlCache.has(storageKey)) {\n urlCache.set(storageKey, url);\n }\n}\n\nexport function usePresignedUrl(storageKey: string | undefined | null) {\n const { api } = useChat();\n const [url, setUrl] = useState<string | null>(() => {\n return storageKey ? (urlCache.get(storageKey) ?? null) : null;\n });\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!storageKey) {\n setUrl(null);\n return;\n }\n const cached = urlCache.get(storageKey);\n if (cached) {\n setUrl(cached);\n return;\n }\n let cancelled = false;\n setError(null);\n api\n .presignGet(storageKey)\n .then((r) => {\n if (!cancelled) {\n urlCache.set(storageKey, r.url);\n setUrl(r.url);\n }\n })\n .catch((e) => {\n if (!cancelled) setError(e instanceof Error ? e : new Error(String(e)));\n });\n return () => {\n cancelled = true;\n };\n }, [storageKey, api]);\n\n return { url, error };\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { AppUser } from \"../lib/api\";\nimport type { MessagePage } from \"../lib/reconcile\";\nimport { chatKeys } from \"../lib/queryKeys\";\nimport { useChat } from \"../provider/ChatContext\";\nimport { useConversationMembers } from \"../hooks/useConversationMembers\";\nimport { useUpload } from \"../hooks/useUpload\";\nimport { useVoiceRecorder } from \"../hooks/useVoiceRecorder\";\nimport { primePresignedUrl } from \"../hooks/usePresignedUrl\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n conversationId: string;\n};\n\nfunction escapeReg(s: string) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function MessageInput({ conversationId }: Props) {\n const { api, sendTyping, sendTypingStop, userId } = useChat();\n const qc = useQueryClient();\n const { uploadFile } = useUpload();\n const { recording, start, stop } = useVoiceRecorder();\n const [text, setText] = useState(\"\");\n const fileRef = useRef<HTMLInputElement>(null);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const { data: members = [] } = useConversationMembers(conversationId);\n\n /** User ids that were inserted via @ picker (this compose session). */\n const mentionPickIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n setText(\"\");\n mentionPickIdsRef.current.clear();\n setMentionOpen(false);\n }, [conversationId]);\n\n /** Throttle typing.start to once per 2 s to avoid spamming Conduitly. */\n const lastTypingSentRef = useRef(0);\n\n const [mentionOpen, setMentionOpen] = useState(false);\n const [mentionFilter, setMentionFilter] = useState(\"\");\n const [mentionIndex, setMentionIndex] = useState(0);\n const [atCaret, setAtCaret] = useState<number | null>(null);\n\n const filteredMembers = useMemo(() => {\n const t = mentionFilter.toLowerCase();\n if (!t) return members;\n return members.filter(\n (m) =>\n m.display_name.toLowerCase().includes(t) ||\n m.id.toLowerCase().includes(t),\n );\n }, [members, mentionFilter]);\n\n const syncMentionUi = useCallback(\n (value: string, caret: number) => {\n const before = value.slice(0, caret);\n const at = before.lastIndexOf(\"@\");\n if (at < 0) {\n setMentionOpen(false);\n setAtCaret(null);\n return;\n }\n const afterAt = before.slice(at + 1);\n if (/\\s/.test(afterAt)) {\n setMentionOpen(false);\n setAtCaret(null);\n return;\n }\n setMentionOpen(true);\n setAtCaret(at);\n setMentionFilter(afterAt);\n setMentionIndex(0);\n },\n [],\n );\n\n const onTextChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value;\n setText(v);\n syncMentionUi(v, e.target.selectionStart ?? v.length);\n if (v.trim()) {\n const now = Date.now();\n if (now - lastTypingSentRef.current > 2_000) {\n sendTyping(conversationId);\n lastTypingSentRef.current = now;\n }\n }\n },\n [syncMentionUi, sendTyping, conversationId],\n );\n\n /** Mirror ref — a hidden <span> inside .textareaGrow that makes the wrapper grow with content. */\n const mirrorRef = useRef<HTMLSpanElement>(null);\n\n const onSelectMention = useCallback(\n (u: AppUser) => {\n setMentionOpen(false);\n const ta = taRef.current;\n if (atCaret == null || !ta) return;\n const caret = ta.selectionStart ?? text.length;\n const before = text.slice(0, atCaret);\n const after = text.slice(caret);\n const insert = `@${u.display_name} `;\n const next = before + insert + after;\n mentionPickIdsRef.current.add(u.id);\n setText(next);\n setAtCaret(null);\n requestAnimationFrame(() => {\n const pos = before.length + insert.length;\n ta.focus();\n ta.setSelectionRange(pos, pos);\n });\n },\n [atCaret, text],\n );\n\n type SendPayload = {\n body?: string | null;\n mentioned_user_ids?: string[];\n attachments?: Array<{\n storage_key: string;\n mime_type: string;\n byte_size: number;\n original_filename?: string | null;\n width?: number | null;\n height?: number | null;\n duration_seconds?: number | null;\n thumbnail_storage_key?: string | null;\n }>;\n };\n\n const buildMentionIds = useCallback(\n (body: string): string[] => {\n const ids = [...mentionPickIdsRef.current];\n const out: string[] = [];\n for (const id of ids) {\n const m = members.find((x) => x.id === id);\n if (!m) continue;\n const pat = new RegExp(`@${escapeReg(m.display_name)}(\\\\s|$)`);\n if (pat.test(body)) out.push(id);\n }\n return [...new Set(out)];\n },\n [members],\n );\n\n const mutation = useMutation({\n mutationFn: async (payload: SendPayload) => {\n return api.sendMessage(conversationId, payload);\n },\n onMutate: async (payload) => {\n // Fire-and-forget — don't block the optimistic insert on query cancellation.\n void qc.cancelQueries({ queryKey: chatKeys.messages(conversationId) });\n // Clear the composer immediately so the user can type the next message right away.\n setText(\"\");\n mentionPickIdsRef.current.clear();\n setMentionOpen(false);\n const optimisticId = `local-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n qc.setQueryData<MessagePage>(chatKeys.messages(conversationId), (old) => {\n const optimistic = {\n id: optimisticId,\n conversation_id: conversationId,\n sender_id: userId,\n body: payload.body ?? null,\n created_at: new Date().toISOString(),\n attachments: payload.attachments?.map((a, i) => ({ ...a, id: `opt-att-${i}` })) ?? [],\n _status: \"sending\" as const,\n };\n if (!old) return { items: [optimistic], next_cursor: \"\" };\n return { ...old, items: [optimistic, ...old.items] };\n });\n return { optimisticId };\n },\n onError: (_err, payload, context) => {\n // Restore the text so the user can retry without retyping.\n if (typeof payload.body === \"string\" && payload.body) {\n setText((prev) => (prev ? prev : payload.body!));\n }\n if (!context?.optimisticId) return;\n qc.setQueryData<MessagePage>(chatKeys.messages(conversationId), (old) => {\n if (!old) return old;\n return {\n ...old,\n items: old.items.map((m) =>\n m.id === context.optimisticId ? { ...m, _status: \"failed\" as const } : m,\n ),\n };\n });\n },\n onSuccess: (confirmedMessage, _payload, context) => {\n // Single atomic in-place swap: optimistic placeholder → confirmed server message.\n // No remove-then-refetch — that two-step causes the flash.\n qc.setQueryData<MessagePage>(chatKeys.messages(conversationId), (old) => {\n if (!old) return old;\n const optimisticIdx = old.items.findIndex((m) => m.id === context?.optimisticId);\n if (optimisticIdx !== -1) {\n // Replace at the exact same position — no reorder, no gap, no duplicate.\n const next = [...old.items];\n next[optimisticIdx] = confirmedMessage;\n return { ...old, items: next };\n }\n // NATS already brought in the real message before onSuccess fired.\n // Ensure no duplicate and drop the now-stale optimistic item (if still lingering).\n const hasReal = old.items.some((m) => m.id === confirmedMessage.id);\n const cleaned = old.items.filter((m) => m.id !== context?.optimisticId);\n if (hasReal) return { ...old, items: cleaned };\n return { ...old, items: [confirmedMessage, ...cleaned] };\n });\n // Refresh sidebar (unread counts / last-message preview) but NOT the thread —\n // the cache already has the authoritative message from the swap above.\n void qc.invalidateQueries({ queryKey: chatKeys.conversations() });\n },\n });\n\n const onSend = useCallback(() => {\n const t = text.trim();\n if (!t) return;\n const mids = buildMentionIds(text);\n mutation.mutate({\n body: t || null,\n ...(mids.length > 0 ? { mentioned_user_ids: mids } : {}),\n });\n sendTypingStop(conversationId);\n lastTypingSentRef.current = 0;\n }, [text, mutation, buildMentionIds, sendTypingStop, conversationId]);\n\n const onBlur = useCallback(() => {\n if (text.trim()) {\n sendTypingStop(conversationId);\n lastTypingSentRef.current = 0;\n }\n }, [text, sendTypingStop, conversationId]);\n\n const onFiles = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files?.length) return;\n const attachments: NonNullable<SendPayload[\"attachments\"]> = [];\n for (const f of Array.from(files)) {\n const objectUrl = URL.createObjectURL(f);\n const meta = await uploadFile(f);\n // Pre-populate presign cache with the local blob URL so the optimistic\n // message renders the image/file instantly without a presign round-trip.\n primePresignedUrl(meta.storage_key, objectUrl);\n let duration_seconds: number | undefined;\n if (f.type.startsWith(\"audio/\")) {\n const dur = await readAudioDuration(f);\n if (dur != null) duration_seconds = dur;\n }\n attachments.push({\n storage_key: meta.storage_key,\n mime_type: meta.mime_type,\n byte_size: meta.byte_size,\n original_filename: meta.original_filename,\n duration_seconds,\n });\n }\n mutation.mutate({ body: null, attachments });\n e.target.value = \"\";\n },\n [mutation, uploadFile],\n );\n\n const onVoiceStop = useCallback(async () => {\n const res = await stop();\n if (!res) return;\n const file = new File([res.blob], \"voice.webm\", { type: res.mimeType });\n const objectUrl = URL.createObjectURL(file);\n const dur = await readAudioDuration(file);\n const meta = await uploadFile(file, { duration_seconds: dur ?? undefined });\n primePresignedUrl(meta.storage_key, objectUrl);\n mutation.mutate({\n body: null,\n attachments: [\n {\n storage_key: meta.storage_key,\n mime_type: meta.mime_type,\n byte_size: meta.byte_size,\n duration_seconds: meta.duration_seconds ?? dur ?? undefined,\n },\n ],\n });\n }, [stop, uploadFile, mutation]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (mentionOpen && filteredMembers.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setMentionIndex((i) => (i + 1) % filteredMembers.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setMentionIndex((i) => (i - 1 + filteredMembers.length) % filteredMembers.length);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setMentionOpen(false);\n return;\n }\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n if (mentionOpen && filteredMembers.length > 0) {\n e.preventDefault();\n onSelectMention(filteredMembers[mentionIndex]);\n return;\n }\n e.preventDefault();\n onSend();\n }\n },\n [mentionOpen, filteredMembers, mentionIndex, onSelectMention, onSend],\n );\n\n return (\n <div className={styles.composer}>\n <input ref={fileRef} type=\"file\" multiple hidden accept=\"image/*,video/*,audio/*\" onChange={onFiles} />\n <button type=\"button\" className={styles.toolBtn} onClick={() => fileRef.current?.click()} aria-label=\"Attach file\">\n <IconPlus aria-hidden />\n </button>\n <button\n type=\"button\"\n className={`${styles.toolBtn} ${recording ? styles.toolBtnRecording : \"\"}`}\n onClick={() => (recording ? onVoiceStop() : start())}\n aria-label={recording ? \"Stop and send recording\" : \"Record voice message\"}\n >\n {recording ? <IconStop aria-hidden /> : <IconMic aria-hidden />}\n </button>\n <div className={styles.composerDivider} aria-hidden />\n <div className={styles.inputWrap}>\n {mentionOpen && filteredMembers.length > 0 ? (\n <div className={styles.mentionPopover}>\n {filteredMembers.map((u, i) => (\n <button\n key={u.id}\n type=\"button\"\n className={`${styles.mentionRow} ${i === mentionIndex ? styles.mentionRowActive : \"\"}`}\n onMouseDown={(ev) => {\n ev.preventDefault();\n onSelectMention(u);\n }}\n >\n {u.display_name}\n </button>\n ))}\n </div>\n ) : null}\n {/* textareaGrow: CSS grid trick — the hidden mirror span grows to content size,\n the textarea overlays it in grid-area 1/1. No JS height measurement needed. */}\n <div className={styles.textareaGrow}>\n {/* Mirror: invisible replica that drives the container height */}\n <span ref={mirrorRef} className={styles.textareaMirror} aria-hidden>\n {text || \"Type a message…\"}{\"\\u200B\"}\n </span>\n <textarea\n ref={taRef}\n className={styles.textarea}\n rows={1}\n value={text}\n onChange={onTextChange}\n onBlur={onBlur}\n onSelect={(e) => syncMentionUi(e.currentTarget.value, e.currentTarget.selectionStart ?? 0)}\n onKeyDown={onKeyDown}\n placeholder=\"Type a message…\"\n />\n </div>\n </div>\n <button\n type=\"button\"\n className={styles.sendBtn}\n onClick={onSend}\n disabled={!text.trim()}\n aria-label=\"Send message\"\n title=\"Send\"\n >\n <span className={styles.sendBtnIcon} aria-hidden>\n <IconSend />\n </span>\n </button>\n </div>\n );\n}\n\nfunction IconPlus({ \"aria-hidden\": ah }: { \"aria-hidden\"?: boolean }) {\n return (\n <svg width={18} height={18} viewBox=\"0 0 24 24\" aria-hidden={ah} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nfunction IconMic({ \"aria-hidden\": ah }: { \"aria-hidden\"?: boolean }) {\n return (\n <svg width={18} height={18} viewBox=\"0 0 24 24\" aria-hidden={ah} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 14a3 3 0 0 0 3-3V5a3 3 0 0 0-6 0v6a3 3 0 0 0 3 3z\" />\n <path d=\"M19 10v1a7 7 0 0 1-14 0v-1M12 18v4M8 22h8\" />\n </svg>\n );\n}\n\nfunction IconStop({ \"aria-hidden\": ah }: { \"aria-hidden\"?: boolean }) {\n return (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" aria-hidden={ah} fill=\"currentColor\">\n <rect x={7} y={7} width={10} height={10} rx={1.5} />\n </svg>\n );\n}\n\nfunction IconSend() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n );\n}\n\nfunction readAudioDuration(file: File): Promise<number | undefined> {\n return new Promise((resolve) => {\n const url = URL.createObjectURL(file);\n const a = document.createElement(\"audio\");\n a.preload = \"metadata\";\n a.src = url;\n a.onloadedmetadata = () => {\n const d = a.duration;\n URL.revokeObjectURL(url);\n resolve(Number.isFinite(d) ? d : undefined);\n };\n a.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(undefined);\n };\n });\n}\n","export function isImageMime(m: string): boolean {\n return m.startsWith(\"image/\");\n}\n\nexport function isVideoMime(m: string): boolean {\n return m.startsWith(\"video/\");\n}\n\nexport function isAudioMime(m: string): boolean {\n return m.startsWith(\"audio/\");\n}\n\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function formatDurationSeconds(sec: number): string {\n const s = Math.floor(sec % 60);\n const m = Math.floor(sec / 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport Lightbox from \"yet-another-react-lightbox\";\nimport \"yet-another-react-lightbox/styles.css\";\nimport { usePresignedUrl } from \"../hooks/usePresignedUrl\";\nimport styles from \"./chat.module.css\";\n\nexport function ImageMessage({ storageKey }: { storageKey: string }) {\n const { url } = usePresignedUrl(storageKey);\n const [open, setOpen] = useState(false);\n const [loaded, setLoaded] = useState(false);\n\n return (\n <>\n <div className={styles.imageWrap}>\n {!url ? (\n <div className={styles.imageSkeletonFill} aria-hidden />\n ) : (\n <>\n {!loaded && <div className={styles.imageSkeletonOverlay} aria-hidden />}\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className={styles.imageBtn}\n aria-label=\"View image\"\n title=\"Tap to view\"\n >\n <img\n src={url}\n alt=\"\"\n className={styles.mediaThumb}\n loading=\"lazy\"\n decoding=\"async\"\n onLoad={() => setLoaded(true)}\n />\n </button>\n </>\n )}\n </div>\n {url ? <Lightbox open={open} close={() => setOpen(false)} slides={[{ src: url }]} /> : null}\n </>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { usePresignedUrl } from \"../hooks/usePresignedUrl\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n storageKey: string;\n thumbnailKey?: string | null;\n};\n\nexport function VideoMessage({ storageKey, thumbnailKey }: Props) {\n const { url: videoUrl } = usePresignedUrl(storageKey);\n const { url: posterUrl } = usePresignedUrl(thumbnailKey || undefined);\n const [play, setPlay] = useState(false);\n\n if (!videoUrl) {\n return <div className={styles.videoWrap} aria-hidden />;\n }\n\n return (\n <div className={styles.videoWrap}>\n {play ? (\n <video src={videoUrl} controls playsInline />\n ) : (\n <>\n {posterUrl ? (\n <img src={posterUrl} alt=\"\" className={styles.videoPoster} />\n ) : (\n <video src={videoUrl} preload=\"metadata\" muted className={styles.videoPoster} />\n )}\n <button type=\"button\" className={styles.playOverlay} onClick={() => setPlay(true)} aria-label=\"Play video\">\n ▶\n </button>\n </>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport WaveSurfer from \"wavesurfer.js\";\nimport { formatDurationSeconds } from \"../lib/media\";\nimport { usePresignedUrl } from \"../hooks/usePresignedUrl\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n storageKey: string;\n durationSeconds?: number | null;\n isOwn: boolean;\n};\n\nexport function VoiceNotePlayer({ storageKey, durationSeconds, isOwn }: Props) {\n const { url } = usePresignedUrl(storageKey);\n const containerRef = useRef<HTMLDivElement>(null);\n const waveRef = useRef<WaveSurfer | null>(null);\n\n useEffect(() => {\n if (!url || !containerRef.current) return;\n const w = WaveSurfer.create({\n container: containerRef.current,\n height: 36,\n waveColor: isOwn ? \"rgba(255,255,255,0.45)\" : \"rgba(255,255,255,0.35)\",\n progressColor: isOwn ? \"#fff\" : \"var(--chat-primary)\",\n cursorWidth: 0,\n barWidth: 2,\n barGap: 1,\n });\n w.load(url);\n waveRef.current = w;\n return () => {\n w.destroy();\n waveRef.current = null;\n };\n }, [url, isOwn]);\n\n return (\n <div className={styles.voiceWrap}>\n <button\n type=\"button\"\n className={styles.iconBtn}\n style={{ marginBottom: 4 }}\n onClick={() => waveRef.current?.playPause()}\n aria-label=\"Play voice\"\n >\n ▶\n </button>\n <div ref={containerRef} className={styles.voiceBar} />\n {durationSeconds != null ? (\n <span className={styles.meta}>{formatDurationSeconds(Math.floor(durationSeconds))}</span>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { format, parseISO } from \"date-fns\";\nimport type { Message, MessageAttachment } from \"../types\";\nimport { isAudioMime, isImageMime, isVideoMime } from \"../lib/media\";\nimport { useChat } from \"../provider/ChatContext\";\nimport styles from \"./chat.module.css\";\nimport { ImageMessage } from \"./ImageMessage\";\nimport { VideoMessage } from \"./VideoMessage\";\nimport { VoiceNotePlayer } from \"./VoiceNotePlayer\";\n\ntype Props = {\n message: Message;\n compact?: boolean;\n /** Fade-in animation for messages that arrive from other senders via NATS. */\n animateIn?: boolean;\n};\n\nexport function MessageBubble({ message, compact, animateIn }: Props) {\n const { userId } = useChat();\n const own = message.sender_id === userId;\n const isDeleted = !!message.deleted_at;\n\n const timeStr = (() => {\n try {\n return format(parseISO(message.created_at), \"h:mm a\");\n } catch {\n return format(new Date(), \"h:mm a\");\n }\n })();\n\n if (isDeleted) {\n return (\n <div className={`${styles.bubbleRow} ${own ? styles.bubbleRowOwn : styles.bubbleRowOther}`}>\n <div className={`${styles.bubble} ${styles.bubbleDeleted}`}>\n <p style={{ margin: 0, fontStyle: \"italic\" }}>This message was deleted.</p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`${styles.bubbleRow} ${own ? styles.bubbleRowOwn : styles.bubbleRowOther} ${compact ? styles.bubbleRowCompact : \"\"} ${animateIn ? styles.bubbleRowAnimateIn : \"\"}`}\n >\n <div\n className={`${styles.bubble} ${own ? styles.bubbleOwn : styles.bubbleOther} ${message._status === \"failed\" ? styles.bubbleFailed : \"\"}`}\n >\n {message.body ? <p style={{ margin: 0 }}>{message.body}</p> : null}\n {message.attachments?.map((a) => (\n <div key={a.storage_key || a.id} style={{ marginTop: message.body ? 6 : 0 }}>\n <AttachmentBlock attachment={a} isOwn={own} />\n </div>\n ))}\n <div className={styles.meta}>\n {timeStr}\n {message.edited_at ? <span className={styles.editedLabel}> · edited</span> : null}\n {own && message._status === \"sending\" ? (\n <span className={styles.statusSending} aria-label=\"Sending\">\n <IconClock />\n </span>\n ) : null}\n {own && message._status === \"failed\" ? (\n <span className={styles.statusFailed} title=\"Failed to send\">\n !\n </span>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction IconClock() {\n return (\n <svg\n width={11}\n height={11}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n className={styles.statusSpinner}\n >\n <circle cx={12} cy={12} r={10} />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\nfunction AttachmentBlock({ attachment: a, isOwn }: { attachment: MessageAttachment; isOwn: boolean }) {\n if (isImageMime(a.mime_type)) {\n return <ImageMessage storageKey={a.storage_key} />;\n }\n if (isVideoMime(a.mime_type)) {\n return <VideoMessage storageKey={a.storage_key} thumbnailKey={a.thumbnail_storage_key} />;\n }\n if (isAudioMime(a.mime_type)) {\n return <VoiceNotePlayer storageKey={a.storage_key} durationSeconds={a.duration_seconds} isOwn={isOwn} />;\n }\n return (\n <span className={styles.fileChip}>\n {a.mime_type} · {a.byte_size} bytes\n </span>\n );\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect, useRef } from \"react\";\nimport type { Message } from \"../types\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n messages: Message[];\n /** Override default thread container (e.g. full-height flex child) */\n threadClassName?: string;\n fetchOlderMessages?: () => void;\n isFetchingOlder?: boolean;\n hasMoreMessages?: boolean;\n};\n\nexport function MessageThread({\n messages,\n threadClassName,\n fetchOlderMessages,\n isFetchingOlder,\n hasMoreMessages,\n}: Props) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const bottomRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const ordered = [...messages].reverse();\n\n // Track ids we've already rendered so only new incoming messages get the fade-in.\n const seenIdsRef = useRef<Set<string>>(new Set());\n\n // True until the first non-empty render — used to instant-jump vs smooth-scroll.\n const initializedRef = useRef(false);\n\n // Track previous message count so we know when genuinely new messages arrive.\n const prevCountRef = useRef(0);\n\n // Snapshot scrollHeight just before older messages are prepended.\n const prevScrollHeightRef = useRef<number>(0);\n\n // Save height when fetch starts.\n useEffect(() => {\n if (isFetchingOlder && scrollRef.current) {\n prevScrollHeightRef.current = scrollRef.current.scrollHeight;\n }\n }, [isFetchingOlder]);\n\n // Restore scroll position after older messages are prepended.\n useLayoutEffect(() => {\n const el = scrollRef.current;\n const prev = prevScrollHeightRef.current;\n if (!el || !prev || isFetchingOlder) return;\n const diff = el.scrollHeight - prev;\n if (diff > 0) {\n el.scrollTop += diff;\n prevScrollHeightRef.current = 0;\n }\n }, [messages.length, isFetchingOlder]);\n\n // Scroll management: instant jump on initial load, smooth only for live arrivals.\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el || messages.length === 0) return;\n\n const hasOptimistic = messages.some((m) => m._status === \"sending\");\n const isNewMessage = messages.length > prevCountRef.current;\n prevCountRef.current = messages.length;\n\n if (!initializedRef.current) {\n // First load: instant jump, no animation.\n el.scrollTop = el.scrollHeight;\n initializedRef.current = true;\n return;\n }\n\n if (hasOptimistic) {\n // User just sent — always scroll to bottom instantly.\n el.scrollTop = el.scrollHeight;\n return;\n }\n\n if (isNewMessage) {\n // Incoming message from someone else — smooth scroll only if near bottom.\n const distFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (distFromBottom < 160) {\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }\n }\n }, [messages.length, messages]);\n\n // IntersectionObserver on the top sentinel.\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel || !fetchOlderMessages) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && hasMoreMessages && !isFetchingOlder) {\n fetchOlderMessages();\n }\n },\n { root: scrollRef.current, rootMargin: \"120px 0px 0px 0px\", threshold: 0 },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [fetchOlderMessages, hasMoreMessages, isFetchingOlder]);\n\n // Reset on unmount/conversation switch so the next conversation starts fresh.\n useEffect(() => {\n return () => {\n initializedRef.current = false;\n prevCountRef.current = 0;\n seenIdsRef.current = new Set();\n };\n }, []);\n\n // Update seen ids after every render.\n useEffect(() => {\n for (const m of ordered) seenIdsRef.current.add(m.id);\n });\n\n return (\n <div ref={scrollRef} className={threadClassName ?? styles.thread}>\n <div ref={sentinelRef} className={styles.olderSentinel}>\n {isFetchingOlder ? (\n <div className={styles.olderSpinner}>\n <span className={styles.olderDot} />\n <span className={styles.olderDot} />\n <span className={styles.olderDot} />\n </div>\n ) : hasMoreMessages ? (\n <div className={styles.olderHint} />\n ) : null}\n </div>\n\n {ordered.map((m, i) => {\n const prev = ordered[i - 1];\n const compact =\n !!prev &&\n prev.sender_id === m.sender_id &&\n new Date(m.created_at).getTime() - new Date(prev.created_at).getTime() < 60_000;\n\n const isNew = !seenIdsRef.current.has(m.id) && m._status !== \"sending\";\n\n return (\n <MessageBubble\n key={m.id}\n message={m}\n compact={compact}\n animateIn={isNew}\n />\n );\n })}\n <div ref={bottomRef} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { AppUser } from \"../lib/api\";\nimport { useChatActions } from \"../hooks/useChatActions\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n /** Called after a conversation is created or opened. */\n onConversationReady: (conversationId: string) => void;\n};\n\nfunction initials(displayName: string): string {\n const parts = displayName.trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) {\n return (parts[0]![0]! + parts[1]![0]!).toUpperCase();\n }\n const s = displayName.trim();\n return s.slice(0, 2).toUpperCase() || \"?\";\n}\n\nfunction IconClose() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nfunction IconCheck() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function NewChatModal({ open, onClose, onConversationReady }: Props) {\n const { api, openOrCreateDirect, createGroup } = useChatActions();\n const [mode, setMode] = useState<\"direct\" | \"group\">(\"direct\");\n const [q, setQ] = useState(\"\");\n const [debounced, setDebounced] = useState(\"\");\n const [contacts, setContacts] = useState<AppUser[]>([]);\n const [loading, setLoading] = useState(false);\n const [err, setErr] = useState<string | null>(null);\n\n const [groupTitle, setGroupTitle] = useState(\"\");\n const [selected, setSelected] = useState<AppUser[]>([]);\n\n useEffect(() => {\n const t = setTimeout(() => setDebounced(q.trim()), 300);\n return () => clearTimeout(t);\n }, [q]);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n setLoading(true);\n setErr(null);\n void api\n .listContacts(debounced || undefined, 50)\n .then((rows) => {\n if (!cancelled) setContacts(rows);\n })\n .catch((e: Error) => {\n if (!cancelled) setErr(e.message ?? \"Failed to load contacts\");\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [open, debounced, api]);\n\n useEffect(() => {\n if (!open) {\n setQ(\"\");\n setDebounced(\"\");\n setMode(\"direct\");\n setGroupTitle(\"\");\n setSelected([]);\n setErr(null);\n }\n }, [open]);\n\n const toggleMember = useCallback((u: AppUser) => {\n setSelected((prev) => {\n const has = prev.some((x) => x.id === u.id);\n if (has) return prev.filter((x) => x.id !== u.id);\n return [...prev, u];\n });\n }, []);\n\n const onPickDirect = useCallback(\n async (u: AppUser) => {\n setErr(null);\n setLoading(true);\n try {\n const c = await openOrCreateDirect(u.id);\n onConversationReady(c.id);\n onClose();\n } catch (e) {\n setErr(e instanceof Error ? e.message : \"Could not open chat\");\n } finally {\n setLoading(false);\n }\n },\n [openOrCreateDirect, onConversationReady, onClose],\n );\n\n const onCreateGroup = useCallback(async () => {\n const title = groupTitle.trim();\n if (!title || selected.length === 0) {\n setErr(\"Add a title and at least one member.\");\n return;\n }\n setErr(null);\n setLoading(true);\n try {\n const c = await createGroup(\n title,\n selected.map((u) => u.id),\n );\n onConversationReady(c.id);\n onClose();\n } catch (e) {\n setErr(e instanceof Error ? e.message : \"Could not create group\");\n } finally {\n setLoading(false);\n }\n }, [groupTitle, selected, createGroup, onConversationReady, onClose]);\n\n const directList = useMemo(() => contacts, [contacts]);\n\n if (!open) return null;\n\n return (\n <div className={styles.modalBackdrop} role=\"presentation\" onMouseDown={onClose}>\n <div\n className={styles.modalCard}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"new-chat-title\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className={styles.modalHeader}>\n <h2 id=\"new-chat-title\" className={styles.modalTitle}>\n New chat\n </h2>\n <button type=\"button\" className={styles.modalClose} onClick={onClose} aria-label=\"Close dialog\">\n <IconClose />\n </button>\n </div>\n\n <div className={styles.modalBody}>\n <div className={styles.segmentWrap} role=\"tablist\" aria-label=\"Chat type\">\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-direct\"\n aria-selected={mode === \"direct\"}\n aria-controls=\"new-chat-panel\"\n className={mode === \"direct\" ? styles.segmentActive : styles.segment}\n onClick={() => setMode(\"direct\")}\n >\n Direct\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-group\"\n aria-selected={mode === \"group\"}\n aria-controls=\"new-chat-panel\"\n className={mode === \"group\" ? styles.segmentActive : styles.segment}\n onClick={() => setMode(\"group\")}\n >\n Group\n </button>\n </div>\n\n {err ? <div className={styles.modalError}>{err}</div> : null}\n\n <div\n id=\"new-chat-panel\"\n className={styles.modalPanel}\n role=\"tabpanel\"\n aria-labelledby={mode === \"direct\" ? \"tab-direct\" : \"tab-group\"}\n >\n {mode === \"direct\" ? (\n <>\n <label className={styles.modalLabel} htmlFor=\"direct-search\">\n Find someone\n </label>\n <input\n id=\"direct-search\"\n type=\"search\"\n className={styles.modalSearch}\n placeholder=\"Search by name or email\"\n value={q}\n onChange={(e) => setQ(e.target.value)}\n autoFocus\n />\n <div className={styles.modalList}>\n {loading ? (\n <div className={styles.modalEmpty}>Loading contacts…</div>\n ) : directList.length === 0 ? (\n <div className={styles.modalEmpty}>No contacts match your search.</div>\n ) : (\n directList.map((u) => (\n <button\n key={u.id}\n type=\"button\"\n className={`${styles.modalRow} ${styles.modalRowHoriz}`}\n onClick={() => void onPickDirect(u)}\n disabled={loading}\n >\n <span className={styles.modalAvatar} aria-hidden>\n {initials(u.display_name)}\n </span>\n <span className={styles.modalRowInner}>\n <span className={styles.modalName}>{u.display_name}</span>\n {u.email ? <span className={styles.modalMeta}>{u.email}</span> : null}\n </span>\n </button>\n ))\n )}\n </div>\n </>\n ) : (\n <>\n <label className={styles.modalLabel} htmlFor=\"group-title\">\n Group name\n </label>\n <input\n id=\"group-title\"\n type=\"text\"\n className={styles.modalSearch}\n placeholder=\"e.g. Project Alpha\"\n value={groupTitle}\n onChange={(e) => setGroupTitle(e.target.value)}\n autoFocus\n />\n <label className={styles.modalLabel} htmlFor=\"group-search\">\n Add people\n </label>\n <input\n id=\"group-search\"\n type=\"search\"\n className={styles.modalSearch}\n placeholder=\"Search contacts\"\n value={q}\n onChange={(e) => setQ(e.target.value)}\n />\n {selected.length > 0 ? (\n <div className={styles.chipRow}>\n {selected.map((u) => (\n <button\n key={u.id}\n type=\"button\"\n className={styles.chip}\n onClick={() => toggleMember(u)}\n aria-label={`Remove ${u.display_name}`}\n >\n {u.display_name}\n <span className={styles.chipRemove} aria-hidden>\n ×\n </span>\n </button>\n ))}\n </div>\n ) : null}\n <div className={styles.modalList}>\n {loading ? (\n <div className={styles.modalEmpty}>Loading contacts…</div>\n ) : contacts.length === 0 ? (\n <div className={styles.modalEmpty}>No contacts to show. Try a different search.</div>\n ) : (\n contacts.map((u) => {\n const on = selected.some((x) => x.id === u.id);\n return (\n <button\n key={u.id}\n type=\"button\"\n className={`${styles.modalRow} ${styles.modalRowHoriz} ${on ? styles.modalRowHorizSelected : \"\"}`}\n onClick={() => toggleMember(u)}\n aria-pressed={on}\n >\n <span\n className={`${styles.modalCheckbox} ${on ? styles.modalCheckboxOn : \"\"}`}\n aria-hidden\n >\n {on ? <IconCheck /> : null}\n </span>\n <span className={styles.modalAvatar} aria-hidden>\n {initials(u.display_name)}\n </span>\n <span className={styles.modalRowInner}>\n <span className={styles.modalName}>{u.display_name}</span>\n {u.email ? <span className={styles.modalMeta}>{u.email}</span> : null}\n </span>\n </button>\n );\n })\n )}\n </div>\n <button\n type=\"button\"\n className={styles.modalPrimary}\n disabled={loading || !groupTitle.trim() || selected.length === 0}\n onClick={() => void onCreateGroup()}\n >\n Create group\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport styles from \"./chat.module.css\";\n\ntype Props = {\n /** Display names of users currently typing (already resolved from member list). */\n names: string[];\n};\n\nexport function TypingIndicator({ names }: Props) {\n if (names.length === 0) return null;\n\n let label: string;\n if (names.length === 1) {\n label = `${names[0]} is typing…`;\n } else if (names.length === 2) {\n label = `${names[0]} and ${names[1]} are typing…`;\n } else {\n label = `${names.length} people are typing…`;\n }\n\n return (\n <AnimatePresence>\n <motion.div\n key=\"typing\"\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 4 }}\n transition={{ duration: 0.15 }}\n className={styles.typingIndicator}\n >\n <span className={styles.typingDots}>\n <span /><span /><span />\n </span>\n {label}\n </motion.div>\n </AnimatePresence>\n );\n}\n","\"use client\";\n\nimport { useChatPanelController, type ChatPanelProps } from \"../hooks/useChatPanelController\";\nimport { ConversationList } from \"./ConversationList\";\nimport { MessageInput } from \"./MessageInput\";\nimport { MessageThread } from \"./MessageThread\";\nimport { NewChatModal } from \"./NewChatModal\";\nimport { TypingIndicator } from \"./TypingIndicator\";\nimport styles from \"./chat.module.css\";\n\nexport type { ChatPanelProps };\n\nexport function ChatPanel(props: ChatPanelProps) {\n const {\n selectedId,\n setSelected,\n newChatOpen,\n setNewChatOpen,\n refreshFromServer,\n convItems,\n messages,\n loadMsg,\n typingNames,\n showNewChat,\n } = useChatPanelController(props);\n\n return (\n <div className={styles.chatPanelInner}>\n <div className={styles.panelToolbar}>\n <div className={styles.panelToolbarInner}>\n {showNewChat ? (\n <button type=\"button\" className={styles.refreshBtn} onClick={() => setNewChatOpen(true)}>\n New chat\n </button>\n ) : (\n <span />\n )}\n <button type=\"button\" className={styles.refreshBtn} onClick={refreshFromServer}>\n Refresh\n </button>\n </div>\n </div>\n <ConversationList items={convItems} selectedId={selectedId} onSelect={(id) => setSelected(id)} />\n {selectedId ? (\n <div className={styles.chatPanelThread}>\n {loadMsg ? (\n <div className={styles.typing}>Loading…</div>\n ) : (\n <MessageThread messages={messages} />\n )}\n <TypingIndicator names={typingNames} />\n <MessageInput conversationId={selectedId} />\n </div>\n ) : (\n <div className={styles.typing}>Select a conversation or start a new chat.</div>\n )}\n <NewChatModal\n open={newChatOpen}\n onClose={() => setNewChatOpen(false)}\n onConversationReady={(id) => setSelected(id)}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useState } from \"react\";\nimport { ChatPanel, type ChatPanelProps } from \"./ChatPanel\";\nimport styles from \"./chat.module.css\";\n\nexport type ChatWidgetProps = ChatPanelProps & {\n position?: \"bottom-right\" | \"bottom-left\";\n defaultOpen?: boolean;\n};\n\nexport function ChatWidget({\n position = \"bottom-right\",\n defaultOpen = false,\n conversationId,\n peerUserId,\n showNewChat,\n onConversationChange,\n}: ChatWidgetProps) {\n const [open, setOpen] = useState(defaultOpen);\n const fabCorner = position === \"bottom-left\" ? styles.fabBl : styles.fabBr;\n const panelCorner = position === \"bottom-left\" ? styles.panelBl : styles.panelBr;\n\n return (\n <>\n <button\n type=\"button\"\n className={`${styles.widgetFab} ${fabCorner}`}\n onClick={() => setOpen((o) => !o)}\n aria-label={open ? \"Close chat\" : \"Open chat\"}\n >\n {open ? \"✕\" : \"💬\"}\n </button>\n <AnimatePresence>\n {open ? (\n <motion.div\n key=\"panel\"\n initial={{ opacity: 0, y: 16, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 16, scale: 0.98 }}\n transition={{ duration: 0.2 }}\n className={`${styles.widgetPanel} ${panelCorner}`}\n >\n <div className={styles.widgetHeader}>Messages</div>\n <div className={styles.widgetBody}>\n <ChatPanel\n conversationId={conversationId}\n peerUserId={peerUserId}\n showNewChat={showNewChat}\n onConversationChange={onConversationChange}\n />\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </>\n );\n}\n","import { format } from \"date-fns\";\r\nimport type { Conversation } from \"../types\";\r\n\r\n/** Primary display name for a conversation in the list. */\r\nexport function convDisplayName(c: Conversation): string {\r\n if (c.kind === \"direct\" && c.peer_display_name) return c.peer_display_name;\r\n if (c.title) return c.title;\r\n return c.kind === \"direct\" ? \"Direct message\" : \"Group chat\";\r\n}\r\n\r\n/** For header / controller use (title, not the peer name). */\r\nexport function convLabel(c: Conversation): string {\r\n return (c.title || (c.kind === \"direct\" ? \"Direct\" : \"Chat\")) as string;\r\n}\r\n\r\nexport function formatConvTime(iso: string): string {\r\n try {\r\n const d = new Date(iso);\r\n const now = new Date();\r\n const isToday = d.toDateString() === now.toDateString();\r\n if (isToday) return format(d, \"h:mm a\");\r\n const diffDays = Math.floor((now.getTime() - d.getTime()) / 86_400_000);\r\n if (diffDays < 7) return format(d, \"EEE\");\r\n return format(d, \"MMM d\");\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\nexport function initials(name: string): string {\r\n const parts = name.trim().split(/\\s+/).filter(Boolean);\r\n if (parts.length >= 2) return (parts[0]![0]! + parts[1]![0]!).toUpperCase();\r\n return name.slice(0, 2).toUpperCase() || \"?\";\r\n}\r\n","import \"G:\\prdg-chat\\web\\src\\chat\\components\\standalone-chat.module.css\"; export default {\"root\":\"standalone-chat__root\",\"shell\":\"standalone-chat__shell\",\"sidebar\":\"standalone-chat__sidebar\",\"sidebarHeader\":\"standalone-chat__sidebarHeader\",\"sidebarTitle\":\"standalone-chat__sidebarTitle\",\"iconSquare\":\"standalone-chat__iconSquare\",\"searchWrap\":\"standalone-chat__searchWrap\",\"searchInput\":\"standalone-chat__searchInput\",\"searchIcon\":\"standalone-chat__searchIcon\",\"tabs\":\"standalone-chat__tabs\",\"tab\":\"standalone-chat__tab\",\"tabActive\":\"standalone-chat__tabActive\",\"listScroll\":\"standalone-chat__listScroll\",\"sectionLabel\":\"standalone-chat__sectionLabel\",\"convRow\":\"standalone-chat__convRow\",\"convRowActive\":\"standalone-chat__convRowActive\",\"avatar\":\"standalone-chat__avatar\",\"avatarInitials\":\"standalone-chat__avatarInitials\",\"avatarDot\":\"standalone-chat__avatarDot\",\"convBody\":\"standalone-chat__convBody\",\"convTopLine\":\"standalone-chat__convTopLine\",\"convName\":\"standalone-chat__convName\",\"convPreview\":\"standalone-chat__convPreview\",\"convTime\":\"standalone-chat__convTime\",\"fab\":\"standalone-chat__fab\",\"sidebarFooter\":\"standalone-chat__sidebarFooter\",\"main\":\"standalone-chat__main\",\"mainHeader\":\"standalone-chat__mainHeader\",\"mainHeaderLeft\":\"standalone-chat__mainHeaderLeft\",\"mainAvatar\":\"standalone-chat__mainAvatar\",\"mainTitle\":\"standalone-chat__mainTitle\",\"mainStatus\":\"standalone-chat__mainStatus\",\"mainActions\":\"standalone-chat__mainActions\",\"actionBtn\":\"standalone-chat__actionBtn\",\"threadArea\":\"standalone-chat__threadArea\",\"emptyMain\":\"standalone-chat__emptyMain\",\"inputArea\":\"standalone-chat__inputArea\",\"callsEmpty\":\"standalone-chat__callsEmpty\"}","\"use client\";\r\n\r\nimport type { Conversation } from \"../types\";\r\nimport { convDisplayName, formatConvTime, initials } from \"../lib/chatLabels\";\r\nimport styles from \"./standalone-chat.module.css\";\r\n\r\nexport type SidebarTab = \"recent\" | \"groups\" | \"calls\";\r\n\r\nexport type ChatInboxSidebarProps = {\r\n q: string;\r\n setQ: (q: string) => void;\r\n tab: SidebarTab;\r\n setTab: (t: SidebarTab) => void;\r\n tabDefs: [SidebarTab, string][];\r\n filtered: Conversation[];\r\n activeRows: Conversation[];\r\n restRows: Conversation[];\r\n selectedId: string | null;\r\n onSelectConversation: (id: string) => void;\r\n onRefresh: () => void;\r\n showNewChat: boolean;\r\n onNewChat: () => void;\r\n};\r\n\r\n/**\r\n * Full inbox sidebar (search, tabs, conversation rows, FAB). Styles use `standalone-chat.module.css`.\r\n * Pair with `ChatMainColumn` or your own main area; or use `StandaloneChatPage` for the full layout.\r\n */\r\nexport function ChatInboxSidebar({\r\n q,\r\n setQ,\r\n tab,\r\n setTab,\r\n tabDefs,\r\n filtered,\r\n activeRows,\r\n restRows,\r\n selectedId,\r\n onSelectConversation,\r\n onRefresh,\r\n showNewChat,\r\n onNewChat,\r\n}: ChatInboxSidebarProps) {\r\n const renderRow = (c: Conversation) => {\r\n const name = convDisplayName(c);\r\n const timeStr = formatConvTime(c.last_message_at ?? c.updated_at);\r\n const preview = c.last_message_preview ?? (c.kind === \"group\" ? \"Group chat\" : \"\");\r\n const isActive = selectedId === c.id;\r\n return (\r\n <button\r\n key={c.id}\r\n type=\"button\"\r\n className={`${styles.convRow} ${isActive ? styles.convRowActive : \"\"}`}\r\n onClick={() => onSelectConversation(c.id)}\r\n >\r\n <div className={styles.avatar} aria-hidden>\r\n <span className={styles.avatarInitials}>{initials(name)}</span>\r\n <span className={styles.avatarDot} />\r\n </div>\r\n <div className={styles.convBody}>\r\n <div className={styles.convTopLine}>\r\n <span className={styles.convName}>{name}</span>\r\n <span className={styles.convTime}>{timeStr}</span>\r\n </div>\r\n {preview ? (\r\n <div className={styles.convPreview}>{preview}</div>\r\n ) : null}\r\n </div>\r\n </button>\r\n );\r\n };\r\n\r\n return (\r\n <aside className={styles.sidebar}>\r\n <div className={styles.sidebarHeader}>\r\n <h1 className={styles.sidebarTitle}>Messages</h1>\r\n <div style={{ display: \"flex\", gap: 8 }}>\r\n <button\r\n type=\"button\"\r\n className={styles.iconSquare}\r\n aria-label=\"Refresh conversations\"\r\n title=\"Refresh\"\r\n onClick={() => onRefresh()}\r\n >\r\n ↻\r\n </button>\r\n <button type=\"button\" className={styles.iconSquare} aria-label=\"Settings\" title=\"Settings\">\r\n ⚙\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className={styles.searchWrap}>\r\n <input\r\n type=\"search\"\r\n className={styles.searchInput}\r\n placeholder=\"Search Chat\"\r\n value={q}\r\n onChange={(e) => setQ(e.target.value)}\r\n aria-label=\"Search conversations\"\r\n />\r\n <span className={styles.searchIcon}>⌕</span>\r\n </div>\r\n\r\n <div className={styles.tabs} role=\"tablist\">\r\n {tabDefs.map(([id, label]) => (\r\n <button\r\n key={id}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={tab === id}\r\n className={`${styles.tab} ${tab === id ? styles.tabActive : \"\"}`}\r\n onClick={() => setTab(id)}\r\n >\r\n {label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div className={styles.listScroll}>\r\n {tab === \"calls\" ? (\r\n <p className={styles.callsEmpty}>No recent calls yet.</p>\r\n ) : filtered.length === 0 ? (\r\n <p className={styles.callsEmpty}>No conversations match.</p>\r\n ) : (\r\n <>\r\n {activeRows.length > 0 ? (\r\n <>\r\n <div className={styles.sectionLabel}>ACTIVE CHATS</div>\r\n {activeRows.map(renderRow)}\r\n </>\r\n ) : null}\r\n {restRows.length > 0 ? (\r\n <>\r\n <div className={styles.sectionLabel}>ALL CHATS</div>\r\n {restRows.map(renderRow)}\r\n </>\r\n ) : null}\r\n </>\r\n )}\r\n </div>\r\n\r\n {showNewChat ? (\r\n <div className={styles.sidebarFooter}>\r\n <button type=\"button\" className={styles.fab} aria-label=\"New chat\" onClick={onNewChat}>\r\n +\r\n </button>\r\n </div>\r\n ) : null}\r\n </aside>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport type { Message } from \"../types\";\r\nimport { useChat } from \"../provider/ChatContext\";\r\nimport { MessageInput } from \"./MessageInput\";\r\nimport { MessageThread } from \"./MessageThread\";\r\nimport { TypingIndicator } from \"./TypingIndicator\";\r\nimport chatStyles from \"./chat.module.css\";\r\nimport styles from \"./standalone-chat.module.css\";\r\n\r\nexport type ChatMainColumnProps = {\r\n selectedId: string | null;\r\n headerTitle: string;\r\n headerStatus: string;\r\n messages: Message[];\r\n loadMsg: boolean;\r\n fetchOlderMessages?: () => void;\r\n isFetchingOlder?: boolean;\r\n hasMoreMessages?: boolean;\r\n typingNames: string[];\r\n /** When nothing is selected */\r\n emptyMessage?: string;\r\n threadClassName?: string;\r\n};\r\n\r\n/**\r\n * Main chat column: header, scrollable thread, typing line, composer. Use with `ChatInboxSidebar` or a custom picker.\r\n * For a **single** conversation (entity / order), prefer `ChatConversationView` instead.\r\n */\r\nexport function ChatMainColumn({\r\n selectedId,\r\n headerTitle,\r\n headerStatus,\r\n messages,\r\n loadMsg,\r\n fetchOlderMessages,\r\n isFetchingOlder,\r\n hasMoreMessages,\r\n typingNames,\r\n emptyMessage = \"Select a conversation or start a new chat.\",\r\n threadClassName,\r\n}: ChatMainColumnProps) {\r\n const { config } = useChat();\r\n const callEnabled = config.callEnabled === true;\r\n\r\n if (!selectedId) {\r\n return (\r\n <main className={styles.main}>\r\n <div className={styles.emptyMain}>{emptyMessage}</div>\r\n </main>\r\n );\r\n }\r\n\r\n return (\r\n <main className={styles.main}>\r\n <header className={styles.mainHeader}>\r\n <div className={styles.mainHeaderLeft}>\r\n <div className={styles.mainAvatar} aria-hidden />\r\n <div style={{ minWidth: 0 }}>\r\n <div className={styles.mainTitle}>{headerTitle}</div>\r\n {headerStatus ? <div className={styles.mainStatus}>{headerStatus}</div> : null}\r\n </div>\r\n </div>\r\n <div className={styles.mainActions}>\r\n {callEnabled ? (\r\n <>\r\n <button type=\"button\" className={styles.actionBtn} aria-label=\"Voice call\" title=\"Voice call\">\r\n 📞\r\n </button>\r\n <button type=\"button\" className={styles.actionBtn} aria-label=\"Video call\" title=\"Video call\">\r\n 📹\r\n </button>\r\n </>\r\n ) : null}\r\n <button type=\"button\" className={styles.actionBtn} aria-label=\"More\" title=\"More\">\r\n ⋮\r\n </button>\r\n </div>\r\n </header>\r\n\r\n <div className={styles.threadArea}>\r\n {loadMsg ? (\r\n <div className={styles.emptyMain}>Loading…</div>\r\n ) : (\r\n <MessageThread\r\n messages={messages}\r\n threadClassName={threadClassName ?? chatStyles.threadFlex}\r\n fetchOlderMessages={fetchOlderMessages}\r\n isFetchingOlder={isFetchingOlder}\r\n hasMoreMessages={hasMoreMessages}\r\n />\r\n )}\r\n <TypingIndicator names={typingNames} />\r\n </div>\r\n\r\n <div className={styles.inputArea}>\r\n <MessageInput conversationId={selectedId} />\r\n </div>\r\n </main>\r\n );\r\n}\r\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useChatPanelController, type ChatPanelProps } from \"../hooks/useChatPanelController\";\nimport { useChat } from \"../provider/ChatContext\";\nimport { convLabel } from \"../lib/chatLabels\";\nimport { ChatInboxSidebar, type SidebarTab } from \"./ChatInboxSidebar\";\nimport { ChatMainColumn } from \"./ChatMainColumn\";\nimport { NewChatModal } from \"./NewChatModal\";\nimport styles from \"./standalone-chat.module.css\";\n\nexport type StandaloneChatPageProps = ChatPanelProps;\n\nexport function StandaloneChatPage(props: ChatPanelProps) {\n const { config } = useChat();\n const {\n selectedId,\n setSelected,\n newChatOpen,\n setNewChatOpen,\n refreshFromServer,\n convItems,\n messages,\n loadMsg,\n fetchOlderMessages,\n isFetchingOlder,\n hasMoreMessages,\n typingNames,\n showNewChat,\n membersForSelected,\n } = useChatPanelController(props);\n\n const [tab, setTab] = useState<SidebarTab>(\"recent\");\n const [q, setQ] = useState(\"\");\n\n const callEnabled = config.callEnabled === true;\n\n useEffect(() => {\n if (!callEnabled && tab === \"calls\") setTab(\"recent\");\n }, [callEnabled, tab]);\n\n const filtered = useMemo(() => {\n let list = [...convItems];\n const needle = q.trim().toLowerCase();\n if (needle) list = list.filter((c) => convLabel(c).toLowerCase().includes(needle));\n if (tab === \"groups\") list = list.filter((c) => c.kind === \"group\");\n if (tab === \"calls\") list = [];\n list.sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime());\n return list;\n }, [convItems, q, tab]);\n\n const { activeRows, restRows } = useMemo(() => {\n const active = filtered.slice(0, 4);\n const rest = filtered.slice(4);\n return { activeRows: active, restRows: rest };\n }, [filtered]);\n\n const tabDefs = useMemo((): [SidebarTab, string][] => {\n const rows: [SidebarTab, string][] = [\n [\"recent\", \"Recent\"],\n [\"groups\", \"Groups\"],\n ];\n if (callEnabled) rows.push([\"calls\", \"Calls\"]);\n return rows;\n }, [callEnabled]);\n\n const selectedConv = selectedId ? convItems.find((c) => c.id === selectedId) : undefined;\n const otherMembers = membersForSelected.filter((m) => m.id !== config.userId);\n const headerTitle = selectedConv\n ? selectedConv.kind === \"direct\"\n ? (selectedConv.peer_display_name ?? otherMembers[0]?.display_name ?? convLabel(selectedConv))\n : convLabel(selectedConv)\n : \"\";\n const headerStatus =\n typingNames.length > 0 ? `${typingNames.join(\", \")} typing…` : selectedId ? \"online\" : \"\";\n\n return (\n <div className={styles.root}>\n <div className={styles.shell}>\n <ChatInboxSidebar\n q={q}\n setQ={setQ}\n tab={tab}\n setTab={setTab}\n tabDefs={tabDefs}\n filtered={filtered}\n activeRows={activeRows}\n restRows={restRows}\n selectedId={selectedId}\n onSelectConversation={(id) => setSelected(id)}\n onRefresh={refreshFromServer}\n showNewChat={showNewChat}\n onNewChat={() => setNewChatOpen(true)}\n />\n\n <ChatMainColumn\n selectedId={selectedId && selectedConv ? selectedId : null}\n headerTitle={headerTitle}\n headerStatus={headerStatus}\n messages={messages}\n loadMsg={loadMsg}\n fetchOlderMessages={fetchOlderMessages}\n isFetchingOlder={isFetchingOlder}\n hasMoreMessages={hasMoreMessages}\n typingNames={typingNames}\n />\n </div>\n\n <NewChatModal\n open={newChatOpen}\n onClose={() => setNewChatOpen(false)}\n onConversationReady={(id) => setSelected(id)}\n />\n </div>\n );\n}\n","\"use client\";\r\n\r\nimport type { ReactNode } from \"react\";\r\nimport { useMemo } from \"react\";\r\nimport { useChat } from \"../provider/ChatContext\";\r\nimport { useConversationMembers } from \"../hooks/useConversationMembers\";\r\nimport { useMessages } from \"../hooks/useMessages\";\r\nimport { MessageInput } from \"./MessageInput\";\r\nimport { MessageThread } from \"./MessageThread\";\r\nimport { TypingIndicator } from \"./TypingIndicator\";\r\nimport chatStyles from \"./chat.module.css\";\r\n\r\nexport type ChatConversationViewProps = {\r\n /** Active conversation — wire `useChatPanelController({ conversationId })` or entity resolution first. */\r\n conversationId: string;\r\n /** Optional block above the scrollable thread (order title, breadcrumbs, etc.). */\r\n header?: ReactNode;\r\n className?: string;\r\n threadAreaClassName?: string;\r\n /** Passed to `MessageThread` (default: `chatStyles.threadFlex`). */\r\n threadClassName?: string;\r\n inputAreaClassName?: string;\r\n /** @default true */\r\n showTyping?: boolean;\r\n loadingFallback?: ReactNode;\r\n};\r\n\r\n/**\r\n * Self-contained thread + typing + composer for a single conversation (e.g. entity / order chat).\r\n * Compose your own layout, or use `StandaloneChatPage` for the full inbox + thread experience.\r\n */\r\nexport function ChatConversationView({\r\n conversationId,\r\n header,\r\n className,\r\n threadAreaClassName,\r\n threadClassName,\r\n inputAreaClassName,\r\n showTyping = true,\r\n loadingFallback,\r\n}: ChatConversationViewProps) {\r\n const { typingByConversation } = useChat();\r\n const {\r\n data: msgData,\r\n isLoading: loadMsg,\r\n fetchOlderMessages,\r\n isFetchingOlder,\r\n hasMoreMessages,\r\n } = useMessages(conversationId);\r\n const { data: membersForSelected = [] } = useConversationMembers(conversationId);\r\n\r\n const membersById = useMemo(\r\n () => Object.fromEntries(membersForSelected.map((m) => [m.id, m])),\r\n [membersForSelected],\r\n );\r\n\r\n const typingNames = useMemo(() => {\r\n const ids = typingByConversation[conversationId] ?? [];\r\n return ids.map((id) => membersById[id]?.display_name ?? \"Someone\");\r\n }, [conversationId, typingByConversation, membersById]);\r\n\r\n const messages = msgData?.items ?? [];\r\n\r\n return (\r\n <div className={className}>\r\n {header}\r\n <div className={threadAreaClassName}>\r\n {loadMsg ? (\r\n loadingFallback ?? <div className={chatStyles.typing}>Loading…</div>\r\n ) : (\r\n <MessageThread\r\n messages={messages}\r\n threadClassName={threadClassName ?? chatStyles.threadFlex}\r\n fetchOlderMessages={fetchOlderMessages}\r\n isFetchingOlder={isFetchingOlder}\r\n hasMoreMessages={hasMoreMessages}\r\n />\r\n )}\r\n {showTyping ? <TypingIndicator names={typingNames} /> : null}\r\n </div>\r\n <div className={inputAreaClassName}>\r\n <MessageInput conversationId={conversationId} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}