@adminide-stack/yantra-mobile 12.0.105-alpha.0 → 12.0.106-alpha.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.
Files changed (33) hide show
  1. package/lib/features/messaging/BlockedContactsScreen.js +127 -0
  2. package/lib/features/messaging/BlockedContactsScreen.js.map +1 -0
  3. package/lib/features/messaging/ChatAttachments.js +4 -2
  4. package/lib/features/messaging/ChatAttachments.js.map +1 -1
  5. package/lib/features/messaging/ChatComponents.js +194 -10
  6. package/lib/features/messaging/ChatComponents.js.map +1 -1
  7. package/lib/features/messaging/ChatInfoScreen.js +173 -17
  8. package/lib/features/messaging/ChatInfoScreen.js.map +1 -1
  9. package/lib/features/messaging/ConversationListScreen.js +17 -1
  10. package/lib/features/messaging/ConversationListScreen.js.map +1 -1
  11. package/lib/features/messaging/MediaGalleryScreen.js +264 -0
  12. package/lib/features/messaging/MediaGalleryScreen.js.map +1 -0
  13. package/lib/features/messaging/NativeChatExperience.js +137 -18
  14. package/lib/features/messaging/NativeChatExperience.js.map +1 -1
  15. package/lib/features/messaging/NewGroupScreen.js +191 -0
  16. package/lib/features/messaging/NewGroupScreen.js.map +1 -0
  17. package/lib/features/messaging/PollComposer.js +137 -0
  18. package/lib/features/messaging/PollComposer.js.map +1 -0
  19. package/lib/features/messaging/PollVotesScreen.js +122 -0
  20. package/lib/features/messaging/PollVotesScreen.js.map +1 -0
  21. package/lib/features/messaging/ThreadScreen.js +180 -13
  22. package/lib/features/messaging/ThreadScreen.js.map +1 -1
  23. package/lib/features/messaging/chatLinks.js +39 -2
  24. package/lib/features/messaging/chatLinks.js.map +1 -1
  25. package/lib/features/messaging/chatModel.js +186 -19
  26. package/lib/features/messaging/chatModel.js.map +1 -1
  27. package/lib/features/messaging/chatOperations.js +111 -2
  28. package/lib/features/messaging/chatOperations.js.map +1 -1
  29. package/lib/features/messaging/nativeChatChannelQuery.js +7 -2
  30. package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -1
  31. package/lib/features/messaging/useChatData.js +248 -10
  32. package/lib/features/messaging/useChatData.js.map +1 -1
  33. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"useChatData.js","sources":["../../../src/features/messaging/useChatData.ts"],"sourcesContent":["/**\n * The chat surface's data layer: conversations, one transcript, and sending.\n *\n * Hooks rather than a store, because the remote must not pull in redux or\n * Apollo - everything reaches the network through `ChatGraphQLSeam`. The\n * shaping and merging all live in `chatModel.ts` as pure functions; what is\n * here is the effect wiring around them.\n *\n * Two behaviours are worth knowing about:\n *\n * - **`reconnectEpoch` drives recovery.** The host bumps it on every\n * successful (re)connect. Both hooks re-fetch their head page when it\n * changes, because a dropped socket means missed subscription frames and the\n * only honest fix is to re-read. Merging is idempotent, so healing a gap\n * never duplicates anything.\n * - **Errors are state, not exceptions.** The seam resolves with `{data,\n * errors}` and never rejects, so a failure renders an inline banner over\n * whatever is already on screen instead of unmounting the transcript.\n */\nimport * as React from 'react';\nimport {\n CHANNELS_QUERY,\n CREATE_DIRECT_CHANNEL_MUTATION,\n MESSAGES_QUERY,\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n REACTION_CHANGED_SUBSCRIPTION_WS,\n SEND_MESSAGE_MUTATION,\n CREATE_MESSAGE_UPLOAD_LINKS_MUTATION,\n ATTACH_UPLOADED_FILES_MUTATION,\n SET_MESSAGE_REACTION_MUTATION,\n VIEW_CHANNEL_MUTATION,\n CHANNEL_READ_STATE_QUERY,\n DELETE_MESSAGE_FOR_EVERYONE_MUTATION,\n EDIT_MESSAGE_MUTATION,\n MARK_CHANNEL_DELIVERED_MUTATION,\n MESSAGE_UPDATED_SUBSCRIPTION_WS,\n SEND_TYPING_MUTATION,\n SET_CHANNEL_LIST_STATE_MUTATION,\n SET_MESSAGE_STARRED_MUTATION,\n TYPING_SUBSCRIPTION_WS,\n} from './chatOperations';\nimport {\n applyReactionSummary,\n withViewerReaction,\n type WireReaction,\n mergeConversations,\n mergeMessages,\n patchConversationAfterPost,\n patchConversationAfterUpdate,\n readWatermarkOf,\n deliveredWatermarkOf,\n reconcileOptimistic,\n sortConversations,\n toChatMessage,\n toConversation,\n type ChatConversation,\n type ChatMessage,\n type WireChannel,\n type WirePost,\n ATTACHMENT_LABELS,\n type ChatAttachment,\n type ChatAttachmentKind,\n type ChatReplyRef,\n} from './chatModel';\nimport type {\n ChatGraphQLSeam,\n ChatHostServices,\n ChatMediaSeam,\n ChatPickedImage,\n ChatStorageSeam,\n ChatViewer,\n} from './chatHost';\nimport {\n isMongoAccountId,\n isNativeMessengerChannel,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n NATIVE_CHAT_LIST_PAGE_SIZE,\n} from './nativeChatChannelQuery';\n\n/** A Mongo ObjectId made on the device: attachment posts are named before they exist. */\nfunction newPostId(): string {\n const seconds = Math.floor(Date.now() / 1000)\n .toString(16)\n .padStart(8, '0');\n let rest = '';\n for (let i = 0; i < 16; i += 1) rest += Math.floor(Math.random() * 16).toString(16);\n return seconds + rest;\n}\n\n/** A row still in flight: what a retry needs to send it again. */\ninterface PendingSend {\n body: string;\n files?: ChatPickedImage[];\n kind?: ChatAttachmentKind;\n replyTo?: ChatReplyRef | null;\n}\n\n/** Messages fetched per page in a thread. */\nconst PAGE_SIZE = 20;\n/** How far back a jump to a quoted or searched message will page: 10 pages = 200 messages. */\nconst MAX_PAGES_TO_FIND = 10;\n/** One \"delivered\" per chat per this long is plenty: it is a watermark, not a per-message receipt. */\nconst DELIVERED_THROTTLE_MS = 10_000;\n\nfunction firstErrorMessage(errors?: { message: string }[]): string | null {\n if (!errors?.length) return null;\n const raw = errors[0].message || 'Something went wrong.';\n if (/Cannot return null for non-nullable field Channel\\.id/i.test(raw)) return null;\n if (/status code 400/i.test(raw)) return 'Could not load messages for this chat.';\n if (/status code 401/i.test(raw) || /status code 403/i.test(raw))\n return 'You do not have access to this conversation.';\n return raw;\n}\n\ninterface MessagesQueryPayload {\n messages?: {\n data?: (WirePost | null)[] | null;\n totalCount?: number | null;\n } | null;\n}\n\nfunction sortChannelsByRecentActivity(rows: WireChannel[]): WireChannel[] {\n return [...rows].sort((left, right) => {\n const leftTime = left.lastPostAt ? new Date(left.lastPostAt).getTime() : 0;\n const rightTime = right.lastPostAt ? new Date(right.lastPostAt).getTime() : 0;\n return rightTime - leftTime;\n });\n}\n\nexport interface ConversationsState {\n conversations: ChatConversation[];\n loading: boolean;\n error: string | null;\n refreshing: boolean;\n refresh: () => void;\n /** More conversations exist on the server beyond what is loaded. */\n hasMore: boolean;\n loadingMore: boolean;\n /** Fetch the next page of conversations. */\n loadMore: () => void;\n /** Locally zero the badge so the list responds before the server confirms. */\n markRead: (channelId: string) => void;\n /** Locally set a chat's mute (epoch millis, 0 = unmuted) ahead of the server's answer. */\n setMutedUntil: (channelId: string, mutedUntil: number) => void;\n /** Show the viewer's unsent text for a chat in the list, ahead of the server copy. */\n setDraft: (channelId: string, draft: string) => void;\n /** Pin / archive a chat in the viewer's list (optimistic; reverts with an error on failure). */\n setListState: (channelId: string, state: { pinned?: boolean; archived?: boolean }) => void;\n /** An edit or delete-for-everyone landed: refresh the row's preview if it was the newest message. */\n applyConversationUpdate: (channelId: string, post: WirePost) => void;\n /** Tell the server this phone has a chat's messages (two gray ticks for the sender). Throttled. */\n markDelivered: (channelId: string) => void;\n /** Move a row to the top with an updated preview after send/subscription. */\n applyConversationMessage: (channelId: string, post: WirePost) => void;\n openDirect: (peerUserId: string, peerName: string) => Promise<string | null>;\n}\n\nexport function useConversations(\n services: ChatHostServices,\n viewer: ChatViewer | null,\n opts?: {\n syncListRealtime?: boolean;\n /** Wait for host to set yantra-chat org before querying. */ listQueryEnabled?: boolean;\n },\n): ConversationsState {\n const { gql } = services;\n const [conversations, setConversations] = React.useState<ChatConversation[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [refreshing, setRefreshing] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n const conversationsRef = React.useRef<ChatConversation[]>([]);\n /** Raw server rows consumed so far (before the client-side filter), i.e. the next `skip`. */\n const serverOffset = React.useRef(0);\n\n React.useEffect(() => {\n conversationsRef.current = conversations;\n }, [conversations]);\n\n const listQueryEnabled = opts?.listQueryEnabled !== false;\n\n const load = React.useCallback(\n async (mode: 'initial' | 'refresh') => {\n if (!viewerId || !listQueryEnabled) return;\n if (mode === 'refresh') setRefreshing(true);\n if (mode === 'initial') {\n // Paint the Apollo-cached list immediately; the network read below replaces it.\n const cached = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n { fetchPolicy: 'cache-only' },\n );\n const cachedRows = (cached.data?.channelsByUser ?? [])\n .filter(Boolean)\n .filter(isNativeMessengerChannel) as WireChannel[];\n if (mounted.current && cachedRows.length) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(cachedRows).map((c) => toConversation(c, viewerId)),\n ),\n );\n setLoading(false);\n }\n }\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n // network-only: a stale conversation list is the single most\n // visible staleness in a chat app, and this is one small page.\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n\n // Partial data with errors is normal here (one bad channel should\n // not blank the list), so render what arrived AND show the banner.\n // Initial/refresh always resets to the first page.\n if (rows.length || !message) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(rows).map((c) => toConversation(c, viewerId)),\n ),\n );\n serverOffset.current = raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoading(false);\n setRefreshing(false);\n },\n [gql, viewerId, listQueryEnabled],\n );\n\n const loadMore = React.useCallback(async () => {\n if (!viewerId || !listQueryEnabled || !hasMore || loadingMore || loading) return;\n setLoadingMore(true);\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n { ...NATIVE_CHAT_CHANNELS_QUERY_VARS, skip: serverOffset.current },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n if (rows.length) {\n setConversations((prev) =>\n mergeConversations(\n prev,\n rows.map((c) => toConversation(c, viewerId)),\n ),\n );\n }\n if (!message) {\n serverOffset.current += raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoadingMore(false);\n }, [gql, viewerId, listQueryEnabled, hasMore, loadingMore, loading]);\n\n React.useEffect(() => {\n if (!listQueryEnabled) {\n setLoading(true);\n return;\n }\n void load('initial');\n }, [load, listQueryEnabled]);\n\n // Re-read the list on every reconnect: while the socket was down the list\n // could have moved for reasons no subscription frame will now tell us.\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void load('refresh');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n const markRead = React.useCallback((channelId: string) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId ? { ...c, unreadCount: 0 } : c)));\n }, []);\n\n const setMutedUntil = React.useCallback((channelId: string, mutedUntil: number) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId ? { ...c, mutedUntil } : c)));\n }, []);\n\n const setDraft = React.useCallback((channelId: string, draft: string) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId && c.draft !== draft ? { ...c, draft } : c)));\n }, []);\n\n const setListState = React.useCallback(\n (channelId: string, state: { pinned?: boolean; archived?: boolean }) => {\n const before = conversationsRef.current.find((c) => c.id === channelId);\n if (!before) return;\n const now = Date.now();\n const patch: Partial<ChatConversation> = {};\n if (typeof state.archived === 'boolean') {\n patch.archivedAt = state.archived ? now : 0;\n if (state.archived) patch.pinnedAt = 0;\n }\n if (typeof state.pinned === 'boolean' && !state.archived) patch.pinnedAt = state.pinned ? now : 0;\n setConversations((prev) =>\n sortConversations(prev.map((c) => (c.id === channelId ? { ...c, ...patch } : c))),\n );\n void (async () => {\n const res = await gql.mutate<{ setChannelListState?: boolean | null }>(\n SET_CHANNEL_LIST_STATE_MUTATION,\n {\n channelId,\n ...state,\n },\n );\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setChannelListState) {\n setConversations((prev) => sortConversations(prev.map((c) => (c.id === channelId ? before : c))));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the chat list.');\n }\n })();\n },\n [gql],\n );\n\n const applyConversationUpdate = React.useCallback(\n (channelId: string, post: WirePost) => {\n if (!viewerId) return;\n setConversations((prev) =>\n prev.map((c) => (c.id === channelId ? patchConversationAfterUpdate(c, post, viewerId) : c)),\n );\n },\n [viewerId],\n );\n\n const deliveredAt = React.useRef(new Map<string, number>());\n const markDelivered = React.useCallback(\n (channelId: string) => {\n const last = deliveredAt.current.get(channelId) ?? 0;\n if (Date.now() - last < DELIVERED_THROTTLE_MS) return;\n deliveredAt.current.set(channelId, Date.now());\n void gql.mutate(MARK_CHANNEL_DELIVERED_MUTATION, { channelId });\n },\n [gql],\n );\n\n // Opening the app delivers whatever arrived while it was closed: every chat with unread messages.\n const unreadKey = conversations\n .filter((c) => c.unreadCount > 0)\n .map((c) => c.id)\n .join('|');\n React.useEffect(() => {\n if (!unreadKey) return;\n unreadKey.split('|').forEach((id) => markDelivered(id));\n }, [unreadKey, markDelivered]);\n\n const applyConversationMessage = React.useCallback(\n (channelId: string, post: WirePost) => {\n if (!viewerId) return;\n setConversations((prev) => {\n const idx = prev.findIndex((c) => c.id === channelId);\n if (idx < 0) return prev;\n const updated = patchConversationAfterPost(prev[idx], post, viewerId);\n const rest = prev.filter((c) => c.id !== channelId);\n return sortConversations([updated, ...rest]);\n });\n },\n [viewerId],\n );\n\n const listSyncKey = opts?.syncListRealtime\n ? conversations\n .map((c) => c.id)\n .slice(0, 12)\n .join('|')\n : '';\n\n React.useEffect(() => {\n if (!opts?.syncListRealtime || !viewerId || !listSyncKey) return undefined;\n const channelIds = listSyncKey.split('|').filter(Boolean);\n const unsubs = channelIds.map((channelId) =>\n gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n applyConversationMessage(channelId, post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n const author = post.author?.id ?? post.creator?.id;\n if (author && String(author) !== viewerId) markDelivered(channelId);\n },\n },\n ),\n );\n return () => {\n unsubs.forEach((off) => off());\n };\n }, [gql, viewerId, listSyncKey, opts?.syncListRealtime, applyConversationMessage, markDelivered]);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const findExistingDirect = React.useCallback((peerUserId: string, peerName: string) => {\n const peerKey = String(peerUserId);\n const nameKey = peerName.trim().toLowerCase();\n return conversationsRef.current.find(\n (c) =>\n c.isDirect &&\n ((c.peer?.id && String(c.peer.id) === peerKey) ||\n (!c.peer?.id && c.title.trim().toLowerCase() === nameKey)),\n );\n }, []);\n\n const openDirect = React.useCallback(\n async (peerUserId: string, peerName: string): Promise<string | null> => {\n if (!isMongoAccountId(peerUserId) || peerUserId === viewerId) return null;\n const existing = findExistingDirect(peerUserId, peerName);\n if (existing) return existing.id;\n\n const res = await gql.mutate<{ createDirectChannel?: WireChannel | null }>(CREATE_DIRECT_CHANNEL_MUTATION, {\n receiver: [peerUserId],\n displayName: peerName,\n });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return null;\n }\n const channel = res.data?.createDirectChannel;\n if (!channel?.id || !viewerId) {\n // firstErrorMessage hides the null-Channel.id error, so a failed create would otherwise do nothing on tap.\n setError('Could not start this conversation. Please try again.');\n return null;\n }\n // Idempotent server-side, so an existing DM lands here too and just\n // merges over its own row rather than appearing twice.\n setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));\n return String(channel.id);\n },\n [gql, viewerId, findExistingDirect],\n );\n\n return {\n conversations,\n loading,\n error,\n refreshing,\n refresh: () => void load('refresh'),\n hasMore,\n loadingMore,\n loadMore: () => void loadMore(),\n markRead,\n setMutedUntil,\n setDraft,\n setListState,\n applyConversationUpdate,\n markDelivered,\n applyConversationMessage,\n openDirect,\n };\n}\n\nexport interface ThreadState {\n messages: ChatMessage[];\n loading: boolean;\n loadingMore: boolean;\n hasMore: boolean;\n error: string | null;\n /** Sends text; `replyTo` quotes another message, WhatsApp-style. */\n send: (body: string, replyTo?: ChatReplyRef | null) => Promise<void>;\n loadMore: () => void;\n retry: (messageId: string) => void;\n /**\n * Photos / a voice note, with an optional caption. Absent when the host has no media seam.\n * Uploads each file, then sends one message carrying them.\n */\n sendAttachments?: (\n files: ChatPickedImage[],\n caption: string,\n kind: ChatAttachmentKind,\n replyTo?: ChatReplyRef | null,\n ) => Promise<void>;\n /** Pick (or, with the same emoji / null, remove) the viewer's Tapback on a message. */\n react: (messageId: string, emoji: string | null) => void;\n /** Rewrite one of the viewer's own messages (within the edit window). */\n edit: (messageId: string, body: string) => void;\n /** WhatsApp's \"Delete for everyone\": a tombstone everyone sees. */\n deleteForEveryone: (messageId: string) => void;\n /** \"Delete for me\": hidden on this phone only. */\n deleteForMe: (messageId: string) => void;\n /** Star or unstar a message for the viewer. */\n star: (messageId: string, starred: boolean) => void;\n /** Read older pages until `messageId` is loaded (a quote or search result far up). Resolves whether it was found. */\n loadUntil: (messageId: string) => Promise<boolean>;\n}\n\nexport function useThread(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewer: ChatViewer | null,\n opts?: {\n onConversationMessage?: (post: WirePost) => void;\n /** An edit or delete-for-everyone, so the list preview can follow. */\n onConversationUpdate?: (post: WirePost) => void;\n media?: ChatMediaSeam;\n /** Where \"Delete for me\" remembers what this phone hides. */\n storage?: ChatStorageSeam;\n },\n): ThreadState {\n const [messages, setMessages] = React.useState<ChatMessage[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const [hasMore, setHasMore] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n /** Rows still in flight, so a retry can send them again. */\n const pending = React.useRef(new Map<string, PendingSend>());\n const media = opts?.media;\n\n const onConversationMessage = opts?.onConversationMessage;\n const notifyList = React.useCallback(\n (post: WirePost) => {\n if (!channelId) return;\n onConversationMessage?.(post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n },\n [channelId, gql, onConversationMessage],\n );\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const fetchPage = React.useCallback(\n async (skip: number) => {\n if (!channelId || !viewerId) return;\n const res = await gql.query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const rows = (res.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n setMessages((prev) =>\n mergeMessages(\n prev,\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n // Short page means the end. Offset paging can also repeat rows, but\n // mergeMessages de-duplicates so that is invisible.\n const total = res.data?.messages?.totalCount;\n setHasMore(typeof total === 'number' ? skip + rows.length < total : rows.length >= PAGE_SIZE);\n setError(firstErrorMessage(res.errors));\n setLoading(false);\n setLoadingMore(false);\n },\n [gql, channelId, viewerId],\n );\n\n // Reset hard when the channel changes: keeping the previous transcript for\n // even one frame shows the wrong conversation under the right title.\n React.useEffect(() => {\n let cancelled = false;\n setMessages([]);\n setHasMore(true);\n setLoading(true);\n pending.current.clear();\n if (channelId && viewerId) {\n // Paint the Apollo-cached head page immediately (a revisit shows the transcript with no\n // spinner); the network-only fetch below then replaces it with the server's truth.\n void gql\n .query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip: 0 },\n { fetchPolicy: 'cache-only' },\n )\n .then((cached) => {\n const rows = (cached.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n if (cancelled || !mounted.current || !rows.length) return;\n setMessages((prev) =>\n prev.length\n ? prev\n : mergeMessages(\n [],\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n setLoading(false);\n });\n }\n void fetchPage(0);\n return () => {\n cancelled = true;\n };\n }, [fetchPage, gql, channelId, viewerId]);\n\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void fetchPage(0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n // Live messages. The host owns socket retry; this just holds the handle.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n const incoming = toChatMessage(post, viewerId);\n // The echo of the viewer's own send arrives here too, so it\n // must reconcile rather than append.\n setMessages((prev) => reconcileOptimistic(prev, incoming));\n notifyList(post);\n },\n error: (err) => mounted.current && setError(err.message),\n },\n );\n }, [gql, channelId, viewerId, notifyList]);\n\n const send = React.useCallback(\n async (body: string, replyTo?: ChatReplyRef | null) => {\n const text = body.trim();\n if (!text || !channelId || !viewerId) return;\n\n const clientId = `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const optimistic: ChatMessage = {\n id: clientId,\n body: text,\n createdAt: Date.now(),\n authorId: viewerId,\n authorName: viewer?.displayName ?? 'You',\n authorAvatar: viewer?.avatarUrl ?? null,\n isMine: true,\n isDeleted: false,\n isEdited: false,\n attachments: [],\n reactions: [],\n replyTo: replyTo ?? null,\n sendState: 'sending',\n };\n pending.current.set(clientId, { body: text, replyTo });\n setMessages((prev) => mergeMessages(prev, [optimistic]));\n onConversationMessage?.({\n id: clientId,\n message: text,\n createdAt: new Date().toISOString(),\n creator: { id: viewerId },\n });\n\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n // extraProps land in post.props, which every client reads the quote back from.\n messageInput: { content: text, ...(replyTo ? { extraProps: { replyTo } } : {}) },\n });\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const saved = res.data?.sendMessage;\n if (message || !saved) {\n // Keep the text on screen and mark it failed. Dropping a\n // message the user typed is never acceptable.\n setMessages((prev) =>\n prev.map((m) => (m.id === clientId ? { ...m, sendState: 'failed' as const } : m)),\n );\n setError(message);\n return;\n }\n pending.current.delete(clientId);\n setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));\n notifyList(saved);\n },\n [gql, channelId, viewerId, viewer, notifyList, onConversationMessage],\n );\n\n const sendAttachments = React.useCallback(\n async (files: ChatPickedImage[], caption: string, kind: ChatAttachmentKind, replyTo?: ChatReplyRef | null) => {\n if (!media || !files.length || !channelId || !viewerId) return;\n const text = caption.trim();\n const postId = newPostId();\n const local: ChatAttachment[] = files.map((f, i) => ({\n id: `${postId}-${i}`,\n kind,\n name: f.name,\n mimeType: f.mimeType,\n url: f.uri,\n key: null,\n width: f.width ?? null,\n height: f.height ?? null,\n durationMs: f.durationMs ?? null,\n }));\n // The pending row carries the real post id, so the server copy replaces it in place.\n setMessages((prev) =>\n mergeMessages(prev, [\n {\n id: postId,\n body: text,\n createdAt: Date.now(),\n authorId: viewerId,\n authorName: viewer?.displayName ?? 'You',\n authorAvatar: viewer?.avatarUrl ?? null,\n isMine: true,\n isDeleted: false,\n isEdited: false,\n attachments: local,\n reactions: [],\n replyTo: replyTo ?? null,\n sendState: 'sending',\n },\n ]),\n );\n pending.current.set(postId, { body: text, files, kind, replyTo });\n\n const fail = (message: string) => {\n if (!mounted.current) return;\n setMessages((prev) => prev.map((m) => (m.id === postId ? { ...m, sendState: 'failed' as const } : m)));\n setError(message);\n };\n\n try {\n const links = await gql.mutate<{ createMessageFilesUploadLink?: string[] | null }>(\n CREATE_MESSAGE_UPLOAD_LINKS_MUTATION,\n { postId, filenames: files.map((f) => f.name) },\n );\n const urls = links.data?.createMessageFilesUploadLink ?? [];\n if (links.errors?.length || urls.length !== files.length) {\n fail(firstErrorMessage(links.errors) ?? 'Could not prepare the upload.');\n return;\n }\n await Promise.all(files.map((f, i) => media.putBytes(urls[i], f.uri, f.mimeType)));\n\n const attached = await gql.mutate<{ attachUploadedFilesToMessage?: { id: string }[] | null }>(\n ATTACH_UPLOADED_FILES_MUTATION,\n {\n postId,\n files: files.map((f, i) => ({\n name: f.name,\n mimeType: f.mimeType,\n size: f.byteSize ?? 0,\n width: f.width ?? null,\n height: f.height ?? null,\n url: urls[i].split('?')[0],\n })),\n },\n );\n const fileIds = (attached.data?.attachUploadedFilesToMessage ?? []).map((f) => f.id);\n if (attached.errors?.length || !fileIds.length) {\n fail(firstErrorMessage(attached.errors) ?? 'Could not attach the upload.');\n return;\n }\n\n const durationMs = kind === 'audio' ? files[0]?.durationMs : undefined;\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n postId,\n messageInput: {\n // messenger-box rejects blank text (it trims), so a photo / voice note on its\n // own carries its label; the bubble hides it again.\n content: text || ATTACHMENT_LABELS[kind],\n files: fileIds,\n extraProps: {\n attachmentKind: kind,\n ...(durationMs ? { voiceDurationMs: durationMs } : {}),\n ...(replyTo ? { replyTo } : {}),\n },\n },\n });\n if (!mounted.current) return;\n const saved = res.data?.sendMessage;\n if (res.errors?.length || !saved) {\n fail(firstErrorMessage(res.errors) ?? 'Could not send.');\n return;\n }\n pending.current.delete(postId);\n setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));\n notifyList(saved);\n } catch (e) {\n fail(e instanceof Error ? e.message : 'Could not send.');\n }\n },\n [media, gql, channelId, viewerId, viewer, notifyList],\n );\n\n const retry = React.useCallback(\n (messageId: string) => {\n const entry = pending.current.get(messageId);\n if (!entry) return;\n pending.current.delete(messageId);\n setMessages((prev) => prev.filter((m) => m.id !== messageId));\n if (entry.files?.length && entry.kind)\n void sendAttachments(entry.files, entry.body, entry.kind, entry.replyTo);\n else void send(entry.body, entry.replyTo);\n },\n [send, sendAttachments],\n );\n\n const loadMore = React.useCallback(() => {\n if (loadingMore || !hasMore || loading) return;\n setLoadingMore(true);\n // Count only server rows: optimistic ones are not in the server's\n // offset space and would skip a real message on the next page.\n void fetchPage(messages.filter((m) => !m.sendState || m.sendState === 'sent').length);\n }, [fetchPage, loadingMore, hasMore, loading, messages]);\n\n // Live Tapbacks from anyone in the conversation, including the viewer's other devices.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{\n chatReactionChanged?: { postId?: string | null; reactions?: WireReaction[] | null } | null;\n }>(\n REACTION_CHANGED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const event = data?.chatReactionChanged;\n if (!event?.postId || !mounted.current) return;\n setMessages((prev) => applyReactionSummary(prev, String(event.postId), event.reactions, viewerId));\n },\n },\n );\n }, [gql, channelId, viewerId]);\n\n const messagesRef = React.useRef(messages);\n messagesRef.current = messages;\n\n const react = React.useCallback(\n (messageId: string, emoji: string | null) => {\n if (!channelId || !viewerId) return;\n const target = messagesRef.current.find((m) => m.id === messageId);\n // Only confirmed server rows can carry reactions.\n if (!target || (target.sendState && target.sendState !== 'sent')) return;\n const before = target.reactions;\n const after = withViewerReaction(before, emoji, viewerId);\n const next = after.find((r) => r.mine)?.reaction ?? null;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: after } : m)));\n\n void (async () => {\n const res = await gql.mutate<{ setMessageReaction?: WireReaction[] | null }>(\n SET_MESSAGE_REACTION_MUTATION,\n { channelId, postId: messageId, reaction: next },\n );\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setMessageReaction) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: before } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the reaction.');\n return;\n }\n setMessages((prev) => applyReactionSummary(prev, messageId, res.data?.setMessageReaction, viewerId));\n })();\n },\n [gql, channelId, viewerId],\n );\n\n // Edits and deletes-for-everyone from anyone in the chat, including the viewer's other devices.\n const onConversationUpdate = opts?.onConversationUpdate;\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{ chatMessageUpdated?: WirePost | null }>(\n MESSAGE_UPDATED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageUpdated;\n if (!post?.id || !mounted.current) return;\n const updated = toChatMessage(post, viewerId);\n setMessages((prev) =>\n prev.map((m) => (m.id === updated.id ? { ...updated, sendState: m.sendState } : m)),\n );\n onConversationUpdate?.(post);\n },\n },\n );\n }, [gql, channelId, viewerId, onConversationUpdate]);\n\n const messageIdOf = React.useCallback(\n (messageId: string) => ({ channelId: String(channelId), messageId }),\n [channelId],\n );\n\n const edit = React.useCallback(\n (messageId: string, body: string) => {\n const text = body.trim();\n if (!channelId || !viewerId || !text) return;\n const before = messagesRef.current.find((m) => m.id === messageId);\n if (!before || before.body === text) return;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, body: text, isEdited: true } : m)));\n void (async () => {\n const res = await gql.mutate<{ editMessage?: WirePost | null }>(EDIT_MESSAGE_MUTATION, {\n messageId: messageIdOf(messageId),\n messageInput: { content: text },\n });\n if (!mounted.current) return;\n const saved = res.data?.editMessage;\n if (res.errors?.length || !saved) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? before : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not edit the message.');\n return;\n }\n setMessages((prev) => prev.map((m) => (m.id === messageId ? toChatMessage(saved, viewerId) : m)));\n onConversationUpdate?.(saved);\n })();\n },\n [gql, channelId, viewerId, messageIdOf, onConversationUpdate],\n );\n\n const deleteForEveryone = React.useCallback(\n (messageId: string) => {\n if (!channelId || !viewerId) return;\n const before = messagesRef.current.find((m) => m.id === messageId);\n if (!before) return;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId ? { ...m, isDeleted: true, body: '', attachments: [], replyTo: null } : m,\n ),\n );\n void (async () => {\n const res = await gql.mutate<{ deleteMessageForEveryone?: WirePost | null }>(\n DELETE_MESSAGE_FOR_EVERYONE_MUTATION,\n { messageId: messageIdOf(messageId) },\n );\n if (!mounted.current) return;\n const saved = res.data?.deleteMessageForEveryone;\n if (res.errors?.length || !saved) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? before : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not delete the message.');\n return;\n }\n onConversationUpdate?.(saved);\n })();\n },\n [gql, channelId, viewerId, messageIdOf, onConversationUpdate],\n );\n\n // \"Delete for me\" is this phone's own list of hidden messages, per chat.\n const storage = opts?.storage;\n const hiddenKey = channelId ? `chat-hidden:${channelId}` : null;\n const [hidden, setHidden] = React.useState<ReadonlySet<string>>(() => new Set());\n React.useEffect(() => {\n setHidden(new Set());\n if (!storage || !hiddenKey) return;\n storage\n .get(hiddenKey)\n .then((raw) => {\n const ids = raw ? (JSON.parse(raw) as unknown) : [];\n if (mounted.current && Array.isArray(ids)) setHidden(new Set(ids.filter((i) => typeof i === 'string')));\n })\n .catch(() => undefined);\n }, [storage, hiddenKey]);\n const deleteForMe = React.useCallback(\n (messageId: string) => {\n setHidden((prev) => {\n const next = new Set(prev);\n next.add(messageId);\n // Bounded: the newest 500 hidden ids per chat are plenty for a phone.\n if (storage && hiddenKey) {\n storage.set(hiddenKey, JSON.stringify(Array.from(next).slice(-500))).catch(() => undefined);\n }\n return next;\n });\n },\n [storage, hiddenKey],\n );\n\n const star = React.useCallback(\n (messageId: string, starred: boolean) => {\n if (!channelId || !viewerId) return;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, starred } : m)));\n void (async () => {\n const res = await gql.mutate<{ setMessageStarred?: boolean | null }>(SET_MESSAGE_STARRED_MUTATION, {\n messageId: messageIdOf(messageId),\n starred,\n });\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setMessageStarred) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, starred: !starred } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the star.');\n }\n })();\n },\n [gql, channelId, viewerId, messageIdOf],\n );\n\n const loadUntil = React.useCallback(\n async (messageId: string): Promise<boolean> => {\n for (let page = 0; page < MAX_PAGES_TO_FIND; page += 1) {\n if (messagesRef.current.some((m) => m.id === messageId)) return true;\n const served = messagesRef.current.filter((m) => !m.sendState || m.sendState === 'sent').length;\n const before = messagesRef.current.length;\n // eslint-disable-next-line no-await-in-loop -- each page depends on the one before\n await fetchPage(served);\n if (messagesRef.current.length === before) break;\n }\n return messagesRef.current.some((m) => m.id === messageId);\n },\n [fetchPage],\n );\n\n const visibleMessages = React.useMemo(\n () => (hidden.size ? messages.filter((m) => !hidden.has(m.id)) : messages),\n [messages, hidden],\n );\n\n return {\n messages: visibleMessages,\n loading,\n loadingMore,\n hasMore,\n error,\n send,\n sendAttachments: media ? sendAttachments : undefined,\n loadMore,\n retry,\n react,\n edit,\n deleteForEveryone,\n deleteForMe,\n star,\n loadUntil,\n };\n}\n\n/** How often the open chat re-reads who has seen it, while the viewer's last message is unread. */\nconst READ_STATE_POLL_MS = 8_000;\n\n/**\n * The open chat's read and delivered watermarks, kept fresh while they matter.\n *\n * The server has no \"someone opened the chat\" event, so while `waiting` (the viewer's\n * newest message is not read yet) this re-reads the members' `lastViewedAt` every few\n * seconds and on every reconnect, and stops as soon as nothing is waiting. Returns the\n * newest watermarks seen (0 until the first read); callers take the max with what the\n * list already knew, since a watermark only moves forward.\n */\nexport function useReadWatermark(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewerId: string | null,\n waiting: boolean,\n): { read: number; delivered: number } {\n const [watermark, setWatermark] = React.useState({ read: 0, delivered: 0 });\n React.useEffect(() => setWatermark({ read: 0, delivered: 0 }), [channelId]);\n\n React.useEffect(() => {\n if (!channelId || !viewerId || !waiting) return undefined;\n let alive = true;\n const read = async () => {\n const res = await gql.query<{ viewChannelDetail?: WireChannel | null }>(\n CHANNEL_READ_STATE_QUERY,\n { id: channelId },\n { fetchPolicy: 'no-cache' },\n );\n const channel = res.data?.viewChannelDetail;\n if (!alive || !channel) return;\n const read = readWatermarkOf(channel, viewerId);\n const delivered = deliveredWatermarkOf(channel, viewerId);\n setWatermark((prev) =>\n read <= prev.read && delivered <= prev.delivered\n ? prev\n : { read: Math.max(prev.read, read), delivered: Math.max(prev.delivered, delivered) },\n );\n };\n void read();\n const timer = setInterval(read, READ_STATE_POLL_MS);\n return () => {\n alive = false;\n clearInterval(timer);\n };\n }, [gql, channelId, viewerId, waiting, gql.reconnectEpoch]);\n\n return watermark;\n}\n\n/** Fire-and-forget read receipt; the badge is already cleared locally. */\nexport function useMarkRead(gql: ChatGraphQLSeam, channelId: string | null, onMarked: (id: string) => void) {\n React.useEffect(() => {\n if (!channelId) return;\n onMarked(channelId);\n void gql.mutate(VIEW_CHANNEL_MUTATION, { id: channelId });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channelId]);\n}\n\n/** Re-send \"typing\" this often while the person keeps typing; stop after this long without a key. */\nconst TYPING_REFRESH_MS = 4_000;\nconst TYPING_IDLE_MS = 5_000;\n/** Forget someone's \"typing\" when no refresh arrives for this long (their app closed mid-word). */\nconst TYPING_EXPIRE_MS = 7_000;\n\nexport interface TypingState {\n /** Ids of the other people typing right now, oldest first. */\n typingUserIds: string[];\n /** Call on every composer change; sends start / stop as WhatsApp does. */\n onDraftChange: (text: string) => void;\n /** The message went out: stop at once. */\n onSent: () => void;\n}\n\n/** \"typing…\" both ways for one open chat. */\nexport function useTyping(gql: ChatGraphQLSeam, channelId: string | null, viewerId: string | null): TypingState {\n const [typing, setTyping] = React.useState<Record<string, number>>({});\n const lastStart = React.useRef(0);\n const idleTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const active = React.useRef(false);\n\n React.useEffect(() => {\n setTyping({});\n if (!channelId || !viewerId) return undefined;\n const off = gql.subscribe<{ typingIndicator?: { userId?: string | null; action?: string | null } | null }>(\n TYPING_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const event = data?.typingIndicator;\n const who = event?.userId ? String(event.userId) : '';\n if (!who || who === viewerId) return;\n setTyping((prev) => {\n const next = { ...prev };\n if (event?.action === 'start') next[who] = Date.now();\n else delete next[who];\n return next;\n });\n },\n },\n );\n const sweep = setInterval(() => {\n setTyping((prev) => {\n const now = Date.now();\n const kept = Object.entries(prev).filter(([, at]) => now - at < TYPING_EXPIRE_MS);\n return kept.length === Object.keys(prev).length ? prev : Object.fromEntries(kept);\n });\n }, 1_000);\n return () => {\n off();\n clearInterval(sweep);\n };\n }, [gql, channelId, viewerId]);\n\n const send = React.useCallback(\n (action: 'start' | 'stop') => {\n if (!channelId) return;\n void gql.mutate(SEND_TYPING_MUTATION, { channelId, action });\n },\n [gql, channelId],\n );\n\n const stop = React.useCallback(() => {\n if (idleTimer.current) clearTimeout(idleTimer.current);\n idleTimer.current = null;\n if (!active.current) return;\n active.current = false;\n lastStart.current = 0;\n send('stop');\n }, [send]);\n\n const onDraftChange = React.useCallback(\n (text: string) => {\n if (!text.trim()) {\n stop();\n return;\n }\n const now = Date.now();\n if (!active.current || now - lastStart.current > TYPING_REFRESH_MS) {\n active.current = true;\n lastStart.current = now;\n send('start');\n }\n if (idleTimer.current) clearTimeout(idleTimer.current);\n idleTimer.current = setTimeout(stop, TYPING_IDLE_MS);\n },\n [send, stop],\n );\n\n // Leaving the chat stops the indicator for everyone else.\n React.useEffect(() => stop, [channelId, stop]);\n\n const typingUserIds = React.useMemo(\n () =>\n Object.entries(typing)\n .sort((a, b) => a[1] - b[1])\n .map(([id]) => id),\n [typing],\n );\n return { typingUserIds, onDraftChange, onSent: stop };\n}\n\n/**\n * Forward a message to other chats, WhatsApp-style: the text goes out as a new message in each,\n * marked \"Forwarded\". Resolves the chats it reached.\n */\nexport async function forwardMessage(\n gql: ChatGraphQLSeam,\n body: string,\n channelIds: string[],\n): Promise<{ sent: string[]; posts: Array<{ channelId: string; post: WirePost }> }> {\n const text = body.trim();\n const sent: string[] = [];\n const posts: Array<{ channelId: string; post: WirePost }> = [];\n if (!text) return { sent, posts };\n await Promise.all(\n channelIds.map(async (channelId) => {\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n messageInput: { content: text, extraProps: { forwarded: true } },\n });\n const post = res.data?.sendMessage;\n if (post && !res.errors?.length) {\n sent.push(channelId);\n posts.push({ channelId, post });\n }\n }),\n );\n return { sent, posts };\n}\n"],"names":["_a","_b","_c","read"],"mappings":"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"}
1
+ {"version":3,"file":"useChatData.js","sources":["../../../src/features/messaging/useChatData.ts"],"sourcesContent":["/**\n * The chat surface's data layer: conversations, one transcript, and sending.\n *\n * Hooks rather than a store, because the remote must not pull in redux or\n * Apollo - everything reaches the network through `ChatGraphQLSeam`. The\n * shaping and merging all live in `chatModel.ts` as pure functions; what is\n * here is the effect wiring around them.\n *\n * Two behaviours are worth knowing about:\n *\n * - **`reconnectEpoch` drives recovery.** The host bumps it on every\n * successful (re)connect. Both hooks re-fetch their head page when it\n * changes, because a dropped socket means missed subscription frames and the\n * only honest fix is to re-read. Merging is idempotent, so healing a gap\n * never duplicates anything.\n * - **Errors are state, not exceptions.** The seam resolves with `{data,\n * errors}` and never rejects, so a failure renders an inline banner over\n * whatever is already on screen instead of unmounting the transcript.\n */\nimport * as React from 'react';\nimport {\n CHANNELS_QUERY,\n CREATE_DIRECT_CHANNEL_MUTATION,\n CREATE_GROUP_CHANNEL_MUTATION,\n ADD_GROUP_MEMBERS_MUTATION,\n REMOVE_GROUP_MEMBER_MUTATION,\n LEAVE_GROUP_MUTATION,\n SET_GROUP_ADMIN_MUTATION,\n UPDATE_GROUP_INFO_MUTATION,\n SET_GROUP_SEND_POLICY_MUTATION,\n MESSAGES_QUERY,\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n REACTION_CHANGED_SUBSCRIPTION_WS,\n SEND_MESSAGE_MUTATION,\n CREATE_MESSAGE_UPLOAD_LINKS_MUTATION,\n ATTACH_UPLOADED_FILES_MUTATION,\n SET_MESSAGE_REACTION_MUTATION,\n VIEW_CHANNEL_MUTATION,\n CHANNEL_READ_STATE_QUERY,\n DELETE_MESSAGE_FOR_EVERYONE_MUTATION,\n EDIT_MESSAGE_MUTATION,\n MARK_CHANNEL_DELIVERED_MUTATION,\n MESSAGE_UPDATED_SUBSCRIPTION_WS,\n SEND_TYPING_MUTATION,\n SET_CHANNEL_LIST_STATE_MUTATION,\n SET_MESSAGE_STARRED_MUTATION,\n TYPING_SUBSCRIPTION_WS,\n SET_DISAPPEARING_MUTATION,\n KEEP_MESSAGE_MUTATION,\n CREATE_POLL_MUTATION,\n VOTE_POLL_MUTATION,\n BLOCK_CONTACT_MUTATION,\n UNBLOCK_CONTACT_MUTATION,\n BLOCKED_CONTACTS_QUERY,\n REPORT_TARGET_MUTATION,\n} from './chatOperations';\nimport {\n applyReactionSummary,\n withViewerReaction,\n type WireReaction,\n mergeConversations,\n mergeMessages,\n patchConversationAfterPost,\n patchConversationAfterUpdate,\n readWatermarkOf,\n deliveredWatermarkOf,\n reconcileOptimistic,\n sortConversations,\n toChatMessage,\n toConversation,\n type ChatConversation,\n type ChatMessage,\n type WireChannel,\n type WirePost,\n ATTACHMENT_LABELS,\n type ChatAttachment,\n type ChatAttachmentKind,\n type ChatReplyRef,\n withViewerPollVote,\n} from './chatModel';\nimport type {\n ChatGraphQLSeam,\n ChatHostServices,\n ChatMediaSeam,\n ChatPickedImage,\n ChatStorageSeam,\n ChatViewer,\n} from './chatHost';\nimport {\n isMongoAccountId,\n isNativeMessengerChannel,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n NATIVE_CHAT_LIST_PAGE_SIZE,\n} from './nativeChatChannelQuery';\n\n/** A Mongo ObjectId made on the device: attachment posts are named before they exist. */\nfunction newPostId(): string {\n const seconds = Math.floor(Date.now() / 1000)\n .toString(16)\n .padStart(8, '0');\n let rest = '';\n for (let i = 0; i < 16; i += 1) rest += Math.floor(Math.random() * 16).toString(16);\n return seconds + rest;\n}\n\n/** A row still in flight: what a retry needs to send it again. */\ninterface PendingSend {\n body: string;\n files?: ChatPickedImage[];\n kind?: ChatAttachmentKind;\n replyTo?: ChatReplyRef | null;\n mentions?: string[];\n}\n\n/** Messages fetched per page in a thread. */\nconst PAGE_SIZE = 20;\n/** How far back a jump to a quoted or searched message will page: 10 pages = 200 messages. */\nconst MAX_PAGES_TO_FIND = 10;\n/** One \"delivered\" per chat per this long is plenty: it is a watermark, not a per-message receipt. */\nconst DELIVERED_THROTTLE_MS = 10_000;\n\nfunction firstErrorMessage(errors?: { message: string }[]): string | null {\n if (!errors?.length) return null;\n const raw = errors[0].message || 'Something went wrong.';\n if (/Cannot return null for non-nullable field Channel\\.id/i.test(raw)) return null;\n if (/status code 400/i.test(raw)) return 'Could not load messages for this chat.';\n if (/status code 401/i.test(raw) || /status code 403/i.test(raw))\n return 'You do not have access to this conversation.';\n return raw;\n}\n\ninterface MessagesQueryPayload {\n messages?: {\n data?: (WirePost | null)[] | null;\n totalCount?: number | null;\n } | null;\n}\n\nfunction sortChannelsByRecentActivity(rows: WireChannel[]): WireChannel[] {\n return [...rows].sort((left, right) => {\n const leftTime = left.lastPostAt ? new Date(left.lastPostAt).getTime() : 0;\n const rightTime = right.lastPostAt ? new Date(right.lastPostAt).getTime() : 0;\n return rightTime - leftTime;\n });\n}\n\nexport interface ConversationsState {\n conversations: ChatConversation[];\n loading: boolean;\n error: string | null;\n refreshing: boolean;\n refresh: () => void;\n /** More conversations exist on the server beyond what is loaded. */\n hasMore: boolean;\n loadingMore: boolean;\n /** Fetch the next page of conversations. */\n loadMore: () => void;\n /** Locally zero the badge so the list responds before the server confirms. */\n markRead: (channelId: string) => void;\n /** Locally set a chat's mute (epoch millis, 0 = unmuted) ahead of the server's answer. */\n setMutedUntil: (channelId: string, mutedUntil: number) => void;\n /** Show the viewer's unsent text for a chat in the list, ahead of the server copy. */\n setDraft: (channelId: string, draft: string) => void;\n /** Pin / archive a chat in the viewer's list (optimistic; reverts with an error on failure). */\n setListState: (channelId: string, state: { pinned?: boolean; archived?: boolean }) => void;\n /** An edit or delete-for-everyone landed: refresh the row's preview if it was the newest message. */\n applyConversationUpdate: (channelId: string, post: WirePost) => void;\n /** Tell the server this phone has a chat's messages (two gray ticks for the sender). Throttled. */\n markDelivered: (channelId: string) => void;\n /** Move a row to the top with an updated preview after send/subscription. */\n applyConversationMessage: (channelId: string, post: WirePost) => void;\n openDirect: (peerUserId: string, peerName: string) => Promise<string | null>;\n /** Create a group; resolves the new channel id (null on failure). */\n createGroup: (name: string, memberIds: string[], description?: string) => Promise<string | null>;\n addGroupMembers: (channelId: string, memberIds: string[]) => Promise<string | null>;\n removeGroupMember: (channelId: string, memberId: string) => Promise<string | null>;\n setGroupAdmin: (channelId: string, memberId: string, admin: boolean) => Promise<string | null>;\n updateGroupInfo: (channelId: string, changes: { name?: string; description?: string }) => Promise<string | null>;\n setGroupSendPolicy: (channelId: string, onlyAdmins: boolean) => Promise<string | null>;\n /** Leave a group; resolves true when done. The chat leaves the list. */\n leaveGroup: (channelId: string) => Promise<boolean>;\n /** Turn disappearing messages on (seconds) or off (0) for a chat; resolves the channel id. */\n setDisappearing: (channelId: string, seconds: number) => Promise<string | null>;\n /** Block / unblock a contact (one-directional, silent). Optimistic; resolves true on success. */\n blockContact: (userId: string) => Promise<boolean>;\n unblockContact: (userId: string) => Promise<boolean>;\n /** Report a contact / group / message; alsoBlock does WhatsApp's \"Report and block\". */\n reportTarget: (\n targetType: 'CONTACT' | 'GROUP' | 'MESSAGE',\n targetId: string,\n opts?: { reason?: string; alsoBlock?: boolean },\n ) => Promise<boolean>;\n /** Whether the viewer has blocked this peer (for the Block/Unblock toggle). */\n isPeerBlocked: (userId: string | null | undefined) => boolean;\n}\n\nexport function useConversations(\n services: ChatHostServices,\n viewer: ChatViewer | null,\n opts?: {\n syncListRealtime?: boolean;\n /** Wait for host to set yantra-chat org before querying. */ listQueryEnabled?: boolean;\n },\n): ConversationsState {\n const { gql } = services;\n const [conversations, setConversations] = React.useState<ChatConversation[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [refreshing, setRefreshing] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n /** Peers the viewer has blocked, for the Block/Unblock toggle. Loaded once, kept optimistic. */\n const [blockedPeers, setBlockedPeers] = React.useState<Set<string>>(() => new Set());\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n const conversationsRef = React.useRef<ChatConversation[]>([]);\n /** Raw server rows consumed so far (before the client-side filter), i.e. the next `skip`. */\n const serverOffset = React.useRef(0);\n\n React.useEffect(() => {\n conversationsRef.current = conversations;\n }, [conversations]);\n\n const listQueryEnabled = opts?.listQueryEnabled !== false;\n\n const load = React.useCallback(\n async (mode: 'initial' | 'refresh') => {\n if (!viewerId || !listQueryEnabled) return;\n if (mode === 'refresh') setRefreshing(true);\n if (mode === 'initial') {\n // Paint the Apollo-cached list immediately; the network read below replaces it.\n const cached = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n { fetchPolicy: 'cache-only' },\n );\n const cachedRows = (cached.data?.channelsByUser ?? [])\n .filter(Boolean)\n .filter(isNativeMessengerChannel) as WireChannel[];\n if (mounted.current && cachedRows.length) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(cachedRows).map((c) => toConversation(c, viewerId)),\n ),\n );\n setLoading(false);\n }\n }\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n // network-only: a stale conversation list is the single most\n // visible staleness in a chat app, and this is one small page.\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n\n // Partial data with errors is normal here (one bad channel should\n // not blank the list), so render what arrived AND show the banner.\n // Initial/refresh always resets to the first page.\n if (rows.length || !message) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(rows).map((c) => toConversation(c, viewerId)),\n ),\n );\n serverOffset.current = raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoading(false);\n setRefreshing(false);\n },\n [gql, viewerId, listQueryEnabled],\n );\n\n const loadMore = React.useCallback(async () => {\n if (!viewerId || !listQueryEnabled || !hasMore || loadingMore || loading) return;\n setLoadingMore(true);\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n { ...NATIVE_CHAT_CHANNELS_QUERY_VARS, skip: serverOffset.current },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n if (rows.length) {\n setConversations((prev) =>\n mergeConversations(\n prev,\n rows.map((c) => toConversation(c, viewerId)),\n ),\n );\n }\n if (!message) {\n serverOffset.current += raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoadingMore(false);\n }, [gql, viewerId, listQueryEnabled, hasMore, loadingMore, loading]);\n\n React.useEffect(() => {\n if (!listQueryEnabled) {\n setLoading(true);\n return;\n }\n void load('initial');\n }, [load, listQueryEnabled]);\n\n // Re-read the list on every reconnect: while the socket was down the list\n // could have moved for reasons no subscription frame will now tell us.\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void load('refresh');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n const markRead = React.useCallback((channelId: string) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId ? { ...c, unreadCount: 0 } : c)));\n }, []);\n\n const setMutedUntil = React.useCallback((channelId: string, mutedUntil: number) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId ? { ...c, mutedUntil } : c)));\n }, []);\n\n const setDraft = React.useCallback((channelId: string, draft: string) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId && c.draft !== draft ? { ...c, draft } : c)));\n }, []);\n\n const setListState = React.useCallback(\n (channelId: string, state: { pinned?: boolean; archived?: boolean }) => {\n const before = conversationsRef.current.find((c) => c.id === channelId);\n if (!before) return;\n const now = Date.now();\n const patch: Partial<ChatConversation> = {};\n if (typeof state.archived === 'boolean') {\n patch.archivedAt = state.archived ? now : 0;\n if (state.archived) patch.pinnedAt = 0;\n }\n if (typeof state.pinned === 'boolean' && !state.archived) patch.pinnedAt = state.pinned ? now : 0;\n setConversations((prev) =>\n sortConversations(prev.map((c) => (c.id === channelId ? { ...c, ...patch } : c))),\n );\n void (async () => {\n const res = await gql.mutate<{ setChannelListState?: boolean | null }>(\n SET_CHANNEL_LIST_STATE_MUTATION,\n {\n channelId,\n ...state,\n },\n );\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setChannelListState) {\n setConversations((prev) => sortConversations(prev.map((c) => (c.id === channelId ? before : c))));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the chat list.');\n }\n })();\n },\n [gql],\n );\n\n const applyConversationUpdate = React.useCallback(\n (channelId: string, post: WirePost) => {\n if (!viewerId) return;\n setConversations((prev) =>\n prev.map((c) => (c.id === channelId ? patchConversationAfterUpdate(c, post, viewerId) : c)),\n );\n },\n [viewerId],\n );\n\n const deliveredAt = React.useRef(new Map<string, number>());\n const markDelivered = React.useCallback(\n (channelId: string) => {\n const last = deliveredAt.current.get(channelId) ?? 0;\n if (Date.now() - last < DELIVERED_THROTTLE_MS) return;\n deliveredAt.current.set(channelId, Date.now());\n void gql.mutate(MARK_CHANNEL_DELIVERED_MUTATION, { channelId });\n },\n [gql],\n );\n\n // Opening the app delivers whatever arrived while it was closed: every chat with unread messages.\n const unreadKey = conversations\n .filter((c) => c.unreadCount > 0)\n .map((c) => c.id)\n .join('|');\n React.useEffect(() => {\n if (!unreadKey) return;\n unreadKey.split('|').forEach((id) => markDelivered(id));\n }, [unreadKey, markDelivered]);\n\n const applyConversationMessage = React.useCallback(\n (channelId: string, post: WirePost) => {\n if (!viewerId) return;\n setConversations((prev) => {\n const idx = prev.findIndex((c) => c.id === channelId);\n if (idx < 0) return prev;\n const updated = patchConversationAfterPost(prev[idx], post, viewerId);\n const rest = prev.filter((c) => c.id !== channelId);\n return sortConversations([updated, ...rest]);\n });\n },\n [viewerId],\n );\n\n const listSyncKey = opts?.syncListRealtime\n ? conversations\n .map((c) => c.id)\n .slice(0, 12)\n .join('|')\n : '';\n\n React.useEffect(() => {\n if (!opts?.syncListRealtime || !viewerId || !listSyncKey) return undefined;\n const channelIds = listSyncKey.split('|').filter(Boolean);\n const unsubs = channelIds.map((channelId) =>\n gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n applyConversationMessage(channelId, post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n const author = post.author?.id ?? post.creator?.id;\n if (author && String(author) !== viewerId) markDelivered(channelId);\n },\n },\n ),\n );\n return () => {\n unsubs.forEach((off) => off());\n };\n }, [gql, viewerId, listSyncKey, opts?.syncListRealtime, applyConversationMessage, markDelivered]);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const findExistingDirect = React.useCallback((peerUserId: string, peerName: string) => {\n const peerKey = String(peerUserId);\n const nameKey = peerName.trim().toLowerCase();\n return conversationsRef.current.find(\n (c) =>\n c.isDirect &&\n ((c.peer?.id && String(c.peer.id) === peerKey) ||\n (!c.peer?.id && c.title.trim().toLowerCase() === nameKey)),\n );\n }, []);\n\n const openDirect = React.useCallback(\n async (peerUserId: string, peerName: string): Promise<string | null> => {\n if (!isMongoAccountId(peerUserId) || peerUserId === viewerId) return null;\n const existing = findExistingDirect(peerUserId, peerName);\n if (existing) return existing.id;\n\n const res = await gql.mutate<{ createDirectChannel?: WireChannel | null }>(CREATE_DIRECT_CHANNEL_MUTATION, {\n receiver: [peerUserId],\n displayName: peerName,\n });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return null;\n }\n const channel = res.data?.createDirectChannel;\n if (!channel?.id || !viewerId) {\n // firstErrorMessage hides the null-Channel.id error, so a failed create would otherwise do nothing on tap.\n setError('Could not start this conversation. Please try again.');\n return null;\n }\n // Idempotent server-side, so an existing DM lands here too and just\n // merges over its own row rather than appearing twice.\n setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));\n return String(channel.id);\n },\n [gql, viewerId, findExistingDirect],\n );\n\n // --- WhatsApp-style group management. Each mutation returns the updated channel; we merge it\n // over its list row so the group, its members and its settings refresh at once. On failure\n // the error banner shows and the optimistic UI is left to the caller. ---\n const runGroupMutation = React.useCallback(\n async (op: string, variables: Record<string, unknown>): Promise<string | null> => {\n const res = await gql.mutate<Record<string, WireChannel | null>>(op, variables);\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return null;\n }\n const channel = res.data ? Object.values(res.data)[0] : null;\n if (!channel?.id || !viewerId) {\n setError('Something went wrong. Please try again.');\n return null;\n }\n setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));\n return String(channel.id);\n },\n [gql, viewerId],\n );\n\n const createGroup = React.useCallback(\n (name: string, memberIds: string[], description?: string) =>\n runGroupMutation(CREATE_GROUP_CHANNEL_MUTATION, { name, memberIds, description: description ?? null }),\n [runGroupMutation],\n );\n const addGroupMembers = React.useCallback(\n (channelId: string, memberIds: string[]) =>\n runGroupMutation(ADD_GROUP_MEMBERS_MUTATION, { channelId, memberIds }),\n [runGroupMutation],\n );\n const removeGroupMember = React.useCallback(\n (channelId: string, memberId: string) =>\n runGroupMutation(REMOVE_GROUP_MEMBER_MUTATION, { channelId, memberId }),\n [runGroupMutation],\n );\n const setGroupAdmin = React.useCallback(\n (channelId: string, memberId: string, admin: boolean) =>\n runGroupMutation(SET_GROUP_ADMIN_MUTATION, { channelId, memberId, admin }),\n [runGroupMutation],\n );\n const updateGroupInfo = React.useCallback(\n (channelId: string, changes: { name?: string; description?: string }) =>\n runGroupMutation(UPDATE_GROUP_INFO_MUTATION, {\n channelId,\n name: changes.name ?? null,\n description: changes.description ?? null,\n }),\n [runGroupMutation],\n );\n const setGroupSendPolicy = React.useCallback(\n (channelId: string, onlyAdmins: boolean) =>\n runGroupMutation(SET_GROUP_SEND_POLICY_MUTATION, { channelId, onlyAdmins }),\n [runGroupMutation],\n );\n const leaveGroup = React.useCallback(\n async (channelId: string): Promise<boolean> => {\n const res = await gql.mutate<{ leaveGroup?: boolean | null }>(LEAVE_GROUP_MUTATION, { channelId });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return false;\n }\n // Left the group: it leaves the list.\n setConversations((prev) => prev.filter((c) => c.id !== channelId));\n return true;\n },\n [gql],\n );\n\n const setDisappearing = React.useCallback(\n (channelId: string, seconds: number) =>\n runGroupMutation(SET_DISAPPEARING_MUTATION, { channelId, seconds: Math.max(0, Math.floor(seconds)) }),\n [runGroupMutation],\n );\n\n // Block list: load the viewer's blocked peers once so the info screen can show Block vs Unblock.\n React.useEffect(() => {\n if (!viewerId || !listQueryEnabled) return;\n let cancelled = false;\n void (async () => {\n const res = await gql\n .query<{ blockedContacts?: unknown }>(BLOCKED_CONTACTS_QUERY, {}, { fetchPolicy: 'network-only' })\n .catch(() => null);\n const raw = res?.data?.blockedContacts;\n const rows: Array<Record<string, unknown>> = Array.isArray(raw)\n ? (raw as Array<Record<string, unknown>>)\n : [];\n if (cancelled) return;\n const ids = rows.map((r) => String(r?.userId ?? '')).filter(Boolean);\n setBlockedPeers(new Set(ids));\n })();\n return () => {\n cancelled = true;\n };\n }, [gql, viewerId, listQueryEnabled]);\n\n const isPeerBlocked = React.useCallback(\n (userId: string | null | undefined) => Boolean(userId) && blockedPeers.has(String(userId)),\n [blockedPeers],\n );\n\n const blockContact = React.useCallback(\n async (userId: string): Promise<boolean> => {\n if (!userId) return false;\n // Optimistic: flip the toggle immediately, revert if the server rejects.\n setBlockedPeers((prev) => new Set(prev).add(String(userId)));\n const res = await gql.mutate<{ blockContact?: boolean | null }>(BLOCK_CONTACT_MUTATION, { userId });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setBlockedPeers((prev) => {\n const next = new Set(prev);\n next.delete(String(userId));\n return next;\n });\n setError(message);\n return false;\n }\n return true;\n },\n [gql],\n );\n\n const unblockContact = React.useCallback(\n async (userId: string): Promise<boolean> => {\n if (!userId) return false;\n setBlockedPeers((prev) => {\n const next = new Set(prev);\n next.delete(String(userId));\n return next;\n });\n const res = await gql.mutate<{ unblockContact?: boolean | null }>(UNBLOCK_CONTACT_MUTATION, { userId });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setBlockedPeers((prev) => new Set(prev).add(String(userId)));\n setError(message);\n return false;\n }\n return true;\n },\n [gql],\n );\n\n const reportTarget = React.useCallback(\n async (\n targetType: 'CONTACT' | 'GROUP' | 'MESSAGE',\n targetId: string,\n reportOpts?: { reason?: string; alsoBlock?: boolean },\n ): Promise<boolean> => {\n if (!targetId) return false;\n const res = await gql.mutate<{ reportTarget?: boolean | null }>(REPORT_TARGET_MUTATION, {\n targetType,\n targetId,\n reason: reportOpts?.reason ?? null,\n alsoBlock: reportOpts?.alsoBlock ?? false,\n });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return false;\n }\n // \"Report and block\" also blocked a contact / the message author: reflect it in the toggle.\n if (reportOpts?.alsoBlock && targetType === 'CONTACT') {\n setBlockedPeers((prev) => new Set(prev).add(String(targetId)));\n }\n return true;\n },\n [gql],\n );\n\n return {\n conversations,\n loading,\n error,\n refreshing,\n refresh: () => void load('refresh'),\n hasMore,\n loadingMore,\n loadMore: () => void loadMore(),\n markRead,\n setMutedUntil,\n setDraft,\n setListState,\n applyConversationUpdate,\n markDelivered,\n applyConversationMessage,\n openDirect,\n createGroup,\n addGroupMembers,\n removeGroupMember,\n setGroupAdmin,\n updateGroupInfo,\n setGroupSendPolicy,\n leaveGroup,\n setDisappearing,\n blockContact,\n unblockContact,\n reportTarget,\n isPeerBlocked,\n };\n}\n\nexport interface ThreadState {\n messages: ChatMessage[];\n loading: boolean;\n loadingMore: boolean;\n hasMore: boolean;\n error: string | null;\n /** Sends text; `replyTo` quotes another message, WhatsApp-style. */\n send: (body: string, replyTo?: ChatReplyRef | null, mentions?: string[]) => Promise<void>;\n loadMore: () => void;\n retry: (messageId: string) => void;\n /**\n * Photos / a voice note, with an optional caption. Absent when the host has no media seam.\n * Uploads each file, then sends one message carrying them.\n */\n sendAttachments?: (\n files: ChatPickedImage[],\n caption: string,\n kind: ChatAttachmentKind,\n replyTo?: ChatReplyRef | null,\n ) => Promise<void>;\n /** Pick (or, with the same emoji / null, remove) the viewer's Tapback on a message. */\n react: (messageId: string, emoji: string | null) => void;\n /** Rewrite one of the viewer's own messages (within the edit window). */\n edit: (messageId: string, body: string) => void;\n /** WhatsApp's \"Delete for everyone\": a tombstone everyone sees. */\n deleteForEveryone: (messageId: string) => void;\n /** \"Delete for me\": hidden on this phone only. */\n deleteForMe: (messageId: string) => void;\n /** Star or unstar a message for the viewer. */\n star: (messageId: string, starred: boolean) => void;\n /** Keep (or unkeep) a disappearing message so the sweep leaves it. */\n keep: (messageId: string, keep: boolean) => void;\n /** Create a poll in this chat. */\n createPoll: (question: string, options: string[], multiple: boolean) => Promise<void>;\n /** Tap a poll option; `optionId` is the one tapped (the hook computes the new full selection). */\n vote: (messageId: string, optionId: string) => void;\n /** Read older pages until `messageId` is loaded (a quote or search result far up). Resolves whether it was found. */\n loadUntil: (messageId: string) => Promise<boolean>;\n}\n\nexport function useThread(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewer: ChatViewer | null,\n opts?: {\n onConversationMessage?: (post: WirePost) => void;\n /** An edit or delete-for-everyone, so the list preview can follow. */\n onConversationUpdate?: (post: WirePost) => void;\n media?: ChatMediaSeam;\n /** Where \"Delete for me\" remembers what this phone hides. */\n storage?: ChatStorageSeam;\n },\n): ThreadState {\n const [messages, setMessages] = React.useState<ChatMessage[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const [hasMore, setHasMore] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n /** Rows still in flight, so a retry can send them again. */\n const pending = React.useRef(new Map<string, PendingSend>());\n const media = opts?.media;\n\n const onConversationMessage = opts?.onConversationMessage;\n const notifyList = React.useCallback(\n (post: WirePost) => {\n if (!channelId) return;\n onConversationMessage?.(post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n },\n [channelId, gql, onConversationMessage],\n );\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const fetchPage = React.useCallback(\n async (skip: number) => {\n if (!channelId || !viewerId) return;\n const res = await gql.query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const rows = (res.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n setMessages((prev) =>\n mergeMessages(\n prev,\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n // Short page means the end. Offset paging can also repeat rows, but\n // mergeMessages de-duplicates so that is invisible.\n const total = res.data?.messages?.totalCount;\n setHasMore(typeof total === 'number' ? skip + rows.length < total : rows.length >= PAGE_SIZE);\n setError(firstErrorMessage(res.errors));\n setLoading(false);\n setLoadingMore(false);\n },\n [gql, channelId, viewerId],\n );\n\n // Reset hard when the channel changes: keeping the previous transcript for\n // even one frame shows the wrong conversation under the right title.\n React.useEffect(() => {\n let cancelled = false;\n setMessages([]);\n setHasMore(true);\n setLoading(true);\n pending.current.clear();\n if (channelId && viewerId) {\n // Paint the Apollo-cached head page immediately (a revisit shows the transcript with no\n // spinner); the network-only fetch below then replaces it with the server's truth.\n void gql\n .query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip: 0 },\n { fetchPolicy: 'cache-only' },\n )\n .then((cached) => {\n const rows = (cached.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n if (cancelled || !mounted.current || !rows.length) return;\n setMessages((prev) =>\n prev.length\n ? prev\n : mergeMessages(\n [],\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n setLoading(false);\n });\n }\n void fetchPage(0);\n return () => {\n cancelled = true;\n };\n }, [fetchPage, gql, channelId, viewerId]);\n\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void fetchPage(0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n // Live messages. The host owns socket retry; this just holds the handle.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n const incoming = toChatMessage(post, viewerId);\n // The echo of the viewer's own send arrives here too, so it\n // must reconcile rather than append.\n setMessages((prev) => reconcileOptimistic(prev, incoming));\n notifyList(post);\n },\n error: (err) => mounted.current && setError(err.message),\n },\n );\n }, [gql, channelId, viewerId, notifyList]);\n\n const send = React.useCallback(\n async (body: string, replyTo?: ChatReplyRef | null, mentions?: string[]) => {\n const text = body.trim();\n if (!text || !channelId || !viewerId) return;\n const mentionIds = (mentions ?? []).filter(Boolean);\n\n const clientId = `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const optimistic: ChatMessage = {\n id: clientId,\n body: text,\n createdAt: Date.now(),\n authorId: viewerId,\n authorName: viewer?.displayName ?? 'You',\n authorAvatar: viewer?.avatarUrl ?? null,\n isMine: true,\n isDeleted: false,\n isEdited: false,\n attachments: [],\n reactions: [],\n replyTo: replyTo ?? null,\n mentions: mentionIds,\n sendState: 'sending',\n };\n pending.current.set(clientId, { body: text, replyTo, mentions: mentionIds });\n setMessages((prev) => mergeMessages(prev, [optimistic]));\n onConversationMessage?.({\n id: clientId,\n message: text,\n createdAt: new Date().toISOString(),\n creator: { id: viewerId },\n });\n\n const extraProps = {\n ...(replyTo ? { replyTo } : {}),\n ...(mentionIds.length ? { mentions: mentionIds } : {}),\n };\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n // extraProps land in post.props, which every client reads the quote/mentions back from.\n messageInput: { content: text, ...(Object.keys(extraProps).length ? { extraProps } : {}) },\n });\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const saved = res.data?.sendMessage;\n if (message || !saved) {\n // Keep the text on screen and mark it failed. Dropping a\n // message the user typed is never acceptable.\n setMessages((prev) =>\n prev.map((m) => (m.id === clientId ? { ...m, sendState: 'failed' as const } : m)),\n );\n setError(message);\n return;\n }\n pending.current.delete(clientId);\n setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));\n notifyList(saved);\n },\n [gql, channelId, viewerId, viewer, notifyList, onConversationMessage],\n );\n\n const sendAttachments = React.useCallback(\n async (files: ChatPickedImage[], caption: string, kind: ChatAttachmentKind, replyTo?: ChatReplyRef | null) => {\n if (!media || !files.length || !channelId || !viewerId) return;\n const text = caption.trim();\n const postId = newPostId();\n const local: ChatAttachment[] = files.map((f, i) => ({\n id: `${postId}-${i}`,\n kind,\n name: f.name,\n mimeType: f.mimeType,\n url: f.uri,\n key: null,\n width: f.width ?? null,\n height: f.height ?? null,\n durationMs: f.durationMs ?? null,\n }));\n // The pending row carries the real post id, so the server copy replaces it in place.\n setMessages((prev) =>\n mergeMessages(prev, [\n {\n id: postId,\n body: text,\n createdAt: Date.now(),\n authorId: viewerId,\n authorName: viewer?.displayName ?? 'You',\n authorAvatar: viewer?.avatarUrl ?? null,\n isMine: true,\n isDeleted: false,\n isEdited: false,\n attachments: local,\n reactions: [],\n replyTo: replyTo ?? null,\n sendState: 'sending',\n },\n ]),\n );\n pending.current.set(postId, { body: text, files, kind, replyTo });\n\n const fail = (message: string) => {\n if (!mounted.current) return;\n setMessages((prev) => prev.map((m) => (m.id === postId ? { ...m, sendState: 'failed' as const } : m)));\n setError(message);\n };\n\n try {\n const links = await gql.mutate<{ createMessageFilesUploadLink?: string[] | null }>(\n CREATE_MESSAGE_UPLOAD_LINKS_MUTATION,\n { postId, filenames: files.map((f) => f.name) },\n );\n const urls = links.data?.createMessageFilesUploadLink ?? [];\n if (links.errors?.length || urls.length !== files.length) {\n fail(firstErrorMessage(links.errors) ?? 'Could not prepare the upload.');\n return;\n }\n await Promise.all(files.map((f, i) => media.putBytes(urls[i], f.uri, f.mimeType)));\n\n const attached = await gql.mutate<{ attachUploadedFilesToMessage?: { id: string }[] | null }>(\n ATTACH_UPLOADED_FILES_MUTATION,\n {\n postId,\n files: files.map((f, i) => ({\n name: f.name,\n mimeType: f.mimeType,\n size: f.byteSize ?? 0,\n width: f.width ?? null,\n height: f.height ?? null,\n url: urls[i].split('?')[0],\n })),\n },\n );\n const fileIds = (attached.data?.attachUploadedFilesToMessage ?? []).map((f) => f.id);\n if (attached.errors?.length || !fileIds.length) {\n fail(firstErrorMessage(attached.errors) ?? 'Could not attach the upload.');\n return;\n }\n\n const durationMs = kind === 'audio' ? files[0]?.durationMs : undefined;\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n postId,\n messageInput: {\n // messenger-box rejects blank text (it trims), so a photo / voice note on its\n // own carries its label; the bubble hides it again.\n content: text || ATTACHMENT_LABELS[kind],\n files: fileIds,\n extraProps: {\n attachmentKind: kind,\n ...(durationMs ? { voiceDurationMs: durationMs } : {}),\n ...(replyTo ? { replyTo } : {}),\n },\n },\n });\n if (!mounted.current) return;\n const saved = res.data?.sendMessage;\n if (res.errors?.length || !saved) {\n fail(firstErrorMessage(res.errors) ?? 'Could not send.');\n return;\n }\n pending.current.delete(postId);\n setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));\n notifyList(saved);\n } catch (e) {\n fail(e instanceof Error ? e.message : 'Could not send.');\n }\n },\n [media, gql, channelId, viewerId, viewer, notifyList],\n );\n\n const retry = React.useCallback(\n (messageId: string) => {\n const entry = pending.current.get(messageId);\n if (!entry) return;\n pending.current.delete(messageId);\n setMessages((prev) => prev.filter((m) => m.id !== messageId));\n if (entry.files?.length && entry.kind)\n void sendAttachments(entry.files, entry.body, entry.kind, entry.replyTo);\n else void send(entry.body, entry.replyTo, entry.mentions);\n },\n [send, sendAttachments],\n );\n\n const loadMore = React.useCallback(() => {\n if (loadingMore || !hasMore || loading) return;\n setLoadingMore(true);\n // Count only server rows: optimistic ones are not in the server's\n // offset space and would skip a real message on the next page.\n void fetchPage(messages.filter((m) => !m.sendState || m.sendState === 'sent').length);\n }, [fetchPage, loadingMore, hasMore, loading, messages]);\n\n // Live Tapbacks from anyone in the conversation, including the viewer's other devices.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{\n chatReactionChanged?: { postId?: string | null; reactions?: WireReaction[] | null } | null;\n }>(\n REACTION_CHANGED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const event = data?.chatReactionChanged;\n if (!event?.postId || !mounted.current) return;\n setMessages((prev) => applyReactionSummary(prev, String(event.postId), event.reactions, viewerId));\n },\n },\n );\n }, [gql, channelId, viewerId]);\n\n const messagesRef = React.useRef(messages);\n messagesRef.current = messages;\n\n const react = React.useCallback(\n (messageId: string, emoji: string | null) => {\n if (!channelId || !viewerId) return;\n const target = messagesRef.current.find((m) => m.id === messageId);\n // Only confirmed server rows can carry reactions.\n if (!target || (target.sendState && target.sendState !== 'sent')) return;\n const before = target.reactions;\n const after = withViewerReaction(before, emoji, viewerId);\n const next = after.find((r) => r.mine)?.reaction ?? null;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: after } : m)));\n\n void (async () => {\n const res = await gql.mutate<{ setMessageReaction?: WireReaction[] | null }>(\n SET_MESSAGE_REACTION_MUTATION,\n { channelId, postId: messageId, reaction: next },\n );\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setMessageReaction) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: before } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the reaction.');\n return;\n }\n setMessages((prev) => applyReactionSummary(prev, messageId, res.data?.setMessageReaction, viewerId));\n })();\n },\n [gql, channelId, viewerId],\n );\n\n // Edits and deletes-for-everyone from anyone in the chat, including the viewer's other devices.\n const onConversationUpdate = opts?.onConversationUpdate;\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{ chatMessageUpdated?: WirePost | null }>(\n MESSAGE_UPDATED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageUpdated;\n if (!post?.id || !mounted.current) return;\n const updated = toChatMessage(post, viewerId);\n // The disappearing sweep publishes props.disappeared to mean \"remove this row\"\n // (not \"show a tombstone\"), so drop it from the transcript live.\n if (updated.disappeared) {\n setMessages((prev) => prev.filter((m) => m.id !== updated.id));\n onConversationUpdate?.(post);\n return;\n }\n setMessages((prev) =>\n prev.map((m) => (m.id === updated.id ? { ...updated, sendState: m.sendState } : m)),\n );\n onConversationUpdate?.(post);\n },\n },\n );\n }, [gql, channelId, viewerId, onConversationUpdate]);\n\n const messageIdOf = React.useCallback(\n (messageId: string) => ({ channelId: String(channelId), messageId }),\n [channelId],\n );\n\n const edit = React.useCallback(\n (messageId: string, body: string) => {\n const text = body.trim();\n if (!channelId || !viewerId || !text) return;\n const before = messagesRef.current.find((m) => m.id === messageId);\n if (!before || before.body === text) return;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, body: text, isEdited: true } : m)));\n void (async () => {\n const res = await gql.mutate<{ editMessage?: WirePost | null }>(EDIT_MESSAGE_MUTATION, {\n messageId: messageIdOf(messageId),\n messageInput: { content: text },\n });\n if (!mounted.current) return;\n const saved = res.data?.editMessage;\n if (res.errors?.length || !saved) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? before : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not edit the message.');\n return;\n }\n setMessages((prev) => prev.map((m) => (m.id === messageId ? toChatMessage(saved, viewerId) : m)));\n onConversationUpdate?.(saved);\n })();\n },\n [gql, channelId, viewerId, messageIdOf, onConversationUpdate],\n );\n\n const deleteForEveryone = React.useCallback(\n (messageId: string) => {\n if (!channelId || !viewerId) return;\n const before = messagesRef.current.find((m) => m.id === messageId);\n if (!before) return;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId ? { ...m, isDeleted: true, body: '', attachments: [], replyTo: null } : m,\n ),\n );\n void (async () => {\n const res = await gql.mutate<{ deleteMessageForEveryone?: WirePost | null }>(\n DELETE_MESSAGE_FOR_EVERYONE_MUTATION,\n { messageId: messageIdOf(messageId) },\n );\n if (!mounted.current) return;\n const saved = res.data?.deleteMessageForEveryone;\n if (res.errors?.length || !saved) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? before : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not delete the message.');\n return;\n }\n onConversationUpdate?.(saved);\n })();\n },\n [gql, channelId, viewerId, messageIdOf, onConversationUpdate],\n );\n\n // \"Delete for me\" is this phone's own list of hidden messages, per chat.\n const storage = opts?.storage;\n const hiddenKey = channelId ? `chat-hidden:${channelId}` : null;\n const [hidden, setHidden] = React.useState<ReadonlySet<string>>(() => new Set());\n React.useEffect(() => {\n setHidden(new Set());\n if (!storage || !hiddenKey) return;\n storage\n .get(hiddenKey)\n .then((raw) => {\n const ids = raw ? (JSON.parse(raw) as unknown) : [];\n if (mounted.current && Array.isArray(ids)) setHidden(new Set(ids.filter((i) => typeof i === 'string')));\n })\n .catch(() => undefined);\n }, [storage, hiddenKey]);\n const deleteForMe = React.useCallback(\n (messageId: string) => {\n setHidden((prev) => {\n const next = new Set(prev);\n next.add(messageId);\n // Bounded: the newest 500 hidden ids per chat are plenty for a phone.\n if (storage && hiddenKey) {\n storage.set(hiddenKey, JSON.stringify(Array.from(next).slice(-500))).catch(() => undefined);\n }\n return next;\n });\n },\n [storage, hiddenKey],\n );\n\n const star = React.useCallback(\n (messageId: string, starred: boolean) => {\n if (!channelId || !viewerId) return;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, starred } : m)));\n void (async () => {\n const res = await gql.mutate<{ setMessageStarred?: boolean | null }>(SET_MESSAGE_STARRED_MUTATION, {\n messageId: messageIdOf(messageId),\n starred,\n });\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setMessageStarred) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, starred: !starred } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the star.');\n }\n })();\n },\n [gql, channelId, viewerId, messageIdOf],\n );\n\n const keep = React.useCallback(\n (messageId: string, keepIt: boolean) => {\n if (!channelId || !viewerId) return;\n const before = messagesRef.current.find((m) => m.id === messageId);\n if (!before) return;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, kept: keepIt } : m)));\n void (async () => {\n const res = await gql.mutate<{ keepMessage?: WirePost | null }>(KEEP_MESSAGE_MUTATION, {\n messageId: messageIdOf(messageId),\n keep: keepIt,\n });\n if (!mounted.current) return;\n const saved = res.data?.keepMessage;\n if (res.errors?.length || !saved) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? before : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the message.');\n return;\n }\n setMessages((prev) => prev.map((m) => (m.id === messageId ? toChatMessage(saved, viewerId) : m)));\n })();\n },\n [gql, channelId, viewerId, messageIdOf],\n );\n\n const vote = React.useCallback(\n (messageId: string, optionId: string) => {\n if (!channelId || !viewerId) return;\n const target = messagesRef.current.find((m) => m.id === messageId);\n if (!target?.poll) return;\n const before = target.poll;\n const after = withViewerPollVote(before, optionId, viewerId);\n // optionIds = the viewer's COMPLETE selection after the tap (what the server reconciles to).\n const optionIds = after.options.filter((o) => o.mine).map((o) => o.id);\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, poll: after } : m)));\n void (async () => {\n const res = await gql.mutate<{ votePoll?: WirePost | null }>(VOTE_POLL_MUTATION, {\n channelId,\n postId: messageId,\n optionIds,\n });\n if (!mounted.current) return;\n const saved = res.data?.votePoll;\n if (res.errors?.length || !saved) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, poll: before } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not record your vote.');\n return;\n }\n setMessages((prev) => prev.map((m) => (m.id === messageId ? toChatMessage(saved, viewerId) : m)));\n })();\n },\n [gql, channelId, viewerId],\n );\n\n const createPoll = React.useCallback(\n async (question: string, options: string[], multiple: boolean): Promise<void> => {\n if (!channelId || !viewerId) return;\n const q = question.trim();\n const opts2 = options.map((o) => o.trim()).filter(Boolean);\n if (!q || opts2.length < 2) return;\n const res = await gql.mutate<{ createPoll?: WirePost | null }>(CREATE_POLL_MUTATION, {\n channelId,\n question: q,\n options: opts2,\n multiple,\n });\n if (!mounted.current) return;\n const saved = res.data?.createPoll;\n if (res.errors?.length || !saved) {\n setError(firstErrorMessage(res.errors) ?? 'Could not create the poll.');\n return;\n }\n // Merge the new poll in (the chatMessageAdded subscription delivers it to everyone else;\n // mergeMessages de-duplicates by id).\n setMessages((prev) => mergeMessages(prev, [toChatMessage(saved, viewerId)]));\n notifyList(saved);\n },\n [gql, channelId, viewerId, notifyList],\n );\n\n const loadUntil = React.useCallback(\n async (messageId: string): Promise<boolean> => {\n for (let page = 0; page < MAX_PAGES_TO_FIND; page += 1) {\n if (messagesRef.current.some((m) => m.id === messageId)) return true;\n const served = messagesRef.current.filter((m) => !m.sendState || m.sendState === 'sent').length;\n const before = messagesRef.current.length;\n // eslint-disable-next-line no-await-in-loop -- each page depends on the one before\n await fetchPage(served);\n if (messagesRef.current.length === before) break;\n }\n return messagesRef.current.some((m) => m.id === messageId);\n },\n [fetchPage],\n );\n\n const visibleMessages = React.useMemo(\n () => (hidden.size ? messages.filter((m) => !hidden.has(m.id)) : messages),\n [messages, hidden],\n );\n\n return {\n messages: visibleMessages,\n loading,\n loadingMore,\n hasMore,\n error,\n send,\n sendAttachments: media ? sendAttachments : undefined,\n loadMore,\n retry,\n react,\n edit,\n deleteForEveryone,\n deleteForMe,\n star,\n keep,\n createPoll,\n vote,\n loadUntil,\n };\n}\n\n/** How often the open chat re-reads who has seen it, while the viewer's last message is unread. */\nconst READ_STATE_POLL_MS = 8_000;\n\n/**\n * The open chat's read and delivered watermarks, kept fresh while they matter.\n *\n * The server has no \"someone opened the chat\" event, so while `waiting` (the viewer's\n * newest message is not read yet) this re-reads the members' `lastViewedAt` every few\n * seconds and on every reconnect, and stops as soon as nothing is waiting. Returns the\n * newest watermarks seen (0 until the first read); callers take the max with what the\n * list already knew, since a watermark only moves forward.\n */\nexport function useReadWatermark(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewerId: string | null,\n waiting: boolean,\n): { read: number; delivered: number } {\n const [watermark, setWatermark] = React.useState({ read: 0, delivered: 0 });\n React.useEffect(() => setWatermark({ read: 0, delivered: 0 }), [channelId]);\n\n React.useEffect(() => {\n if (!channelId || !viewerId || !waiting) return undefined;\n let alive = true;\n const read = async () => {\n const res = await gql.query<{ viewChannelDetail?: WireChannel | null }>(\n CHANNEL_READ_STATE_QUERY,\n { id: channelId },\n { fetchPolicy: 'no-cache' },\n );\n const channel = res.data?.viewChannelDetail;\n if (!alive || !channel) return;\n const read = readWatermarkOf(channel, viewerId);\n const delivered = deliveredWatermarkOf(channel, viewerId);\n setWatermark((prev) =>\n read <= prev.read && delivered <= prev.delivered\n ? prev\n : { read: Math.max(prev.read, read), delivered: Math.max(prev.delivered, delivered) },\n );\n };\n void read();\n const timer = setInterval(read, READ_STATE_POLL_MS);\n return () => {\n alive = false;\n clearInterval(timer);\n };\n }, [gql, channelId, viewerId, waiting, gql.reconnectEpoch]);\n\n return watermark;\n}\n\n/** Fire-and-forget read receipt; the badge is already cleared locally. */\nexport function useMarkRead(gql: ChatGraphQLSeam, channelId: string | null, onMarked: (id: string) => void) {\n React.useEffect(() => {\n if (!channelId) return;\n onMarked(channelId);\n void gql.mutate(VIEW_CHANNEL_MUTATION, { id: channelId });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channelId]);\n}\n\n/** Re-send \"typing\" this often while the person keeps typing; stop after this long without a key. */\nconst TYPING_REFRESH_MS = 4_000;\nconst TYPING_IDLE_MS = 5_000;\n/** Forget someone's \"typing\" when no refresh arrives for this long (their app closed mid-word). */\nconst TYPING_EXPIRE_MS = 7_000;\n\nexport interface TypingState {\n /** Ids of the other people typing right now, oldest first. */\n typingUserIds: string[];\n /** Call on every composer change; sends start / stop as WhatsApp does. */\n onDraftChange: (text: string) => void;\n /** The message went out: stop at once. */\n onSent: () => void;\n}\n\n/** \"typing…\" both ways for one open chat. */\nexport function useTyping(gql: ChatGraphQLSeam, channelId: string | null, viewerId: string | null): TypingState {\n const [typing, setTyping] = React.useState<Record<string, number>>({});\n const lastStart = React.useRef(0);\n const idleTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const active = React.useRef(false);\n\n React.useEffect(() => {\n setTyping({});\n if (!channelId || !viewerId) return undefined;\n const off = gql.subscribe<{ typingIndicator?: { userId?: string | null; action?: string | null } | null }>(\n TYPING_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const event = data?.typingIndicator;\n const who = event?.userId ? String(event.userId) : '';\n if (!who || who === viewerId) return;\n setTyping((prev) => {\n const next = { ...prev };\n if (event?.action === 'start') next[who] = Date.now();\n else delete next[who];\n return next;\n });\n },\n },\n );\n const sweep = setInterval(() => {\n setTyping((prev) => {\n const now = Date.now();\n const kept = Object.entries(prev).filter(([, at]) => now - at < TYPING_EXPIRE_MS);\n return kept.length === Object.keys(prev).length ? prev : Object.fromEntries(kept);\n });\n }, 1_000);\n return () => {\n off();\n clearInterval(sweep);\n };\n }, [gql, channelId, viewerId]);\n\n const send = React.useCallback(\n (action: 'start' | 'stop') => {\n if (!channelId) return;\n void gql.mutate(SEND_TYPING_MUTATION, { channelId, action });\n },\n [gql, channelId],\n );\n\n const stop = React.useCallback(() => {\n if (idleTimer.current) clearTimeout(idleTimer.current);\n idleTimer.current = null;\n if (!active.current) return;\n active.current = false;\n lastStart.current = 0;\n send('stop');\n }, [send]);\n\n const onDraftChange = React.useCallback(\n (text: string) => {\n if (!text.trim()) {\n stop();\n return;\n }\n const now = Date.now();\n if (!active.current || now - lastStart.current > TYPING_REFRESH_MS) {\n active.current = true;\n lastStart.current = now;\n send('start');\n }\n if (idleTimer.current) clearTimeout(idleTimer.current);\n idleTimer.current = setTimeout(stop, TYPING_IDLE_MS);\n },\n [send, stop],\n );\n\n // Leaving the chat stops the indicator for everyone else.\n React.useEffect(() => stop, [channelId, stop]);\n\n const typingUserIds = React.useMemo(\n () =>\n Object.entries(typing)\n .sort((a, b) => a[1] - b[1])\n .map(([id]) => id),\n [typing],\n );\n return { typingUserIds, onDraftChange, onSent: stop };\n}\n\n/**\n * Forward a message to other chats, WhatsApp-style: the text goes out as a new message in each,\n * marked \"Forwarded\". Resolves the chats it reached.\n */\nexport async function forwardMessage(\n gql: ChatGraphQLSeam,\n body: string,\n channelIds: string[],\n): Promise<{ sent: string[]; posts: Array<{ channelId: string; post: WirePost }> }> {\n const text = body.trim();\n const sent: string[] = [];\n const posts: Array<{ channelId: string; post: WirePost }> = [];\n if (!text) return { sent, posts };\n await Promise.all(\n channelIds.map(async (channelId) => {\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n messageInput: { content: text, extraProps: { forwarded: true } },\n });\n const post = res.data?.sendMessage;\n if (post && !res.errors?.length) {\n sent.push(channelId);\n posts.push({ channelId, post });\n }\n }),\n );\n return { sent, posts };\n}\n"],"names":["_a","_b","_c","read"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-mobile",
3
- "version": "12.0.105-alpha.0",
3
+ "version": "12.0.106-alpha.0",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -45,7 +45,7 @@
45
45
  "@messenger-box/platform-mobile": "*",
46
46
  "@react-native-async-storage/async-storage": "*",
47
47
  "@react-navigation/native": "*",
48
- "common": "12.0.103-alpha.1",
48
+ "common": "12.0.105-alpha.0",
49
49
  "expo-constants": "*",
50
50
  "expo-secure-store": "*",
51
51
  "expo-web-browser": "*",
@@ -65,5 +65,5 @@
65
65
  "typescript": {
66
66
  "definition": "lib/index.d.ts"
67
67
  },
68
- "gitHead": "5b6a63ca0ddae481ab60809aafefb0df961db72e"
68
+ "gitHead": "b1d5498dc68c8ca96fa0d412312b3fa389456bd5"
69
69
  }