@adminide-stack/yantra-mobile 12.0.70-alpha.4 → 12.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config/env-config.js +1 -1
- package/lib/config/env-config.js.map +1 -1
- package/lib/features/messaging/ChatAttachments.js +383 -0
- package/lib/features/messaging/ChatAttachments.js.map +1 -0
- package/lib/features/messaging/ChatComponents.js +22 -6
- package/lib/features/messaging/ChatComponents.js.map +1 -1
- package/lib/features/messaging/ContactsScreen.js +15 -16
- package/lib/features/messaging/ContactsScreen.js.map +1 -1
- package/lib/features/messaging/NativeChatExperience.js +5 -1
- package/lib/features/messaging/NativeChatExperience.js.map +1 -1
- package/lib/features/messaging/ThreadScreen.js +88 -13
- package/lib/features/messaging/ThreadScreen.js.map +1 -1
- package/lib/features/messaging/chatModel.js +93 -7
- package/lib/features/messaging/chatModel.js.map +1 -1
- package/lib/features/messaging/chatOperations.js +27 -6
- package/lib/features/messaging/chatOperations.js.map +1 -1
- package/lib/features/messaging/useChatData.js +125 -6
- package/lib/features/messaging/useChatData.js.map +1 -1
- package/package.json +4 -4
|
@@ -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 SET_MESSAGE_REACTION_MUTATION,\n VIEW_CHANNEL_MUTATION,\n} from './chatOperations';\nimport {\n applyReactionSummary,\n withViewerReaction,\n type WireReaction,\n mergeConversations,\n mergeMessages,\n patchConversationAfterPost,\n reconcileOptimistic,\n sortConversations,\n toChatMessage,\n toConversation,\n type ChatConversation,\n type ChatMessage,\n type WireChannel,\n type WirePost,\n} from './chatModel';\nimport type { ChatGraphQLSeam, ChatHostServices, ChatViewer } from './chatHost';\nimport {\n isMongoAccountId,\n isNativeMessengerChannel,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n NATIVE_CHAT_LIST_PAGE_SIZE,\n} from './nativeChatChannelQuery';\n\n/** Messages fetched per page in a thread. */\nconst PAGE_SIZE = 20;\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 /** 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 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 },\n },\n ),\n );\n return () => {\n unsubs.forEach((off) => off());\n };\n }, [gql, viewerId, listSyncKey, opts?.syncListRealtime, applyConversationMessage]);\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 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 send: (body: string) => Promise<void>;\n loadMore: () => void;\n retry: (messageId: string) => 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}\n\nexport function useThread(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewer: ChatViewer | null,\n opts?: { onConversationMessage?: (post: WirePost) => void },\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 /** Bodies of rows still in flight, so a retry can find them. */\n const pending = React.useRef(new Map<string, string>());\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) => {\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 sendState: 'sending',\n };\n pending.current.set(clientId, text);\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 messageInput: { content: text },\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 retry = React.useCallback(\n (messageId: string) => {\n const body = pending.current.get(messageId);\n if (!body) return;\n pending.current.delete(messageId);\n setMessages((prev) => prev.filter((m) => m.id !== messageId));\n void send(body);\n },\n [send],\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 return { messages, loading, loadingMore, hasMore, error, send, loadMore, retry, react };\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"],"names":["_a","_b"],"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 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} from './chatOperations';\nimport {\n applyReactionSummary,\n withViewerReaction,\n type WireReaction,\n mergeConversations,\n mergeMessages,\n patchConversationAfterPost,\n reconcileOptimistic,\n sortConversations,\n toChatMessage,\n toConversation,\n type ChatConversation,\n type ChatMessage,\n type WireChannel,\n type WirePost,\n} from './chatModel';\nimport type { ChatGraphQLSeam, ChatHostServices, ChatMediaSeam, ChatPickedImage, ChatViewer } from './chatHost';\nimport { ATTACHMENT_LABELS, type ChatAttachment, type ChatAttachmentKind } from './chatModel';\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}\nimport {\n isMongoAccountId,\n isNativeMessengerChannel,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n NATIVE_CHAT_LIST_PAGE_SIZE,\n} from './nativeChatChannelQuery';\n\n/** Messages fetched per page in a thread. */\nconst PAGE_SIZE = 20;\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 /** 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 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 },\n },\n ),\n );\n return () => {\n unsubs.forEach((off) => off());\n };\n }, [gql, viewerId, listSyncKey, opts?.syncListRealtime, applyConversationMessage]);\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 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 send: (body: 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?: (files: ChatPickedImage[], caption: string, kind: ChatAttachmentKind) => 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}\n\nexport function useThread(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewer: ChatViewer | null,\n opts?: { onConversationMessage?: (post: WirePost) => void; media?: ChatMediaSeam },\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) => {\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 sendState: 'sending',\n };\n pending.current.set(clientId, { body: text });\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 messageInput: { content: text },\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) => {\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 sendState: 'sending',\n },\n ]),\n );\n pending.current.set(postId, { body: text, files, kind });\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: { attachmentKind: kind, ...(durationMs ? { voiceDurationMs: durationMs } : {}) },\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) void sendAttachments(entry.files, entry.body, entry.kind);\n else void send(entry.body);\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 return {\n messages,\n loading,\n loadingMore,\n hasMore,\n error,\n send,\n sendAttachments: media ? sendAttachments : undefined,\n loadMore,\n retry,\n react,\n };\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"],"names":["_a","_b","_c"],"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.70
|
|
3
|
+
"version": "12.0.70",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"uuid": "^9.0.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"common": "12.0.70
|
|
29
|
+
"common": "^12.0.70"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@messenger-box/platform-mobile": "*",
|
|
43
43
|
"@react-native-async-storage/async-storage": "*",
|
|
44
44
|
"@react-navigation/native": "*",
|
|
45
|
-
"common": "12.0.
|
|
45
|
+
"common": "12.0.69",
|
|
46
46
|
"expo-constants": "*",
|
|
47
47
|
"expo-secure-store": "*",
|
|
48
48
|
"expo-web-browser": "*",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"typescript": {
|
|
60
60
|
"definition": "lib/index.d.ts"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "ec2d330651b983c209a7f482ff6a38755ec7e761"
|
|
63
63
|
}
|